{% extends "base.html" %} {% block content %} {% set box = "border:1px solid var(--border, #ddd); border-radius:6px; padding:0.9rem 1rem; margin:1rem 0;" %}

FAIRDOM-SEEK

Two steps: configure a SEEK instance's data model from this profile (Controlled Vocabularies + Sample Types), then sync the loaded dataset into it — both over SEEK's API using the URL + key set on the Plugins page.

{% if action_error %}
{{ action_error }}
{% endif %} {% if provision_result %}
Model provisioned{% if provisioned_profile %} ({{ provisioned_profile }}){% endif %}. Created {{ provision_result.created|length }}, reused {{ provision_result.reused|length }}. {% if provision_result.created %}
Created: {{ provision_result.created|join(", ") }}
{% endif %} {% if provision_result.reused %}
Reused: {{ provision_result.reused|join(", ") }}
{% endif %} {% if provision_result.errors %}
Errors: {{ provision_result.errors|join("; ") }}
{% endif %}
{% endif %} {% if sync_result %}
Synced {{ sync_result.created_count }} resource{{ "" if sync_result.created_count == 1 else "s" }} to SEEK.
{{ sync_result.investigations|length }} investigation(s), {{ sync_result.studies|length }} study(ies), {{ sync_result.assays|length }} assay(s), {{ sync_result.samples|length }} sample(s).
{% if sync_result.skipped %}
Skipped: {% for node_id, reason in sync_result.skipped %}{{ reason }}{% if not loop.last %}; {% endif %}{% endfor %}
{% endif %} {% if sync_result.errors %}
Errors: {% for node_id, reason in sync_result.errors %}{{ reason }}{% if not loop.last %}; {% endif %}{% endfor %}
{% endif %}
{% endif %} {% if not api_key_configured %}
Set your SEEK URL + API key on the Plugins page to provision or sync over the API.
{% endif %} {# ---- Phase 1: provision the model ---- #}

1 · Configure the model in SEEK

Pick the model (profile) to export, then Provision to create its Controlled Vocabularies (from closed value lists) + Sample Types (from sample-bearing entities) in SEEK over the API. Idempotent — re-running reuses what already exists. To then sync a dataset, provision the profile it was built on (loaded now: {{ profile }}).

{% include "seek/_project_select.html" %}
Extended Metadata (custom fields on Investigation/Study/Assay) — SEEK only lets an admin create these, so download the definitions and hand them over.

Then, as a SEEK admin: Server administration → Extended Metadata Types → create from FAIR Data Station TTL → upload the file.

{# ---- Phase 2: sync the data ---- #}

2 · Sync the dataset to SEEK

{% if exportable_count %}

Pushes profile {{ profile }} · dataset {{ dataset_name or "(unsaved)" }} — {% for etype, n in entity_counts %}{{ etype }} ×{{ n }}{% if not loop.last %}, {% endif %}{% endfor %} — as Investigations/Studies/Assays and Samples (into the provisioned Sample Types).

{% include "seek/_project_select.html" %}
{% else %}

No exportable dataset loaded — build or load one first.

{% endif %}
{# ---- Alternative: file export ---- #}

Or export a file

Download FAIR Data Station RDF and import it via SEEK's own Import from FAIR Data Station (handles the full ISA + Extended Metadata).

{% if exportable_count %} Download SEEK ISA RDF (.ttl) → {% else %} {% endif %} {% if seek_url %} · your instance: {% if seek_url.startswith(("http://", "https://")) %}{{ seek_url }}{% else %}{{ seek_url }}{% endif %} {% endif %}

Note: SEEK reads ISA levels positionally, so with the ISA profile (no ObservationUnit level) entities below Study import one level high; Investigation and Study round-trip cleanly.

{% endblock %}