Skip to main content
Ctrl+K
fairdm 0.3.1 documentation - Home fairdm 0.3.1 documentation - Home
    • Developers
    • Administrators
    • Users
    • What FairDM is for
    • FAIR data and research data infrastructure
    • The technology stack
    • The core data model
    • How sample and measurement types are stored
    • Controlled vocabularies
    • Configuration over code
    • Why complete metadata matters
    • How access to a record is decided
    • Why FairDM records contributors
    • How contributor accounts and credits work
    • How a profile is claimed
    • How FairDM configures a portal
    • Who is asked to agree to a legal document
    • How locations are stored and protected
    • Dataset publication, DOIs and DataCite metadata
    • Glossary
    • Framework Contributors
    • Architecture Decision Records
    • Roadmap — FairDM
    • Changelog
  • GitHub
  • GitHub
  • Developers
  • Administrators
  • Users
  • What FairDM is for
  • FAIR data and research data infrastructure
  • The technology stack
  • The core data model
  • How sample and measurement types are stored
  • Controlled vocabularies
  • Configuration over code
  • Why complete metadata matters
  • How access to a record is decided
  • Why FairDM records contributors
  • How contributor accounts and credits work
  • How a profile is claimed
  • How FairDM configures a portal
  • Who is asked to agree to a legal document
  • How locations are stored and protected
  • Dataset publication, DOIs and DataCite metadata
  • Glossary
  • Framework Contributors
  • Architecture Decision Records
  • Roadmap — FairDM
  • Changelog
  • GitHub
  • GitHub

Section Navigation

Tutorial

  • Build your first sample and measurement types

How-to guides

  • How to add a factory for a portal model
  • How to add a filter to a sample type
  • How to add a measurement type
  • How to add a record field to a form
  • How to add a sample type
  • How to add a section to the home page
  • How to add a start step to a container
  • How to add a transform for another format
  • How to add a viewset to the API router
  • How to add an entry to the Manage menu
  • How to add an environment override module
  • How to add pages to a plugin
  • How to add queryset methods to a measurement type
  • How to add search and sort to a list view
  • How to allow only some sites to call the API
  • How to back up a portal
  • How to change a type’s API address
  • How to change how the team page looks
  • How to change the API rate limits
  • How to change the entrance layout
  • How to change the entrance pane
  • How to change the portal theme
  • How to change what a home page section shows
  • How to change what the edit details page offers
  • How to choose the fields the API returns
  • How to configure the agreement check
  • How to count API callers behind a proxy
  • How to create a ghost person
  • How to create a plugin
  • How to create an addon
  • How to credit a person on a record
  • How to customise a generated component
  • How to customise a sample form
  • How to customise the admin for a measurement type
  • How to customise the API documentation
  • How to customise the profile form
  • How to define a portal role of your own
  • How to deploy a portal in a container
  • How to develop a portal on the development image
  • How to extend an overview page
  • How to extend the profile-claiming flow
  • How to filter a list by a record
  • How to filter projects by vocabulary keywords
  • How to find records by where they are
  • How to give a sample or measurement a location
  • How to give a sample or measurement type its own overview page
  • How to grant object permissions on a polymorphic model
  • How to import and export locations
  • How to import people from a list of ORCID iDs
  • How to link to a legal document
  • How to load development data for the overview pages
  • How to loop over the registered types
  • How to narrow a record field by another field
  • How to override a FairDM setting
  • How to place an organization on a map
  • How to record sample relationships
  • How to register a sample or measurement type
  • How to render markdown in a template
  • How to restore a portal from a backup
  • How to restrict a plugin to some users
  • How to restrict a record field to one sample type
  • How to restrict API tokens to some people
  • How to run a background worker in a container
  • How to search a registered type by more than its name
  • How to show part of a page to a record’s team
  • How to sign in as each portal role while developing
  • How to sync a profile from ORCID or ROR without Celery
  • How to test a portal with FairDM factories
  • How to upgrade a portal to django-literature 0.3
  • How to upgrade a portal to vocabulary addresses
  • How to use a controlled vocabulary in a model
  • How to use a sample form in a view
  • How to write a custom form or filter for a measurement type

