<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on Tristan Wiessalla</title><link>https://blog.twiessalla.de/posts/</link><description>Recent content in Posts on Tristan Wiessalla</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 18 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.twiessalla.de/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Learning Drupal</title><link>https://blog.twiessalla.de/posts/drupal-documentation/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.twiessalla.de/posts/drupal-documentation/</guid><description>&lt;p&gt;I&amp;rsquo;ll break this apart into a multi-part series soon.&lt;/p&gt;
&lt;h2 id="importing-data-in-drupal"&gt;Importing data in Drupal &lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;drupal&lt;!-- raw HTML omitted --&gt;&lt;!-- raw HTML omitted --&gt;&lt;/h2&gt;
&lt;h3 id="importing-data"&gt;Importing data&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The general workflow from original record (&lt;code&gt;source_record&lt;/code&gt;) to AI-extracted record (&lt;code&gt;extracted_entity&lt;/code&gt;) and finally the innovation (&lt;code&gt;innovation&lt;/code&gt;) you find on the user-facing website is:
&lt;ol&gt;
&lt;li&gt;write migration.yml file&lt;/li&gt;
&lt;li&gt;upload source file (json, csv, &amp;hellip;) to &lt;code&gt;web/modules/custom/&amp;lt;your_module_name&amp;gt;/source/&amp;lt;your_source_name_as_in_yml&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;drush migrate:import &amp;lt;your migration id&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="rolling-back"&gt;Rolling back&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;This generally fails because of a malformatted migration file or typos etc in the source data, to rollback you do
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;drush migrate:stop &amp;lt;your migration id&amp;gt;&lt;/code&gt; to stop any migration process going on&lt;/li&gt;
&lt;li&gt;&lt;code&gt;drush migrate:reset &amp;lt;your migration id&amp;gt;&lt;/code&gt; to set the migration status to &amp;lsquo;idle&amp;rsquo; (i.e. ready to import)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;drush migrate:rollback &amp;lt;your migration id&amp;gt;&lt;/code&gt; to remove any partially imported records&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Some notes on rollback: If you already have downstream content types based off of earlier imported source records, you&amp;rsquo;re prone to create duplicates when rolling back &amp;amp; re-importing the same sources. Your options are then:
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;drush migrate:rollback &amp;lt;your migration id&amp;gt; --update&lt;/code&gt; to only update &lt;code&gt;source_record&lt;/code&gt; that changed in the source data (because you e.g. changed the json structure)&lt;/li&gt;
&lt;li&gt;Purge all downstream content by going to (Web menu -&amp;gt; BACK-END -&amp;gt; Manage &amp;lt;content type&amp;gt;)
&lt;ol&gt;
&lt;li&gt;Once there, filter for all content of interest, select the action &amp;lsquo;Delete&amp;rsquo; from the Action drop-down and execute&lt;/li&gt;
&lt;li&gt;You might need to do this 3 times, for &amp;lsquo;Original Record&amp;rsquo;, &amp;lsquo;AI-extracted innovation record&amp;rsquo; and &amp;lsquo;Innovation&amp;rsquo;&lt;/li&gt;
&lt;li&gt;After purging existing data, you can run &lt;code&gt;drush migrate:import &amp;lt;your migration id&amp;gt;&lt;/code&gt; again&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="yaml-template-for-import"&gt;yaml Template for import&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;added after import, delete this column before importing&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;langcode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;en&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enforced&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;&amp;lt;import_STI_portal_data / import_IRD_jsons&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;machine reference to this migration&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;class&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;field_plugin_method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;cck_plugin_method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;migration_tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;STI&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;migration_group&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;STI-import-group&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;description, e.g. the one found in Manage data sources&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;csv / json&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;constants&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;SOURCE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;source name as found in Manage data sources&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;SOURCE_ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;source name as found in the Manage data sources url&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;RECTYPE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;check what rectypes are set in Mange data source&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;path to the json or csv file to migrate&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;header_offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ids&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;&amp;lt;the data column containing unique IDs, eg. id, url, title&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;process&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;field_data_source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;constants/SOURCE_ID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Needed so that imported records are assigned to the correct data source&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;field_original_internal_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;skip_on_empty&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;give the same as set in &amp;#39;ids&amp;#39; above&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;row&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;message: &amp;#39;Row does not contain Project Symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;skipped&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;skip_on_empty&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;data column containing the name/title of the entry&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;row&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;message: &amp;#39;Row does not contain title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;skipped&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;default_value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;default_value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;source_record&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# leave unchanged, you&amp;#39;re importing a &amp;#39;source_record&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;field_shorter_description/value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;skip_on_empty&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;data column containing a 1-2 sentence description&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;process&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Row does not contain short descr.&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;field_shorter_description/format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;default_value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;default_value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;full_html&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;field_long_description/value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;skip_on_empty&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;data column containing a long freetext description&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;process&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Row does not contain short descr.&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;field_long_description/format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;default_value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;default_value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;full_html&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;callback&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;callable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;time&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;unpack_source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;field_impact_sdgs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;explode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;delimiter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;data column mentioning sdgs&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;callback&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;callable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;trim&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;preg_replace&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\..*&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Often it is necessary to map however sdgs are named in the source data to the STI portal taxonomy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;static_map&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;map&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;1&amp;#39;: &amp;#39;Goal 1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;No&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;poverty&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;2&amp;#39;: &amp;#39;Goal 2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Zero hunger&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;3&amp;#39;: &amp;#39;Goal 3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Good health and well-being&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;4&amp;#39;: &amp;#39;Goal 4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Quality education&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;5&amp;#39;: &amp;#39;Goal 5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Gender equality&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;6&amp;#39;: &amp;#39;Goal 6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Clean water and sanitation&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;7&amp;#39;: &amp;#39;Goal 7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Affordable and clean energy&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;8&amp;#39;: &amp;#39;Goal 8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Decent work and economic growth&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;9&amp;#39;: &amp;#39;Goal 9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Industry, innovation and infrastructure&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;10&amp;#39;: &amp;#39;Goal 10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Reduced inequalities&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;11&amp;#39;: &amp;#39;Goal 11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Sustainable cities and communities&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;12&amp;#39;: &amp;#39;Goal 12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Responsible consumption and production&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;13&amp;#39;: &amp;#39;Goal 13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Climate action&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;14&amp;#39;: &amp;#39;Goal 14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Life below water&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;15&amp;#39;: &amp;#39;Goal 15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Life on land&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;16&amp;#39;: &amp;#39;Goal 16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Peace, justice and strong institutions&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#39;17&amp;#39;: &amp;#39;Goal 17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Partnerships for the goals&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;default_value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;entity_lookup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entity_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;taxonomy_term&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ignore_case&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;impact_sdgs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;field_region&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;entity_generate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entity_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;taxonomy_term&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ignore_case&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;region column or field&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;countries_no_standard&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;field_innovation_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;explode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;innovation column or field&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;delimiter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;callback&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;callable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;trim&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;entity_lookup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entity_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;taxonomy_term&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ignore_case&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;type&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;field_use_cases&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;explode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;use cases column or field&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;delimiter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;callback&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;callable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;trim&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;entity_lookup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entity_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;taxonomy_term&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ignore_case&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;use_cases&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;field_adoption_countries_ns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# this field is needed in case country names do not follow the UN/FAO - Standards&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;skip_on_empty&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;process&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;&amp;lt;use cases column or field&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;explode&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;delimiter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;-&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;entity_generate&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entity_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;taxonomy_term&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ignore_case&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;value_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;name&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;countries_no_standard&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;destination&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;plugin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;entity:node&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;default_bundle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;source_record&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;overwrite_properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;field_data_source&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;field_original_internal_id&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;field_shorter_description/value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;field_long_description/value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;migration_dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{&lt;span class="w"&gt; &lt;/span&gt;}&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The migration has 4 top-level parts:&lt;/p&gt;</description><content:encoded><![CDATA[<p>I&rsquo;ll break this apart into a multi-part series soon.</p>
<h2 id="importing-data-in-drupal">Importing data in Drupal <!-- raw HTML omitted --><!-- raw HTML omitted -->drupal<!-- raw HTML omitted --><!-- raw HTML omitted --></h2>
<h3 id="importing-data">Importing data</h3>
<ul>
<li>The general workflow from original record (<code>source_record</code>) to AI-extracted record (<code>extracted_entity</code>) and finally the innovation (<code>innovation</code>) you find on the user-facing website is:
<ol>
<li>write migration.yml file</li>
<li>upload source file (json, csv, &hellip;) to <code>web/modules/custom/&lt;your_module_name&gt;/source/&lt;your_source_name_as_in_yml&gt;</code>)</li>
<li><code>drush migrate:import &lt;your migration id&gt;</code></li>
</ol>
</li>
</ul>
<h3 id="rolling-back">Rolling back</h3>
<ul>
<li>This generally fails because of a malformatted migration file or typos etc in the source data, to rollback you do
<ol>
<li><code>drush migrate:stop &lt;your migration id&gt;</code> to stop any migration process going on</li>
<li><code>drush migrate:reset &lt;your migration id&gt;</code> to set the migration status to &lsquo;idle&rsquo; (i.e. ready to import)</li>
<li><code>drush migrate:rollback &lt;your migration id&gt;</code> to remove any partially imported records</li>
</ol>
</li>
<li>Some notes on rollback: If you already have downstream content types based off of earlier imported source records, you&rsquo;re prone to create duplicates when rolling back &amp; re-importing the same sources. Your options are then:
<ol>
<li><code>drush migrate:rollback &lt;your migration id&gt; --update</code> to only update <code>source_record</code> that changed in the source data (because you e.g. changed the json structure)</li>
<li>Purge all downstream content by going to (Web menu -&gt; BACK-END -&gt; Manage &lt;content type&gt;)
<ol>
<li>Once there, filter for all content of interest, select the action &lsquo;Delete&rsquo; from the Action drop-down and execute</li>
<li>You might need to do this 3 times, for &lsquo;Original Record&rsquo;, &lsquo;AI-extracted innovation record&rsquo; and &lsquo;Innovation&rsquo;</li>
<li>After purging existing data, you can run <code>drush migrate:import &lt;your migration id&gt;</code> again</li>
</ol>
</li>
</ol>
</li>
</ul>
<h3 id="yaml-template-for-import">yaml Template for import</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">    </span><span class="nt">uuid</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;added after import, delete this column before importing&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">langcode</span><span class="p">:</span><span class="w"> </span><span class="l">en</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">status</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">dependencies</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">enforced</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">module</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">&lt;import_STI_portal_data / import_IRD_jsons&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;machine reference to this migration&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">class</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">field_plugin_method</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">cck_plugin_method</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">migration_tags</span><span class="p">:</span><span class="w"> </span><span class="l">STI</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">migration_group</span><span class="p">:</span><span class="w"> </span><span class="l">STI-import-group</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">label</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;description, e.g. the one found in Manage data sources&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">source</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;csv / json&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">constants</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">SOURCE</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;source name as found in Manage data sources&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">SOURCE_ID</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;source name as found in the Manage data sources url&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">RECTYPE</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;check what rectypes are set in Mange data source&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;path to the json or csv file to migrate&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">header_offset</span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">ids</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">&lt;the data column containing unique IDs, eg. id, url, title&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">process</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_data_source</span><span class="p">:</span><span class="w"> </span><span class="l">constants/SOURCE_ID</span><span class="w"> </span><span class="c"># Needed so that imported records are assigned to the correct data source</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_original_internal_id</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">skip_on_empty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;give the same as set in &#39;ids&#39; above&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">method</span><span class="p">:</span><span class="w"> </span><span class="l">row</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">message: &#39;Row does not contain Project Symbol</span><span class="p">:</span><span class="w"> </span><span class="l">skipped&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">title</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">skip_on_empty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;data column containing the name/title of the entry&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">method</span><span class="p">:</span><span class="w"> </span><span class="l">row</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">message: &#39;Row does not contain title</span><span class="p">:</span><span class="w"> </span><span class="l">skipped&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">type</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">default_value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">default_value</span><span class="p">:</span><span class="w"> </span><span class="l">source_record</span><span class="w"> </span><span class="c"># leave unchanged, you&#39;re importing a &#39;source_record&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_shorter_description/value</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">skip_on_empty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;data column containing a 1-2 sentence description&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">method</span><span class="p">:</span><span class="w"> </span><span class="l">process</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;Row does not contain short descr.&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_shorter_description/format</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">default_value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">default_value</span><span class="p">:</span><span class="w"> </span><span class="l">full_html</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_long_description/value</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">skip_on_empty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;data column containing a long freetext description&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">method</span><span class="p">:</span><span class="w"> </span><span class="l">process</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">message</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;Row does not contain short descr.&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_long_description/format</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">default_value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">default_value</span><span class="p">:</span><span class="w"> </span><span class="l">full_html</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">time</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">callback</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">callable</span><span class="p">:</span><span class="w"> </span><span class="l">time</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">unpack_source</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span>{<span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_impact_sdgs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">explode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">delimiter</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;,&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;data column mentioning sdgs&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">callback</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">callable</span><span class="p">:</span><span class="w"> </span><span class="l">trim</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">preg_replace</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;\..*&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">replace</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># Often it is necessary to map however sdgs are named in the source data to the STI portal taxonomy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">static_map</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">map</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;1&#39;: &#39;Goal 1</span><span class="p">:</span><span class="w"> </span><span class="kc">No</span><span class="w"> </span><span class="l">poverty&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;2&#39;: &#39;Goal 2</span><span class="p">:</span><span class="w"> </span><span class="l">Zero hunger&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;3&#39;: &#39;Goal 3</span><span class="p">:</span><span class="w"> </span><span class="l">Good health and well-being&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;4&#39;: &#39;Goal 4</span><span class="p">:</span><span class="w"> </span><span class="l">Quality education&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;5&#39;: &#39;Goal 5</span><span class="p">:</span><span class="w"> </span><span class="l">Gender equality&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;6&#39;: &#39;Goal 6</span><span class="p">:</span><span class="w"> </span><span class="l">Clean water and sanitation&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;7&#39;: &#39;Goal 7</span><span class="p">:</span><span class="w"> </span><span class="l">Affordable and clean energy&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;8&#39;: &#39;Goal 8</span><span class="p">:</span><span class="w"> </span><span class="l">Decent work and economic growth&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;9&#39;: &#39;Goal 9</span><span class="p">:</span><span class="w"> </span><span class="l">Industry, innovation and infrastructure&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;10&#39;: &#39;Goal 10</span><span class="p">:</span><span class="w"> </span><span class="l">Reduced inequalities&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;11&#39;: &#39;Goal 11</span><span class="p">:</span><span class="w"> </span><span class="l">Sustainable cities and communities&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;12&#39;: &#39;Goal 12</span><span class="p">:</span><span class="w"> </span><span class="l">Responsible consumption and production&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;13&#39;: &#39;Goal 13</span><span class="p">:</span><span class="w"> </span><span class="l">Climate action&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;14&#39;: &#39;Goal 14</span><span class="p">:</span><span class="w"> </span><span class="l">Life below water&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;15&#39;: &#39;Goal 15</span><span class="p">:</span><span class="w"> </span><span class="l">Life on land&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;16&#39;: &#39;Goal 16</span><span class="p">:</span><span class="w"> </span><span class="l">Peace, justice and strong institutions&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">&#39;17&#39;: &#39;Goal 17</span><span class="p">:</span><span class="w"> </span><span class="l">Partnerships for the goals&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">default_value</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">entity_lookup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">entity_type</span><span class="p">:</span><span class="w"> </span><span class="l">taxonomy_term</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">ignore_case</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">value_key</span><span class="p">:</span><span class="w"> </span><span class="l">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">bundle</span><span class="p">:</span><span class="w"> </span><span class="l">impact_sdgs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_region</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">entity_generate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">entity_type</span><span class="p">:</span><span class="w"> </span><span class="l">taxonomy_term</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ignore_case</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">value_key</span><span class="p">:</span><span class="w"> </span><span class="l">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;region column or field&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">bundle</span><span class="p">:</span><span class="w"> </span><span class="l">countries_no_standard</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_innovation_type</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">explode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;innovation column or field&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">delimiter</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;-&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">callback</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">callable</span><span class="p">:</span><span class="w"> </span><span class="l">trim</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">entity_lookup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">entity_type</span><span class="p">:</span><span class="w"> </span><span class="l">taxonomy_term</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ignore_case</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">value_key</span><span class="p">:</span><span class="w"> </span><span class="l">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">bundle</span><span class="p">:</span><span class="w"> </span><span class="l">type</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_use_cases</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">explode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;use cases column or field&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">delimiter</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;-&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">callback</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">callable</span><span class="p">:</span><span class="w"> </span><span class="l">trim</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">entity_lookup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">entity_type</span><span class="p">:</span><span class="w"> </span><span class="l">taxonomy_term</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ignore_case</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">value_key</span><span class="p">:</span><span class="w"> </span><span class="l">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">bundle</span><span class="p">:</span><span class="w"> </span><span class="l">use_cases</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_adoption_countries_ns</span><span class="p">:</span><span class="w"> </span><span class="c"># this field is needed in case country names do not follow the UN/FAO - Standards</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">skip_on_empty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">method</span><span class="p">:</span><span class="w"> </span><span class="l">process</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;use cases column or field&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">explode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">delimiter</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;-&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">entity_generate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">entity_type</span><span class="p">:</span><span class="w"> </span><span class="l">taxonomy_term</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">ignore_case</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">value_key</span><span class="p">:</span><span class="w"> </span><span class="l">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">bundle</span><span class="p">:</span><span class="w"> </span><span class="l">countries_no_standard</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">destination</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;entity:node&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">default_bundle</span><span class="p">:</span><span class="w"> </span><span class="l">source_record</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">overwrite_properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">field_data_source</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">field_original_internal_id</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">field_shorter_description/value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">field_long_description/value</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">migration_dependencies</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">required</span><span class="p">:</span><span class="w"> </span>{<span class="w">  </span>}<span class="w">
</span></span></span></code></pre></div><ul>
<li>
<p>The migration has 4 top-level parts:</p>
<ol>
<li>The header sections <code>id</code>, <code>label</code>, etc</li>
<li><code>source</code> describing the source data and its structure</li>
<li><code>process</code> describing how to read, process and pass on the source data fields</li>
<li><code>destination</code> describing where the data is supposed to end up. Just put:</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;entity:node&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">default_bundle</span><span class="p">:</span><span class="w"> </span><span class="l">source_record</span><span class="w">
</span></span></span></code></pre></div></li>
</ul>
<h4 id="minimum-fields-for-migration">Minimum fields for migration</h4>
<p>What should you parse out from the data? What should be there? I think the list below is good for a start:</p>
<ul>
<li><code>title</code></li>
<li><code>field_original_internal_id</code></li>
<li><code>field_shorter_description</code></li>
<li><code>field_long_description</code></li>
</ul>
<ul>
<li>
<p>Additional: Should be sourced from the data</p>
<ul>
<li><code>field_link</code></li>
<li><code>field_owner</code></li>
<li><code>field_impact_sdgs</code></li>
<li><code>field_country_origin</code></li>
<li><code>field_countries_adoption</code></li>
</ul>
</li>
</ul>
<h4 id="drupal-plugins-and-their-use-to-fill-different-fields-in-the-migration">Drupal plugins and their use to fill different fields in the migration</h4>
<ul>
<li>
<p><code>entity_lookup</code>, <code>skip_on_empty</code> and <code>explode</code></p>
<ul>
<li>Example</li>
</ul>
<!-- raw HTML omitted -->
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">field_adoption_countries_ns</span><span class="p">:</span><span class="w"> </span><span class="c"># this field is needed in case country names do not follow the UN/FAO - Standards</span><span class="w">
</span></span></span><span class="line"><span class="cl">-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">skip_on_empty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">method</span><span class="p">:</span><span class="w"> </span><span class="l">process</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">&lt;use cases column or field&gt;</span><span class="w">
</span></span></span><span class="line"><span class="cl">-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">explode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">delimiter</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;-&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl">-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">entity_generate</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">entity_type</span><span class="p">:</span><span class="w"> </span><span class="l">taxonomy_term</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">ignore_case</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">value_key</span><span class="p">:</span><span class="w"> </span><span class="l">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">bundle</span><span class="p">:</span><span class="w"> </span><span class="l">countries_no_standard</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>Explanation:
<ul>
<li>Multiple plugins can be chained like above. The execution order is top-to-bottom. The first plugin must receive the <code>source</code> data column or field.</li>
<li><code>skip_on_empty</code> is a sanity check. If the field/column is not filled for this row or entry, it will simply not be filled (and skipped). This avoids errors when migrating data with empty fields. You need to give it a <code>method:</code> (process or row)</li>
<li><code>explode</code> is used if a field/column contains multiple values. In a csv file it might be that &lsquo;|&rsquo; or &lsquo;-&rsquo; are used as a separator for a &lsquo;unclean&rsquo; field containing more than one value</li>
<li><code>entity_generate</code> generates a new taxonomy term if no exactly matching one can be found (e.g. data uses &lsquo;FAO&rsquo; while taxonomy expects &lsquo;Food and Agriculture Organization of the United Nations&rsquo;. That can either be cleaned up later by manually replacing <em>or</em> one uses ai-mapping logic like is done for the <code>field_adoption_countries_ns</code> entry. It finds the closest real taxonomy term and automatically replaces them</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>
<p><code>static_map</code></p>
<ul>
<li>Example:</li>
</ul>
<!-- raw HTML omitted -->
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl">-<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Often it is necessary to map however sdgs are named in the source data to the STI portal taxonomy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">static_map</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">map</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;1&#39;: &#39;Goal 1</span><span class="p">:</span><span class="w"> </span><span class="kc">No</span><span class="w"> </span><span class="l">poverty&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;2&#39;: &#39;Goal 2</span><span class="p">:</span><span class="w"> </span><span class="l">Zero hunger&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;3&#39;: &#39;Goal 3</span><span class="p">:</span><span class="w"> </span><span class="l">Good health and well-being&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;4&#39;: &#39;Goal 4</span><span class="p">:</span><span class="w"> </span><span class="l">Quality education&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;5&#39;: &#39;Goal 5</span><span class="p">:</span><span class="w"> </span><span class="l">Gender equality&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;6&#39;: &#39;Goal 6</span><span class="p">:</span><span class="w"> </span><span class="l">Clean water and sanitation&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;7&#39;: &#39;Goal 7</span><span class="p">:</span><span class="w"> </span><span class="l">Affordable and clean energy&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;8&#39;: &#39;Goal 8</span><span class="p">:</span><span class="w"> </span><span class="l">Decent work and economic growth&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;9&#39;: &#39;Goal 9</span><span class="p">:</span><span class="w"> </span><span class="l">Industry, innovation and infrastructure&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;10&#39;: &#39;Goal 10</span><span class="p">:</span><span class="w"> </span><span class="l">Reduced inequalities&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;11&#39;: &#39;Goal 11</span><span class="p">:</span><span class="w"> </span><span class="l">Sustainable cities and communities&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;12&#39;: &#39;Goal 12</span><span class="p">:</span><span class="w"> </span><span class="l">Responsible consumption and production&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;13&#39;: &#39;Goal 13</span><span class="p">:</span><span class="w"> </span><span class="l">Climate action&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;14&#39;: &#39;Goal 14</span><span class="p">:</span><span class="w"> </span><span class="l">Life below water&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;15&#39;: &#39;Goal 15</span><span class="p">:</span><span class="w"> </span><span class="l">Life on land&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;16&#39;: &#39;Goal 16</span><span class="p">:</span><span class="w"> </span><span class="l">Peace, justice and strong institutions&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">&#39;17&#39;: &#39;Goal 17</span><span class="p">:</span><span class="w"> </span><span class="l">Partnerships for the goals&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">default_value</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;&#39;</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>Explanation: This plugin works if you can guarantee a one-to-one mapping of how data entries are written in the data source to how they are represented in the taxonomy. On the left-hand side of the colon put the way the entry is written in the data source, on the right side the way its written in the taxonomy. Right-hand side seems to ignore case, but make sure that the entries are written exactly matching to the taxonomy terms.</li>
</ul>
</li>
</ul>
<ul>
<li>
<p><code>entity_lookup</code></p>
<ul>
<li>Example</li>
</ul>
<!-- raw HTML omitted -->
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">field_type_of_information_manage</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">plugin</span><span class="p">:</span><span class="w"> </span><span class="l">entity_lookup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">entity_type</span><span class="p">:</span><span class="w"> </span><span class="l">taxonomy_term</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">ignore_case</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">value_key</span><span class="p">:</span><span class="w"> </span><span class="l">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">source</span><span class="p">:</span><span class="w"> </span><span class="l">constants/RECTYPE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">bundle</span><span class="p">:</span><span class="w"> </span><span class="l">source_entity_types</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>Explanation: Fill in the corresponding term fromt he taxonomy found in the corresponding bundle. This needs to be an exact match, i.e. this step is done after <code>static_map</code> or using a pre-defined constant like in the example.</li>
<li>to find the correct machine name for the bundle in question go to Web menu -&gt; About -&gt; Taxonomies -&gt; &lt;click on taxonomy&gt; -&gt; &lt;click on the taxonomy name/title again&gt;. You should find the Machine name next to the title</li>
</ul>
</li>
</ul>
<ul>
<li></li>
</ul>
<h3 id="content-workflow-imports">Content workflow; Imports</h3>
<ul>
<li>This commands lists all content types&rsquo; machine names</li>
</ul>
<pre tabindex="0"><code class="language-nil" data-lang="nil">  drush eval &#34;print_r(array_keys(\Drupal::entityTypeManager()-&gt;getStorage(&#39;node_type&#39;)-&gt;loadMultiple()));&#34;

Array
(
    [0] =&gt; asti_data
    [1] =&gt; definitions
    [2] =&gt; digital_asset
    [3] =&gt; extracted_entity
    [4] =&gt; initiative
    [5] =&gt; innovation
    [6] =&gt; innovation_core
    [7] =&gt; innovation_extracted_from_origin
    [8] =&gt; internal_content
    [9] =&gt; learning_resource
    [10] =&gt; organization
    [11] =&gt; source_record
    [12] =&gt; taxonomy_description
    [13] =&gt; web_page
    [14] =&gt; website_section
)
</code></pre><ul>
<li>To find out which fields are available for each content type, run</li>
</ul>
<pre tabindex="0"><code class="language-nil" data-lang="nil">drush field:info node &lt;e.g. source_record&gt;
</code></pre><ul>
<li>This will give you an idea which information should ideally already be present when importing the data</li>
<li>To understand what those fields are supposed to contain, you can consult the taxonomy page (Web menu -&gt; About -&gt; Taxonomies -&gt; &lt;e.g. Use Cases&gt;
<ul>
<li>This will help you understand if the data source of choice has a matching taxonomy</li>
</ul>
</li>
</ul>
<h3 id="from-original-record-to-innovation">From Original record to innovation</h3>
<ol>
<li>Web menu -&gt; BACK-END -&gt; manage data sources
<ul>
<li>Search: &lt;your data source&gt;</li>
<li>Edit tag: STI portal data source (also ATIO, should the data be imported into ATIO)</li>
<li>Publish (I encountered problems with the AI-enhancement if I didn&rsquo;t do this)</li>
<li>select if
<ul>
<li>can be overwritten by AI</li>
<li>allow overwriting by original record</li>
<li>allow overwriting by extracted innovation record</li>
</ul>
</li>
</ul>
</li>
<li>Web menu -&gt; BACK-END -&gt; Workflows for original records
<ul>
<li>Source: &lt;your data source&gt; (should auto-complete at this point)</li>
<li>filter</li>
<li>select all</li>
<li>generate/update extracted innovations from original records</li>
</ul>
</li>
<li>Web menu -&gt; BACK-END -&gt; Workflows for ai-extracted innovations
<ol>
<li>Enrich derived innovation record with AI if empty (settings allow a bit less cautious)
<ul>
<li>max 250, better 50 at a time (otherwise you risk a timeout error)</li>
<li>if not loading, change the &lsquo;start&rsquo; in the url for &lsquo;stop&rsquo;: <code>https://sti-portal-prototype.net/stiportal_dev/web/batch?id=3342&amp;op=start</code> -&gt; <code>https://sti-portal-prototype.net/stiportal_dev/web/batch?id=3342&amp;op=stop</code></li>
</ul>
</li>
<li>Generate/update innovation records from AI extracted records
<ul>
<li>to see what can go wrong &amp; how to fix it: <a href="/posts/drupal-documentation/#error-log-ai-enhancement">Error log: AI enhancement</a></li>
</ul>
</li>
<li>Check that the innovations are displayed correctly in the website if you open your data source&rsquo;s collection page</li>
</ol>
</li>
</ol>
<h3 id="notes">Notes</h3>
<ul>
<li>Make sure that there are no duplicates in the source data. This means whatever field is used as &lsquo;id&rsquo; is truly unique. Good candidates are project numbers, urls or, if no alternative, the full title</li>
<li>&lsquo;Titles&rsquo; have a character limit</li>
</ul>
<h2 id="error-log-ai-enhancement">Error log: AI enhancement</h2>
<h3 id="data-source-not-found-in-exception-list">Data source not found in exception list</h3>
<ul>
<li>
<p>Error:</p>
<pre tabindex="0"><code class="language-nil" data-lang="nil">Check action successor current_prov_id (Activity_12o35fp) from ECA VBO - Generate / update AI derived innovation records from original records (process_yoqnpd7) for event eca_vbo.execute.
​- session_user (Entity user/46/wiessalla) - entity (Entity node/source_record/35689/ Corte (Poda) das folhas do coqueiro na região de Bicol)
​- node (Entity node/source_record/35689/ Corte (Poda) das folhas do coqueiro na região de Bicol)
​- except_providers_view (DTO) -
0 (Entity node/digital_asset/28182/Country Annual Report (CAR)) -
1 (Entity node/digital_asset/28184/Digital Agriculture Programme Priority Area (BP5) ) -
2 (Entity node/digital_asset/25260/Seeding The Future Global Food System Innovation Database and Network) -
3 (Entity node/digital_asset/19987/Technologies for African Agricultural Transformation (TAAT)) -
4 (Entity node/digital_asset/20007/World Overview of Conservation Approaches and Technologies (WOCAT)) - exception_provider (DTO &#34;0&#34;) - exceptions_count (DTO &#34;0&#34;) - provider_id_read (DTO &#34;28182&#34;) - provider_id (DTO &#34;28182&#34;) - exception_providers_list (DTO) -
0 (DTO &#34;20007&#34;) - 1 (DTO &#34;19987&#34;) - 2 (DTO &#34;25260&#34;) - 3 (DTO &#34;28184&#34;) -
4 (DTO &#34;28182&#34;) - orig_rec (Entity node/source_record/35689/ Corte (Poda) das folhas do coqueiro na região de Bicol) - rec_sources (DTO) -
0 (Entity node/digital_asset/4/FAO Technologies and Practices for Small Agricultural Producers (TECA))
​- counter (DTO &#34;-17243&#34;) - current_prov_id (NULL) - user (Entity user/1/admin) - event (DTO)
​- view (DTO) - id (string &#34;backend2&#34;) - display_id (string &#34;page_7&#34;) - action (DTO)
​- plugin (string &#34;eca_vbo_execute:generate_update_extracted_innovations_from_original_records&#34;)
​- config (DTO) - operation_name (string &#34;Generate / update extracted innovations from original records&#34;) - message_override (string &#34;&#34;)
​- skip_confirm (integer &#34;0&#34;) - entity (DTO) - id (string &#34;35689&#34;)
​- label (string &#34; Corte (Poda) das folhas do coqueiro na região de Bicol&#34;)
​- type (string &#34;node&#34;) - bundle (string &#34;source_record&#34;) - langcode (string &#34;en&#34;) - machine_name (string &#34;eca_vbo.execute&#34;)
</code></pre><ul>
<li>Explanation: In the example I was trying to add new AI-extracted innovations to the provider &lsquo;TECA&rsquo; with the <code>provider_id</code> 4. This id was not found and not added to the <code>exception_providers_list</code>. The import enters an infinite loop and fails with HTTP Error 500.</li>
<li>Solution: For me, setting the data source&rsquo;s status to &lsquo;published&rsquo; worked</li>
</ul>
</li>
</ul>
<h3 id="cannot-access-offset-of-type-string-on-string">Cannot access offset of type string on string</h3>
<ul>
<li>Error:
<pre tabindex="0"><code class="language-nil" data-lang="nil">ResponseText: The website encountered an unexpected error. Try again later.
TypeError: Cannot access offset of type string on string in Drupal\ai_automators\PluginBaseClasses\Boolean-&gt;verifyValue()
(line 94 of modules/contrib/ai/modules/ai_automators/src/PluginBaseClasses/Boolean.php).
</code></pre></li>
<li>the same error is thrown on line 110
<ul>
<li>Explanation: Some boolean elements in the ECA (such as whether or not the field &lsquo;overwrite existing entries by AI&rsquo; is checked in the data source settings) are apparently passed as strings through the ECA. The Boolean.php of the <code>ai_automators</code> plugin (<code>web/modules/contrib/ai/modules/ai_automators/src/PluginBaseClasses/Boolean.php</code>)</li>
</ul>
</li>
</ul>
<p>takes only arrays in line 94 and 110.</p>
<ul>
<li>Solution: As a hotfix I forced casting every value that is not an array to an array. That seems to work for now
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">public</span> <span class="k">function</span> <span class="nf">verifyValue</span><span class="p">(</span><span class="nx">ContentEntityInterface</span> <span class="nv">$entity</span><span class="p">,</span> <span class="nv">$value</span><span class="p">,</span> <span class="nx">FieldDefinitionInterface</span> <span class="nv">$fieldDefinit</span>    <span class="nx">ion</span><span class="p">,</span> <span class="k">array</span> <span class="nv">$automatorConfig</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Has to be string boolean.
</span></span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">is_array</span><span class="p">(</span><span class="nv">$value</span><span class="p">))</span> <span class="p">{</span> <span class="c1">#! changed
</span></span></span><span class="line"><span class="cl">    <span class="nv">$value</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;value&#39;</span> <span class="o">=&gt;</span> <span class="nv">$value</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">in_array</span><span class="p">(</span><span class="nv">$value</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;TRUE&#39;</span><span class="p">,</span> <span class="s1">&#39;FALSE&#39;</span><span class="p">,</span> <span class="s1">&#39;0&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">]))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">FALSE</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Otherwise it is ok.
</span></span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="k">TRUE</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd">​ * {@inheritDoc}
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="cl"><span class="k">public</span> <span class="k">function</span> <span class="nf">storeValues</span><span class="p">(</span><span class="nx">ContentEntityInterface</span> <span class="nv">$entity</span><span class="p">,</span> <span class="k">array</span> <span class="nv">$values</span><span class="p">,</span> <span class="nx">FieldDefinitionInterface</span> <span class="nv">$field</span>    <span class="nx">Definition</span><span class="p">,</span> <span class="k">array</span> <span class="nv">$automatorConfig</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Transform string to boolean.
</span></span></span><span class="line"><span class="cl">  <span class="k">foreach</span> <span class="p">(</span><span class="nv">$values</span> <span class="k">as</span> <span class="nv">$key</span> <span class="o">=&gt;</span> <span class="nv">$value</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">is_array</span><span class="p">(</span><span class="nv">$value</span><span class="p">))</span> <span class="p">{</span> <span class="c1">#! changed
</span></span></span><span class="line"><span class="cl">      <span class="nv">$value</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;value&#39;</span> <span class="o">=&gt;</span> <span class="nv">$value</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$values</span><span class="p">[</span><span class="nv">$key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">in_array</span><span class="p">(</span><span class="nv">$value</span><span class="p">[</span><span class="s1">&#39;value&#39;</span><span class="p">],</span> <span class="p">[</span><span class="s1">&#39;TRUE&#39;</span><span class="p">,</span> <span class="s1">&#39;1&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span> <span class="o">?</span> <span class="k">TRUE</span> <span class="o">:</span> <span class="k">FALSE</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="c1">// Then set the value.
</span></span></span><span class="line"><span class="cl">  <span class="nv">$entity</span><span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="nv">$fieldDefinition</span><span class="o">-&gt;</span><span class="na">getName</span><span class="p">(),</span> <span class="nv">$values</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">  <span class="k">return</span> <span class="k">TRUE</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></li>
</ul>
<h3 id="openai-api-doesn-t-handle-strings">OpenAI API doesn&rsquo;t handle strings</h3>
<ul>
<li>Error:
<pre tabindex="0"><code class="language-nil" data-lang="nil">TypeError: OpenAI\Responses\Chat\CreateResponse::from():
Argument #1 ($attributes) must be of type array, string given,
called in /home/stiprototype/public_html/stiportal_dev/vendor/openai-php/client/src/Resources/Chat.php on line 35 in OpenAI\Responses\Chat\CreateResponse::from()
(line 46 of /home/stiprototype/public_html/stiportal_dev/vendor/openai-php/client/src/Responses/Chat/CreateResponse.php).
</code></pre></li>
<li>Explanation: Like in <a href="/posts/drupal-documentation/#cannot-access-offset-of-type-string-on-string">this error</a> the ECA that does the AI-enrichment seems to pass a string where an array is expected</li>
<li>Solution:
<ul>
<li>Changing the php code and forcing strings to array could work</li>
<li>Fundamentally, the issue should be addressed in the ECA</li>
<li>Changing the API from OpenAI to Anthropic avoids the issue so I did this</li>
</ul>
</li>
</ul>
<h3 id="examples-of-formatting-errors-when-running-a-migration">Examples of formatting errors when running a migration</h3>
<h4 id="whitespaces-and-different-languages">Whitespaces and different languages</h4>
<ul>
<li>Error:
<pre tabindex="0"><code class="language-nil" data-lang="nil">
#+begin_src
4536 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39;Augst
2006&#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
8363 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39;
2015&#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
8653 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39;February
2016 &#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
8707 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39; April
2016 &#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
2471 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39;August
2015 &#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
2699 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39;May
2013 &#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
2019 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39;May
2011 &#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
2466 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39;March
2005 &#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
2555 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39;March
2018 &#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
10038 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39;May
2015 &#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
10126 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39; April
2021&#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
10105 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39;Février
2015&#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
10106 1 teca:field_information_resource_date:format_date: Format date plugin could not transform &#39;Février
2015&#39; using the format &#39;F Y&#39;. Error: The date cannot be created from a format.
</code></pre></li>
<li>Explanation:
<ol>
<li>Some entries don&rsquo;t follow the general formatting of &lsquo;F Y&rsquo; (written month in English and Year)</li>
<li>Some entries have trailing or leading whitespaces. In this particular case the <code>trim</code> function of Drupal migrate didn&rsquo;t remove them, because they are non-standard whitespaces</li>
<li>Some Month names are written in French</li>
</ol>
</li>
<li>Solution: In this case it was only a handful of entries and I fixed them manually. In general this should be flagged to whoever was/is curating the original data</li>
</ul>
<h3 id="gemini-api-changed">Gemini API changed</h3>
<ul>
<li>this seems to be the case quite often</li>
<li></li>
</ul>
<h3 id="drupal-stuck-looking-for-a-broken-twig-files">Drupal stuck looking for a broken twig files</h3>
<ul>
<li>Error:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">2285210</span>   05/Nov 12:55   php      Error      Twig<span class="se">\E</span>rror<span class="se">\L</span>oaderError: Template <span class="s2">&#34;.html.twig&#34;</span> is not defined. in
</span></span><span class="line"><span class="cl">                                        Twig<span class="se">\L</span>oader<span class="se">\C</span>hainLoader-&gt;getCacheKey<span class="o">()</span> <span class="o">(</span>line <span class="m">38</span> of
</span></span><span class="line"><span class="cl">                                        /var/www/html/web/themes/custom/fao/templates/block/block--views.h
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">                                        tml.twig
</span></span></code></pre></div>This manifested itself in completely blocking all DB operations (<code>cim</code>, <code>cex</code>, <code>cr</code>) and resulting in Drupal not being able to serve the site anymore</li>
</ul>
<ul>
<li>Explanation: Whenever Drupal renders anything — even an admin page, a Drush command, or a cron job — it loads the theme registry: A huge PHP array mapping every template name to the file that implements it. That registry is stored in the <code>cache_discovery</code> table and rebuilt whenever:
<ul>
<li>You clear caches (drush cr)</li>
<li>You export/import config (drush cex / cim)</li>
<li>You install or update modules/themes</li>
</ul>
</li>
</ul>
<p>So even Drush CLI commands (which don’t render HTML) still invoke the theme system during bootstrapping.</p>
<ul>
<li>Solution:</li>
</ul>
<p>Remove the offending file and rebuild the cache</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">rm /var/www/html/web/themes/custom/fao/templates/block/block--views.html.twig
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">drush cr
</span></span></code></pre></div><ul>
<li>In the future <code>drush theme:debug</code> could point out those errors before loading the theme into the cache</li>
</ul>
<h4 id="d41d8c"></h4>
<h2 id="how-to-change-taxonomy-terms">How to change taxonomy terms <!-- raw HTML omitted --><!-- raw HTML omitted -->drupal<!-- raw HTML omitted --><!-- raw HTML omitted --></h2>
<ul>
<li>Web menu -&gt; Structure -&gt; Taxonomy -&gt; &lt;AFS innovation use cases&gt;</li>
</ul>
<h3 id="custom-taxonomy">Custom Taxonomy</h3>
<ul>
<li>Structure -&gt; Taxonomy -&gt; Create vocabulary</li>
<li>Add terms manually one by one
<ul>
<li>Faster alternative (deactivated): Extend -&gt; Taxonomy Manager
<ol>
<li>Install</li>
<li>Structure -&gt; Taxonomy Manager -&gt; &lt;new category&gt; -&gt; paste \n - separated list</li>
<li>Structure -&gt; Content types -&gt; original record -&gt; create new fields</li>
<li>Structure -&gt; Content types -&gt; ai-extracted record -&gt; create new fields</li>
<li>Structure -&gt; Content types -&gt; innovation -&gt; create new fields</li>
<li>Change ECA; add the new</li>
</ol>
</li>
</ul>
</li>
</ul>
<h2 id="installing-custom-modules">Installing custom modules <!-- raw HTML omitted --><!-- raw HTML omitted -->drupal<!-- raw HTML omitted --><!-- raw HTML omitted --></h2>
<ul>
<li>The default location for custom modules is <code>web/modules/custom/&lt;your module&gt;</code></li>
<li>The minimum set of files is
<ul>
<li><code>&lt;your module&gt;.info.yml</code> : Metadata and description of the module dependencies. What is the module?</li>
<li><code>&lt;your module&gt;.libraries.yml</code> : Describes location of css/js and other library files. Lists other plugin dependencies.</li>
<li><code>&lt;your module&gt;.module</code> (php syntax): Optional. Adds a php hook (function) controlling when and how the library will be activated</li>
</ul>
</li>
<li>Additionally, you might have a <code>css</code> and <code>js</code> folder in the module structure providing custom code and styling</li>
<li>The steps to activate your module are
<ol>
<li>Install all necessary dependencies using <code>composer require</code> and <code>drush en</code></li>
<li>Create/write your module file structure and put it in <code>modules/custom</code></li>
<li><code>drush en &lt;your module&gt; -y</code></li>
</ol>
</li>
<li>If your module is changing the behavior of other custom modules you should add it in the <code>dependencies:</code> field there. E.g. if you change theming, just add your module to your custom themes <code>.libraries.yml</code> file</li>
</ul>
<h3 id="project-structure">Project structure</h3>
<ul>
<li>A minimal working example project structure could be:</li>
</ul>
<pre tabindex="0"><code class="language-nil" data-lang="nil">web/modules/custom/sti_leaflet/
├── js/
│   └── custom_cluster_icons.js
├── sti_leaflet.info.yml
├── sti_leaflet.libraries.yml
└── sti_leaflet.module
</code></pre><ul>
<li>Additional you might need
<ul>
<li>/css        → Custom styling</li>
<li>/js         → JavaScript behaviors or logic</li>
<li>/templates  → Twig overrides</li>
<li><em>/src</em>       → PHP classes (services, plugins, controllers, etc.)</li>
</ul>
</li>
</ul>
<h2 id="setting-up-a-new-server-instance">Setting up a new server instance</h2>
<p>Now, all user-changed drupal code (mostly js, twg, yml and php/module) is now on <a href="https://github.com/un-fao/fao-sti-portal">FAO&rsquo;s github repository</a>. &lsquo;Main&rsquo; is currently tracking our &lsquo;review&rsquo; server.</p>
<h3 id="server-roles">Server roles</h3>
<table>
  <thead>
      <tr>
          <th>Server Name</th>
          <th>Role</th>
          <th>Hosted</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>test</td>
          <td>playground; obsolete</td>
          <td>private</td>
      </tr>
      <tr>
          <td>dev</td>
          <td>staging ground for changes made trough gui</td>
          <td>private</td>
      </tr>
      <tr>
          <td>review</td>
          <td>mirrors production, test for changes pulled from dev</td>
          <td>gcloud</td>
      </tr>
      <tr>
          <td>production</td>
          <td>user-facing, pulls only from review</td>
          <td>gcloud</td>
      </tr>
  </tbody>
</table>
<h3 id="steps-to-get-new-server-instance">Steps to get new server instance</h3>
<ul>
<li>Precondition is that the necessary tech stack is installed (php, drupal, etc). Here a link to a [[][shell.nix development environment]]</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Get upstream config</span>
</span></span><span class="line"><span class="cl">git clone git@github.com:valeriapesce/ATIO-KB-harvesting-IRD.git
</span></span><span class="line"><span class="cl"><span class="c1"># Get the non-tracked files (images, etc)</span>
</span></span><span class="line"><span class="cl">./sync.sh &lt;user&gt;@review:&lt;path to drupal root&gt; fao-sti-portal
</span></span><span class="line"><span class="cl"><span class="c1"># Install dependencies speciefied in composer.lock</span>
</span></span><span class="line"><span class="cl">composer install --no-interaction --prefer-dist
</span></span><span class="line"><span class="cl"><span class="c1"># Run the server</span>
</span></span><span class="line"><span class="cl">vendor/bin/drush serve 127.0.0.1:5050
</span></span></code></pre></div><h3 id="sync-dot-sh-file">sync.sh file</h3>
<p>Under development, will be added to the github repo</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">  <span class="c1">#!/usr/bin/env bash</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Safely sync environment-specific Drupal config and file directories</span>
</span></span><span class="line"><span class="cl"><span class="c1"># from one local Drupal root to another.</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Usage:</span>
</span></span><span class="line"><span class="cl"><span class="c1">#   ./sync.sh /path/to/source/drupal/root /path/to/target/drupal/root</span>
</span></span><span class="line"><span class="cl"><span class="c1">#</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">set</span> -euo pipefail
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="nv">$#</span> -ne <span class="m">2</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;Usage: </span><span class="nv">$0</span><span class="s2"> /path/to/source/drupal/root /path/to/target/drupal/root&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">exit</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">SRC</span><span class="o">=</span><span class="k">$(</span>realpath <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">DST</span><span class="o">=</span><span class="k">$(</span>realpath <span class="s2">&#34;</span><span class="nv">$2</span><span class="s2">&#34;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> ! -d <span class="s2">&#34;</span><span class="nv">$SRC</span><span class="s2">/web/sites&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">  <span class="nb">echo</span> <span class="s2">&#34;Error: Source Drupal root &#39;</span><span class="nv">$SRC</span><span class="s2">&#39; does not appear to contain web/sites/&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nb">exit</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">mkdir -p <span class="s2">&#34;</span><span class="nv">$DST</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;&gt;&gt;&gt; Syncing from:&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;    </span><span class="nv">$SRC</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;&gt;&gt;&gt; To:&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;    </span><span class="nv">$DST</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Explicit file list (relative to Drupal root)</span>
</span></span><span class="line"><span class="cl"><span class="nv">FILES</span><span class="o">=(</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;web/sites/config_UayHOzMAbX_oN-5FQkTXdB6Ot6tWDOFLY6ljN5FFOQ0bKajw9MX6UFRsu0IsRTqQ-C9vQ4_kng/sync/key.key.anthropic_atiokb.yml&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;web/sites/config_UayHOzMAbX_oN-5FQkTXdB6Ot6tWDOFLY6ljN5FFOQ0bKajw9MX6UFRsu0IsRTqQ-C9vQ4_kng/sync/key.key.google_ai.yml&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;web/sites/config_UayHOzMAbX_oN-5FQkTXdB6Ot6tWDOFLY6ljN5FFOQ0bKajw9MX6UFRsu0IsRTqQ-C9vQ4_kng/sync/key.key.milvus_zilliz.yml&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;web/sites/config_UayHOzMAbX_oN-5FQkTXdB6Ot6tWDOFLY6ljN5FFOQ0bKajw9MX6UFRsu0IsRTqQ-C9vQ4_kng/sync/key.key.openai_api_key.yml&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Directory patterns</span>
</span></span><span class="line"><span class="cl"><span class="nv">DIRS</span><span class="o">=(</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;web/sites/*/*settings*.php&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;web/sites/*/*services*.yml&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;web/sites/*/files&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;web/sites/*/public&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;web/sites/*/private&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;web/sites/*/files-public&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;web/sites/*/files-private&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;&gt;&gt;&gt; Starting sync...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Copy individual files (if missing)</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> relpath in <span class="s2">&#34;</span><span class="si">${</span><span class="nv">FILES</span><span class="p">[@]</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">  <span class="nv">src</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$SRC</span><span class="s2">/</span><span class="nv">$relpath</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="nv">dst</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$DST</span><span class="s2">/</span><span class="nv">$relpath</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="o">[[</span> -f <span class="s2">&#34;</span><span class="nv">$src</span><span class="s2">&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    mkdir -p <span class="s2">&#34;</span><span class="k">$(</span>dirname <span class="s2">&#34;</span><span class="nv">$dst</span><span class="s2">&#34;</span><span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[[</span> ! -f <span class="s2">&#34;</span><span class="nv">$dst</span><span class="s2">&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">      <span class="nb">echo</span> <span class="s2">&#34;Copying file: </span><span class="nv">$relpath</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">      rsync -a <span class="s2">&#34;</span><span class="nv">$src</span><span class="s2">&#34;</span> <span class="s2">&#34;</span><span class="nv">$dst</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">else</span>
</span></span><span class="line"><span class="cl">      <span class="nb">echo</span> <span class="s2">&#34;Skipping (already exists): </span><span class="nv">$relpath</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">  <span class="k">else</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;Missing source file: </span><span class="nv">$relpath</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Copy directories and pattern-matched files</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> pattern in <span class="s2">&#34;</span><span class="si">${</span><span class="nv">DIRS</span><span class="p">[@]</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">  <span class="k">for</span> path in <span class="s2">&#34;</span><span class="nv">$SRC</span><span class="s2">&#34;</span>/<span class="nv">$pattern</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[[</span> -e <span class="s2">&#34;</span><span class="nv">$path</span><span class="s2">&#34;</span> <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">      <span class="nv">relpath</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">path</span><span class="p">#</span><span class="nv">$SRC</span><span class="p">/</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="nv">src</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$path</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="nv">dst</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$DST</span><span class="s2">/</span><span class="nv">$relpath</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">      mkdir -p <span class="s2">&#34;</span><span class="k">$(</span>dirname <span class="s2">&#34;</span><span class="nv">$dst</span><span class="s2">&#34;</span><span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="nb">echo</span> <span class="s2">&#34;Syncing: </span><span class="nv">$relpath</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">      rsync -a --ignore-existing <span class="s2">&#34;</span><span class="nv">$src</span><span class="s2">&#34;</span> <span class="s2">&#34;</span><span class="nv">$dst</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">  <span class="k">done</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;&gt;&gt;&gt; Sync complete!&#34;</span>
</span></span></code></pre></div><ul>
<li>I had to add this, since there still is a bug in the script</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mv sites/default/files/files/* sites/default/files
</span></span><span class="line"><span class="cl">mv sites/default/files/files/.* sites/default/files
</span></span></code></pre></div><h2 id="vs-code-configuration-to-connect-to-gcloud">VS Code configuration to connect to gcloud</h2>
<p>There are <a href="https://stackoverflow.com/questions/64379563/how-to-connect-vscode-to-gcp-instances">a couple of ways</a> to edit your <code>~/.ssh/config</code> file so that the Remote Explorer in VSCode connects to your google cloud instance.</p>
<h3 id="direct-editing-using-the-google-cloud-sdk">Direct editing using the google cloud sdk</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gcloud compute config-ssh
</span></span></code></pre></div><p>This command writes host entries to your local ~/.ssh/config like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Host my-instance.us-central1-a.my-project
</span></span><span class="line"><span class="cl">    HostName 34.72.x.x
</span></span><span class="line"><span class="cl">    IdentityFile ~/.ssh/google_compute_engine <span class="c1">#this file exists after connecting to the vm the first time</span>
</span></span><span class="line"><span class="cl">    User my-username
</span></span><span class="line"><span class="cl">    CheckHostIP no
</span></span><span class="line"><span class="cl">    StrictHostKeyChecking no
</span></span></code></pre></div><p>So you can just `ssh my-instance.us-central1-a.my-project` directly without remembering zones or IPs.
See: <a href="https://cloud.google.com/sdk/gcloud/reference/compute/config-ssh">https://cloud.google.com/sdk/gcloud/reference/compute/config-ssh</a></p>
<h3 id="using-a-proxy-command-in-the-ssh-config">Using a Proxy Command in the ssh config</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">TUNNEL_PORT</span><span class="o">=</span><span class="m">2222</span>
</span></span><span class="line"><span class="cl"><span class="nv">VM_NAME</span><span class="o">=</span>drupal-vm
</span></span><span class="line"><span class="cl"><span class="nv">PROJECT</span><span class="o">=</span>fao-sti-review
</span></span><span class="line"><span class="cl"><span class="nv">ZONE</span><span class="o">=</span>europe-west1-b
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Host <span class="nv">$VM_NAME</span>
</span></span><span class="line"><span class="cl">  User &lt;your remote user name&gt;
</span></span><span class="line"><span class="cl">  IdentityFile ~/.ssh/google_compute_engine
</span></span><span class="line"><span class="cl">  ProxyCommand gcloud compute start-iap-tunnel %h <span class="m">22</span> --listen-on-stdin --project<span class="o">=</span><span class="nv">$PROJECT</span> --zone<span class="o">=</span><span class="nv">$ZONE</span>
</span></span></code></pre></div><p>See: <a href="https://unix.stackexchange.com/questions/590957/ssh-config-to-start-session-with-google-cloud-compute-instance?utm_source=chatgpt.com">https://unix.stackexchange.com/questions/590957/ssh-config-to-start-session-with-google-cloud-compute-instance?utm_source=chatgpt.com</a></p>
<h3 id="opening-a-tunnel-and-specifying-the-tunnel-s-port-on-localhost">Opening a tunnel and specifying the tunnel&rsquo;s port on localhost</h3>
<p>If you specify your ssh connection in the config like:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">Host drupal-fao
</span></span><span class="line"><span class="cl">  User &lt;your remote user name&gt;
</span></span><span class="line"><span class="cl">  HostName localhost
</span></span><span class="line"><span class="cl">  IdentityFile /home/&lt;your <span class="nb">local</span> user name&gt;/.ssh/google_compute_engine
</span></span><span class="line"><span class="cl">  Port <span class="m">2222</span>
</span></span><span class="line"><span class="cl">  ForwardAgent yes
</span></span></code></pre></div><p>Then you can open the tunnel like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nv">TUNNEL_PORT</span><span class="o">=</span><span class="m">2222</span>
</span></span><span class="line"><span class="cl"><span class="nv">VM_NAME</span><span class="o">=</span>drupal-vm
</span></span><span class="line"><span class="cl"><span class="nv">PROJECT</span><span class="o">=</span>fao-sti-review
</span></span><span class="line"><span class="cl"><span class="nv">ZONE</span><span class="o">=</span>europe-west1-b
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">gcloud compute start-iap-tunnel <span class="s2">&#34;</span><span class="nv">$VM_NAME</span><span class="s2">&#34;</span> <span class="m">22</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --local-host-port<span class="o">=</span>localhost:<span class="nv">$TUNNEL_PORT</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --project<span class="o">=</span><span class="s2">&#34;</span><span class="nv">$PROJECT</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --zone<span class="o">=</span><span class="s2">&#34;</span><span class="nv">$ZONE</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  --quiet
</span></span></code></pre></div><p>Afterwards you can connect through vscode and <code>ssh drupal-fao</code> works automatically</p>
<h2 id="set-up-new-instance">Set up new instance</h2>
<ol>
<li>Prepare mysql</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">USER</span><span class="w"> </span><span class="s1">&#39;drupal_user&#39;</span><span class="o">@</span><span class="s1">&#39;localhost&#39;</span><span class="w"> </span><span class="n">IDENTIFIED</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="o">&lt;</span><span class="n">password</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">settings</span><span class="p">.</span><span class="n">php</span><span class="o">&gt;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">GRANT</span><span class="w"> </span><span class="k">ALL</span><span class="w"> </span><span class="k">PRIVILEGES</span><span class="w"> </span><span class="k">ON</span><span class="w"> </span><span class="n">drupal</span><span class="p">.</span><span class="o">*</span><span class="w"> </span><span class="k">TO</span><span class="w"> </span><span class="s1">&#39;drupal_user&#39;</span><span class="o">@</span><span class="s1">&#39;localhost&#39;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="n">FLUSH</span><span class="w"> </span><span class="k">PRIVILEGES</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">DATABASE</span><span class="w"> </span><span class="n">drupal</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><ol>
<li>Get the code</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">git clone git@github.com:un-fao/fao-sti-portal.git
</span></span></code></pre></div><ol>
<li>Get the files</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sync.sh fao-review:/var/www/html/ ./sti-portal-fao <span class="c1">#replace fao-review with whatever is in your .ssh/config</span>
</span></span></code></pre></div><ol>
<li>Get the DB</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Get the latest DB dump here: https://console.cloud.google.com/storage/browser/fao-sti-review-backups;tab=objects?q=search&amp;referrer=search&amp;project=fao-sti-review&amp;prefix=&amp;forceOnObjectsSortingFiltering=false</span>
</span></span><span class="line"><span class="cl">mysql -u drupal_user -p drupal &lt; ~/Downloads/&lt;your recent backup&gt;.sql
</span></span></code></pre></div><ol>
<li>Finish</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">vendor/bin/drush cr
</span></span><span class="line"><span class="cl">vendor/bin/drush serve 127.0.0.1:8080
</span></span></code></pre></div><h2 id="styling">Styling</h2>
<h3 id="new-view-display">New view display</h3>
<ul>
<li>Task: Change the layout of the popup cards in the leaflet map view. (Remove the image).</li>
<li>Steps to solve:
<ol>
<li>Create a <code>View Mode</code>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">langcode</span><span class="p">:</span><span class="w"> </span><span class="l">en</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">status</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">dependencies</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">module</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - node</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l">node.map_teaser</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">label</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;Map teaser&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;Used for Leaflet popups.&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">targetEntityType</span><span class="p">:</span><span class="w"> </span><span class="l">node</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">cache</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></div></li>
<li>Create a <code>Entity View Display</code>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">langcode</span><span class="p">:</span><span class="w"> </span><span class="l">en</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">status</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">dependencies</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - core.entity_view_mode.node.map_teaser</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.ai_automator_status</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.body</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_actual_users</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_adoptability_dimensions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_adoption_description</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_adoption_level</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_afs_stf_areas</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_ai_stamp</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_allow_ai_update</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_allow_ai_update_if_empty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_allow_overwr_if_empty</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_allow_overwriting_by_origi</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_areas_of_expertise</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_areas_of_need</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_atio_innovation_category</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_atio_kb_source</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_award_year</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_bib_citation_of_pub</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_challenges_addressed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_city</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_collection</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_countries_adoption</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_country_origin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_curation_notes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_data_source</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_description_markup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_display_mode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_entity_creation_mode</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_environmental_impact</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_ffs_type</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_grassroot_partner</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_grassroots_innovation_narr</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_human_impact</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_identifying_feature</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_if_grassroots</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_impact_sdgs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_inclusion_and_representati</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_info_on_partial_editing</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_information_resource_date</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_innovation_domain</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_innovation_stage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_innovation_type</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_innovative_elements_narrat</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_innovative_features</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_investment_type</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_languages</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_long_term_beneficiaries</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_original_descr_markup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_original_extracted_innovat</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_owner</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_partners</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_prospective_users</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_readiness_description</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_readiness_level</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_record_long_metadata</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_record_metadata</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_record_status</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_region</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_related_innovation_core</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_scaling_level_idia</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_shorter_description</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_sponsors</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_start_date</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_start_year</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_state</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_stf_development_status</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_stf_level_of_recognition</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_stf_organization_size</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_stf_organization_type</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_thematic_area</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_title_instructions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_url_s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_use_case_image</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_use_cases</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - field.field.node.innovation.field_use_cases_description</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - node.type.innovation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">module</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="l">​    - text</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">id</span><span class="p">:</span><span class="w"> </span><span class="l">node.innovation.map_teaser</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">targetEntityType</span><span class="p">:</span><span class="w"> </span><span class="l">node</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">bundle</span><span class="p">:</span><span class="w"> </span><span class="l">innovation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="l">map_teaser</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">content</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_ai_disclaimer</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">markup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">label</span><span class="p">:</span><span class="w"> </span><span class="l">hidden</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">settings</span><span class="p">:</span><span class="w"> </span>{<span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">third_party_settings</span><span class="p">:</span><span class="w"> </span>{<span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">region</span><span class="p">:</span><span class="w"> </span><span class="l">content</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_country_origin</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">entity_reference_label</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">label</span><span class="p">:</span><span class="w"> </span><span class="l">above</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">settings</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">link</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">third_party_settings</span><span class="p">:</span><span class="w"> </span>{<span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">region</span><span class="p">:</span><span class="w"> </span><span class="l">content</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_data_source</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">entity_reference_label</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">label</span><span class="p">:</span><span class="w"> </span><span class="l">above</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">settings</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">link</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">third_party_settings</span><span class="p">:</span><span class="w"> </span>{<span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">region</span><span class="p">:</span><span class="w"> </span><span class="l">content</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_shorter_description</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">text_default</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">label</span><span class="p">:</span><span class="w"> </span><span class="l">above</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">settings</span><span class="p">:</span><span class="w"> </span>{<span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">third_party_settings</span><span class="p">:</span><span class="w"> </span>{<span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">region</span><span class="p">:</span><span class="w"> </span><span class="l">content</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">title</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">label</span><span class="p">:</span><span class="w"> </span><span class="l">above</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">settings</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">link_to_entity</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">third_party_settings</span><span class="p">:</span><span class="w"> </span>{<span class="w">  </span>}<span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">region</span><span class="p">:</span><span class="w"> </span><span class="l">content</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">hidden</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">ai_automator_status</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">body</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">content_moderation_control</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">created</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_actual_users</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_adoptability_dimensions</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_adoption_description</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_adoption_level</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_afs_stf_areas</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_ai_stamp</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_allow_ai_update</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_allow_ai_update_if_empty</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_allow_overwr_if_empty</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_allow_overwriting_by_origi</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_areas_of_expertise</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_areas_of_need</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_atio_innovation_category</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_atio_kb_source</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_award_year</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_bib_citation_of_pub</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_challenges_addressed</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_city</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_collection</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_countries_adoption</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_curation_notes</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_description_markup</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_display_mode</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_entity_creation_mode</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_environmental_impact</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_ffs_type</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_grassroot_partner</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_grassroots_innovation_narr</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_human_impact</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_identifying_feature</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_if_grassroots</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_impact_sdgs</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_inclusion_and_representati</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_info_on_partial_editing</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_information_resource_date</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_innovation_domain</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_innovation_stage</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_innovation_type</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_innovative_elements_narrat</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_innovative_features</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_investment_type</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_languages</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_long_term_beneficiaries</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_original_descr_markup</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_original_extracted_innovat</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_owner</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_partners</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_prospective_users</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_readiness_description</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_readiness_level</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_record_long_metadata</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_record_metadata</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_record_status</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_region</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_related_innovation_core</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_scaling_level_idia</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_sponsors</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_start_date</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_start_year</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_state</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_stf_development_status</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_stf_level_of_recognition</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_stf_organization_size</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_stf_organization_type</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_thematic_area</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_title_instructions</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_url_s</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_use_case_image</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_use_cases</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_use_cases_description</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">field_variant</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">langcode</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">links</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">search_api_excerpt</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">synonyms</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">uid</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></div></li>
<li>Manage the content display (<code>admin/structure/types/manage/innovation/display/</code>)
<ul>
<li>If you imported working configs like above not needed</li>
<li>Check that under tab <code>default</code>, your new display is checked under <code>Custom display settings</code> (all the way at the bottom of the page)</li>
</ul>
</li>
<li>Apply a corresponding twig template, in this case: <code>/var/www/html/web/themes/custom/fao/templates/content/node--innovation--map-teaser.html.twig</code>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-twig" data-lang="twig"><span class="line"><span class="cl"><span class="x">         </span><span class="c">{#
</span></span></span><span class="line"><span class="cl"><span class="c">/**
</span></span></span><span class="line"><span class="cl"><span class="c">​ * @file
</span></span></span><span class="line"><span class="cl"><span class="c">​ * Default theme implementation to display a node.
</span></span></span><span class="line"><span class="cl"><span class="c"> *
</span></span></span><span class="line"><span class="cl"><span class="c">​ * Available variables:
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - node: The node entity with limited access to object properties and methods.
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   Only method names starting with &#34;get&#34;, &#34;has&#34;, or &#34;is&#34; and a few common
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   methods such as &#34;id&#34;, &#34;label&#34;, and &#34;bundle&#34; are available. For example:
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   - node.getCreatedTime() will return the node creation timestamp.
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   - node.hasField(&#39;field_example&#39;) returns TRUE if the node bundle includes
</span></span></span><span class="line"><span class="cl"><span class="c">​ *     field_example. (This does not indicate the presence of a value in this
</span></span></span><span class="line"><span class="cl"><span class="c">​ *     field.)
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   - node.isPublished() will return whether the node is published or not.
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   Calling other methods, such as node.delete(), will result in an exception.
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   See \Drupal\node\Entity\Node for a full list of public properties and
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   methods for the node object.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - label: (optional) The title of the node.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - content: All node items. Use {{ content }} to print them all,
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   or print a subset such as {{ content.field_example }}. Use
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   {{ content|without(&#39;field_example&#39;) }} to temporarily suppress the printing
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   of a given child element.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - author_picture: The node author user entity, rendered using the &#34;compact&#34;
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   view mode.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - metadata: Metadata for this node.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - date: (optional) Themed creation date field.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - author_name: (optional) Themed author name field.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - url: Direct URL of the current node.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - display_submitted: Whether submission information should be displayed.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - attributes: HTML attributes for the containing element.
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   The attributes.class element may contain one or more of the following
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   classes:
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   - node: The current template type (also known as a &#34;theming hook&#34;).
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   - node--type-[type]: The current node type. For example, if the node is an
</span></span></span><span class="line"><span class="cl"><span class="c">​ *     &#34;Article&#34; it would result in &#34;node--type-article&#34;. Note that the machine
</span></span></span><span class="line"><span class="cl"><span class="c">​ *     name will often be in a short form of the human readable label.
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   - node--view-mode-[view_mode]: The View Mode of the node; for example, a
</span></span></span><span class="line"><span class="cl"><span class="c">​ *     teaser would result in: &#34;node--view-mode-teaser&#34;, and
</span></span></span><span class="line"><span class="cl"><span class="c">​ *     full: &#34;node--view-mode-full&#34;.
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   The following are controlled through the node publishing options.
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   - node--promoted: Appears on nodes promoted to the front page.
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   - node--sticky: Appears on nodes ordered above other non-sticky nodes in
</span></span></span><span class="line"><span class="cl"><span class="c">​ *     teaser listings.
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   - node--unpublished: Appears on unpublished nodes visible only to site
</span></span></span><span class="line"><span class="cl"><span class="c">​ *     admins.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - title_attributes: Same as attributes, except applied to the main title
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   tag that appears in the template.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - content_attributes: Same as attributes, except applied to the main
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   content tag that appears in the template.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - author_attributes: Same as attributes, except applied to the author of
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   the node tag that appears in the template.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - title_prefix: Additional output populated by modules, intended to be
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   displayed in front of the main title tag that appears in the template.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - title_suffix: Additional output populated by modules, intended to be
</span></span></span><span class="line"><span class="cl"><span class="c">​ *   displayed after the main title tag that appears in the template.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - view_mode: View mode; for example, &#34;teaser&#34; or &#34;full&#34;.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - teaser: Flag for the teaser state. Will be true if view_mode is &#39;teaser&#39;.
</span></span></span><span class="line"><span class="cl"><span class="c">​ * - page: Flag for the full page state. Will be true if view_mode is &#39;full&#39;.
</span></span></span><span class="line"><span class="cl"><span class="c"> *
</span></span></span><span class="line"><span class="cl"><span class="c">​ * @see template_preprocess_node()
</span></span></span><span class="line"><span class="cl"><span class="c"> *
</span></span></span><span class="line"><span class="cl"><span class="c">​ * @ingroup themeable
</span></span></span><span class="line"><span class="cl"><span class="c"> */
</span></span></span><span class="line"><span class="cl"><span class="c">#}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="cp">{%</span> <span class="k">set</span> <span class="nv">classes</span> <span class="o">=</span> <span class="o">[</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;card&#39;</span><span class="o">,</span>
</span></span><span class="line"><span class="cl">  <span class="s1">&#39;card-events&#39;</span>
</span></span><span class="line"><span class="cl"><span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="cp">%}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span> <span class="nv">attach_library</span><span class="o">(</span><span class="s1">&#39;fao/maps&#39;</span><span class="o">)</span> <span class="cp">}}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">&lt;article</span><span class="cp">{{</span> <span class="nv">attributes.addClass</span><span class="o">(</span><span class="nv">classes</span><span class="o">)</span> <span class="cp">}}</span><span class="x">&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">  </span><span class="cp">{{</span> <span class="nv">title_prefix</span> <span class="cp">}}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">  </span><span class="cp">{{</span> <span class="nv">title_suffix</span> <span class="cp">}}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">  </span><span class="c">{# &lt;div class=&#34;card-image ratio ratio-3x2&#34;&gt; #}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">    </span><span class="c">{# {{ content.field_use_case_image }} #}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">  </span><span class="c">{# &lt;/div&gt; #}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">  &lt;div class=&#34;card-body&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">    &lt;h6 class=&#34;title-category &#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">    </span><span class="cp">{{</span> <span class="nv">node.field_innovation_type</span><span class="m">.0</span><span class="nv">.entity.name.value</span> <span class="cp">}}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">    &lt;/h6&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">    &lt;h5 class=&#34;card-title&#34;&gt;&lt;a href=&#34;</span><span class="cp">{{</span> <span class="nv">url</span> <span class="cp">}}</span><span class="x">&#34; class=&#34;title-link&#34;&gt;</span><span class="cp">{{</span> <span class="nv">node.title.value</span> <span class="cp">}}</span><span class="x">&lt;/a&gt;&lt;/h5&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">    &lt;h6 class=&#34;date-location card-date-location&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">      &lt;span class=&#34;location&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">        </span><span class="cp">{%</span> <span class="k">if</span> <span class="nv">content.field_country_origin</span><span class="o">|</span><span class="nf">render</span><span class="o">|</span><span class="nf">trim</span> <span class="cp">%}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">          &lt;i class=&#34;bi bi-geo-alt-fill&#34;&gt;&lt;/i&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">          </span><span class="cp">{{</span> <span class="nv">content.field_country_origin</span> <span class="cp">}}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">        </span><span class="cp">{%</span> <span class="k">endif</span> <span class="cp">%}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">        &lt;span class=&#34;date&#34;&gt;</span><span class="cp">{{</span> <span class="nv">node.getCreatedTime</span><span class="o">()|</span><span class="nf">date</span><span class="o">(</span><span class="s1">&#39;d/m/Y&#39;</span><span class="o">)</span> <span class="cp">}}</span><span class="x">&lt;/span&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">      &lt;/span&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">    &lt;/h6&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">    &lt;div class=&#34;card-text&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">      </span><span class="cp">{{</span> <span class="nv">content.field_shorter_description</span> <span class="cp">}}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">    &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">    &lt;div class=&#34;classifications card-classifications&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">      </span><span class="cp">{{</span> <span class="nv">content.field_innovation_type</span> <span class="cp">}}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">      </span><span class="cp">{{</span> <span class="nv">content.field_use_cases</span> <span class="cp">}}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">      </span><span class="cp">{%</span> <span class="k">if</span> <span class="nv">sdgs</span> <span class="cp">%}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">      &lt;div class=&#34;sdg-list&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">        </span><span class="cp">{%</span> <span class="k">for</span> <span class="nv">sdg</span> <span class="k">in</span> <span class="nv">sdgs</span> <span class="cp">%}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">          &lt;a href=&#34;</span><span class="cp">{{</span> <span class="nv">sdg.url</span> <span class="cp">}}</span><span class="x">&#34; class=&#34;sdg-small text-white text-decoration-none </span><span class="cp">{{</span> <span class="nv">sdg.class</span> <span class="cp">}}</span><span class="x">&#34;&gt;&lt;/a&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">        </span><span class="cp">{%</span> <span class="k">endfor</span> <span class="cp">%}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">      &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">      </span><span class="cp">{%</span> <span class="k">endif</span> <span class="cp">%}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">    &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">    </span><span class="cp">{{</span> <span class="nv">content.field_data_source</span> <span class="cp">}}</span><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="x">  &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">&lt;/article&gt;
</span></span></span><span class="line"><span class="cl"><span class="x">
</span></span></span><span class="line"><span class="cl"><span class="c">{#
</span></span></span><span class="line"><span class="cl"><span class="c">  Custom template for Innovation nodes in Map teaser view mode.
</span></span></span><span class="line"><span class="cl"><span class="c">
</span></span></span><span class="line"><span class="cl"><span class="c">{% set classes = [&#39;card-events&#39;, &#39;card-map-popup&#39;] %}
</span></span></span><span class="line"><span class="cl"><span class="c">
</span></span></span><span class="line"><span class="cl"><span class="c">&lt;article{{ attributes.addClass(classes) }}&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">  &lt;h5 class=&#34;popup-title&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">    {{ label }}
</span></span></span><span class="line"><span class="cl"><span class="c">  &lt;/h5&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">
</span></span></span><span class="line"><span class="cl"><span class="c">  &lt;div class=&#34;popup-body&#34;&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">    {{ content.field_shorter_description }}
</span></span></span><span class="line"><span class="cl"><span class="c">    {{ content.field_innovation_type }}
</span></span></span><span class="line"><span class="cl"><span class="c">    {{ content.field_use_cases }}
</span></span></span><span class="line"><span class="cl"><span class="c">  &lt;/div&gt;
</span></span></span><span class="line"><span class="cl"><span class="c">&lt;/article&gt; #}</span><span class="x">
</span></span></span></code></pre></div></li>
<li>Fine-tune what elements are shown on the card, by moving items to the &lsquo;Field&rsquo; section at <code>admin/structure/types/manage/innovation/display/</code></li>
</ol>
</li>
<li>Explanation:
<ul>
<li>
<p>Drupal styling goes through a couple of steps: The content display determines which elements are displayed, and twig then styles those elements</p>
</li>
<li>
<p>it seems twig can also override this behavior and automatically display certain elements even if they&rsquo;re not selected in the content display</p>
</li>
</ul>
</li>
</ul>
<h3 id="make-search-bar-scrollable">Make search bar scrollable</h3>
<ul>
<li>Can e.g. be achieved by this:
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-css" data-lang="css"><span class="line"><span class="cl"><span class="p">.</span><span class="nc">view-filters</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">max-height</span><span class="p">:</span> <span class="mi">100</span><span class="kt">vh</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">overflow-y</span><span class="p">:</span> <span class="kc">auto</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">position</span><span class="p">:</span> <span class="kc">sticky</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">top</span><span class="p">:</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">padding-right</span><span class="p">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">overflow-x</span><span class="p">:</span> <span class="kc">hidden</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div></li>
</ul>
<h2 id="apache-config">Apache config</h2>
<p>Maintaining two drupal installs and resulting sites requires to set up some wiring in apache, in order to have two meaningful addresses.</p>
<h3 id="path-resolution">Path resolution</h3>
<ul>
<li>configure <code>/etc/apache2/sites-enabled/000-default.conf</code></li>
<li>every drupal root needs to have its own Directory</li>
</ul>
<pre tabindex="0"><code class="language-nil" data-lang="nil">    &lt;VirtualHost *:80&gt;
  # The ServerName directive sets the request scheme, hostname and port that
  # the server uses to identify itself. This is used when creating
  # redirection URLs. In the context of virtual hosts, the ServerName
  # specifies what hostname must appear in the request&#39;s Host: header to
  # match this virtual host. For the default virtual host (this file) this
  # value is not decisive as it is used as a last resort host regardless.
  # However, you must set it for any further virtual host explicitly.
  #ServerName www.example.com

  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html/sti-portal/web

     &lt;Directory /var/www/html&gt;
         Options FollowSymLinks MultiViews
         AllowOverride None
         Require all granted
     &lt;/Directory&gt;

     &lt;Directory /var/www/html/sti-portal/html&gt;
        Options FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
     &lt;/Directory&gt;

     &lt;Directory /var/www/html/sti-social/html&gt;
        Options FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
     &lt;/Directory&gt;

     # The path after alias is the path relative to root that will be accessible
     Alias /network /var/www/html/sti-social/html
     &lt;Directory /var/www/html/sti-social/html&gt;
        Options FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
     &lt;/Directory&gt;

  # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
  # error, crit, alert, emerg.
  # It is also possible to configure the loglevel for particular
  # modules, e.g.
  #LogLevel info ssl:warn

  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined

  # For most configuration files from conf-available/, which are
  # enabled or disabled at a global level, it is possible to
  # include a line for only one particular virtual host. For example the
  # following line enables the CGI configuration for this host only
  # after it has been globally disabled with &#34;a2disconf&#34;.
  #Include conf-available/serve-cgi-bin.conf
&lt;/VirtualHost&gt;
</code></pre><h3 id="inststall-drupal-page">Inststall Drupal Page</h3>
<p><code>sudo -u www-data vendor/bin/drush --root=html --uri=&quot;http://localhost/network&quot; cr</code></p>
<h2 id="add-a-custom-block">Add a custom block</h2>
<ol>
<li>Create the block under <code>/admin/structure/block-content</code></li>
<li>Add a block instance under <code>/block/add/hero_submit_idea</code></li>
<li>Find the block to set under <code>/admin/structure/block</code></li>
</ol>
<h2 id="install-open-social">Install open social</h2>
<ol>
<li>
<p>For version 13 you need php3.8-fhm</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -fsSL https://packages.sury.org/php/apt.gpg <span class="p">|</span> sudo gpg --dearmor -o /etc/apt/keyrings/sury-php.gpg
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;deb [signed-by=/etc/apt/keyrings/sury-php.gpg] https://packages.sury.org/php/ </span><span class="k">$(</span>lsb_release -sc<span class="k">)</span><span class="s2"> main&#34;</span> <span class="p">|</span> sudo tee /etc/apt/sources.list.d/sury-php.list
</span></span><span class="line"><span class="cl">sudo apt update
</span></span><span class="line"><span class="cl">sudo apt install -y php8.3-fpm libapache2-mod-fcgid php8.3-xml php8.3-mysql php8.3-gd php8.3-mbstring php8.3-intl php8.3-curl
</span></span><span class="line"><span class="cl">sudo a2enmod proxy_fcgi setenvif php8.3-fpm
</span></span><span class="line"><span class="cl">sudo a2disconf php8.2-fpm 2&gt;/dev/null <span class="o">||</span> <span class="nb">true</span>
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now php8.3-fpm
</span></span><span class="line"><span class="cl">sudo systemctl restart php8.3-fpm
</span></span><span class="line"><span class="cl">sudo systemctl restart apache2
</span></span></code></pre></div></li>
<li>
<p>Set up the site &amp; DB</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo -u www-data vendor/bin/drush --root<span class="o">=</span>html --sites-subdir<span class="o">=</span>default -y site:install social   --db-url<span class="o">=</span><span class="s1">&#39;mysql://social:social@127.0.0.1:3306/social&#39;</span>
</span></span></code></pre></div></li>
<li>
<p>Load in old db</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">zcat /home/tristan/db.sql.gz <span class="p">|</span> vendor/bin/drush --root<span class="o">=</span>html sqlc
</span></span></code></pre></div></li>
<li>
<p>Configure apache</p>
<pre tabindex="0"><code class="language-nil" data-lang="nil">  cat /etc/apache2/sites-enabled/000-default.conf
&lt;VirtualHost *:80&gt;
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request&#39;s Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/sti-portal/web

    &lt;Directory /var/www/html/sti-portal/web&gt;
        Options FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    &lt;/Directory&gt;

    Alias /network /var/www/html/sti-social/html
    &lt;Directory /var/www/html/sti-social/html&gt;
        Options FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    &lt;/Directory&gt;

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with &#34;a2disconf&#34;.
        #Include conf-available/serve-cgi-bin.conf
        # Make Drupal think the original request was HTTPS externally.
        &lt;Location &#34;/network&#34;&gt;
        RequestHeader set X-Forwarded-Proto &#34;https&#34;
        RequestHeader set X-Forwarded-Port &#34;443&#34;
        RequestHeader set X-Forwarded-Host &#34;sti-portal.edge.faofao.org&#34;
        &lt;/Location&gt;
&lt;/VirtualHost
</code></pre><ul>
<li>
<p>check config with <code>apachectl configtest</code></p>
</li>
<li>
<p>enable with <code>sudo systemctl restart apache2</code></p>
</li>
</ul>
</li>
</ol>
<p>Kiautschou str 6</p>
<h2 id="solution">Solution</h2>
<ul>
<li>adding <code>kdePackages.akonadi-calendar</code> to my config and re-loading plasma (<code>systemctl --user restart plasma-plasmashell.service</code>) solved the issue</li>
</ul>
<h2 id="resources">Resources</h2>
<ul>
<li>commented on github: <a href="https://github.com/NixOS/nixpkgs/issues/344025">https://github.com/NixOS/nixpkgs/issues/344025</a></li>
</ul>
]]></content:encoded></item><item><title>KDE Digital Clock</title><link>https://blog.twiessalla.de/posts/kde-clock/</link><pubDate>Thu, 25 Sep 2025 00:00:00 +0200</pubDate><guid>https://blog.twiessalla.de/posts/kde-clock/</guid><description>&lt;h2 id="problem"&gt;Problem&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Using KDE Plasma 6.4.4 on NixOS my Nextcloud calendars that are synced to contact are no longer displayed in the KDE Digital Clock widget even after enabling &amp;lsquo;Calendar Events&amp;rsquo; and selecting my calendars of interest&lt;/li&gt;
&lt;li&gt;This used to work fine and broke with a recent update&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="solution"&gt;Solution&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;adding &lt;code&gt;kdePackages.akonadi-calendar&lt;/code&gt; to my config and re-loading plasma (&lt;code&gt;systemctl --user restart plasma-plasmashell.service&lt;/code&gt;) solved the issue&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;commented on github: &lt;a href="https://github.com/NixOS/nixpkgs/issues/344025"&gt;https://github.com/NixOS/nixpkgs/issues/344025&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><content:encoded><![CDATA[<h2 id="problem">Problem</h2>
<ul>
<li>Using KDE Plasma 6.4.4 on NixOS my Nextcloud calendars that are synced to contact are no longer displayed in the KDE Digital Clock widget even after enabling &lsquo;Calendar Events&rsquo; and selecting my calendars of interest</li>
<li>This used to work fine and broke with a recent update</li>
</ul>
<h2 id="solution">Solution</h2>
<ul>
<li>adding <code>kdePackages.akonadi-calendar</code> to my config and re-loading plasma (<code>systemctl --user restart plasma-plasmashell.service</code>) solved the issue</li>
</ul>
<h2 id="resources">Resources</h2>
<ul>
<li>commented on github: <a href="https://github.com/NixOS/nixpkgs/issues/344025">https://github.com/NixOS/nixpkgs/issues/344025</a></li>
</ul>
]]></content:encoded></item><item><title>A/I from the viewpoint of digital sovereignty</title><link>https://blog.twiessalla.de/posts/on-autistici-inventati/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.twiessalla.de/posts/on-autistici-inventati/</guid><description>&lt;p&gt;When I think about the story of the end of Autistici/Inventati my central question is concerning the inactivity of Italian and European politics on the issue. Many values that are defended by both institutions combine in this matter: National and European sovereignty. The future of the European market. The Creation of a future perspective for our youth.&lt;/p&gt;
&lt;p&gt;From this point of view A/I is first and foremost an Italian, an European tech project. A project that does not only preach values of participation and digital emancipation, but has made them the foundation of all their activities since the beginning. Decisions are made democratically by the collective and the central idea was that everyone would learn to understand the technology used. This approach resulted in manuals and guides that teach the reader concepts of hosting and the technical structure of the internet.&lt;/p&gt;</description><content:encoded><![CDATA[<p>When I think about the story of the end of Autistici/Inventati my central question is concerning the inactivity of Italian and European politics on the issue. Many values that are defended by both institutions combine in this matter: National and European sovereignty. The future of the European market. The Creation of a future perspective for our youth.</p>
<p>From this point of view A/I is first and foremost an Italian, an European tech project. A project that does not only preach values of participation and digital emancipation, but has made them the foundation of all their activities since the beginning. Decisions are made democratically by the collective and the central idea was that everyone would learn to understand the technology used. This approach resulted in manuals and guides that teach the reader concepts of hosting and the technical structure of the internet.</p>
<p>Why is it so shocking that we have not heard anything from our political representatives in Rome and Brussels?
The EU is far behind the US and China when it comes to the digital economic powerhouses of the world. We find ourselves in a situation in which we realized that our digital space is practically exclusively being controlled by the US Big Tech companies. Effectively those are monopolies that have used values like free market capitalism and democracy only to maneuver themselves into their absolutist position of power. Europe is struggling with both: we have few companies that are economically relevant enough to even make a dnet in fields like digital communication, networks, trade, entertainment, hardware and office software. One of the central pillars of US-american softpower in the last 30 years has been to render the western hemisphere utterly dependant on US tech, transformining national into international monopolies. This has developed into one the central threats to our pluralistic democracy: Any discourse in the digital space does not take place on democratically goverened platforms but in the private rooms of Mark Zuckerberg, Elon Musk and Liang Rubo.
Today, digital discourse is practically the same as public discourse and it follows the rules enforced by those companies. We witness the consequences for decades now, but increasingly so since the US decided to turn towards authoritarianism. US and Russian interests now largely overlap when Europe&rsquo;s future is concerned resulting in the uniform propaganda-slop that follows these well-known dimensions: the western world is doomed, our dedication to human rights, empathy and democracy have weakened us politically and economically to the point that we can&rsquo;t even survive yearly immigration on the scale of less than one percent of our population. This digital age, now AI age, requires autocracy and the dictate of the patriarchy. These narratives work and we see it in the political direction of pracitcally all EU nations. It&rsquo;s handy that this division of our population and nations serves our global competitors so much. Divide and conquer, a weak Europe that finally lets reign oligarchs and autocrats freely.</p>
<p>So what could be a way out of this stuck situation? The path to a solution highlights why it is so shocking that our politicians have not recognized the value of A/I and remain silent instead of defending democratic European digital projects. To make it short: the way out is emancipation. A/I is expression of this emancipation, a self-help group filling the gap that insufficient digital public policies have created. Today we witness a digital space based on passive consumption, human convenience, distraction and entertainment. A space that hinders critical thinking and furthers separation. A space in which the majority of public discourse is taking place. Even though those facts are known for a long time now, we fail to prepare our children for this world. Digital education in our schools is limited to encourage children to buy an iPad or a Chromebook on which they then learn to use Microsoft Office products. You really have to realize this: the concept for digital education is to use specific products of specific US companies. Learned helplessness from day one. If, however, we want an independent digital economony and a self-determined digital space, we must not educate &lsquo;users&rsquo;. We need generations for whom algorithms aren&rsquo;t black magic and computers black boxes. Who are not users but architects, not only of content, but crucially of infrastructure, of spaces. People who are used not only to technical structures but specifically understand the impact on our society, our discourse and our independence. People who create a digital infrastructure that represents our values, not those of US-monopolies.
Achieving this requires a confrontation with the foundations of digital technologies from day one, not only with finished apps and products. We need to understand that apps can&rsquo;t only be used but also be adapted and built. We need to educate our youth in using the means of digital production, not only in using its final products.</p>
<p>This is what A/I understood 25 years ago and what we need to defend: Italians, Europeans who dare to construct and control the infrastructure of our digital spaces. Who dare to make our values the basis of the education of others and in the creation of digital services. Who are one of many both in the market as well in the democratic discourse, not one for all.</p>
<p>I am deeply disappointet by our representatives and their confused so-called digital strategies, that are passive instead of active, who kowtow to our big brother the US. It is not about constructing a digital space in the image of the US-controlled monopolized one, whith the only distinction to put European billionaires in charge. It is about truly emancipating ourselves and educate a population who is able to shape the digital space to their ideas.</p>
]]></content:encoded></item></channel></rss>