fairdm 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fairdm-0.3.0/.gitignore +114 -0
- fairdm-0.3.0/LICENSE +21 -0
- fairdm-0.3.0/PKG-INFO +506 -0
- fairdm-0.3.0/README.md +416 -0
- fairdm-0.3.0/demo/README.md +466 -0
- fairdm-0.3.0/demo/__init__.py +1 -0
- fairdm-0.3.0/demo/admin.py +519 -0
- fairdm-0.3.0/demo/apps.py +22 -0
- fairdm-0.3.0/demo/config.py +460 -0
- fairdm-0.3.0/demo/factories.py +374 -0
- fairdm-0.3.0/demo/filters.py +475 -0
- fairdm-0.3.0/demo/forms.py +584 -0
- fairdm-0.3.0/demo/management/__init__.py +0 -0
- fairdm-0.3.0/demo/management/commands/__init__.py +0 -0
- fairdm-0.3.0/demo/management/commands/seed_contributors.py +42 -0
- fairdm-0.3.0/demo/management/commands/seed_overviews.py +39 -0
- fairdm-0.3.0/demo/management/commands/seed_profiles.py +503 -0
- fairdm-0.3.0/demo/management/commands/seed_record_search.py +40 -0
- fairdm-0.3.0/demo/migrations/0001_initial.py +724 -0
- fairdm-0.3.0/demo/migrations/0002_alter_customparentsample_options.py +17 -0
- fairdm-0.3.0/demo/migrations/0003_icp_ms_measurement_uncertainty_and_more.py +24 -0
- fairdm-0.3.0/demo/migrations/__init__.py +0 -0
- fairdm-0.3.0/demo/models.py +690 -0
- fairdm-0.3.0/demo/options.py +1 -0
- fairdm-0.3.0/demo/plugins.py +186 -0
- fairdm-0.3.0/demo/seed/__init__.py +0 -0
- fairdm-0.3.0/demo/seed/common.py +127 -0
- fairdm-0.3.0/demo/seed/contributors.py +361 -0
- fairdm-0.3.0/demo/seed/measurements.py +205 -0
- fairdm-0.3.0/demo/seed/projects.py +565 -0
- fairdm-0.3.0/demo/seed/record_search.py +318 -0
- fairdm-0.3.0/demo/seed/samples.py +237 -0
- fairdm-0.3.0/demo/static/scss/_bootstrap_vars.scss +1 -0
- fairdm-0.3.0/demo/static/scss/stylesheet.scss +2 -0
- fairdm-0.3.0/demo/tables.py +59 -0
- fairdm-0.3.0/demo/templates/demo/rocksample_overview.html +32 -0
- fairdm-0.3.0/demo/templates/demo/xrfmeasurement_overview.html +46 -0
- fairdm-0.3.0/demo/templates/fairdm/landing.html +20 -0
- fairdm-0.3.0/demo/tests/__init__.py +0 -0
- fairdm-0.3.0/demo/tests/test_admin_views.py +465 -0
- fairdm-0.3.0/demo/tests/test_api_smoke.py +54 -0
- fairdm-0.3.0/demo/tests/test_contributors.py +136 -0
- fairdm-0.3.0/demo/tests/test_forms.py +70 -0
- fairdm-0.3.0/demo/tests/test_registry_api.py +219 -0
- fairdm-0.3.0/fairdm/__init__.py +13 -0
- fairdm-0.3.0/fairdm/api/__init__.py +1 -0
- fairdm-0.3.0/fairdm/api/apps.py +22 -0
- fairdm-0.3.0/fairdm/api/checks.py +70 -0
- fairdm-0.3.0/fairdm/api/filters.py +503 -0
- fairdm-0.3.0/fairdm/api/pagination.py +40 -0
- fairdm-0.3.0/fairdm/api/permissions.py +103 -0
- fairdm-0.3.0/fairdm/api/router.py +63 -0
- fairdm-0.3.0/fairdm/api/schema.py +366 -0
- fairdm-0.3.0/fairdm/api/serializers.py +1248 -0
- fairdm-0.3.0/fairdm/api/settings.py +128 -0
- fairdm-0.3.0/fairdm/api/throttling.py +56 -0
- fairdm-0.3.0/fairdm/api/urls.py +23 -0
- fairdm-0.3.0/fairdm/api/viewsets.py +408 -0
- fairdm-0.3.0/fairdm/apps.py +129 -0
- fairdm-0.3.0/fairdm/backups/__init__.py +1 -0
- fairdm-0.3.0/fairdm/backups/apps.py +21 -0
- fairdm-0.3.0/fairdm/backups/keys.py +111 -0
- fairdm-0.3.0/fairdm/backups/management/__init__.py +0 -0
- fairdm-0.3.0/fairdm/backups/management/commands/__init__.py +0 -0
- fairdm-0.3.0/fairdm/backups/management/commands/backup.py +40 -0
- fairdm-0.3.0/fairdm/backups/media.py +55 -0
- fairdm-0.3.0/fairdm/backups/run.py +39 -0
- fairdm-0.3.0/fairdm/backups/signals.py +33 -0
- fairdm-0.3.0/fairdm/backups/tasks.py +21 -0
- fairdm-0.3.0/fairdm/conf/__init__.py +101 -0
- fairdm-0.3.0/fairdm/conf/addons.py +146 -0
- fairdm-0.3.0/fairdm/conf/celery.py +10 -0
- fairdm-0.3.0/fairdm/conf/checks.py +664 -0
- fairdm-0.3.0/fairdm/conf/development.py +122 -0
- fairdm-0.3.0/fairdm/conf/environment.py +62 -0
- fairdm-0.3.0/fairdm/conf/settings/__init__.py +1 -0
- fairdm-0.3.0/fairdm/conf/settings/addons.py +417 -0
- fairdm-0.3.0/fairdm/conf/settings/api.py +44 -0
- fairdm-0.3.0/fairdm/conf/settings/apps.py +192 -0
- fairdm-0.3.0/fairdm/conf/settings/auth.py +93 -0
- fairdm-0.3.0/fairdm/conf/settings/cache.py +37 -0
- fairdm-0.3.0/fairdm/conf/settings/celery.py +40 -0
- fairdm-0.3.0/fairdm/conf/settings/database.py +56 -0
- fairdm-0.3.0/fairdm/conf/settings/email.py +39 -0
- fairdm-0.3.0/fairdm/conf/settings/logging.py +72 -0
- fairdm-0.3.0/fairdm/conf/settings/security.py +61 -0
- fairdm-0.3.0/fairdm/conf/settings/static_media.py +108 -0
- fairdm-0.3.0/fairdm/conf/setup.py +373 -0
- fairdm-0.3.0/fairdm/conf/urls.py +74 -0
- fairdm-0.3.0/fairdm/config.py +62 -0
- fairdm-0.3.0/fairdm/contrib/__init__.py +9 -0
- fairdm-0.3.0/fairdm/contrib/admin/__init__.py +1 -0
- fairdm-0.3.0/fairdm/contrib/admin/admin.py +60 -0
- fairdm-0.3.0/fairdm/contrib/admin/apps.py +17 -0
- fairdm-0.3.0/fairdm/contrib/admin/sites.py +117 -0
- fairdm-0.3.0/fairdm/contrib/admin/templates/admin/base_site.html +6 -0
- fairdm-0.3.0/fairdm/contrib/admin/templates/admin/fixture_upload_form.html +14 -0
- fairdm-0.3.0/fairdm/contrib/admin/urls.py +13 -0
- fairdm-0.3.0/fairdm/contrib/admin/views.py +86 -0
- fairdm-0.3.0/fairdm/contrib/autocomplete/__init__.py +3 -0
- fairdm-0.3.0/fairdm/contrib/autocomplete/apps.py +12 -0
- fairdm-0.3.0/fairdm/contrib/autocomplete/fields.py +671 -0
- fairdm-0.3.0/fairdm/contrib/autocomplete/filters.py +94 -0
- fairdm-0.3.0/fairdm/contrib/autocomplete/templates/autocomplete/contributor_option.html +18 -0
- fairdm-0.3.0/fairdm/contrib/autocomplete/templates/autocomplete/record_option.html +8 -0
- fairdm-0.3.0/fairdm/contrib/autocomplete/throttling.py +65 -0
- fairdm-0.3.0/fairdm/contrib/autocomplete/urls.py +66 -0
- fairdm-0.3.0/fairdm/contrib/autocomplete/views.py +1048 -0
- fairdm-0.3.0/fairdm/contrib/collections/README.md +101 -0
- fairdm-0.3.0/fairdm/contrib/collections/__init__.py +3 -0
- fairdm-0.3.0/fairdm/contrib/collections/apps.py +62 -0
- fairdm-0.3.0/fairdm/contrib/collections/tables.py +183 -0
- fairdm-0.3.0/fairdm/contrib/collections/templates/collections/listing.html +33 -0
- fairdm-0.3.0/fairdm/contrib/collections/urls.py +9 -0
- fairdm-0.3.0/fairdm/contrib/collections/views.py +167 -0
- fairdm-0.3.0/fairdm/contrib/contributors/__init__.py +1 -0
- fairdm-0.3.0/fairdm/contrib/contributors/access.py +332 -0
- fairdm-0.3.0/fairdm/contrib/contributors/adapters.py +136 -0
- fairdm-0.3.0/fairdm/contrib/contributors/admin.py +790 -0
- fairdm-0.3.0/fairdm/contrib/contributors/apps.py +34 -0
- fairdm-0.3.0/fairdm/contrib/contributors/choices.py +67 -0
- fairdm-0.3.0/fairdm/contrib/contributors/exceptions.py +9 -0
- fairdm-0.3.0/fairdm/contrib/contributors/filters.py +100 -0
- fairdm-0.3.0/fairdm/contrib/contributors/forms/__init__.py +1 -0
- fairdm-0.3.0/fairdm/contrib/contributors/forms/account.py +79 -0
- fairdm-0.3.0/fairdm/contrib/contributors/forms/contribution.py +186 -0
- fairdm-0.3.0/fairdm/contrib/contributors/forms/forms.py +132 -0
- fairdm-0.3.0/fairdm/contrib/contributors/forms/organization.py +151 -0
- fairdm-0.3.0/fairdm/contrib/contributors/forms/person.py +84 -0
- fairdm-0.3.0/fairdm/contrib/contributors/forms/profile.py +430 -0
- fairdm-0.3.0/fairdm/contrib/contributors/forms/widgets.py +9 -0
- fairdm-0.3.0/fairdm/contrib/contributors/managers.py +311 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0001_initial.py +616 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0002_delete_member_remove_person_is_member_and_more.py +22 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0003_alter_organization_country.py +23 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0004_delete_contributorrole_and_more.py +60 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0005_alter_contributor_profile.py +16 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0006_cleanup_duplicate_types.py +48 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0007_add_unique_type_constraints.py +17 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0008_migrate_to_location_model.py +67 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0009_alter_contributor_lang_and_more.py +26 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0010_alter_contributoridentifier_managers.py +15 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0011_add_partial_dates_and_privacy.py +60 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0012_rename_to_affiliation.py +15 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0013_update_related_names.py +43 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0014_add_is_claimed_field.py +19 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0015_set_is_claimed.py +25 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0016_make_is_claimed_non_nullable.py +18 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0017_remove_manage_organization_permission.py +81 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0018_claiming_audit_log.py +43 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0019_alter_contributoridentifier_type.py +17 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0020_contributors_audit.py +148 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0021_alter_affiliation_end_date_help_text.py +17 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0022_contribution_level.py +25 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0023_levels_from_stored_permissions.py +178 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/0024_organization_location.py +29 -0
- fairdm-0.3.0/fairdm/contrib/contributors/migrations/__init__.py +0 -0
- fairdm-0.3.0/fairdm/contrib/contributors/models.py +2212 -0
- fairdm-0.3.0/fairdm/contrib/contributors/permissions.py +115 -0
- fairdm-0.3.0/fairdm/contrib/contributors/plugins/__init__.py +6 -0
- fairdm-0.3.0/fairdm/contrib/contributors/plugins/organisation.py +1 -0
- fairdm-0.3.0/fairdm/contrib/contributors/plugins/overview.py +295 -0
- fairdm-0.3.0/fairdm/contrib/contributors/plugins/person.py +46 -0
- fairdm-0.3.0/fairdm/contrib/contributors/plugins/shared.py +1017 -0
- fairdm-0.3.0/fairdm/contrib/contributors/plugins/update.py +77 -0
- fairdm-0.3.0/fairdm/contrib/contributors/profiles.py +119 -0
- fairdm-0.3.0/fairdm/contrib/contributors/receivers.py +38 -0
- fairdm-0.3.0/fairdm/contrib/contributors/resources.py +110 -0
- fairdm-0.3.0/fairdm/contrib/contributors/services/__init__.py +1 -0
- fairdm-0.3.0/fairdm/contrib/contributors/services/claiming.py +196 -0
- fairdm-0.3.0/fairdm/contrib/contributors/services/crediting.py +374 -0
- fairdm-0.3.0/fairdm/contrib/contributors/services/matching.py +44 -0
- fairdm-0.3.0/fairdm/contrib/contributors/services/merge.py +215 -0
- fairdm-0.3.0/fairdm/contrib/contributors/services/registries.py +441 -0
- fairdm-0.3.0/fairdm/contrib/contributors/signals.py +48 -0
- fairdm-0.3.0/fairdm/contrib/contributors/static/contributors/css/contributor-filter.css +32 -0
- fairdm-0.3.0/fairdm/contrib/contributors/static/contributors/js/contributor-filter.js +79 -0
- fairdm-0.3.0/fairdm/contrib/contributors/tasks.py +233 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/admin/change_form.html +49 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/admin/claim_person.html +77 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/admin/merge_person.html +70 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/claim_profile.html +66 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/contributor_card.html +5 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/organization_detail.html +49 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/overview/organization.html +196 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/overview/person.html +178 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/contribution_add_organization.html +189 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/contribution_add_person.html +201 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/contribution_edit.html +88 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/contribution_list.html +136 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/contribution_remove.html +66 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/update.html +20 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/team.html +14 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/affiliations/row.html +18 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/affiliations.html +31 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/hierarchy/node.html +14 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/hierarchy.html +52 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/links.html +23 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/records.html +51 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/roles.html +27 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contribution/access.html +19 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contribution/affiliation.html +44 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contribution/controls.html +30 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contribution/list_item.html +17 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contribution/organization.html +38 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/affiliation.html +4 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/avatar.html +21 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/byline.html +28 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/card/contribution.html +21 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/card/index.html +12 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/card/organization.html +37 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/card/person.html +33 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/card/person_alt.html +24 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/icon.html +10 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/item.html +33 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/name.html +17 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/names.html +20 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/person/affiliation.html +9 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/person/affiliations.html +11 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/person/identifier.html +7 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/row.html +12 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/stack.html +23 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/summary.html +18 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor_card.html +4 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/org/avatar.html +20 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/organization_card.html +16 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/person_card.html +23 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templates/widgets/orcid.html +77 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templatetags/__init__.py +1 -0
- fairdm-0.3.0/fairdm/contrib/contributors/templatetags/contributor_tags.py +112 -0
- fairdm-0.3.0/fairdm/contrib/contributors/urls.py +31 -0
- fairdm-0.3.0/fairdm/contrib/contributors/utils/__init__.py +90 -0
- fairdm-0.3.0/fairdm/contrib/contributors/utils/audit.py +47 -0
- fairdm-0.3.0/fairdm/contrib/contributors/utils/helpers.py +94 -0
- fairdm-0.3.0/fairdm/contrib/contributors/utils/tokens.py +77 -0
- fairdm-0.3.0/fairdm/contrib/contributors/utils/transforms.py +958 -0
- fairdm-0.3.0/fairdm/contrib/contributors/validators.py +223 -0
- fairdm-0.3.0/fairdm/contrib/contributors/views/__init__.py +10 -0
- fairdm-0.3.0/fairdm/contrib/contributors/views/claiming.py +111 -0
- fairdm-0.3.0/fairdm/contrib/contributors/views/organization.py +34 -0
- fairdm-0.3.0/fairdm/contrib/contributors/views/person.py +50 -0
- fairdm-0.3.0/fairdm/contrib/contributors/views/team.py +73 -0
- fairdm-0.3.0/fairdm/contrib/identity/__init__.py +1 -0
- fairdm-0.3.0/fairdm/contrib/identity/admin.py +101 -0
- fairdm-0.3.0/fairdm/contrib/identity/apps.py +12 -0
- fairdm-0.3.0/fairdm/contrib/identity/forms.py +1 -0
- fairdm-0.3.0/fairdm/contrib/identity/migrations/0001_initial.py +182 -0
- fairdm-0.3.0/fairdm/contrib/identity/migrations/0002_rename_database_to_identity.py +159 -0
- fairdm-0.3.0/fairdm/contrib/identity/migrations/0003_rename_databasetranslation_identitytranslation_and_more.py +27 -0
- fairdm-0.3.0/fairdm/contrib/identity/migrations/0004_alter_authoritytranslation_unique_together_and_more.py +27 -0
- fairdm-0.3.0/fairdm/contrib/identity/migrations/__init__.py +0 -0
- fairdm-0.3.0/fairdm/contrib/identity/models.py +131 -0
- fairdm-0.3.0/fairdm/contrib/identity/static/configuration/admin.css +28 -0
- fairdm-0.3.0/fairdm/contrib/import_export/__init__.py +1 -0
- fairdm-0.3.0/fairdm/contrib/import_export/apps.py +12 -0
- fairdm-0.3.0/fairdm/contrib/import_export/formats.py +10 -0
- fairdm-0.3.0/fairdm/contrib/import_export/forms.py +30 -0
- fairdm-0.3.0/fairdm/contrib/import_export/resources.py +130 -0
- fairdm-0.3.0/fairdm/contrib/import_export/templates/cotton/import_export/export_dropdown.html +21 -0
- fairdm-0.3.0/fairdm/contrib/import_export/templates/cotton/import_export/result/base_errors.html +1 -0
- fairdm-0.3.0/fairdm/contrib/import_export/templates/cotton/import_export/result/error.html +16 -0
- fairdm-0.3.0/fairdm/contrib/import_export/templates/cotton/import_export/result/preview.html +1 -0
- fairdm-0.3.0/fairdm/contrib/import_export/templates/cotton/import_export/result/validation_errors.html +1 -0
- fairdm-0.3.0/fairdm/contrib/import_export/templates/import_export/import.html +122 -0
- fairdm-0.3.0/fairdm/contrib/import_export/urls.py +5 -0
- fairdm-0.3.0/fairdm/contrib/import_export/utils.py +174 -0
- fairdm-0.3.0/fairdm/contrib/import_export/views.py +378 -0
- fairdm-0.3.0/fairdm/contrib/location/__init__.py +1 -0
- fairdm-0.3.0/fairdm/contrib/location/apps.py +12 -0
- fairdm-0.3.0/fairdm/contrib/location/migrations/0001_initial.py +81 -0
- fairdm-0.3.0/fairdm/contrib/location/migrations/0002_delete_point.py +16 -0
- fairdm-0.3.0/fairdm/contrib/location/migrations/__init__.py +0 -0
- fairdm-0.3.0/fairdm/contrib/plugins/__init__.py +73 -0
- fairdm-0.3.0/fairdm/contrib/plugins/access.py +199 -0
- fairdm-0.3.0/fairdm/contrib/plugins/apps.py +13 -0
- fairdm-0.3.0/fairdm/contrib/plugins/base.py +265 -0
- fairdm-0.3.0/fairdm/contrib/plugins/checks.py +220 -0
- fairdm-0.3.0/fairdm/contrib/plugins/menus.py +16 -0
- fairdm-0.3.0/fairdm/contrib/plugins/mixins.py +39 -0
- fairdm-0.3.0/fairdm/contrib/plugins/registration.py +229 -0
- fairdm-0.3.0/fairdm/contrib/plugins/templates/menus/tab.html +4 -0
- fairdm-0.3.0/fairdm/contrib/plugins/templates/menus/tabs.html +10 -0
- fairdm-0.3.0/fairdm/contrib/plugins/templatetags/__init__.py +1 -0
- fairdm-0.3.0/fairdm/contrib/plugins/templatetags/plugin_tags.py +61 -0
- fairdm-0.3.0/fairdm/contrib/plugins/utils.py +103 -0
- fairdm-0.3.0/fairdm/core/__init__.py +1 -0
- fairdm-0.3.0/fairdm/core/abstract.py +476 -0
- fairdm-0.3.0/fairdm/core/admin.py +21 -0
- fairdm-0.3.0/fairdm/core/apps.py +40 -0
- fairdm-0.3.0/fairdm/core/choices.py +14 -0
- fairdm-0.3.0/fairdm/core/dataset/__init__.py +1 -0
- fairdm-0.3.0/fairdm/core/dataset/admin.py +190 -0
- fairdm-0.3.0/fairdm/core/dataset/apps.py +13 -0
- fairdm-0.3.0/fairdm/core/dataset/filters.py +90 -0
- fairdm-0.3.0/fairdm/core/dataset/forms.py +164 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0001_initial.py +216 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0002_initial.py +92 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0003_alter_dataset_options.py +28 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0004_alter_dataset_reference.py +28 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0005_alter_dataset_license.py +28 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0006_cleanup_duplicate_types.py +61 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0007_add_unique_type_constraints.py +31 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0008_datasetliteraturerelation_alter_datasetdate_managers_and_more.py +193 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0009_alter_dataset_project_on_delete.py +32 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0010_add_dataset_permissions.py +30 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0011_alter_dataset_options_alter_dataset_license_and_more.py +52 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0012_dataset_published_alter_dataset_name.py +23 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0013_alter_dataset_options.py +17 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0014_alter_datasetdescription_value.py +19 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/0015_index_modified.py +25 -0
- fairdm-0.3.0/fairdm/core/dataset/migrations/__init__.py +0 -0
- fairdm-0.3.0/fairdm/core/dataset/models.py +532 -0
- fairdm-0.3.0/fairdm/core/dataset/plugins.py +707 -0
- fairdm-0.3.0/fairdm/core/dataset/templates/cotton/dataset/card.html +145 -0
- fairdm-0.3.0/fairdm/core/dataset/templates/dataset/dataset_card.html +2 -0
- fairdm-0.3.0/fairdm/core/dataset/templates/dataset/dataset_detail.html +166 -0
- fairdm-0.3.0/fairdm/core/dataset/templates/publishing/datacite/contributor.xml +14 -0
- fairdm-0.3.0/fairdm/core/dataset/templates/publishing/datacite44.xml +106 -0
- fairdm-0.3.0/fairdm/core/dataset/urls.py +18 -0
- fairdm-0.3.0/fairdm/core/dataset/views.py +62 -0
- fairdm-0.3.0/fairdm/core/dates.py +31 -0
- fairdm-0.3.0/fairdm/core/descriptions.py +85 -0
- fairdm-0.3.0/fairdm/core/editing.py +632 -0
- fairdm-0.3.0/fairdm/core/filters.py +16 -0
- fairdm-0.3.0/fairdm/core/forms.py +160 -0
- fairdm-0.3.0/fairdm/core/formsets.py +68 -0
- fairdm-0.3.0/fairdm/core/image_utils.py +32 -0
- fairdm-0.3.0/fairdm/core/managers.py +162 -0
- fairdm-0.3.0/fairdm/core/measurement/__init__.py +1 -0
- fairdm-0.3.0/fairdm/core/measurement/admin.py +178 -0
- fairdm-0.3.0/fairdm/core/measurement/apps.py +48 -0
- fairdm-0.3.0/fairdm/core/measurement/config.py +94 -0
- fairdm-0.3.0/fairdm/core/measurement/filters.py +130 -0
- fairdm-0.3.0/fairdm/core/measurement/forms.py +145 -0
- fairdm-0.3.0/fairdm/core/measurement/managers.py +160 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0001_initial.py +217 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0002_initial.py +69 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0003_alter_measurement_options.py +27 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0004_cleanup_duplicate_types.py +61 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0005_add_unique_type_constraints.py +31 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0006_alter_measurementdate_managers_and_more.py +37 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0007_alter_measurementdate_type_and_more.py +24 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0008_measurement_local_id.py +24 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0009_alter_measurementidentifier_type.py +19 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0010_alter_measurement_local_id.py +18 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0011_alter_measurement_sample.py +21 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0012_alter_measurement_name.py +18 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0013_alter_measurementdescription_value.py +19 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0014_index_modified.py +23 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/0015_located_measurements.py +49 -0
- fairdm-0.3.0/fairdm/core/measurement/migrations/__init__.py +0 -0
- fairdm-0.3.0/fairdm/core/measurement/models.py +339 -0
- fairdm-0.3.0/fairdm/core/measurement/plugins.py +293 -0
- fairdm-0.3.0/fairdm/core/measurement/templates/measurement/measurement_overview.html +167 -0
- fairdm-0.3.0/fairdm/core/measurement/urls.py +13 -0
- fairdm-0.3.0/fairdm/core/models.py +13 -0
- fairdm-0.3.0/fairdm/core/overview.py +134 -0
- fairdm-0.3.0/fairdm/core/permissions.py +76 -0
- fairdm-0.3.0/fairdm/core/plugins.py +573 -0
- fairdm-0.3.0/fairdm/core/project/__init__.py +1 -0
- fairdm-0.3.0/fairdm/core/project/admin.py +203 -0
- fairdm-0.3.0/fairdm/core/project/apps.py +13 -0
- fairdm-0.3.0/fairdm/core/project/filters.py +125 -0
- fairdm-0.3.0/fairdm/core/project/forms.py +116 -0
- fairdm-0.3.0/fairdm/core/project/migrations/0001_initial.py +277 -0
- fairdm-0.3.0/fairdm/core/project/migrations/0002_alter_project_options.py +27 -0
- fairdm-0.3.0/fairdm/core/project/migrations/0003_alter_projectdescription_type.py +19 -0
- fairdm-0.3.0/fairdm/core/project/migrations/0004_cleanup_duplicate_types.py +63 -0
- fairdm-0.3.0/fairdm/core/project/migrations/0005_add_unique_type_constraints.py +31 -0
- fairdm-0.3.0/fairdm/core/project/migrations/0006_alter_project_options_alter_projectdate_options_and_more.py +82 -0
- fairdm-0.3.0/fairdm/core/project/migrations/0007_project_created_by_alter_project_funding_and_more.py +39 -0
- fairdm-0.3.0/fairdm/core/project/migrations/0008_convert_funding_to_datacite_shape.py +45 -0
- fairdm-0.3.0/fairdm/core/project/migrations/0009_alter_project_name.py +18 -0
- fairdm-0.3.0/fairdm/core/project/migrations/0010_alter_projectdescription_value.py +19 -0
- fairdm-0.3.0/fairdm/core/project/migrations/0011_index_modified.py +23 -0
- fairdm-0.3.0/fairdm/core/project/migrations/__init__.py +0 -0
- fairdm-0.3.0/fairdm/core/project/models.py +393 -0
- fairdm-0.3.0/fairdm/core/project/plugins.py +557 -0
- fairdm-0.3.0/fairdm/core/project/receivers.py +5 -0
- fairdm-0.3.0/fairdm/core/project/serializers.py +25 -0
- fairdm-0.3.0/fairdm/core/project/templates/cotton/project/card.html +119 -0
- fairdm-0.3.0/fairdm/core/project/templates/cotton/project/create_button.html +8 -0
- fairdm-0.3.0/fairdm/core/project/templates/project/project_card.html +2 -0
- fairdm-0.3.0/fairdm/core/project/templates/project/project_detail.html +193 -0
- fairdm-0.3.0/fairdm/core/project/transforms.py +219 -0
- fairdm-0.3.0/fairdm/core/project/urls.py +18 -0
- fairdm-0.3.0/fairdm/core/project/validators.py +94 -0
- fairdm-0.3.0/fairdm/core/project/views.py +61 -0
- fairdm-0.3.0/fairdm/core/related_records.py +108 -0
- fairdm-0.3.0/fairdm/core/sample/__init__.py +1 -0
- fairdm-0.3.0/fairdm/core/sample/admin.py +211 -0
- fairdm-0.3.0/fairdm/core/sample/apps.py +13 -0
- fairdm-0.3.0/fairdm/core/sample/config.py +43 -0
- fairdm-0.3.0/fairdm/core/sample/filters.py +138 -0
- fairdm-0.3.0/fairdm/core/sample/forms.py +170 -0
- fairdm-0.3.0/fairdm/core/sample/managers.py +187 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0001_initial.py +325 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0002_alter_sample_options.py +27 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0003_cleanup_duplicate_types.py +61 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0004_add_unique_type_constraints.py +31 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0005_alter_sample_options_alter_samplerelation_options_and_more.py +73 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0006_alter_sample_local_id.py +24 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0007_alter_sample_status_alter_sample_uuid_and_more.py +31 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0008_migrate_sample_status_to_unknown.py +23 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0009_alter_sample_name.py +18 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0010_alter_sampledescription_value.py +19 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0011_index_modified.py +23 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/0012_located_samples.py +54 -0
- fairdm-0.3.0/fairdm/core/sample/migrations/__init__.py +0 -0
- fairdm-0.3.0/fairdm/core/sample/models.py +475 -0
- fairdm-0.3.0/fairdm/core/sample/plugins.py +339 -0
- fairdm-0.3.0/fairdm/core/sample/templates/cotton/sample/card.html +74 -0
- fairdm-0.3.0/fairdm/core/sample/templates/sample/sample_detail.html +33 -0
- fairdm-0.3.0/fairdm/core/sample/templates/sample/sample_overview.html +155 -0
- fairdm-0.3.0/fairdm/core/sample/templates/sample/sample_type_detail.html +7 -0
- fairdm-0.3.0/fairdm/core/sample/urls.py +13 -0
- fairdm-0.3.0/fairdm/core/urls.py +10 -0
- fairdm-0.3.0/fairdm/core/utils.py +232 -0
- fairdm-0.3.0/fairdm/core/vocabularies.py +77 -0
- fairdm-0.3.0/fairdm/db/__init__.py +1 -0
- fairdm-0.3.0/fairdm/db/fields.py +61 -0
- fairdm-0.3.0/fairdm/db/managers.py +1 -0
- fairdm-0.3.0/fairdm/db/models.py +148 -0
- fairdm-0.3.0/fairdm/factories/__init__.py +137 -0
- fairdm-0.3.0/fairdm/factories/contributors.py +199 -0
- fairdm-0.3.0/fairdm/factories/core.py +717 -0
- fairdm-0.3.0/fairdm/factories/utils.py +146 -0
- fairdm-0.3.0/fairdm/fixtures/django-waffle.json +35 -0
- fairdm-0.3.0/fairdm/forms/__init__.py +10 -0
- fairdm-0.3.0/fairdm/forms/base.py +227 -0
- fairdm-0.3.0/fairdm/forms/fields.py +195 -0
- fairdm-0.3.0/fairdm/management/__init__.py +1 -0
- fairdm-0.3.0/fairdm/management/commands/__init__.py +1 -0
- fairdm-0.3.0/fairdm/management/commands/cleanup_permissions.py +52 -0
- fairdm-0.3.0/fairdm/management/commands/create_dev_accounts.py +165 -0
- fairdm-0.3.0/fairdm/management/commands/generate_fake_data.py +522 -0
- fairdm-0.3.0/fairdm/management/commands/seed_licenses.py +98 -0
- fairdm-0.3.0/fairdm/management/commands/show_config.py +58 -0
- fairdm-0.3.0/fairdm/management/commands/upgrade_vocabularies.py +385 -0
- fairdm-0.3.0/fairdm/menus.py +137 -0
- fairdm-0.3.0/fairdm/migrations/0001_initial.py +67 -0
- fairdm-0.3.0/fairdm/migrations/0002_rename_taggeditem_table.py +36 -0
- fairdm-0.3.0/fairdm/migrations/__init__.py +0 -0
- fairdm-0.3.0/fairdm/models.py +14 -0
- fairdm-0.3.0/fairdm/permissions.py +55 -0
- fairdm-0.3.0/fairdm/plugins.py +6 -0
- fairdm-0.3.0/fairdm/portal_roles.py +231 -0
- fairdm-0.3.0/fairdm/registry/__init__.py +27 -0
- fairdm-0.3.0/fairdm/registry/config.py +641 -0
- fairdm-0.3.0/fairdm/registry/exceptions.py +176 -0
- fairdm-0.3.0/fairdm/registry/factories.py +1153 -0
- fairdm-0.3.0/fairdm/registry/registry.py +324 -0
- fairdm-0.3.0/fairdm/static/brand/fairdm.svg +1 -0
- fairdm-0.3.0/fairdm/static/brand/icon.png +0 -0
- fairdm-0.3.0/fairdm/static/brand/icon.svg +90 -0
- fairdm-0.3.0/fairdm/static/brand/icon_dark.svg +90 -0
- fairdm-0.3.0/fairdm/static/brand/logo.svg +1 -0
- fairdm-0.3.0/fairdm/static/brand/orcid_16x16.webp +0 -0
- fairdm-0.3.0/fairdm/static/css/fairdm.css +402 -0
- fairdm-0.3.0/fairdm/static/icons/user.svg +7 -0
- fairdm-0.3.0/fairdm/static/img/ORCID.png +0 -0
- fairdm-0.3.0/fairdm/static/img/brand/icon.svg +83 -0
- fairdm-0.3.0/fairdm/static/img/brand/logo.svg +1 -0
- fairdm-0.3.0/fairdm/static/js/chart-theme.js +68 -0
- fairdm-0.3.0/fairdm/templates/api/docs/api_description.md +3 -0
- fairdm-0.3.0/fairdm/templates/api/docs/dataset_list.md +11 -0
- fairdm-0.3.0/fairdm/templates/api/docs/project_list.md +11 -0
- fairdm-0.3.0/fairdm/templates/api/docs/sample_list.md +11 -0
- fairdm-0.3.0/fairdm/templates/base.html +55 -0
- fairdm-0.3.0/fairdm/templates/cards/compact.html +2 -0
- fairdm-0.3.0/fairdm/templates/cards/large.html +46 -0
- fairdm-0.3.0/fairdm/templates/client-side_cropping_widget.html +140 -0
- fairdm-0.3.0/fairdm/templates/cotton/actions/create_new.html +20 -0
- fairdm-0.3.0/fairdm/templates/cotton/actions/manage.html +21 -0
- fairdm-0.3.0/fairdm/templates/cotton/actions/pending.html +21 -0
- fairdm-0.3.0/fairdm/templates/cotton/card/citation.html +29 -0
- fairdm-0.3.0/fairdm/templates/cotton/card/descriptions.html +35 -0
- fairdm-0.3.0/fairdm/templates/cotton/card/details/entry.html +20 -0
- fairdm-0.3.0/fairdm/templates/cotton/card/details.html +55 -0
- fairdm-0.3.0/fairdm/templates/cotton/card/funding.html +41 -0
- fairdm-0.3.0/fairdm/templates/cotton/card/identifiers.html +46 -0
- fairdm-0.3.0/fairdm/templates/cotton/card/location.html +34 -0
- fairdm-0.3.0/fairdm/templates/cotton/card/people.html +44 -0
- fairdm-0.3.0/fairdm/templates/cotton/card/placeholder.html +20 -0
- fairdm-0.3.0/fairdm/templates/cotton/card/readiness.html +49 -0
- fairdm-0.3.0/fairdm/templates/cotton/card/timeline.html +45 -0
- fairdm-0.3.0/fairdm/templates/cotton/components/object_card.html +68 -0
- fairdm-0.3.0/fairdm/templates/cotton/date.html +10 -0
- fairdm-0.3.0/fairdm/templates/cotton/entrance/aside.html +25 -0
- fairdm-0.3.0/fairdm/templates/cotton/icons/orcid.html +4 -0
- fairdm-0.3.0/fairdm/templates/cotton/landing/about.html +45 -0
- fairdm-0.3.0/fairdm/templates/cotton/landing/api.html +29 -0
- fairdm-0.3.0/fairdm/templates/cotton/landing/community.html +42 -0
- fairdm-0.3.0/fairdm/templates/cotton/landing/datasets.html +19 -0
- fairdm-0.3.0/fairdm/templates/cotton/landing/footer.html +33 -0
- fairdm-0.3.0/fairdm/templates/cotton/landing/hero.html +41 -0
- fairdm-0.3.0/fairdm/templates/cotton/landing/join.html +25 -0
- fairdm-0.3.0/fairdm/templates/cotton/landing/projects.html +19 -0
- fairdm-0.3.0/fairdm/templates/cotton/landing/stats.html +11 -0
- fairdm-0.3.0/fairdm/templates/cotton/landing/type_list.html +32 -0
- fairdm-0.3.0/fairdm/templates/cotton/landing/types.html +24 -0
- fairdm-0.3.0/fairdm/templates/cotton/link.html +12 -0
- fairdm-0.3.0/fairdm/templates/cotton/list/index.html +18 -0
- fairdm-0.3.0/fairdm/templates/cotton/list/row.html +14 -0
- fairdm-0.3.0/fairdm/templates/cotton/missing.html +8 -0
- fairdm-0.3.0/fairdm/templates/cotton/nav/link.html +13 -0
- fairdm-0.3.0/fairdm/templates/cotton/progress.html +21 -0
- fairdm-0.3.0/fairdm/templates/cotton/stats/index.html +22 -0
- fairdm-0.3.0/fairdm/templates/cotton/stats/item.html +34 -0
- fairdm-0.3.0/fairdm/templates/cotton/tabs/index.html +22 -0
- fairdm-0.3.0/fairdm/templates/cotton/tabs/tab.html +20 -0
- fairdm-0.3.0/fairdm/templates/django_tomselect/render/option.html +57 -0
- fairdm-0.3.0/fairdm/templates/django_tomselect/tomselect.html +63 -0
- fairdm-0.3.0/fairdm/templates/editing/delete_record.html +38 -0
- fairdm-0.3.0/fairdm/templates/editing/rows.html +6 -0
- fairdm-0.3.0/fairdm/templates/fairdm/dashboard.html +1 -0
- fairdm-0.3.0/fairdm/templates/fairdm/landing.html +78 -0
- fairdm-0.3.0/fairdm/templates/fairdm/plugin.html +10 -0
- fairdm-0.3.0/fairdm/templates/forms/checkbox.html +85 -0
- fairdm-0.3.0/fairdm/templates/forms/fieldset.html +22 -0
- fairdm-0.3.0/fairdm/templates/forms/widgets/array_select2.html +5 -0
- fairdm-0.3.0/fairdm/templates/forms/widgets/quantity_field.html +31 -0
- fairdm-0.3.0/fairdm/templates/forms/widgets/sortable_contributor.html +82 -0
- fairdm-0.3.0/fairdm/templates/forms/widgets/sortable_contributor2.html +81 -0
- fairdm-0.3.0/fairdm/templates/forms/widgets/xpostgres_array_widget.html +24 -0
- fairdm-0.3.0/fairdm/templates/icons/activity.svg +3 -0
- fairdm-0.3.0/fairdm/templates/icons/dashboard.svg +3 -0
- fairdm-0.3.0/fairdm/templates/icons/facebook.svg +1 -0
- fairdm-0.3.0/fairdm/templates/icons/filetype-xml.svg +3 -0
- fairdm-0.3.0/fairdm/templates/icons/grid.svg +3 -0
- fairdm-0.3.0/fairdm/templates/icons/linkedin.svg +1 -0
- fairdm-0.3.0/fairdm/templates/icons/missing_image - Copy.svg +37 -0
- fairdm-0.3.0/fairdm/templates/icons/missing_image.svg +4 -0
- fairdm-0.3.0/fairdm/templates/icons/orcid/authenticated.svg +4 -0
- fairdm-0.3.0/fairdm/templates/icons/orcid/readme.md +3 -0
- fairdm-0.3.0/fairdm/templates/icons/orcid/unauthenticated.svg +5 -0
- fairdm-0.3.0/fairdm/templates/icons/orcid.svg +16 -0
- fairdm-0.3.0/fairdm/templates/icons/organization.svg +1 -0
- fairdm-0.3.0/fairdm/templates/icons/ror.svg +12 -0
- fairdm-0.3.0/fairdm/templates/icons/spinner.svg +1 -0
- fairdm-0.3.0/fairdm/templates/icons/user.svg +7 -0
- fairdm-0.3.0/fairdm/templates/icons/whatsapp.svg +1 -0
- fairdm-0.3.0/fairdm/templates/icons/x_twitter.svg +1 -0
- fairdm-0.3.0/fairdm/templates/layouts/base.html +12 -0
- fairdm-0.3.0/fairdm/templates/location/widgets/location.html +54 -0
- fairdm-0.3.0/fairdm/templates/mvp_accounts/entrance/base.html +34 -0
- fairdm-0.3.0/fairdm/templates/overview/includes/map_library.html +30 -0
- fairdm-0.3.0/fairdm/templates/overview/includes/type_badge.html +48 -0
- fairdm-0.3.0/fairdm/templates/overview/page.html +196 -0
- fairdm-0.3.0/fairdm/templates/pages/api/tos.html +71 -0
- fairdm-0.3.0/fairdm/templates/pages/spectacular.html +26 -0
- fairdm-0.3.0/fairdm/templates/research_vocabs/base.html +42 -0
- fairdm-0.3.0/fairdm/templatetags/__init__.py +1 -0
- fairdm-0.3.0/fairdm/templatetags/fairdm.py +327 -0
- fairdm-0.3.0/fairdm/utils/__init__.py +90 -0
- fairdm-0.3.0/fairdm/utils/choices.py +232 -0
- fairdm-0.3.0/fairdm/utils/context_processors.py +62 -0
- fairdm-0.3.0/fairdm/utils/inspection.py +535 -0
- fairdm-0.3.0/fairdm/utils/location/__init__.py +1 -0
- fairdm-0.3.0/fairdm/utils/location/coverage.py +78 -0
- fairdm-0.3.0/fairdm/utils/location/db.py +53 -0
- fairdm-0.3.0/fairdm/utils/location/forms.py +200 -0
- fairdm-0.3.0/fairdm/utils/location/managers.py +139 -0
- fairdm-0.3.0/fairdm/utils/location/resources.py +190 -0
- fairdm-0.3.0/fairdm/utils/markdown.py +32 -0
- fairdm-0.3.0/fairdm/utils/models.py +18 -0
- fairdm-0.3.0/fairdm/utils/permissions.py +49 -0
- fairdm-0.3.0/fairdm/utils/utils.py +233 -0
- fairdm-0.3.0/fairdm/views/__init__.py +21 -0
- fairdm-0.3.0/fairdm/views/base.py +322 -0
- fairdm-0.3.0/fairdm/views/generic.py +239 -0
- fairdm-0.3.0/fairdm/views/mixins.py +66 -0
- fairdm-0.3.0/pyproject.toml +380 -0
fairdm-0.3.0/.gitignore
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
minio/
|
|
2
|
+
example/**/migrations/*
|
|
3
|
+
!**/migrations/__init__.py
|
|
4
|
+
.vocabularies-cache
|
|
5
|
+
# would be nice to ignore these and build bundle in CI workflow
|
|
6
|
+
# fairdm/static/bundles/
|
|
7
|
+
xtemplates/
|
|
8
|
+
.github/instructions/
|
|
9
|
+
# webpack-stats.json
|
|
10
|
+
docs/_build
|
|
11
|
+
docs/apidocs
|
|
12
|
+
/test*
|
|
13
|
+
!tests/
|
|
14
|
+
!tests/test*
|
|
15
|
+
tmp*
|
|
16
|
+
temp*.*
|
|
17
|
+
|
|
18
|
+
# Temporary and binary files
|
|
19
|
+
*~
|
|
20
|
+
*.ruff_cache
|
|
21
|
+
*.mypy_cache
|
|
22
|
+
*.py[cod]
|
|
23
|
+
*.so
|
|
24
|
+
*.cfg
|
|
25
|
+
!.isort.cfg
|
|
26
|
+
!setup.cfg
|
|
27
|
+
*.orig
|
|
28
|
+
*.log
|
|
29
|
+
*.pot
|
|
30
|
+
**/__pycache__
|
|
31
|
+
.cache/*
|
|
32
|
+
.*.swp
|
|
33
|
+
*/.ipynb_checkpoints/*
|
|
34
|
+
.DS_Store
|
|
35
|
+
_test*.py
|
|
36
|
+
/node_modules
|
|
37
|
+
.playwright-mcp
|
|
38
|
+
|
|
39
|
+
# Project files
|
|
40
|
+
.ropeproject
|
|
41
|
+
.project
|
|
42
|
+
.pydevproject
|
|
43
|
+
.settings
|
|
44
|
+
.idea
|
|
45
|
+
.vscode
|
|
46
|
+
tags
|
|
47
|
+
|
|
48
|
+
# Package files
|
|
49
|
+
*.egg
|
|
50
|
+
*.eggs/
|
|
51
|
+
.installed.cfg
|
|
52
|
+
*.egg-info
|
|
53
|
+
|
|
54
|
+
# Unittest and coverage
|
|
55
|
+
htmlcov
|
|
56
|
+
.coverage
|
|
57
|
+
.coverage.*
|
|
58
|
+
.tox
|
|
59
|
+
junit*.xml
|
|
60
|
+
coverage.xml
|
|
61
|
+
.pytest_cache/
|
|
62
|
+
|
|
63
|
+
# Build and docs folder/files
|
|
64
|
+
build/*
|
|
65
|
+
dist/*
|
|
66
|
+
sdist/*
|
|
67
|
+
docs/api/*
|
|
68
|
+
docs/_rst/*
|
|
69
|
+
docs/_build/*
|
|
70
|
+
cover/*
|
|
71
|
+
MANIFEST
|
|
72
|
+
|
|
73
|
+
# Per-project virtualenvs
|
|
74
|
+
.venv*/
|
|
75
|
+
.conda*/
|
|
76
|
+
.python-version
|
|
77
|
+
|
|
78
|
+
# Django stuff:
|
|
79
|
+
*.log
|
|
80
|
+
local_settings.py
|
|
81
|
+
db.sqlite3
|
|
82
|
+
db.sqlite3-journal
|
|
83
|
+
media/
|
|
84
|
+
/static/
|
|
85
|
+
/*.sqlite3
|
|
86
|
+
|
|
87
|
+
*/static/vendor/*
|
|
88
|
+
|
|
89
|
+
# Celery stuff
|
|
90
|
+
celerybeat-schedule
|
|
91
|
+
celerybeat.pid
|
|
92
|
+
|
|
93
|
+
# Environments
|
|
94
|
+
.env
|
|
95
|
+
.venv
|
|
96
|
+
env/
|
|
97
|
+
venv/
|
|
98
|
+
ENV/
|
|
99
|
+
env.bak/
|
|
100
|
+
venv.bak/
|
|
101
|
+
|
|
102
|
+
dist
|
|
103
|
+
fairdm/static/fairdm/temp/*
|
|
104
|
+
*.ipython
|
|
105
|
+
assets/webpack-stats.json
|
|
106
|
+
staticfiles
|
|
107
|
+
fairdm/templates/fairdm/cards/standard_copy.html
|
|
108
|
+
*.env
|
|
109
|
+
!stack.development.env
|
|
110
|
+
|
|
111
|
+
# Local Obsidian working notes for the domain model (not part of the package).
|
|
112
|
+
vault/
|
|
113
|
+
# Generated from docstrings by sphinx-autodoc2 on every build
|
|
114
|
+
docs/developers/reference/api/
|
fairdm-0.3.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Samuel Jennings
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
fairdm-0.3.0/PKG-INFO
ADDED
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: fairdm
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: A Django framework for building FAIR research data portals with minimal code
|
|
5
|
+
Project-URL: Homepage, https://www.fairdm.com
|
|
6
|
+
Project-URL: Documentation, https://www.fairdm.com
|
|
7
|
+
Project-URL: Repository, https://github.com/FAIR-DM/fairdm
|
|
8
|
+
Project-URL: Issues, https://github.com/FAIR-DM/fairdm/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/FAIR-DM/fairdm/blob/main/CHANGELOG.md
|
|
10
|
+
Author: Samuel Jennings
|
|
11
|
+
License-Expression: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Keywords: FAIR,database,fairdm,open data,research,research data management
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Framework :: Django :: 6.0
|
|
16
|
+
Classifier: Intended Audience :: Science/Research
|
|
17
|
+
Classifier: Natural Language :: English
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
+
Requires-Python: <4.0,>=3.13
|
|
22
|
+
Requires-Dist: celery<6.0.0,>=5.6.2
|
|
23
|
+
Requires-Dist: daisy-cotton-ext<0.6.0,>=0.5.0
|
|
24
|
+
Requires-Dist: defusedxml<0.8.0,>=0.7.0
|
|
25
|
+
Requires-Dist: django-adminactions<3.0.0,>=2.0.0
|
|
26
|
+
Requires-Dist: django-allauth[mfa,socialaccount]<66.0.0,>=65.19.4
|
|
27
|
+
Requires-Dist: django-auto-prefetch<2.0.0,>=1.12.0
|
|
28
|
+
Requires-Dist: django-celery-beat<3.0.0,>=2.5.0
|
|
29
|
+
Requires-Dist: django-cleanup<10.0.0,>=8.1.0
|
|
30
|
+
Requires-Dist: django-content-license<0.4.0,>=0.3.0
|
|
31
|
+
Requires-Dist: django-controlled-vocabularies<0.4.0,>=0.3.1
|
|
32
|
+
Requires-Dist: django-cors-headers<5.0.0,>=4.7.0
|
|
33
|
+
Requires-Dist: django-countries<10.0.0,>=7.6.1
|
|
34
|
+
Requires-Dist: django-crispy-forms<3.0,>=2.3
|
|
35
|
+
Requires-Dist: django-dbbackup<6,>=5.3
|
|
36
|
+
Requires-Dist: django-downloadview<3.0.0,>=2.3.0
|
|
37
|
+
Requires-Dist: django-easy-icons<1.0.0,>=0.6.0
|
|
38
|
+
Requires-Dist: django-environ<0.15.0,>=0.10.0
|
|
39
|
+
Requires-Dist: django-filter<27.0,>=24.3
|
|
40
|
+
Requires-Dist: django-flex-menus
|
|
41
|
+
Requires-Dist: django-guardian<4.0.0,>=3.5.0
|
|
42
|
+
Requires-Dist: django-hijack<4.0.0,>=3.7.4
|
|
43
|
+
Requires-Dist: django-htmx<2.0.0,>=1.29.0
|
|
44
|
+
Requires-Dist: django-import-export<5.0.0,>=4.0.3
|
|
45
|
+
Requires-Dist: django-lifecycle<2.0.0,>=1.2.4
|
|
46
|
+
Requires-Dist: django-literature[ui]<0.4.0,>=0.3.1
|
|
47
|
+
Requires-Dist: django-meta<3.0.0,>=2.1.0
|
|
48
|
+
Requires-Dist: django-model-utils<6.0.0,>=4.3.1
|
|
49
|
+
Requires-Dist: django-mvp-accounts[api]<0.5.0,>=0.4.0
|
|
50
|
+
Requires-Dist: django-mvp-charts<0.4.0,>=0.3.0
|
|
51
|
+
Requires-Dist: django-mvp-compliance<0.4.0,>=0.3.0
|
|
52
|
+
Requires-Dist: django-mvp-forms<1.0,>=0.7.0
|
|
53
|
+
Requires-Dist: django-mvp<0.32.0,>=0.31.0
|
|
54
|
+
Requires-Dist: django-ordered-model<4.0.0,>=3.7.4
|
|
55
|
+
Requires-Dist: django-parler<3.0,>=2.3
|
|
56
|
+
Requires-Dist: django-partial-date<2.0,>=1.3
|
|
57
|
+
Requires-Dist: django-pint<1.1.0,>=0.7.3
|
|
58
|
+
Requires-Dist: django-polymorphic<5.0.0,>=4.11.7
|
|
59
|
+
Requires-Dist: django-redis<8.0.0,>=5.2.0
|
|
60
|
+
Requires-Dist: django-solo<3.0.0,>=2.2.0
|
|
61
|
+
Requires-Dist: django-split-settings<2.0.0,>=1.2.0
|
|
62
|
+
Requires-Dist: django-storages[boto3]<2.0.0,>=1.14.2
|
|
63
|
+
Requires-Dist: django-tables2>=3.0.1
|
|
64
|
+
Requires-Dist: django-taggit<7.0.0,>=6.1.0
|
|
65
|
+
Requires-Dist: django-tomselect<2027,>=2026.6.2
|
|
66
|
+
Requires-Dist: django-waffle<6.0.0,>=5.0.0
|
|
67
|
+
Requires-Dist: django[argon2]<7.0.0,>=6.0
|
|
68
|
+
Requires-Dist: djangorestframework<4.0.0,>=3.17.2
|
|
69
|
+
Requires-Dist: drf-orjson-renderer<2.0.0,>=1.7.5
|
|
70
|
+
Requires-Dist: drf-spectacular[sidecar]<0.31.0,>=0.29.0
|
|
71
|
+
Requires-Dist: easy-thumbnails<3.0,>=2.10
|
|
72
|
+
Requires-Dist: gunicorn<27.0.0,>=23.0.0
|
|
73
|
+
Requires-Dist: markdown<4.0.0,>=3.10.3
|
|
74
|
+
Requires-Dist: nh3<0.4.0,>=0.3.7
|
|
75
|
+
Requires-Dist: pillow<14.0,>=11.0
|
|
76
|
+
Requires-Dist: pint<1.0,>=0.26.1
|
|
77
|
+
Requires-Dist: psycopg2-binary<3.0.0,>=2.9.13
|
|
78
|
+
Requires-Dist: pyecharts<3.0.0,>=2.1.0
|
|
79
|
+
Requires-Dist: pymdown-extensions<13.0.0,>=11.0.2
|
|
80
|
+
Requires-Dist: python-gnupg<0.6,>=0.5.7
|
|
81
|
+
Requires-Dist: rapidfuzz<4.0.0,>=3.14.6
|
|
82
|
+
Requires-Dist: redis<9.0.0,>=4.5.2
|
|
83
|
+
Requires-Dist: requests<3.0,>=2.32
|
|
84
|
+
Requires-Dist: sentry-sdk[django]<3.0.0,>=2.69.2
|
|
85
|
+
Requires-Dist: shortuuid<2.0.0,>=1.0.13
|
|
86
|
+
Requires-Dist: tablib[ods,xlsx]<4.0.0,>=3.10.0
|
|
87
|
+
Requires-Dist: uncertainties<4.0.0,>=3.2.3
|
|
88
|
+
Requires-Dist: whitenoise<7.0.0,>=6.4.0
|
|
89
|
+
Description-Content-Type: text/markdown
|
|
90
|
+
|
|
91
|
+
# FairDM
|
|
92
|
+
|
|
93
|
+
[](https://github.com/FAIR-DM/fairdm/actions/workflows/tests.yml)
|
|
94
|
+
[](https://github.com/FAIR-DM/fairdm/actions/workflows/build.yml)
|
|
95
|
+
[](https://github.com/FAIR-DM/fairdm/actions/workflows/publish.yml)
|
|
96
|
+
[](https://fairdm.readthedocs.io/en/latest/)
|
|
97
|
+
[](https://codecov.io/gh/FAIR-DM/fairdm)
|
|
98
|
+
[](https://pypi.org/project/fairdm/)
|
|
99
|
+
[](https://pypi.org/project/fairdm/)
|
|
100
|
+
[](https://pypi.org/project/fairdm/)
|
|
101
|
+
[](https://pypi.org/project/fairdm/)
|
|
102
|
+
[](https://github.com/astral-sh/ruff)
|
|
103
|
+
[](https://github.com/FAIR-DM/fairdm/blob/main/LICENSE)
|
|
104
|
+
|
|
105
|
+
A Django framework for building FAIR research data portals with minimal code.
|
|
106
|
+
|
|
107
|
+
FairDM makes it trivial for research teams to define domain-specific sample and measurement models and run a fully functional data portal without writing views, URL routing, or frontend code.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## ๐ฏ What is FairDM?
|
|
112
|
+
|
|
113
|
+
FairDM is an opinionated **Django framework** (not a library) designed specifically for research data management. It enables researchers with basic Python skills to:
|
|
114
|
+
|
|
115
|
+
- Define custom domain models for **samples** and **measurements**
|
|
116
|
+
- Get a fully functional web portal **without writing views or templates**
|
|
117
|
+
- Ensure data follows **FAIR principles** (Findable, Accessible, Interoperable, Reusable)
|
|
118
|
+
- Manage research **projects**, **datasets**, and **contributors** out of the box
|
|
119
|
+
- Import/export data in multiple formats with zero configuration
|
|
120
|
+
- Control access with fine-grained **object-level permissions**
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Scope & philosophy
|
|
125
|
+
|
|
126
|
+
### What FairDM is
|
|
127
|
+
|
|
128
|
+
A batteries-included Django framework for building research data portals. You describe your
|
|
129
|
+
samples and measurements as Django models, register them, and get the portal without writing that
|
|
130
|
+
layer yourself: views, URLs, forms, filters, tables, admin and API.
|
|
131
|
+
|
|
132
|
+
### What FairDM is deliberately not
|
|
133
|
+
|
|
134
|
+
- **Not a library of parts.** It is opinionated and owns the application shell. If you want to
|
|
135
|
+
assemble your own stack from independent components, this is the wrong starting point.
|
|
136
|
+
- **Not a generic CMS.** The core model (projects, datasets, samples, measurements and
|
|
137
|
+
contributors) is fixed, because it is what makes portals interoperable and citable.
|
|
138
|
+
- **Not a single portal.** Domain-specific schemas belong in portals that build on FairDM, not
|
|
139
|
+
in the framework itself.
|
|
140
|
+
- **Not a JavaScript application.** The server-rendered baseline is the product, not a fallback.
|
|
141
|
+
- **Not a formal publisher.** Publishing a dataset in FairDM makes it visible to other users of
|
|
142
|
+
the portal. Sending metadata to a data publisher and receiving a DOI in return is a separate
|
|
143
|
+
act, and it belongs to an addon rather than the core.
|
|
144
|
+
- **Not the home of every feature.** The core stays small and the framework grows through
|
|
145
|
+
addons. A capability that only some portals need is an addon, not a core concern.
|
|
146
|
+
|
|
147
|
+
### When principles collide
|
|
148
|
+
|
|
149
|
+
- **Configuration over code** โ declarative model registration with sensible defaults.
|
|
150
|
+
- **Domain-first modelling** โ accurate scientific representation outranks framework convenience.
|
|
151
|
+
- **Progressive complexity** โ registering a model works on its own. Custom forms, filters and
|
|
152
|
+
views come later, and only for the portals that need them.
|
|
153
|
+
- **No frontend knowledge required** โ a working portal must not depend on template or JS skills.
|
|
154
|
+
- **FAIR by design** โ metadata, stable identifiers and machine access are built in, not added on.
|
|
155
|
+
- **A stable backbone beats a fast one** โ research portals outlive their funding, so the core
|
|
156
|
+
model changes slowly and deliberately.
|
|
157
|
+
|
|
158
|
+
Where the framework is headed is a separate question from what it is. That lives in
|
|
159
|
+
[GOALS.md](https://github.com/FAIR-DM/fairdm/blob/main/GOALS.md).
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Requirements
|
|
164
|
+
|
|
165
|
+
- Python 3.13 or later.
|
|
166
|
+
- Django 6.0.
|
|
167
|
+
|
|
168
|
+
## ๐ Quick Start
|
|
169
|
+
|
|
170
|
+
### Prerequisites
|
|
171
|
+
|
|
172
|
+
- **Python 3.13+**
|
|
173
|
+
- **uv** for dependency management
|
|
174
|
+
- **PostgreSQL** (recommended) or SQLite for development
|
|
175
|
+
|
|
176
|
+
### Installation
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
# Clone the repository
|
|
180
|
+
git clone https://github.com/FAIR-DM/fairdm.git
|
|
181
|
+
cd fairdm
|
|
182
|
+
|
|
183
|
+
# Install dependencies with uv
|
|
184
|
+
uv sync
|
|
185
|
+
|
|
186
|
+
# Activate the virtual environment
|
|
187
|
+
source .venv/bin/activate
|
|
188
|
+
|
|
189
|
+
# Run database migrations
|
|
190
|
+
uv run python manage.py migrate
|
|
191
|
+
|
|
192
|
+
# Create a superuser
|
|
193
|
+
uv run python manage.py createsuperuser
|
|
194
|
+
|
|
195
|
+
# Run the development server
|
|
196
|
+
uv run python manage.py runserver
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Visit `http://localhost:8000` to see your portal!
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## ๐ฆ Core Concepts
|
|
204
|
+
|
|
205
|
+
### Projects, Datasets, Samples & Measurements
|
|
206
|
+
|
|
207
|
+
FairDM organizes research data using a hierarchical structure:
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
Project
|
|
211
|
+
โโโ Dataset
|
|
212
|
+
โโโ Sample (your custom types)
|
|
213
|
+
โ โโโ Measurement (your custom types)
|
|
214
|
+
โโโ Sample
|
|
215
|
+
โโโ Measurement
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
- **Project**: Top-level container for research initiatives
|
|
219
|
+
- **Dataset**: Collection of related samples with shared metadata
|
|
220
|
+
- **Sample**: Domain-specific sample types (e.g., RockSample, WaterSample)
|
|
221
|
+
- **Measurement**: Domain-specific measurements on samples (e.g., XRFMeasurement)
|
|
222
|
+
|
|
223
|
+
### Portal Configuration
|
|
224
|
+
|
|
225
|
+
A portal gets its entire Django configuration from one call:
|
|
226
|
+
|
|
227
|
+
```python
|
|
228
|
+
# config/settings.py
|
|
229
|
+
import fairdm
|
|
230
|
+
|
|
231
|
+
fairdm.setup(apps=["myportal"], addons=["fairdm_discussions"])
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
FairDM's settings are production-grade in every environment. Each environment is an override layered on top, named by `DJANGO_ENV` and applied only if it exists โ so `config/development.py` beside your settings module tunes development, and an environment nobody ships a module for simply gets the production baseline. In production, configuration that would leave the portal unsafe stops it starting.
|
|
235
|
+
|
|
236
|
+
See [Configuration](https://github.com/FAIR-DM/fairdm/blob/main/docs/developers/reference/configuration.md) for the layer order, the environment variables and `manage.py show_config`.
|
|
237
|
+
|
|
238
|
+
### Model Registration
|
|
239
|
+
|
|
240
|
+
The heart of FairDM is its **registry system**. Define your models, register them, and get automatic:
|
|
241
|
+
|
|
242
|
+
- โ
Create/Read/Update/Delete views
|
|
243
|
+
- โ
List tables with sorting and filtering
|
|
244
|
+
- โ
Forms with Bootstrap 5 styling
|
|
245
|
+
- โ
REST API endpoints (optional)
|
|
246
|
+
- โ
Import/Export functionality
|
|
247
|
+
- โ
Admin integration
|
|
248
|
+
|
|
249
|
+
#### Example: Registering a Custom Sample
|
|
250
|
+
|
|
251
|
+
```python
|
|
252
|
+
# myapp/models.py
|
|
253
|
+
from fairdm.core.models import Sample
|
|
254
|
+
from django.db import models
|
|
255
|
+
|
|
256
|
+
class RockSample(Sample):
|
|
257
|
+
"""Custom sample type for geological specimens."""
|
|
258
|
+
|
|
259
|
+
rock_type = models.CharField(max_length=100)
|
|
260
|
+
collection_date = models.DateField()
|
|
261
|
+
weight_grams = models.DecimalField(max_digits=10, decimal_places=2)
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
# myapp/config.py
|
|
265
|
+
from fairdm.core.sample.config import BaseSampleConfiguration
|
|
266
|
+
from fairdm.registry import register
|
|
267
|
+
from .models import RockSample
|
|
268
|
+
|
|
269
|
+
@register
|
|
270
|
+
class RockSampleConfig(BaseSampleConfiguration):
|
|
271
|
+
model = RockSample
|
|
272
|
+
fields = ["name", "rock_type", "collection_date", "weight_grams", "location"]
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Listing `location` gives the type's form the location input, which reads signed decimal
|
|
276
|
+
degrees in WGS 84.
|
|
277
|
+
|
|
278
|
+
`BaseSampleConfiguration` is the recommended base for a specimen type's registry configuration โ
|
|
279
|
+
it declares the shared `fields` list every generated component falls back to, so you only state it
|
|
280
|
+
once. A configuration that relies on the registry auto-detecting a different field list per
|
|
281
|
+
component (table vs. form vs. filter set) should subclass the plain `ModelConfiguration` instead.
|
|
282
|
+
|
|
283
|
+
That's it! You now have:
|
|
284
|
+
|
|
285
|
+
- A working web interface for managing rock samples
|
|
286
|
+
- Sortable/filterable tables
|
|
287
|
+
- Create/update/delete forms
|
|
288
|
+
- Import/export to CSV/Excel
|
|
289
|
+
- REST API endpoints (if enabled)
|
|
290
|
+
|
|
291
|
+
---
|
|
292
|
+
|
|
293
|
+
## ๐จ Features
|
|
294
|
+
|
|
295
|
+
### โจ Auto-Generated Components
|
|
296
|
+
|
|
297
|
+
For every registered model, FairDM automatically generates:
|
|
298
|
+
|
|
299
|
+
| Component | Library | Purpose |
|
|
300
|
+
|-----------|---------|---------|
|
|
301
|
+
| **Forms** | Django Forms + Crispy Forms | Create/edit with Bootstrap 5 styling |
|
|
302
|
+
| **Tables** | django-tables2 | Sortable, paginated lists |
|
|
303
|
+
| **Filters** | django-filter | Advanced filtering UI |
|
|
304
|
+
| **Serializers** | Django REST Framework | JSON API responses |
|
|
305
|
+
| **Resources** | django-import-export | CSV/Excel import/export |
|
|
306
|
+
| **Admin** | Django Admin | Optional admin interface |
|
|
307
|
+
|
|
308
|
+
### ๐ Permissions & Access Control
|
|
309
|
+
|
|
310
|
+
- **Object-level permissions** via django-guardian
|
|
311
|
+
- Role-based access (viewer, editor, manager) at Project/Dataset level
|
|
312
|
+
- Public/private dataset visibility controls
|
|
313
|
+
- Add contributors to a project or dataset, including unclaimed profiles for people without accounts yet
|
|
314
|
+
|
|
315
|
+
### ๐ Data Import/Export
|
|
316
|
+
|
|
317
|
+
- **Formats**: CSV, Excel (XLSX), JSON, ODS
|
|
318
|
+
- **Background processing**: Large imports via Celery tasks
|
|
319
|
+
- **Validation**: Automatic field validation and error reporting
|
|
320
|
+
- **Templates**: Export sample templates for data collection
|
|
321
|
+
|
|
322
|
+
### ๐ Plugin System
|
|
323
|
+
|
|
324
|
+
Extend FairDM with custom functionality:
|
|
325
|
+
|
|
326
|
+
- Add analysis panels to detail views
|
|
327
|
+
- Create custom visualizations
|
|
328
|
+
- Integrate third-party tools
|
|
329
|
+
- Build domain-specific workflows
|
|
330
|
+
|
|
331
|
+
### ๐ Modern Frontend Stack
|
|
332
|
+
|
|
333
|
+
- **django-mvp** โ Shared application shell built on Tailwind CSS and daisyUI
|
|
334
|
+
- **daisy-cotton-ext** โ Page blocks the landing page is built from
|
|
335
|
+
- **django-mvp-compliance** โ Legal documents kept in the database, and a record of who agreed to them
|
|
336
|
+
- **HTMX** โ Dynamic interactions without writing JavaScript
|
|
337
|
+
- **Alpine.js** โ Lightweight reactivity for complex interactions
|
|
338
|
+
- **Django Cotton** โ Reusable component-based templates
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## ๐ Documentation
|
|
343
|
+
|
|
344
|
+
Full documentation is available at: **<https://fairdm.readthedocs.io/en/latest/>**
|
|
345
|
+
|
|
346
|
+
### Documentation Sections
|
|
347
|
+
|
|
348
|
+
- **[Developers](https://fairdm.readthedocs.io/en/latest/developers/)** โ Build and deploy a research portal on FairDM
|
|
349
|
+
- **[Administrators](https://fairdm.readthedocs.io/en/latest/administrators/)** โ Run a portal: people, roles, content review and configuration checks
|
|
350
|
+
- **[Users](https://fairdm.readthedocs.io/en/latest/users/)** โ Add, edit and publish research data in a portal
|
|
351
|
+
- **[Contributing](https://fairdm.readthedocs.io/en/latest/contributing/)** โ Contribute to FairDM framework development
|
|
352
|
+
|
|
353
|
+
---
|
|
354
|
+
|
|
355
|
+
## ๐งช Demo Application
|
|
356
|
+
|
|
357
|
+
Explore a working example in the `demo/` directory:
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
# The demo app showcases:
|
|
361
|
+
# - Custom Sample and Measurement models
|
|
362
|
+
# - Model registration and configuration
|
|
363
|
+
# - Custom forms, tables, and filters
|
|
364
|
+
# - Plugin development examples
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
The demo app serves as **executable documentation** and demonstrates best practices for building portals with FairDM.
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## ๐ ๏ธ Development
|
|
372
|
+
|
|
373
|
+
### Running Tests
|
|
374
|
+
|
|
375
|
+
```bash
|
|
376
|
+
# Run the full test suite
|
|
377
|
+
uv run pytest
|
|
378
|
+
|
|
379
|
+
# Run with coverage
|
|
380
|
+
uv run pytest --cov=fairdm --cov-report=html
|
|
381
|
+
|
|
382
|
+
# Run specific test file
|
|
383
|
+
uv run pytest tests/test_registry/test_config.py
|
|
384
|
+
|
|
385
|
+
# Run the reference application's tests on their own (they run by default too)
|
|
386
|
+
uv run pytest demo/tests
|
|
387
|
+
|
|
388
|
+
# Run with verbose output
|
|
389
|
+
uv run pytest -v
|
|
390
|
+
|
|
391
|
+
# Run in a single process (tests are parallel by default)
|
|
392
|
+
uv run pytest -n0
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### Code Quality
|
|
396
|
+
|
|
397
|
+
FairDM uses **Ruff** for linting and formatting:
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
# Lint the codebase
|
|
401
|
+
uv run ruff check .
|
|
402
|
+
|
|
403
|
+
# Format code
|
|
404
|
+
uv run ruff format .
|
|
405
|
+
|
|
406
|
+
# Check type hints with mypy
|
|
407
|
+
uv run mypy fairdm
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### Project Commands
|
|
411
|
+
|
|
412
|
+
Useful Invoke tasks (see `tasks.py`):
|
|
413
|
+
|
|
414
|
+
```bash
|
|
415
|
+
# Show available tasks
|
|
416
|
+
uv run invoke -l
|
|
417
|
+
|
|
418
|
+
# Run database migrations
|
|
419
|
+
uv run invoke migrate
|
|
420
|
+
|
|
421
|
+
# Create test data
|
|
422
|
+
uv run invoke create-test-data
|
|
423
|
+
|
|
424
|
+
# Build documentation
|
|
425
|
+
uv run invoke docs
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## ๐๏ธ Technology Stack
|
|
431
|
+
|
|
432
|
+
### Core Framework
|
|
433
|
+
|
|
434
|
+
- **Django 6.0** โ Web framework
|
|
435
|
+
- **Python 3.13+** โ Programming language
|
|
436
|
+
- **PostgreSQL** โ Database (recommended)
|
|
437
|
+
- **Redis** โ Caching and task queue
|
|
438
|
+
|
|
439
|
+
### Key Dependencies
|
|
440
|
+
|
|
441
|
+
- **django-polymorphic** โ Polymorphic model inheritance
|
|
442
|
+
- **django-guardian** โ Object-level permissions
|
|
443
|
+
- **django-tables2** โ Table rendering
|
|
444
|
+
- **django-filter** โ Filtering system
|
|
445
|
+
- **django-import-export** โ Data import/export
|
|
446
|
+
- **django-htmx** โ HTMX integration
|
|
447
|
+
- **django-cotton** โ Component-based templates
|
|
448
|
+
- **celery** โ Background task processing
|
|
449
|
+
|
|
450
|
+
See [pyproject.toml](https://github.com/FAIR-DM/fairdm/blob/main/pyproject.toml) for the complete dependency list.
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
## Changelog
|
|
455
|
+
|
|
456
|
+
See [CHANGELOG.md](https://github.com/FAIR-DM/fairdm/blob/main/CHANGELOG.md).
|
|
457
|
+
|
|
458
|
+
## ๐ License
|
|
459
|
+
|
|
460
|
+
This project is licensed under the **MIT License** โ see the [LICENSE](https://github.com/FAIR-DM/fairdm/blob/main/LICENSE) file for details.
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
## ๐ค Contributing
|
|
465
|
+
|
|
466
|
+
We welcome contributions! See our [Contributing Guide](https://github.com/FAIR-DM/fairdm/blob/main/CONTRIBUTING.md) for:
|
|
467
|
+
|
|
468
|
+
- **Development workflow**: Install git hooks to prevent CI failures
|
|
469
|
+
- **Code style and conventions**: Ruff formatting (120 char lines)
|
|
470
|
+
- **Testing requirements**: pytest with >80% coverage goal
|
|
471
|
+
- **Pull request process**: Pre-push validation ensures CI passes
|
|
472
|
+
|
|
473
|
+
**Before your first push**, install git hooks to run CI checks locally:
|
|
474
|
+
|
|
475
|
+
```bash
|
|
476
|
+
uv run invoke install-hooks
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
This prevents CI failures by running the same linting and formatting checks locally.
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
## ๐ Project Status
|
|
484
|
+
|
|
485
|
+
FairDM is under active development. Current focus areas:
|
|
486
|
+
|
|
487
|
+
- โ
Core framework and registry system
|
|
488
|
+
- โ
Model registration and auto-generation
|
|
489
|
+
- โ
Permissions and access control
|
|
490
|
+
- ๐ง Plugin system expansion
|
|
491
|
+
- ๐ง REST API enhancements
|
|
492
|
+
- ๐ง Advanced data visualization
|
|
493
|
+
- ๐ Cloud deployment guides
|
|
494
|
+
- ๐ Extended documentation
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
## ๐ Support & Community
|
|
499
|
+
|
|
500
|
+
- **Documentation**: <https://fairdm.readthedocs.io/en/latest/>
|
|
501
|
+
- **Issues**: <https://github.com/FAIR-DM/fairdm/issues>
|
|
502
|
+
- **GitHub**: <https://github.com/FAIR-DM/fairdm>
|
|
503
|
+
|
|
504
|
+
---
|
|
505
|
+
|
|
506
|
+
Made with โค๏ธ for the research community
|