From c3df91c2709b219a581f1c0ace5ebb7159c7c782 Mon Sep 17 00:00:00 2001 From: mv141575 Date: Mon, 2 Nov 2026 16:33:47 +0100 Subject: [PATCH 1/3] Add RDF (Bioschemas) to exchange docu --- TeSS_docs/content/exchange.md | 129 +++++++++++++++++++--------------- 1 file changed, 72 insertions(+), 57 deletions(-) diff --git a/TeSS_docs/content/exchange.md b/TeSS_docs/content/exchange.md index 37d1eb4..927531d 100644 --- a/TeSS_docs/content/exchange.md +++ b/TeSS_docs/content/exchange.md @@ -1,100 +1,115 @@ # Exchange content -TeSS can import content from a range of external sources. +TeSS can import content from a range of external sources. When the source is also based on TeSS, there are additional features which allow you to customise and automate the exchange, thanks to the [mTeSS-X project](../overview/mtess-x). ```{image} ../images/content/graphic-exchange.svg -:alt: Graphic of multi-spaces +:alt: Graphic of content exchange :class: mb-1 :width: 300px :align: center ``` +## How is content exchanged? + +TeSS uses [OAI-PMH](https://www.openarchives.org/pmh/) to exchange materials and events between catalogues. It supports two metadata formats: + +- **Bioschemas RDF**, using schema.org properties, provides richer descriptions of training content and is supported by up-to-date TeSS instances. +- **Dublin Core** provides a smaller set of properties and is supported by many other catalogue platforms. + +TeSS first requests Bioschemas RDF. If that format is unavailable or no recognised materials or events are found, it falls back to Dublin Core. The two formats are not combined to fill gaps in individual records. + +With Bioschemas RDF, `LearningResource` records become TeSS materials, while `Event` and `CourseInstance` records become TeSS events. Courses linked to course instances can also supply metadata for those events. + +With Dublin Core, records become TeSS events if a `dc:type` value contains "event" (case-insensitive), for example `http://purl.org/dc/dcmitype/Event`. Other records become TeSS materials. + ## Which filters can I use to exchange? -TeSS provides a selection of the most useful filters to customise which materials are exchanged. +TeSS provides a selection of filters to customise which materials and events are exchanged. This list is being expanded as part of the [TeSSHub4EOSC project](../overview/tesshub4eosc). If a filter you need is not available, please contact us. -| Filtered property in TeSS (*material or event*) | Exchanged property in Dublin Core | -|:------------------------------------------------|:-------------------------------------| -| Target audience | (None) | -| Keyword | `dc:subject` | -| Title | `dc:title` | -| Description (equals), Description (contains) | `dc:description` convert to text | -| URL (equals), URL (begins) | `dc:identifier` if http(s) | -| DOI | `dc:identifier` if DOI, store as URI | -| License (*material only*) | `dc:rights` | -| Difficulty level | (None) | -| Resource type | `dc:type` * | -| Prerequisites (contains) | (None) | -| Learning objectives (contains) | (None) | - -*When exchanging materials using Dublin Core/[OAI-PMH](https://www.openarchives.org/pmh/), if the `dc:type` includes `http://purl.org/dcmitype/Event` then the item is imported as a TeSS event, else it is imported as a TeSS material. +The tables below show the main supported filters including metadata mappings. `schema:` refers to schema.org; `dc:` refers to Dublin Core. + +An arrow indicates a property of a linked object. For example, `schema:audience` → `schema:audienceType` means the type of the audience. + +Filters are applied to the values imported into TeSS. Their availability therefore depends on the metadata supplied by the source. + +| Filtered property in TeSS | Exchanged properties | +|:-------------------------|:---------------------| +| Target audience | `schema:audience` → `schema:audienceType` | +| Keyword | `schema:keywords`; `dc:subject` | +| Title (equals / contains) | `schema:name`; `dc:title` | +| Description (equals / contains) | `schema:description`; `dc:description` | +| URL (equals / begins) | `schema:url`; `dc:identifier` containing an HTTP(S) URL | +| DOI (*material only*) | `schema:identifier` containing a DOI; `dc:identifier` containing a DOI | +| License (*material only*) | `schema:license`; `dc:rights` | +| Difficulty level (*material only*) | `schema:educationalLevel` | +| Resource type (*material only*) | `schema:learningResourceType`; `dc:type` | +| Prerequisites (contains) | `schema:competencyRequired` for materials; `schema:coursePrerequisites` for events | +| Learning objectives (contains) | `schema:teaches` | + +Recognised HTML formatting in descriptions is converted to Markdown before filtering. The following filters are available for *events only*: -| Filtered property in TeSS (event only) | Exchanged property in Dublin Core | -|:---------------------------------------|:------------------------| -| Subtitle (equals), Subtitle (contains) | (None) | -| City | (None) | -| Country | (None) | -| Event type | (None) | -| Timezone | (None) | +| Filtered property in TeSS | Exchanged properties | +|:-------------------------|:---------------------| +| Subtitle (equals), Subtitle (contains) | `schema:alternateName` | +| City | `schema:location` → `schema:address` → `schema:addressLocality` | +| Country | `schema:location` → `schema:address` → `schema:addressCountry` | +| Event type | Set to "Workshops and courses" for RDF course instances; `dc:type` for Dublin Core events | +| Timezone | Not currently populated from exchanged metadata | -The following properties can also be populated when exchanging materials but without filter controls: +The following properties can also be populated during exchange, but have no dedicated filter controls: -| Non-filtered property in TeSS | Exchanged property in Dublin Core | -|:------------------------------------------------|:----------------------------------| -| Contact | `dc:publisher` | -| Authors (*materials*), Organizer (*events*) | `dc:creator` | -| Language (*event only*) | `dc:language` | -| Scientific Topics | `dc:subject` | -| Date created (*material*), Start date (*event*) | `dc:date` earliest date found ** | -| Date modified (*material*), End date (*event*) | `dc:date` latest date found ** | +| Non-filtered property in TeSS | Exchanged properties | +|:-----------------------------|:---------------------| +| Contact | For RDF events: `schema:contact` → `schema:name` and `schema:email`; for Dublin Core materials and events: `dc:publisher` | +| Authors (*material only*) | `schema:author` → `schema:name`; `dc:creator` | +| Organizer (*event only*) | `schema:organizer`; first non-empty `dc:creator` | +| Language (*event only*) | `schema:inLanguage` | +| Scientific topics | `schema:about` referencing `schema:DefinedTerm` resources | +| Date created (*material only*) | `schema:dateCreated`; first successfully parsed `dc:date` | +| Date modified (*material only*) | `schema:dateModified`; last successfully parsed `dc:date`, if more than one is present | +| Start date (*event only*) | `schema:startDate`; first successfully parsed `dc:date` | +| End date (*event only*) | `schema:endDate`; last successfully parsed `dc:date` | -**When exchanging materials using Dublin Core/[OAI-PMH](https://www.openarchives.org/pmh/), if the item is interpreted as a TeSS event, the `dc:date` properties are sorted in date order, and the earliest date found becomes the start of the event, the latest date found becomes the end date of the event. If the item is interpreted as a TeSS material, these become the date created and date modified, respectively. +Dublin Core dates are used in the order supplied, not sorted chronologically. For events with only one successfully parsed date, that date supplies both the start and end dates. + +Dublin Core `dc:subject` values populate keywords, not scientific topics. `dc:language` is not currently imported. ```{admonition} See also the definitions of these terms :class: seealso -* [TeSS Platform Defintions](/overview/definitions) +* [TeSS Platform Definitions](/overview/definitions) ``` ## How do I set up an automated exchange from another TeSS instance? -You may take the following steps to setup automated exchange between two TeSS based catalogues (a **source** and a **destination**): +You may take the following steps to set up automated exchange between two TeSS-based catalogues (a **source** and a **destination**): -1) Ensure that you have the correct permissions. To set up the exchange of materials, you need to be a site **admin**, or the **owner of a 'content provider'**, of the destination TeSSHub (where the content should end up). You are the owner of content providers that you create. +1) Ensure that you have the correct permissions. To set up the exchange of materials, you need to be a site **admin**, or the **owner of a content provider**, in the destination TeSSHub (where the content should end up). You are the owner of content providers that you create. 2) Go to the source TeSSHub instance (where the training should come from) and understand what metadata (set of filters) is used there to describe the particular set of training content that should be exchanged. 3) In the source instance, at the top of the list of training materials, go to the 'Subscribe' menu, click 'Harvest using OAI-PMH', and copy the OAI-PMH link. -4) Go to the content provider in the target TeSSHub instance (where the exchanged content should be associated with), open the 'Sources' tab then click the 'Add source' button. -5) Enter the URL that you copied in step 3 into the URL field and select 'OAI-PMH' as the ingestion method. -6) If you are ready for the materials to be automatically exchanged, check the 'Enabled' checkbox; otherwise, if you just want to create the source as a draft, don't check this checkbox. If you are an administrator, you may also directly set the new source as 'Approved' to enable it. Everyone else will need to wait until an administrator approves the source before content starts to be exchanged. -7) You may add **filter conditions** to not exchange the whole content of the source TeSSHub. Only content that satisfies all the conditions in the 'Allow' list and none of the conditions in the 'Block' list is exchanged. For more complex cases where either one set of conditions or another set of conditions but not necessarily all the conditions should be satisfied for exchange, feel free to create multiple sources for each set of conditions. +4) Go to the content provider in the destination TeSSHub instance, open the 'Sources' tab, then click the 'Add source' button. +5) Enter the URL that you copied in step 3 into the URL field and select 'OAI-PMH' as the ingestion method. +6) If you are ready for the materials to be automatically exchanged, check the 'Enabled' checkbox; otherwise, leave it unchecked to save the source as a draft. If you are an administrator, you may also directly set the new source as 'Approved'. Everyone else will need to wait until an administrator approves the source before content starts to be exchanged. +7) You may add **filter conditions** to exchange only part of the source's content. Only content that satisfies all conditions in the 'Allow' list and none of the conditions in the 'Block' list is exchanged. To exchange content matching alternative sets of conditions, create a separate source for each set. 8) Save the source using the 'Register Source' button. -9) After the source is enabled and approved, you may expect content to be exchanged and kept up to date once per day, but this may depend on the configuration of the target TeSSHub instance. +9) After the source is enabled and approved, content is normally exchanged and kept up to date once per day, depending on the configuration of the destination TeSSHub instance. The whole process is also shown in this video. In this example, training material on Python that is not for beginners is exchanged from ELIXIR TeSS to PaN-Training: - [Download video](https://zenodo.org/api/records/18926348/files/exchange-demo.mp4/content) +- [View on Zenodo](https://zenodo.org/records/18926348) Please note that the video may be slightly outdated in some cases. The instructions above may be more up to date. - ## How do I set up an automated exchange from something other than TeSS? -You can automate exhange into a TeSS based catalogue (a **destination**) starting from a non-TeSS based catalogue (a **source**), if the catalogue supports [OAI-PMH](https://www.openarchives.org/pmh/). -The [mapping of properties from DC terms to TeSS](#which-filters-can-i-use-to-exchange) is defined above. -Step 3 will need to be modified slightly depending on your particular catalogue platform. -To setup automated exchange, you may take the following steps: +You can automate exchange into a TeSS-based catalogue from a non-TeSS catalogue if the source supports OAI-PMH with compatible Bioschemas RDF or Dublin Core metadata. -1) Ensure that you have the correct permissions. To set up the exchange of materials, you need to be a site **admin**, or the **owner of a 'content provider'**, of the destination TeSSHub (where the content should end up). You are the owner of content providers that you create. -2) Go to the source catalogue instance (where the training should come from) and understand what metadata (set of filters) is used there to describe the particular set of training content that should be exchanged. -3) In the source instance, find and copy an OAI-PMH link. -4) Go to the content provider in the target TeSSHub instance (where the exchanged content should be associated with), open the 'Sources' tab then click the 'Add source' button. -5) Enter the URL that you copied in step 3 into the URL field and select 'OAI-PMH' as the ingestion method. -6) If you are ready for the materials to be automatically exchanged, check the 'Enabled' checkbox; otherwise, if you just want to create the source as a draft, don't check this checkbox. If you are an administrator, you may also directly set the new source as 'Approved' to enable it. Everyone else will need to wait until an administrator approves the source before content starts to be exchanged. -7) You may add **filter conditions** to not exchange the whole content of the source TeSSHub. Only content that satisfies all the conditions in the 'Allow' list and none of the conditions in the 'Block' list is exchanged. For more complex cases where either one set of conditions or another set of conditions but not necessarily all the conditions should be satisfied for exchange, feel free to create multiple sources for each set of conditions. -8) Save the source using the 'Register Source' button. -9) After the source is enabled and approved, you may expect content to be exchanged and kept up to date once per day, but this may depend on the configuration of the target TeSSHub instance. +The [supported properties and filters](#which-filters-can-i-use-to-exchange) are listed above. Sources offering only Dublin Core provide fewer properties, so some filters may not be usable. + +Follow the [steps for exchange from another TeSS instance](#how-do-i-set-up-an-automated-exchange-from-another-tess-instance), but obtain the source's OAI-PMH endpoint URL from its documentation or administrator instead of using the TeSS 'Subscribe' menu. \ No newline at end of file From 73201c4da8d2e5fae31d97e880906d633b7b826d Mon Sep 17 00:00:00 2001 From: mv141575 Date: Mon, 2 Nov 2026 17:08:53 +0100 Subject: [PATCH 2/3] Small exchange documentation fixes --- TeSS_docs/content/exchange.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/TeSS_docs/content/exchange.md b/TeSS_docs/content/exchange.md index 927531d..28611a5 100644 --- a/TeSS_docs/content/exchange.md +++ b/TeSS_docs/content/exchange.md @@ -54,10 +54,10 @@ The following filters are available for *events only*: | Filtered property in TeSS | Exchanged properties | |:-------------------------|:---------------------| -| Subtitle (equals), Subtitle (contains) | `schema:alternateName` | +| Subtitle (equals / contains) | `schema:alternateName` | | City | `schema:location` → `schema:address` → `schema:addressLocality` | | Country | `schema:location` → `schema:address` → `schema:addressCountry` | -| Event type | Set to "Workshops and courses" for RDF course instances; `dc:type` for Dublin Core events | +| Event type | Set to `workshops_and_courses` for RDF course instances; `dc:type` for Dublin Core events. | | Timezone | Not currently populated from exchanged metadata | The following properties can also be populated during exchange, but have no dedicated filter controls: @@ -87,14 +87,14 @@ Dublin Core `dc:subject` values populate keywords, not scientific topics. `dc:la You may take the following steps to set up automated exchange between two TeSS-based catalogues (a **source** and a **destination**): -1) Ensure that you have the correct permissions. To set up the exchange of materials, you need to be a site **admin**, or the **owner of a content provider**, in the destination TeSSHub (where the content should end up). You are the owner of content providers that you create. -2) Go to the source TeSSHub instance (where the training should come from) and understand what metadata (set of filters) is used there to describe the particular set of training content that should be exchanged. +1) Ensure that you have the correct permissions. To set up exchange, you need to be a site **admin** or **curator**, or the **owner or an editor of a content provider**, in the destination TeSSHub (where the content should end up). Provider owners and editors can create sources only when user source creation is enabled in the destination instance. You are the owner of content providers that you create. For non-admin users, the destination must also include `oai_pmh` among its permitted ingestion methods; contact an administrator if 'OAI-PMH' is unavailable. +2) Go to the source TeSSHub instance (where the training should come from) and understand what metadata (set of filters) is used there to describe the particular set of training content that should be exchanged. 3) In the source instance, at the top of the list of training materials, go to the 'Subscribe' menu, click 'Harvest using OAI-PMH', and copy the OAI-PMH link. 4) Go to the content provider in the destination TeSSHub instance, open the 'Sources' tab, then click the 'Add source' button. 5) Enter the URL that you copied in step 3 into the URL field and select 'OAI-PMH' as the ingestion method. -6) If you are ready for the materials to be automatically exchanged, check the 'Enabled' checkbox; otherwise, leave it unchecked to save the source as a draft. If you are an administrator, you may also directly set the new source as 'Approved'. Everyone else will need to wait until an administrator approves the source before content starts to be exchanged. +6) If you are ready for the materials to be automatically exchanged, check the 'Enabled' checkbox; otherwise, leave it unchecked to save the source as a draft. If you are an administrator, you may also directly set the new source as 'Approved'. Everyone else will need administrator approval before content starts to be exchanged, and should request it after saving as described in step 8. 7) You may add **filter conditions** to exchange only part of the source's content. Only content that satisfies all conditions in the 'Allow' list and none of the conditions in the 'Block' list is exchanged. To exchange content matching alternative sets of conditions, create a separate source for each set. -8) Save the source using the 'Register Source' button. +8) Save the source using the 'Register Source' button. If the source needs administrator approval, click **'Request Approval'** on the saved source's page when it is ready for review. Saving alone does not submit an approval request. You will not be able to modify the source while approval is pending. 9) After the source is enabled and approved, content is normally exchanged and kept up to date once per day, depending on the configuration of the destination TeSSHub instance. The whole process is also shown in this video. In this example, training material on Python that is not for beginners is exchanged from ELIXIR TeSS to PaN-Training: @@ -108,8 +108,10 @@ Please note that the video may be slightly outdated in some cases. The instructi ## How do I set up an automated exchange from something other than TeSS? -You can automate exchange into a TeSS-based catalogue from a non-TeSS catalogue if the source supports OAI-PMH with compatible Bioschemas RDF or Dublin Core metadata. +You can automate exchange into a TeSS-based catalogue from a non-TeSS catalogue if the source supports OAI-PMH with compatible Bioschemas RDF or Dublin Core metadata (Dublin Core metadata is required in OAI-PMH). The [supported properties and filters](#which-filters-can-i-use-to-exchange) are listed above. Sources offering only Dublin Core provide fewer properties, so some filters may not be usable. -Follow the [steps for exchange from another TeSS instance](#how-do-i-set-up-an-automated-exchange-from-another-tess-instance), but obtain the source's OAI-PMH endpoint URL from its documentation or administrator instead of using the TeSS 'Subscribe' menu. \ No newline at end of file +Follow the [steps for exchange from another TeSS instance](#how-do-i-set-up-an-automated-exchange-from-another-tess-instance), but obtain the source's OAI-PMH endpoint URL from its documentation or administrator instead of using the TeSS 'Subscribe' menu. + +For other ways to import content automatically, including from sources that do not support OAI-PMH, see [Automatic content registration](auto). From 1525f5ac6ef7340388e07743f7e124ae7d0443b7 Mon Sep 17 00:00:00 2001 From: mv141575 Date: Mon, 2 Nov 2026 17:28:55 +0100 Subject: [PATCH 3/3] Fix dublin core date / language and subject descriptions --- TeSS_docs/content/exchange.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/TeSS_docs/content/exchange.md b/TeSS_docs/content/exchange.md index 28611a5..05ffdbf 100644 --- a/TeSS_docs/content/exchange.md +++ b/TeSS_docs/content/exchange.md @@ -74,9 +74,7 @@ The following properties can also be populated during exchange, but have no dedi | Start date (*event only*) | `schema:startDate`; first successfully parsed `dc:date` | | End date (*event only*) | `schema:endDate`; last successfully parsed `dc:date` | -Dublin Core dates are used in the order supplied, not sorted chronologically. For events with only one successfully parsed date, that date supplies both the start and end dates. - -Dublin Core `dc:subject` values populate keywords, not scientific topics. `dc:language` is not currently imported. +The first date in Dublin Core `dc:date` is considdered the start date and the last one the end date. For events with only one successfully parsed date, that date supplies both the start and end dates. ```{admonition} See also the definitions of these terms :class: seealso