Reference

  • Base views
  • Components
  • Configuration
  • Container images
  • Contribution levels and record access
  • Contributor models
  • Core models
  • Crediting
  • Development accounts
  • Entrance pages
  • Form and filter mixins
  • Home page
  • Legal documents
  • Location fields
  • Management commands
  • Measurement model
  • Model configuration
  • Model fields
  • Overview page blocks
  • Overview plugins
  • Plugins
  • Portal roles in code
  • Profile claiming
  • Record editing pages
  • Record fields
  • REST API
  • Sample model
  • Settings
  • Template tags
  • Test factories
  • The registry
  • Python API
    • fairdm
      • fairdm.db
        • fairdm.db.managers
        • fairdm.db.models
        • fairdm.db.fields
      • fairdm.contrib
        • fairdm.contrib.autocomplete
        • fairdm.contrib.admin
        • fairdm.contrib.collections
        • fairdm.contrib.plugins
        • fairdm.contrib.contributors
        • fairdm.contrib.location
        • fairdm.contrib.identity
        • fairdm.contrib.import_export
      • fairdm.conf
        • fairdm.conf.settings
        • fairdm.conf.checks
        • fairdm.conf.development
        • fairdm.conf.urls
        • fairdm.conf.celery
        • fairdm.conf.setup
        • fairdm.conf.addons
        • fairdm.conf.environment
      • fairdm.management
        • fairdm.management.commands
      • fairdm.templatetags
        • fairdm.templatetags.fairdm
      • fairdm.core
        • fairdm.core.project
        • fairdm.core.dataset
        • fairdm.core.measurement
        • fairdm.core.sample
        • fairdm.core.vocabularies
        • fairdm.core.formsets
        • fairdm.core.admin
        • fairdm.core.dates
        • fairdm.core.overview
        • fairdm.core.managers
        • fairdm.core.image_utils
        • fairdm.core.models
        • fairdm.core.utils
        • fairdm.core.urls
        • fairdm.core.permissions
        • fairdm.core.forms
        • fairdm.core.abstract
        • fairdm.core.choices
        • fairdm.core.filters
        • fairdm.core.plugins
        • fairdm.core.descriptions
        • fairdm.core.related_records
        • fairdm.core.apps
        • fairdm.core.editing
      • fairdm.forms
        • fairdm.forms.base
        • fairdm.forms.fields
      • fairdm.factories
        • fairdm.factories.core
        • fairdm.factories.contributors
        • fairdm.factories.utils
      • fairdm.views
        • fairdm.views.base
        • fairdm.views.mixins
        • fairdm.views.generic
      • fairdm.api
        • fairdm.api.checks
        • fairdm.api.router
        • fairdm.api.urls
        • fairdm.api.permissions
        • fairdm.api.throttling
        • fairdm.api.viewsets
        • fairdm.api.filters
        • fairdm.api.serializers
        • fairdm.api.pagination
        • fairdm.api.apps
        • fairdm.api.schema
        • fairdm.api.settings
      • fairdm.backups
        • fairdm.backups.management
        • fairdm.backups.media
        • fairdm.backups.tasks
        • fairdm.backups.run
        • fairdm.backups.keys
        • fairdm.backups.signals
        • fairdm.backups.apps
      • fairdm.registry
        • fairdm.registry.exceptions
        • fairdm.registry.config
        • fairdm.registry.factories
        • fairdm.registry.registry
      • fairdm.utils
        • fairdm.utils.location
        • fairdm.utils.markdown
        • fairdm.utils.inspection
        • fairdm.utils.models
        • fairdm.utils.utils
        • fairdm.utils.permissions
        • fairdm.utils.choices
        • fairdm.utils.context_processors
      • fairdm.config
      • fairdm.models
      • fairdm.portal_roles
      • fairdm.permissions
      • fairdm.menus
      • fairdm.plugins
      • fairdm.apps

Explanation

  • How a measurement reports its value
  • How API callers are limited
  • How FairDM views are layered
  • How markdown is sanitised
  • How record fields decide what to offer
  • How the container images are versioned
  • What registering a type produces
  • Why factories create metadata only when asked
  • Developers
  • How to link to a legal document

How to link to a legal document#

A portal’s privacy policy, terms of use and impressum are pages under /legal/. FairDM adds no link to any of them, because it cannot know which documents your portal has, so you add the links where your visitors look for them, such as the footer.

Before you start#

Your portal needs a published document, and you need its slug. The slug is the segment of the document’s address. An administrator sets it when writing the document, as described in How to write and publish a legal document.

Steps#

  1. In the template, reverse the document’s address with the mvp_compliance:document URL name and the slug.

    <a class="link" href="{% url 'mvp_compliance:document' 'terms-of-use' %}">Terms of use</a>
    
  2. In Python, reverse it the same way.

    from django.urls import reverse
    
    reverse("mvp_compliance:document", args=["terms-of-use"])
    
  3. To point at an older version, add the version number as a query string: ?version=2026.1.

The result#

The link opens /legal/terms-of-use/, which always shows the version in force. A slug that names no document, or a document with nothing published, answers “not found”. Check the link after the document is published.

The other URL names, mvp_compliance:agree and mvp_compliance:agreed, and the pages behind them are listed in Legal documents. A signed-in person finds the list of what they agreed to under Agreements in the account area, with no link from you.

previous

How to import people from a list of ORCID iDs

next

How to load development data for the overview pages

On this page
  • Before you start
  • Steps
  • The result

© Copyright 2026, Samuel Jennings.

Built with the PyData Sphinx Theme 0.21.0.