[{"content":"I\u0026rsquo;ll break this apart into a multi-part series soon.\nImporting data in Drupal drupal Importing data The general workflow from original record (source_record) to AI-extracted record (extracted_entity) and finally the innovation (innovation) you find on the user-facing website is: write migration.yml file upload source file (json, csv, \u0026hellip;) to web/modules/custom/\u0026lt;your_module_name\u0026gt;/source/\u0026lt;your_source_name_as_in_yml\u0026gt;) drush migrate:import \u0026lt;your migration id\u0026gt; Rolling back This generally fails because of a malformatted migration file or typos etc in the source data, to rollback you do drush migrate:stop \u0026lt;your migration id\u0026gt; to stop any migration process going on drush migrate:reset \u0026lt;your migration id\u0026gt; to set the migration status to \u0026lsquo;idle\u0026rsquo; (i.e. ready to import) drush migrate:rollback \u0026lt;your migration id\u0026gt; to remove any partially imported records Some notes on rollback: If you already have downstream content types based off of earlier imported source records, you\u0026rsquo;re prone to create duplicates when rolling back \u0026amp; re-importing the same sources. Your options are then: drush migrate:rollback \u0026lt;your migration id\u0026gt; --update to only update source_record that changed in the source data (because you e.g. changed the json structure) Purge all downstream content by going to (Web menu -\u0026gt; BACK-END -\u0026gt; Manage \u0026lt;content type\u0026gt;) Once there, filter for all content of interest, select the action \u0026lsquo;Delete\u0026rsquo; from the Action drop-down and execute You might need to do this 3 times, for \u0026lsquo;Original Record\u0026rsquo;, \u0026lsquo;AI-extracted innovation record\u0026rsquo; and \u0026lsquo;Innovation\u0026rsquo; After purging existing data, you can run drush migrate:import \u0026lt;your migration id\u0026gt; again yaml Template for import uuid: \u0026lt;added after import, delete this column before importing\u0026gt; langcode: en status: true dependencies: enforced: module: - \u0026lt;import_STI_portal_data / import_IRD_jsons\u0026gt; id: \u0026lt;machine reference to this migration\u0026gt; class: null field_plugin_method: null cck_plugin_method: null migration_tags: STI migration_group: STI-import-group label: \u0026lt;description, e.g. the one found in Manage data sources\u0026gt; source: plugin: \u0026lt;csv / json\u0026gt; constants: SOURCE: \u0026lt;source name as found in Manage data sources\u0026gt; SOURCE_ID: \u0026lt;source name as found in the Manage data sources url\u0026gt; RECTYPE: \u0026lt;check what rectypes are set in Mange data source\u0026gt; path: \u0026lt;path to the json or csv file to migrate\u0026gt; header_offset: 0 ids: - \u0026lt;the data column containing unique IDs, eg. id, url, title\u0026gt; process: field_data_source: constants/SOURCE_ID # Needed so that imported records are assigned to the correct data source field_original_internal_id: plugin: skip_on_empty source: \u0026lt;give the same as set in \u0026#39;ids\u0026#39; above\u0026gt; method: row message: \u0026#39;Row does not contain Project Symbol: skipped\u0026#39; title: plugin: skip_on_empty source: \u0026lt;data column containing the name/title of the entry\u0026gt; method: row message: \u0026#39;Row does not contain title: skipped\u0026#39; type: plugin: default_value default_value: source_record # leave unchanged, you\u0026#39;re importing a \u0026#39;source_record\u0026#39; field_shorter_description/value: - plugin: skip_on_empty source: \u0026lt;data column containing a 1-2 sentence description\u0026gt; method: process message: \u0026#39;Row does not contain short descr.\u0026#39; field_shorter_description/format: plugin: default_value default_value: full_html field_long_description/value: - plugin: skip_on_empty source: \u0026lt;data column containing a long freetext description\u0026gt; method: process message: \u0026#39;Row does not contain short descr.\u0026#39; field_long_description/format: plugin: default_value default_value: full_html time: plugin: callback callable: time unpack_source: true source: { } field_impact_sdgs: - plugin: explode delimiter: \u0026#39;,\u0026#39; source: \u0026lt;data column mentioning sdgs\u0026gt; - plugin: callback callable: trim - plugin: preg_replace pattern: \u0026#39;\\..*\u0026#39; replace: \u0026#39;\u0026#39; - # Often it is necessary to map however sdgs are named in the source data to the STI portal taxonomy plugin: static_map map: \u0026#39;1\u0026#39;: \u0026#39;Goal 1: No poverty\u0026#39; \u0026#39;2\u0026#39;: \u0026#39;Goal 2: Zero hunger\u0026#39; \u0026#39;3\u0026#39;: \u0026#39;Goal 3: Good health and well-being\u0026#39; \u0026#39;4\u0026#39;: \u0026#39;Goal 4: Quality education\u0026#39; \u0026#39;5\u0026#39;: \u0026#39;Goal 5: Gender equality\u0026#39; \u0026#39;6\u0026#39;: \u0026#39;Goal 6: Clean water and sanitation\u0026#39; \u0026#39;7\u0026#39;: \u0026#39;Goal 7: Affordable and clean energy\u0026#39; \u0026#39;8\u0026#39;: \u0026#39;Goal 8: Decent work and economic growth\u0026#39; \u0026#39;9\u0026#39;: \u0026#39;Goal 9: Industry, innovation and infrastructure\u0026#39; \u0026#39;10\u0026#39;: \u0026#39;Goal 10: Reduced inequalities\u0026#39; \u0026#39;11\u0026#39;: \u0026#39;Goal 11: Sustainable cities and communities\u0026#39; \u0026#39;12\u0026#39;: \u0026#39;Goal 12: Responsible consumption and production\u0026#39; \u0026#39;13\u0026#39;: \u0026#39;Goal 13: Climate action\u0026#39; \u0026#39;14\u0026#39;: \u0026#39;Goal 14: Life below water\u0026#39; \u0026#39;15\u0026#39;: \u0026#39;Goal 15: Life on land\u0026#39; \u0026#39;16\u0026#39;: \u0026#39;Goal 16: Peace, justice and strong institutions\u0026#39; \u0026#39;17\u0026#39;: \u0026#39;Goal 17: Partnerships for the goals\u0026#39; default_value: \u0026#39;\u0026#39; - plugin: entity_lookup entity_type: taxonomy_term ignore_case: true value_key: name bundle: impact_sdgs field_region: - plugin: entity_generate entity_type: taxonomy_term ignore_case: true value_key: name source: \u0026lt;region column or field\u0026gt; bundle: countries_no_standard field_innovation_type: - plugin: explode source: \u0026lt;innovation column or field\u0026gt; delimiter: \u0026#39;-\u0026#39; - plugin: callback callable: trim - plugin: entity_lookup entity_type: taxonomy_term ignore_case: true value_key: name bundle: type field_use_cases: - plugin: explode source: \u0026lt;use cases column or field\u0026gt; delimiter: \u0026#39;-\u0026#39; - plugin: callback callable: trim - plugin: entity_lookup entity_type: taxonomy_term ignore_case: true value_key: name bundle: use_cases field_adoption_countries_ns: # this field is needed in case country names do not follow the UN/FAO - Standards - plugin: skip_on_empty method: process source: \u0026lt;use cases column or field\u0026gt; - plugin: explode delimiter: \u0026#39;-\u0026#39; - plugin: entity_generate entity_type: taxonomy_term ignore_case: true value_key: name bundle: countries_no_standard destination: plugin: \u0026#39;entity:node\u0026#39; default_bundle: source_record overwrite_properties: - field_data_source - field_original_internal_id - field_shorter_description/value - field_long_description/value migration_dependencies: required: { } The migration has 4 top-level parts:\nThe header sections id, label, etc source describing the source data and its structure process describing how to read, process and pass on the source data fields destination describing where the data is supposed to end up. Just put: plugin: \u0026#39;entity:node\u0026#39; default_bundle: source_record Minimum fields for migration What should you parse out from the data? What should be there? I think the list below is good for a start:\ntitle field_original_internal_id field_shorter_description field_long_description Additional: Should be sourced from the data\nfield_link field_owner field_impact_sdgs field_country_origin field_countries_adoption Drupal plugins and their use to fill different fields in the migration entity_lookup, skip_on_empty and explode\nExample field_adoption_countries_ns: # this field is needed in case country names do not follow the UN/FAO - Standards - plugin: skip_on_empty method: process source: \u0026lt;use cases column or field\u0026gt; - plugin: explode delimiter: \u0026#39;-\u0026#39; - plugin: entity_generate entity_type: taxonomy_term ignore_case: true value_key: name bundle: countries_no_standard Explanation: Multiple plugins can be chained like above. The execution order is top-to-bottom. The first plugin must receive the source data column or field. skip_on_empty 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 method: (process or row) explode is used if a field/column contains multiple values. In a csv file it might be that \u0026lsquo;|\u0026rsquo; or \u0026lsquo;-\u0026rsquo; are used as a separator for a \u0026lsquo;unclean\u0026rsquo; field containing more than one value entity_generate generates a new taxonomy term if no exactly matching one can be found (e.g. data uses \u0026lsquo;FAO\u0026rsquo; while taxonomy expects \u0026lsquo;Food and Agriculture Organization of the United Nations\u0026rsquo;. That can either be cleaned up later by manually replacing or one uses ai-mapping logic like is done for the field_adoption_countries_ns entry. It finds the closest real taxonomy term and automatically replaces them static_map\nExample: - # Often it is necessary to map however sdgs are named in the source data to the STI portal taxonomy plugin: static_map map: \u0026#39;1\u0026#39;: \u0026#39;Goal 1: No poverty\u0026#39; \u0026#39;2\u0026#39;: \u0026#39;Goal 2: Zero hunger\u0026#39; \u0026#39;3\u0026#39;: \u0026#39;Goal 3: Good health and well-being\u0026#39; \u0026#39;4\u0026#39;: \u0026#39;Goal 4: Quality education\u0026#39; \u0026#39;5\u0026#39;: \u0026#39;Goal 5: Gender equality\u0026#39; \u0026#39;6\u0026#39;: \u0026#39;Goal 6: Clean water and sanitation\u0026#39; \u0026#39;7\u0026#39;: \u0026#39;Goal 7: Affordable and clean energy\u0026#39; \u0026#39;8\u0026#39;: \u0026#39;Goal 8: Decent work and economic growth\u0026#39; \u0026#39;9\u0026#39;: \u0026#39;Goal 9: Industry, innovation and infrastructure\u0026#39; \u0026#39;10\u0026#39;: \u0026#39;Goal 10: Reduced inequalities\u0026#39; \u0026#39;11\u0026#39;: \u0026#39;Goal 11: Sustainable cities and communities\u0026#39; \u0026#39;12\u0026#39;: \u0026#39;Goal 12: Responsible consumption and production\u0026#39; \u0026#39;13\u0026#39;: \u0026#39;Goal 13: Climate action\u0026#39; \u0026#39;14\u0026#39;: \u0026#39;Goal 14: Life below water\u0026#39; \u0026#39;15\u0026#39;: \u0026#39;Goal 15: Life on land\u0026#39; \u0026#39;16\u0026#39;: \u0026#39;Goal 16: Peace, justice and strong institutions\u0026#39; \u0026#39;17\u0026#39;: \u0026#39;Goal 17: Partnerships for the goals\u0026#39; default_value: \u0026#39;\u0026#39; 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. entity_lookup\nExample field_type_of_information_manage: plugin: entity_lookup entity_type: taxonomy_term ignore_case: true value_key: name source: constants/RECTYPE bundle: source_entity_types 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 static_map or using a pre-defined constant like in the example. to find the correct machine name for the bundle in question go to Web menu -\u0026gt; About -\u0026gt; Taxonomies -\u0026gt; \u0026lt;click on taxonomy\u0026gt; -\u0026gt; \u0026lt;click on the taxonomy name/title again\u0026gt;. You should find the Machine name next to the title Content workflow; Imports This commands lists all content types\u0026rsquo; machine names drush eval \u0026#34;print_r(array_keys(\\Drupal::entityTypeManager()-\u0026gt;getStorage(\u0026#39;node_type\u0026#39;)-\u0026gt;loadMultiple()));\u0026#34; Array ( [0] =\u0026gt; asti_data [1] =\u0026gt; definitions [2] =\u0026gt; digital_asset [3] =\u0026gt; extracted_entity [4] =\u0026gt; initiative [5] =\u0026gt; innovation [6] =\u0026gt; innovation_core [7] =\u0026gt; innovation_extracted_from_origin [8] =\u0026gt; internal_content [9] =\u0026gt; learning_resource [10] =\u0026gt; organization [11] =\u0026gt; source_record [12] =\u0026gt; taxonomy_description [13] =\u0026gt; web_page [14] =\u0026gt; website_section ) To find out which fields are available for each content type, run drush field:info node \u0026lt;e.g. source_record\u0026gt; This will give you an idea which information should ideally already be present when importing the data To understand what those fields are supposed to contain, you can consult the taxonomy page (Web menu -\u0026gt; About -\u0026gt; Taxonomies -\u0026gt; \u0026lt;e.g. Use Cases\u0026gt; This will help you understand if the data source of choice has a matching taxonomy From Original record to innovation Web menu -\u0026gt; BACK-END -\u0026gt; manage data sources Search: \u0026lt;your data source\u0026gt; Edit tag: STI portal data source (also ATIO, should the data be imported into ATIO) Publish (I encountered problems with the AI-enhancement if I didn\u0026rsquo;t do this) select if can be overwritten by AI allow overwriting by original record allow overwriting by extracted innovation record Web menu -\u0026gt; BACK-END -\u0026gt; Workflows for original records Source: \u0026lt;your data source\u0026gt; (should auto-complete at this point) filter select all generate/update extracted innovations from original records Web menu -\u0026gt; BACK-END -\u0026gt; Workflows for ai-extracted innovations Enrich derived innovation record with AI if empty (settings allow a bit less cautious) max 250, better 50 at a time (otherwise you risk a timeout error) if not loading, change the \u0026lsquo;start\u0026rsquo; in the url for \u0026lsquo;stop\u0026rsquo;: https://sti-portal-prototype.net/stiportal_dev/web/batch?id=3342\u0026amp;op=start -\u0026gt; https://sti-portal-prototype.net/stiportal_dev/web/batch?id=3342\u0026amp;op=stop Generate/update innovation records from AI extracted records to see what can go wrong \u0026amp; how to fix it: Error log: AI enhancement Check that the innovations are displayed correctly in the website if you open your data source\u0026rsquo;s collection page Notes Make sure that there are no duplicates in the source data. This means whatever field is used as \u0026lsquo;id\u0026rsquo; is truly unique. Good candidates are project numbers, urls or, if no alternative, the full title \u0026lsquo;Titles\u0026rsquo; have a character limit Error log: AI enhancement Data source not found in exception list Error:\nCheck 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 \u0026#34;0\u0026#34;) - exceptions_count (DTO \u0026#34;0\u0026#34;) - provider_id_read (DTO \u0026#34;28182\u0026#34;) - provider_id (DTO \u0026#34;28182\u0026#34;) - exception_providers_list (DTO) - 0 (DTO \u0026#34;20007\u0026#34;) - 1 (DTO \u0026#34;19987\u0026#34;) - 2 (DTO \u0026#34;25260\u0026#34;) - 3 (DTO \u0026#34;28184\u0026#34;) - 4 (DTO \u0026#34;28182\u0026#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 \u0026#34;-17243\u0026#34;) - current_prov_id (NULL) - user (Entity user/1/admin) - event (DTO) ​- view (DTO) - id (string \u0026#34;backend2\u0026#34;) - display_id (string \u0026#34;page_7\u0026#34;) - action (DTO) ​- plugin (string \u0026#34;eca_vbo_execute:generate_update_extracted_innovations_from_original_records\u0026#34;) ​- config (DTO) - operation_name (string \u0026#34;Generate / update extracted innovations from original records\u0026#34;) - message_override (string \u0026#34;\u0026#34;) ​- skip_confirm (integer \u0026#34;0\u0026#34;) - entity (DTO) - id (string \u0026#34;35689\u0026#34;) ​- label (string \u0026#34; Corte (Poda) das folhas do coqueiro na região de Bicol\u0026#34;) ​- type (string \u0026#34;node\u0026#34;) - bundle (string \u0026#34;source_record\u0026#34;) - langcode (string \u0026#34;en\u0026#34;) - machine_name (string \u0026#34;eca_vbo.execute\u0026#34;) Explanation: In the example I was trying to add new AI-extracted innovations to the provider \u0026lsquo;TECA\u0026rsquo; with the provider_id 4. This id was not found and not added to the exception_providers_list. The import enters an infinite loop and fails with HTTP Error 500. Solution: For me, setting the data source\u0026rsquo;s status to \u0026lsquo;published\u0026rsquo; worked Cannot access offset of type string on string Error: 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-\u0026gt;verifyValue() (line 94 of modules/contrib/ai/modules/ai_automators/src/PluginBaseClasses/Boolean.php). the same error is thrown on line 110 Explanation: Some boolean elements in the ECA (such as whether or not the field \u0026lsquo;overwrite existing entries by AI\u0026rsquo; is checked in the data source settings) are apparently passed as strings through the ECA. The Boolean.php of the ai_automators plugin (web/modules/contrib/ai/modules/ai_automators/src/PluginBaseClasses/Boolean.php) takes only arrays in line 94 and 110.\nSolution: As a hotfix I forced casting every value that is not an array to an array. That seems to work for now public function verifyValue(ContentEntityInterface $entity, $value, FieldDefinitionInterface $fieldDefinit ion, array $automatorConfig) { // Has to be string boolean. if (!is_array($value)) { #! changed $value = [\u0026#39;value\u0026#39; =\u0026gt; $value]; } if (!in_array($value[\u0026#39;value\u0026#39;], [\u0026#39;TRUE\u0026#39;, \u0026#39;FALSE\u0026#39;, \u0026#39;0\u0026#39;, \u0026#39;1\u0026#39;, 0, 1])) { return FALSE; } // Otherwise it is ok. return TRUE; } /** ​ * {@inheritDoc} */ public function storeValues(ContentEntityInterface $entity, array $values, FieldDefinitionInterface $field Definition, array $automatorConfig) { // Transform string to boolean. foreach ($values as $key =\u0026gt; $value) { if (!is_array($value)) { #! changed $value = [\u0026#39;value\u0026#39; =\u0026gt; $value]; } $values[$key] = in_array($value[\u0026#39;value\u0026#39;], [\u0026#39;TRUE\u0026#39;, \u0026#39;1\u0026#39;, 1]) ? TRUE : FALSE; } // Then set the value. $entity-\u0026gt;set($fieldDefinition-\u0026gt;getName(), $values); return TRUE; } OpenAI API doesn\u0026rsquo;t handle strings Error: 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). Explanation: Like in this error the ECA that does the AI-enrichment seems to pass a string where an array is expected Solution: Changing the php code and forcing strings to array could work Fundamentally, the issue should be addressed in the ECA Changing the API from OpenAI to Anthropic avoids the issue so I did this Examples of formatting errors when running a migration Whitespaces and different languages Error: #+begin_src 4536 1 teca:field_information_resource_date:format_date: Format date plugin could not transform \u0026#39;Augst 2006\u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39; 2015\u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39;February 2016 \u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39; April 2016 \u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39;August 2015 \u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39;May 2013 \u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39;May 2011 \u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39;March 2005 \u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39;March 2018 \u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39;May 2015 \u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39; April 2021\u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39;Février 2015\u0026#39; using the format \u0026#39;F Y\u0026#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 \u0026#39;Février 2015\u0026#39; using the format \u0026#39;F Y\u0026#39;. Error: The date cannot be created from a format. Explanation: Some entries don\u0026rsquo;t follow the general formatting of \u0026lsquo;F Y\u0026rsquo; (written month in English and Year) Some entries have trailing or leading whitespaces. In this particular case the trim function of Drupal migrate didn\u0026rsquo;t remove them, because they are non-standard whitespaces Some Month names are written in French 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 Gemini API changed this seems to be the case quite often Drupal stuck looking for a broken twig files Error: 2285210 05/Nov 12:55 php Error Twig\\Error\\LoaderError: Template \u0026#34;.html.twig\u0026#34; is not defined. in Twig\\Loader\\ChainLoader-\u0026gt;getCacheKey() (line 38 of /var/www/html/web/themes/custom/fao/templates/block/block--views.h tml.twig This manifested itself in completely blocking all DB operations (cim, cex, cr) and resulting in Drupal not being able to serve the site anymore 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 cache_discovery table and rebuilt whenever: You clear caches (drush cr) You export/import config (drush cex / cim) You install or update modules/themes So even Drush CLI commands (which don’t render HTML) still invoke the theme system during bootstrapping.\nSolution: Remove the offending file and rebuild the cache\nrm /var/www/html/web/themes/custom/fao/templates/block/block--views.html.twig drush cr In the future drush theme:debug could point out those errors before loading the theme into the cache How to change taxonomy terms drupal Web menu -\u0026gt; Structure -\u0026gt; Taxonomy -\u0026gt; \u0026lt;AFS innovation use cases\u0026gt; Custom Taxonomy Structure -\u0026gt; Taxonomy -\u0026gt; Create vocabulary Add terms manually one by one Faster alternative (deactivated): Extend -\u0026gt; Taxonomy Manager Install Structure -\u0026gt; Taxonomy Manager -\u0026gt; \u0026lt;new category\u0026gt; -\u0026gt; paste \\n - separated list Structure -\u0026gt; Content types -\u0026gt; original record -\u0026gt; create new fields Structure -\u0026gt; Content types -\u0026gt; ai-extracted record -\u0026gt; create new fields Structure -\u0026gt; Content types -\u0026gt; innovation -\u0026gt; create new fields Change ECA; add the new Installing custom modules drupal The default location for custom modules is web/modules/custom/\u0026lt;your module\u0026gt; The minimum set of files is \u0026lt;your module\u0026gt;.info.yml : Metadata and description of the module dependencies. What is the module? \u0026lt;your module\u0026gt;.libraries.yml : Describes location of css/js and other library files. Lists other plugin dependencies. \u0026lt;your module\u0026gt;.module (php syntax): Optional. Adds a php hook (function) controlling when and how the library will be activated Additionally, you might have a css and js folder in the module structure providing custom code and styling The steps to activate your module are Install all necessary dependencies using composer require and drush en Create/write your module file structure and put it in modules/custom drush en \u0026lt;your module\u0026gt; -y If your module is changing the behavior of other custom modules you should add it in the dependencies: field there. E.g. if you change theming, just add your module to your custom themes .libraries.yml file Project structure A minimal working example project structure could be: web/modules/custom/sti_leaflet/ ├── js/ │ └── custom_cluster_icons.js ├── sti_leaflet.info.yml ├── sti_leaflet.libraries.yml └── sti_leaflet.module Additional you might need /css → Custom styling /js → JavaScript behaviors or logic /templates → Twig overrides /src → PHP classes (services, plugins, controllers, etc.) Setting up a new server instance Now, all user-changed drupal code (mostly js, twg, yml and php/module) is now on FAO\u0026rsquo;s github repository. \u0026lsquo;Main\u0026rsquo; is currently tracking our \u0026lsquo;review\u0026rsquo; server.\nServer roles Server Name Role Hosted test playground; obsolete private dev staging ground for changes made trough gui private review mirrors production, test for changes pulled from dev gcloud production user-facing, pulls only from review gcloud Steps to get new server instance Precondition is that the necessary tech stack is installed (php, drupal, etc). Here a link to a [[][shell.nix development environment]] # Get upstream config git clone git@github.com:valeriapesce/ATIO-KB-harvesting-IRD.git # Get the non-tracked files (images, etc) ./sync.sh \u0026lt;user\u0026gt;@review:\u0026lt;path to drupal root\u0026gt; fao-sti-portal # Install dependencies speciefied in composer.lock composer install --no-interaction --prefer-dist # Run the server vendor/bin/drush serve 127.0.0.1:5050 sync.sh file Under development, will be added to the github repo\n#!/usr/bin/env bash # # Safely sync environment-specific Drupal config and file directories # from one local Drupal root to another. # # Usage: # ./sync.sh /path/to/source/drupal/root /path/to/target/drupal/root # set -euo pipefail if [[ $# -ne 2 ]]; then echo \u0026#34;Usage: $0 /path/to/source/drupal/root /path/to/target/drupal/root\u0026#34; exit 1 fi SRC=$(realpath \u0026#34;$1\u0026#34;) DST=$(realpath \u0026#34;$2\u0026#34;) if [[ ! -d \u0026#34;$SRC/web/sites\u0026#34; ]]; then echo \u0026#34;Error: Source Drupal root \u0026#39;$SRC\u0026#39; does not appear to contain web/sites/\u0026#34; exit 1 fi mkdir -p \u0026#34;$DST\u0026#34; echo \u0026#34;\u0026gt;\u0026gt;\u0026gt; Syncing from:\u0026#34; echo \u0026#34; $SRC\u0026#34; echo \u0026#34;\u0026gt;\u0026gt;\u0026gt; To:\u0026#34; echo \u0026#34; $DST\u0026#34; echo # Explicit file list (relative to Drupal root) FILES=( \u0026#34;web/sites/config_UayHOzMAbX_oN-5FQkTXdB6Ot6tWDOFLY6ljN5FFOQ0bKajw9MX6UFRsu0IsRTqQ-C9vQ4_kng/sync/key.key.anthropic_atiokb.yml\u0026#34; \u0026#34;web/sites/config_UayHOzMAbX_oN-5FQkTXdB6Ot6tWDOFLY6ljN5FFOQ0bKajw9MX6UFRsu0IsRTqQ-C9vQ4_kng/sync/key.key.google_ai.yml\u0026#34; \u0026#34;web/sites/config_UayHOzMAbX_oN-5FQkTXdB6Ot6tWDOFLY6ljN5FFOQ0bKajw9MX6UFRsu0IsRTqQ-C9vQ4_kng/sync/key.key.milvus_zilliz.yml\u0026#34; \u0026#34;web/sites/config_UayHOzMAbX_oN-5FQkTXdB6Ot6tWDOFLY6ljN5FFOQ0bKajw9MX6UFRsu0IsRTqQ-C9vQ4_kng/sync/key.key.openai_api_key.yml\u0026#34; ) # Directory patterns DIRS=( \u0026#34;web/sites/*/*settings*.php\u0026#34; \u0026#34;web/sites/*/*services*.yml\u0026#34; \u0026#34;web/sites/*/files\u0026#34; \u0026#34;web/sites/*/public\u0026#34; \u0026#34;web/sites/*/private\u0026#34; \u0026#34;web/sites/*/files-public\u0026#34; \u0026#34;web/sites/*/files-private\u0026#34; ) echo \u0026#34;\u0026gt;\u0026gt;\u0026gt; Starting sync...\u0026#34; echo # Copy individual files (if missing) for relpath in \u0026#34;${FILES[@]}\u0026#34;; do src=\u0026#34;$SRC/$relpath\u0026#34; dst=\u0026#34;$DST/$relpath\u0026#34; if [[ -f \u0026#34;$src\u0026#34; ]]; then mkdir -p \u0026#34;$(dirname \u0026#34;$dst\u0026#34;)\u0026#34; if [[ ! -f \u0026#34;$dst\u0026#34; ]]; then echo \u0026#34;Copying file: $relpath\u0026#34; rsync -a \u0026#34;$src\u0026#34; \u0026#34;$dst\u0026#34; else echo \u0026#34;Skipping (already exists): $relpath\u0026#34; fi else echo \u0026#34;Missing source file: $relpath\u0026#34; fi done # Copy directories and pattern-matched files for pattern in \u0026#34;${DIRS[@]}\u0026#34;; do for path in \u0026#34;$SRC\u0026#34;/$pattern; do if [[ -e \u0026#34;$path\u0026#34; ]]; then relpath=\u0026#34;${path#$SRC/}\u0026#34; src=\u0026#34;$path\u0026#34; dst=\u0026#34;$DST/$relpath\u0026#34; mkdir -p \u0026#34;$(dirname \u0026#34;$dst\u0026#34;)\u0026#34; echo \u0026#34;Syncing: $relpath\u0026#34; rsync -a --ignore-existing \u0026#34;$src\u0026#34; \u0026#34;$dst\u0026#34; fi done done echo echo \u0026#34;\u0026gt;\u0026gt;\u0026gt; Sync complete!\u0026#34; I had to add this, since there still is a bug in the script mv sites/default/files/files/* sites/default/files mv sites/default/files/files/.* sites/default/files VS Code configuration to connect to gcloud There are a couple of ways to edit your ~/.ssh/config file so that the Remote Explorer in VSCode connects to your google cloud instance.\nDirect editing using the google cloud sdk gcloud compute config-ssh This command writes host entries to your local ~/.ssh/config like:\nHost my-instance.us-central1-a.my-project HostName 34.72.x.x IdentityFile ~/.ssh/google_compute_engine #this file exists after connecting to the vm the first time User my-username CheckHostIP no StrictHostKeyChecking no So you can just `ssh my-instance.us-central1-a.my-project` directly without remembering zones or IPs. See: https://cloud.google.com/sdk/gcloud/reference/compute/config-ssh\nUsing a Proxy Command in the ssh config TUNNEL_PORT=2222 VM_NAME=drupal-vm PROJECT=fao-sti-review ZONE=europe-west1-b Host $VM_NAME User \u0026lt;your remote user name\u0026gt; IdentityFile ~/.ssh/google_compute_engine ProxyCommand gcloud compute start-iap-tunnel %h 22 --listen-on-stdin --project=$PROJECT --zone=$ZONE See: https://unix.stackexchange.com/questions/590957/ssh-config-to-start-session-with-google-cloud-compute-instance?utm_source=chatgpt.com\nOpening a tunnel and specifying the tunnel\u0026rsquo;s port on localhost If you specify your ssh connection in the config like:\nHost drupal-fao User \u0026lt;your remote user name\u0026gt; HostName localhost IdentityFile /home/\u0026lt;your local user name\u0026gt;/.ssh/google_compute_engine Port 2222 ForwardAgent yes Then you can open the tunnel like this:\nTUNNEL_PORT=2222 VM_NAME=drupal-vm PROJECT=fao-sti-review ZONE=europe-west1-b gcloud compute start-iap-tunnel \u0026#34;$VM_NAME\u0026#34; 22 \\ --local-host-port=localhost:$TUNNEL_PORT \\ --project=\u0026#34;$PROJECT\u0026#34; \\ --zone=\u0026#34;$ZONE\u0026#34; \\ --quiet Afterwards you can connect through vscode and ssh drupal-fao works automatically\nSet up new instance Prepare mysql CREATE USER \u0026#39;drupal_user\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026lt;password as in settings.php\u0026gt;; GRANT ALL PRIVILEGES ON drupal.* TO \u0026#39;drupal_user\u0026#39;@\u0026#39;localhost\u0026#39;; FLUSH PRIVILEGES; CREATE DATABASE drupal; Get the code git clone git@github.com:un-fao/fao-sti-portal.git Get the files sync.sh fao-review:/var/www/html/ ./sti-portal-fao #replace fao-review with whatever is in your .ssh/config Get the DB # Get the latest DB dump here: https://console.cloud.google.com/storage/browser/fao-sti-review-backups;tab=objects?q=search\u0026amp;referrer=search\u0026amp;project=fao-sti-review\u0026amp;prefix=\u0026amp;forceOnObjectsSortingFiltering=false mysql -u drupal_user -p drupal \u0026lt; ~/Downloads/\u0026lt;your recent backup\u0026gt;.sql Finish vendor/bin/drush cr vendor/bin/drush serve 127.0.0.1:8080 Styling New view display Task: Change the layout of the popup cards in the leaflet map view. (Remove the image). Steps to solve: Create a View Mode langcode: en status: true dependencies: module: ​ - node id: node.map_teaser label: \u0026#39;Map teaser\u0026#39; description: \u0026#39;Used for Leaflet popups.\u0026#39; targetEntityType: node cache: true Create a Entity View Display langcode: en status: true dependencies: config: ​ - core.entity_view_mode.node.map_teaser ​ - field.field.node.innovation.ai_automator_status ​ - field.field.node.innovation.body ​ - field.field.node.innovation.field_actual_users ​ - field.field.node.innovation.field_adoptability_dimensions ​ - field.field.node.innovation.field_adoption_description ​ - field.field.node.innovation.field_adoption_level ​ - field.field.node.innovation.field_afs_stf_areas ​ - field.field.node.innovation.field_ai_stamp ​ - field.field.node.innovation.field_allow_ai_update ​ - field.field.node.innovation.field_allow_ai_update_if_empty ​ - field.field.node.innovation.field_allow_overwr_if_empty ​ - field.field.node.innovation.field_allow_overwriting_by_origi ​ - field.field.node.innovation.field_areas_of_expertise ​ - field.field.node.innovation.field_areas_of_need ​ - field.field.node.innovation.field_atio_innovation_category ​ - field.field.node.innovation.field_atio_kb_source ​ - field.field.node.innovation.field_award_year ​ - field.field.node.innovation.field_bib_citation_of_pub ​ - field.field.node.innovation.field_challenges_addressed ​ - field.field.node.innovation.field_city ​ - field.field.node.innovation.field_collection ​ - field.field.node.innovation.field_countries_adoption ​ - field.field.node.innovation.field_country_origin ​ - field.field.node.innovation.field_curation_notes ​ - field.field.node.innovation.field_data_source ​ - field.field.node.innovation.field_description_markup ​ - field.field.node.innovation.field_display_mode ​ - field.field.node.innovation.field_entity_creation_mode ​ - field.field.node.innovation.field_environmental_impact ​ - field.field.node.innovation.field_ffs_type ​ - field.field.node.innovation.field_grassroot_partner ​ - field.field.node.innovation.field_grassroots_innovation_narr ​ - field.field.node.innovation.field_human_impact ​ - field.field.node.innovation.field_identifying_feature ​ - field.field.node.innovation.field_if_grassroots ​ - field.field.node.innovation.field_impact_sdgs ​ - field.field.node.innovation.field_inclusion_and_representati ​ - field.field.node.innovation.field_info_on_partial_editing ​ - field.field.node.innovation.field_information_resource_date ​ - field.field.node.innovation.field_innovation_domain ​ - field.field.node.innovation.field_innovation_stage ​ - field.field.node.innovation.field_innovation_type ​ - field.field.node.innovation.field_innovative_elements_narrat ​ - field.field.node.innovation.field_innovative_features ​ - field.field.node.innovation.field_investment_type ​ - field.field.node.innovation.field_languages ​ - field.field.node.innovation.field_long_term_beneficiaries ​ - field.field.node.innovation.field_original_descr_markup ​ - field.field.node.innovation.field_original_extracted_innovat ​ - field.field.node.innovation.field_owner ​ - field.field.node.innovation.field_partners ​ - field.field.node.innovation.field_prospective_users ​ - field.field.node.innovation.field_readiness_description ​ - field.field.node.innovation.field_readiness_level ​ - field.field.node.innovation.field_record_long_metadata ​ - field.field.node.innovation.field_record_metadata ​ - field.field.node.innovation.field_record_status ​ - field.field.node.innovation.field_region ​ - field.field.node.innovation.field_related_innovation_core ​ - field.field.node.innovation.field_scaling_level_idia ​ - field.field.node.innovation.field_shorter_description ​ - field.field.node.innovation.field_sponsors ​ - field.field.node.innovation.field_start_date ​ - field.field.node.innovation.field_start_year ​ - field.field.node.innovation.field_state ​ - field.field.node.innovation.field_stf_development_status ​ - field.field.node.innovation.field_stf_level_of_recognition ​ - field.field.node.innovation.field_stf_organization_size ​ - field.field.node.innovation.field_stf_organization_type ​ - field.field.node.innovation.field_thematic_area ​ - field.field.node.innovation.field_title_instructions ​ - field.field.node.innovation.field_url_s ​ - field.field.node.innovation.field_use_case_image ​ - field.field.node.innovation.field_use_cases ​ - field.field.node.innovation.field_use_cases_description ​ - node.type.innovation module: ​ - text id: node.innovation.map_teaser targetEntityType: node bundle: innovation mode: map_teaser content: field_ai_disclaimer: type: markup label: hidden settings: { } third_party_settings: { } weight: 2 region: content field_country_origin: type: entity_reference_label label: above settings: link: true third_party_settings: { } weight: 2 region: content field_data_source: type: entity_reference_label label: above settings: link: true third_party_settings: { } weight: 3 region: content field_shorter_description: type: text_default label: above settings: { } third_party_settings: { } weight: 1 region: content title: type: string label: above settings: link_to_entity: false third_party_settings: { } weight: 0 region: content hidden: ai_automator_status: true body: true content_moderation_control: true created: true field_actual_users: true field_adoptability_dimensions: true field_adoption_description: true field_adoption_level: true field_afs_stf_areas: true field_ai_stamp: true field_allow_ai_update: true field_allow_ai_update_if_empty: true field_allow_overwr_if_empty: true field_allow_overwriting_by_origi: true field_areas_of_expertise: true field_areas_of_need: true field_atio_innovation_category: true field_atio_kb_source: true field_award_year: true field_bib_citation_of_pub: true field_challenges_addressed: true field_city: true field_collection: true field_countries_adoption: true field_curation_notes: true field_description_markup: true field_display_mode: true field_entity_creation_mode: true field_environmental_impact: true field_ffs_type: true field_grassroot_partner: true field_grassroots_innovation_narr: true field_human_impact: true field_identifying_feature: true field_if_grassroots: true field_impact_sdgs: true field_inclusion_and_representati: true field_info_on_partial_editing: true field_information_resource_date: true field_innovation_domain: true field_innovation_stage: true field_innovation_type: true field_innovative_elements_narrat: true field_innovative_features: true field_investment_type: true field_languages: true field_long_term_beneficiaries: true field_original_descr_markup: true field_original_extracted_innovat: true field_owner: true field_partners: true field_prospective_users: true field_readiness_description: true field_readiness_level: true field_record_long_metadata: true field_record_metadata: true field_record_status: true field_region: true field_related_innovation_core: true field_scaling_level_idia: true field_sponsors: true field_start_date: true field_start_year: true field_state: true field_stf_development_status: true field_stf_level_of_recognition: true field_stf_organization_size: true field_stf_organization_type: true field_thematic_area: true field_title_instructions: true field_url_s: true field_use_case_image: true field_use_cases: true field_use_cases_description: true field_variant: true langcode: true links: true search_api_excerpt: true synonyms: true uid: true Manage the content display (admin/structure/types/manage/innovation/display/) If you imported working configs like above not needed Check that under tab default, your new display is checked under Custom display settings (all the way at the bottom of the page) Apply a corresponding twig template, in this case: /var/www/html/web/themes/custom/fao/templates/content/node--innovation--map-teaser.html.twig {# /** ​ * @file ​ * Default theme implementation to display a node. * ​ * Available variables: ​ * - node: The node entity with limited access to object properties and methods. ​ * Only method names starting with \u0026#34;get\u0026#34;, \u0026#34;has\u0026#34;, or \u0026#34;is\u0026#34; and a few common ​ * methods such as \u0026#34;id\u0026#34;, \u0026#34;label\u0026#34;, and \u0026#34;bundle\u0026#34; are available. For example: ​ * - node.getCreatedTime() will return the node creation timestamp. ​ * - node.hasField(\u0026#39;field_example\u0026#39;) returns TRUE if the node bundle includes ​ * field_example. (This does not indicate the presence of a value in this ​ * field.) ​ * - node.isPublished() will return whether the node is published or not. ​ * Calling other methods, such as node.delete(), will result in an exception. ​ * See \\Drupal\\node\\Entity\\Node for a full list of public properties and ​ * methods for the node object. ​ * - label: (optional) The title of the node. ​ * - content: All node items. Use {{ content }} to print them all, ​ * or print a subset such as {{ content.field_example }}. Use ​ * {{ content|without(\u0026#39;field_example\u0026#39;) }} to temporarily suppress the printing ​ * of a given child element. ​ * - author_picture: The node author user entity, rendered using the \u0026#34;compact\u0026#34; ​ * view mode. ​ * - metadata: Metadata for this node. ​ * - date: (optional) Themed creation date field. ​ * - author_name: (optional) Themed author name field. ​ * - url: Direct URL of the current node. ​ * - display_submitted: Whether submission information should be displayed. ​ * - attributes: HTML attributes for the containing element. ​ * The attributes.class element may contain one or more of the following ​ * classes: ​ * - node: The current template type (also known as a \u0026#34;theming hook\u0026#34;). ​ * - node--type-[type]: The current node type. For example, if the node is an ​ * \u0026#34;Article\u0026#34; it would result in \u0026#34;node--type-article\u0026#34;. Note that the machine ​ * name will often be in a short form of the human readable label. ​ * - node--view-mode-[view_mode]: The View Mode of the node; for example, a ​ * teaser would result in: \u0026#34;node--view-mode-teaser\u0026#34;, and ​ * full: \u0026#34;node--view-mode-full\u0026#34;. ​ * The following are controlled through the node publishing options. ​ * - node--promoted: Appears on nodes promoted to the front page. ​ * - node--sticky: Appears on nodes ordered above other non-sticky nodes in ​ * teaser listings. ​ * - node--unpublished: Appears on unpublished nodes visible only to site ​ * admins. ​ * - title_attributes: Same as attributes, except applied to the main title ​ * tag that appears in the template. ​ * - content_attributes: Same as attributes, except applied to the main ​ * content tag that appears in the template. ​ * - author_attributes: Same as attributes, except applied to the author of ​ * the node tag that appears in the template. ​ * - title_prefix: Additional output populated by modules, intended to be ​ * displayed in front of the main title tag that appears in the template. ​ * - title_suffix: Additional output populated by modules, intended to be ​ * displayed after the main title tag that appears in the template. ​ * - view_mode: View mode; for example, \u0026#34;teaser\u0026#34; or \u0026#34;full\u0026#34;. ​ * - teaser: Flag for the teaser state. Will be true if view_mode is \u0026#39;teaser\u0026#39;. ​ * - page: Flag for the full page state. Will be true if view_mode is \u0026#39;full\u0026#39;. * ​ * @see template_preprocess_node() * ​ * @ingroup themeable */ #} {% set classes = [ \u0026#39;card\u0026#39;, \u0026#39;card-events\u0026#39; ] %} {{ attach_library(\u0026#39;fao/maps\u0026#39;) }} \u0026lt;article{{ attributes.addClass(classes) }}\u0026gt; {{ title_prefix }} {{ title_suffix }} {# \u0026lt;div class=\u0026#34;card-image ratio ratio-3x2\u0026#34;\u0026gt; #} {# {{ content.field_use_case_image }} #} {# \u0026lt;/div\u0026gt; #} \u0026lt;div class=\u0026#34;card-body\u0026#34;\u0026gt; \u0026lt;h6 class=\u0026#34;title-category \u0026#34;\u0026gt; {{ node.field_innovation_type.0.entity.name.value }} \u0026lt;/h6\u0026gt; \u0026lt;h5 class=\u0026#34;card-title\u0026#34;\u0026gt;\u0026lt;a href=\u0026#34;{{ url }}\u0026#34; class=\u0026#34;title-link\u0026#34;\u0026gt;{{ node.title.value }}\u0026lt;/a\u0026gt;\u0026lt;/h5\u0026gt; \u0026lt;h6 class=\u0026#34;date-location card-date-location\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;location\u0026#34;\u0026gt; {% if content.field_country_origin|render|trim %} \u0026lt;i class=\u0026#34;bi bi-geo-alt-fill\u0026#34;\u0026gt;\u0026lt;/i\u0026gt; {{ content.field_country_origin }} {% endif %} \u0026lt;span class=\u0026#34;date\u0026#34;\u0026gt;{{ node.getCreatedTime()|date(\u0026#39;d/m/Y\u0026#39;) }}\u0026lt;/span\u0026gt; \u0026lt;/span\u0026gt; \u0026lt;/h6\u0026gt; \u0026lt;div class=\u0026#34;card-text\u0026#34;\u0026gt; {{ content.field_shorter_description }} \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;classifications card-classifications\u0026#34;\u0026gt; {{ content.field_innovation_type }} {{ content.field_use_cases }} {% if sdgs %} \u0026lt;div class=\u0026#34;sdg-list\u0026#34;\u0026gt; {% for sdg in sdgs %} \u0026lt;a href=\u0026#34;{{ sdg.url }}\u0026#34; class=\u0026#34;sdg-small text-white text-decoration-none {{ sdg.class }}\u0026#34;\u0026gt;\u0026lt;/a\u0026gt; {% endfor %} \u0026lt;/div\u0026gt; {% endif %} \u0026lt;/div\u0026gt; {{ content.field_data_source }} \u0026lt;/div\u0026gt; \u0026lt;/article\u0026gt; {# Custom template for Innovation nodes in Map teaser view mode. {% set classes = [\u0026#39;card-events\u0026#39;, \u0026#39;card-map-popup\u0026#39;] %} \u0026lt;article{{ attributes.addClass(classes) }}\u0026gt; \u0026lt;h5 class=\u0026#34;popup-title\u0026#34;\u0026gt; {{ label }} \u0026lt;/h5\u0026gt; \u0026lt;div class=\u0026#34;popup-body\u0026#34;\u0026gt; {{ content.field_shorter_description }} {{ content.field_innovation_type }} {{ content.field_use_cases }} \u0026lt;/div\u0026gt; \u0026lt;/article\u0026gt; #} Fine-tune what elements are shown on the card, by moving items to the \u0026lsquo;Field\u0026rsquo; section at admin/structure/types/manage/innovation/display/ Explanation: Drupal styling goes through a couple of steps: The content display determines which elements are displayed, and twig then styles those elements\nit seems twig can also override this behavior and automatically display certain elements even if they\u0026rsquo;re not selected in the content display\nMake search bar scrollable Can e.g. be achieved by this: .view-filters { max-height: 100vh; overflow-y: auto; position: sticky; top: 0; padding-right: 10px; overflow-x: hidden; } Apache config Maintaining two drupal installs and resulting sites requires to set up some wiring in apache, in order to have two meaningful addresses.\nPath resolution configure /etc/apache2/sites-enabled/000-default.conf every drupal root needs to have its own Directory \u0026lt;VirtualHost *:80\u0026gt; # 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\u0026#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 \u0026lt;Directory /var/www/html\u0026gt; Options FollowSymLinks MultiViews AllowOverride None Require all granted \u0026lt;/Directory\u0026gt; \u0026lt;Directory /var/www/html/sti-portal/html\u0026gt; Options FollowSymLinks MultiViews AllowOverride All Require all granted \u0026lt;/Directory\u0026gt; \u0026lt;Directory /var/www/html/sti-social/html\u0026gt; Options FollowSymLinks MultiViews AllowOverride All Require all granted \u0026lt;/Directory\u0026gt; # The path after alias is the path relative to root that will be accessible Alias /network /var/www/html/sti-social/html \u0026lt;Directory /var/www/html/sti-social/html\u0026gt; Options FollowSymLinks MultiViews AllowOverride All Require all granted \u0026lt;/Directory\u0026gt; # 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 \u0026#34;a2disconf\u0026#34;. #Include conf-available/serve-cgi-bin.conf \u0026lt;/VirtualHost\u0026gt; Inststall Drupal Page sudo -u www-data vendor/bin/drush --root=html --uri=\u0026quot;http://localhost/network\u0026quot; cr\nAdd a custom block Create the block under /admin/structure/block-content Add a block instance under /block/add/hero_submit_idea Find the block to set under /admin/structure/block Install open social For version 13 you need php3.8-fhm\ncurl -fsSL https://packages.sury.org/php/apt.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/sury-php.gpg echo \u0026#34;deb [signed-by=/etc/apt/keyrings/sury-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main\u0026#34; | sudo tee /etc/apt/sources.list.d/sury-php.list sudo apt update 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 sudo a2enmod proxy_fcgi setenvif php8.3-fpm sudo a2disconf php8.2-fpm 2\u0026gt;/dev/null || true sudo systemctl enable --now php8.3-fpm sudo systemctl restart php8.3-fpm sudo systemctl restart apache2 Set up the site \u0026amp; DB\nsudo -u www-data vendor/bin/drush --root=html --sites-subdir=default -y site:install social --db-url=\u0026#39;mysql://social:social@127.0.0.1:3306/social\u0026#39; Load in old db\nzcat /home/tristan/db.sql.gz | vendor/bin/drush --root=html sqlc Configure apache\ncat /etc/apache2/sites-enabled/000-default.conf \u0026lt;VirtualHost *:80\u0026gt; # 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\u0026#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 \u0026lt;Directory /var/www/html/sti-portal/web\u0026gt; Options FollowSymLinks MultiViews AllowOverride All Require all granted \u0026lt;/Directory\u0026gt; Alias /network /var/www/html/sti-social/html \u0026lt;Directory /var/www/html/sti-social/html\u0026gt; Options FollowSymLinks MultiViews AllowOverride All Require all granted \u0026lt;/Directory\u0026gt; # 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 \u0026#34;a2disconf\u0026#34;. #Include conf-available/serve-cgi-bin.conf # Make Drupal think the original request was HTTPS externally. \u0026lt;Location \u0026#34;/network\u0026#34;\u0026gt; RequestHeader set X-Forwarded-Proto \u0026#34;https\u0026#34; RequestHeader set X-Forwarded-Port \u0026#34;443\u0026#34; RequestHeader set X-Forwarded-Host \u0026#34;sti-portal.edge.faofao.org\u0026#34; \u0026lt;/Location\u0026gt; \u0026lt;/VirtualHost check config with apachectl configtest\nenable with sudo systemctl restart apache2\nKiautschou str 6\nSolution adding kdePackages.akonadi-calendar to my config and re-loading plasma (systemctl --user restart plasma-plasmashell.service) solved the issue Resources commented on github: https://github.com/NixOS/nixpkgs/issues/344025 ","permalink":"https://blog.twiessalla.de/posts/drupal-documentation/","summary":"\u003cp\u003eI\u0026rsquo;ll break this apart into a multi-part series soon.\u003c/p\u003e\n\u003ch2 id=\"importing-data-in-drupal\"\u003eImporting data in Drupal \u003c!-- raw HTML omitted --\u003e\u003c!-- raw HTML omitted --\u003edrupal\u003c!-- raw HTML omitted --\u003e\u003c!-- raw HTML omitted --\u003e\u003c/h2\u003e\n\u003ch3 id=\"importing-data\"\u003eImporting data\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eThe general workflow from original record (\u003ccode\u003esource_record\u003c/code\u003e) to AI-extracted record (\u003ccode\u003eextracted_entity\u003c/code\u003e) and finally the innovation (\u003ccode\u003einnovation\u003c/code\u003e) you find on the user-facing website is:\n\u003col\u003e\n\u003cli\u003ewrite migration.yml file\u003c/li\u003e\n\u003cli\u003eupload source file (json, csv, \u0026hellip;) to \u003ccode\u003eweb/modules/custom/\u0026lt;your_module_name\u0026gt;/source/\u0026lt;your_source_name_as_in_yml\u0026gt;\u003c/code\u003e)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edrush migrate:import \u0026lt;your migration id\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"rolling-back\"\u003eRolling back\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eThis generally fails because of a malformatted migration file or typos etc in the source data, to rollback you do\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003edrush migrate:stop \u0026lt;your migration id\u0026gt;\u003c/code\u003e to stop any migration process going on\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edrush migrate:reset \u0026lt;your migration id\u0026gt;\u003c/code\u003e to set the migration status to \u0026lsquo;idle\u0026rsquo; (i.e. ready to import)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edrush migrate:rollback \u0026lt;your migration id\u0026gt;\u003c/code\u003e to remove any partially imported records\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003cli\u003eSome notes on rollback: If you already have downstream content types based off of earlier imported source records, you\u0026rsquo;re prone to create duplicates when rolling back \u0026amp; re-importing the same sources. Your options are then:\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003edrush migrate:rollback \u0026lt;your migration id\u0026gt; --update\u003c/code\u003e to only update \u003ccode\u003esource_record\u003c/code\u003e that changed in the source data (because you e.g. changed the json structure)\u003c/li\u003e\n\u003cli\u003ePurge all downstream content by going to (Web menu -\u0026gt; BACK-END -\u0026gt; Manage \u0026lt;content type\u0026gt;)\n\u003col\u003e\n\u003cli\u003eOnce there, filter for all content of interest, select the action \u0026lsquo;Delete\u0026rsquo; from the Action drop-down and execute\u003c/li\u003e\n\u003cli\u003eYou might need to do this 3 times, for \u0026lsquo;Original Record\u0026rsquo;, \u0026lsquo;AI-extracted innovation record\u0026rsquo; and \u0026lsquo;Innovation\u0026rsquo;\u003c/li\u003e\n\u003cli\u003eAfter purging existing data, you can run \u003ccode\u003edrush migrate:import \u0026lt;your migration id\u0026gt;\u003c/code\u003e again\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"yaml-template-for-import\"\u003eyaml Template for import\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003euuid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;added after import, delete this column before importing\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elangcode\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003een\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003estatus\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eenforced\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003emodule\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e- \u003cspan class=\"l\"\u003e\u0026lt;import_STI_portal_data / import_IRD_jsons\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;machine reference to this migration\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003efield_plugin_method\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003ecck_plugin_method\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emigration_tags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSTI\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emigration_group\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSTI-import-group\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003elabel\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;description, e.g. the one found in Manage data sources\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;csv / json\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003econstants\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eSOURCE\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;source name as found in Manage data sources\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eSOURCE_ID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;source name as found in the Manage data sources url\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eRECTYPE\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;check what rectypes are set in Mange data source\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;path to the json or csv file to migrate\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eheader_offset\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eids\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003e\u0026lt;the data column containing unique IDs, eg. id, url, title\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003eprocess\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efield_data_source\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003econstants/SOURCE_ID\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# Needed so that imported records are assigned to the correct data source\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efield_original_internal_id\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eskip_on_empty\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;give the same as set in \u0026#39;ids\u0026#39; above\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erow\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003emessage: \u0026#39;Row does not contain Project Symbol\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eskipped\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etitle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eskip_on_empty\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;data column containing the name/title of the entry\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003erow\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003emessage: \u0026#39;Row does not contain title\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eskipped\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edefault_value\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edefault_value\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esource_record\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# leave unchanged, you\u0026#39;re importing a \u0026#39;source_record\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efield_shorter_description/value\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eskip_on_empty\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;data column containing a 1-2 sentence description\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eprocess\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Row does not contain short descr.\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efield_shorter_description/format\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edefault_value\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edefault_value\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003efull_html\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efield_long_description/value\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eskip_on_empty\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;data column containing a long freetext description\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eprocess\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Row does not contain short descr.\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efield_long_description/format\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003edefault_value\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edefault_value\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003efull_html\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecallback\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecallable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etime\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eunpack_source\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e{\u003cspan class=\"w\"\u003e  \u003c/span\u003e}\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efield_impact_sdgs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eexplode\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003edelimiter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;,\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;data column mentioning sdgs\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecallback\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ecallable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etrim\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epreg_replace\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003epattern\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\\..*\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"c\"\u003e# Often it is necessary to map however sdgs are named in the source data to the STI portal taxonomy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003estatic_map\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;1\u0026#39;: \u0026#39;Goal 1\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003eNo\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003epoverty\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;2\u0026#39;: \u0026#39;Goal 2\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eZero hunger\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;3\u0026#39;: \u0026#39;Goal 3\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eGood health and well-being\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;4\u0026#39;: \u0026#39;Goal 4\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eQuality education\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;5\u0026#39;: \u0026#39;Goal 5\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eGender equality\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;6\u0026#39;: \u0026#39;Goal 6\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eClean water and sanitation\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;7\u0026#39;: \u0026#39;Goal 7\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eAffordable and clean energy\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;8\u0026#39;: \u0026#39;Goal 8\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eDecent work and economic growth\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;9\u0026#39;: \u0026#39;Goal 9\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eIndustry, innovation and infrastructure\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;10\u0026#39;: \u0026#39;Goal 10\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eReduced inequalities\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;11\u0026#39;: \u0026#39;Goal 11\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eSustainable cities and communities\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;12\u0026#39;: \u0026#39;Goal 12\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eResponsible consumption and production\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;13\u0026#39;: \u0026#39;Goal 13\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eClimate action\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;14\u0026#39;: \u0026#39;Goal 14\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eLife below water\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;15\u0026#39;: \u0026#39;Goal 15\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eLife on land\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;16\u0026#39;: \u0026#39;Goal 16\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePeace, justice and strong institutions\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026#39;17\u0026#39;: \u0026#39;Goal 17\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ePartnerships for the goals\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003edefault_value\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eentity_lookup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eentity_type\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etaxonomy_term\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eignore_case\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003evalue_key\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ebundle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eimpact_sdgs\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efield_region\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eentity_generate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eentity_type\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etaxonomy_term\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eignore_case\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evalue_key\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;region column or field\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebundle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecountries_no_standard\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efield_innovation_type\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eexplode\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;innovation column or field\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edelimiter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecallback\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecallable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etrim\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eentity_lookup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eentity_type\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etaxonomy_term\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eignore_case\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evalue_key\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebundle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efield_use_cases\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eexplode\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;use cases column or field\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003edelimiter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e- \u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecallback\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ecallable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etrim\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eentity_lookup\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eentity_type\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etaxonomy_term\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003eignore_case\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003evalue_key\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nt\"\u003ebundle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003euse_cases\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003efield_adoption_countries_ns\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c\"\u003e# this field is needed in case country names do not follow the UN/FAO - Standards\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eskip_on_empty\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eprocess\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003esource\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003e\u0026lt;use cases column or field\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eexplode\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003edelimiter\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;-\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e-\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003eentity_generate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eentity_type\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003etaxonomy_term\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003eignore_case\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003evalue_key\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"nt\"\u003ebundle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003ecountries_no_standard\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003edestination\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eplugin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;entity:node\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003edefault_bundle\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003esource_record\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003eoverwrite_properties\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003efield_data_source\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003efield_original_internal_id\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003efield_shorter_description/value\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e- \u003cspan class=\"l\"\u003efield_long_description/value\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003emigration_dependencies\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nt\"\u003erequired\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e{\u003cspan class=\"w\"\u003e  \u003c/span\u003e}\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eThe migration has 4 top-level parts:\u003c/p\u003e","title":"Learning Drupal"},{"content":"Problem 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 \u0026lsquo;Calendar Events\u0026rsquo; and selecting my calendars of interest This used to work fine and broke with a recent update Solution adding kdePackages.akonadi-calendar to my config and re-loading plasma (systemctl --user restart plasma-plasmashell.service) solved the issue Resources commented on github: https://github.com/NixOS/nixpkgs/issues/344025 ","permalink":"https://blog.twiessalla.de/posts/kde-clock/","summary":"\u003ch2 id=\"problem\"\u003eProblem\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eUsing 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 \u0026lsquo;Calendar Events\u0026rsquo; and selecting my calendars of interest\u003c/li\u003e\n\u003cli\u003eThis used to work fine and broke with a recent update\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"solution\"\u003eSolution\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eadding \u003ccode\u003ekdePackages.akonadi-calendar\u003c/code\u003e to my config and re-loading plasma (\u003ccode\u003esystemctl --user restart plasma-plasmashell.service\u003c/code\u003e) solved the issue\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"resources\"\u003eResources\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ecommented on github: \u003ca href=\"https://github.com/NixOS/nixpkgs/issues/344025\"\u003ehttps://github.com/NixOS/nixpkgs/issues/344025\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"KDE Digital Clock"},{"content":"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.\nFrom 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.\nWhy 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\u0026rsquo;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\u0026rsquo;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\u0026rsquo;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.\nSo 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 \u0026lsquo;users\u0026rsquo;. We need generations for whom algorithms aren\u0026rsquo;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\u0026rsquo;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.\nThis 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.\nI 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.\n","permalink":"https://blog.twiessalla.de/posts/on-autistici-inventati/","summary":"\u003cp\u003eWhen 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.\u003c/p\u003e\n\u003cp\u003eFrom 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.\u003c/p\u003e","title":"A/I from the viewpoint of digital sovereignty"}]