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.
Files changed (573) hide show
  1. fairdm-0.3.0/.gitignore +114 -0
  2. fairdm-0.3.0/LICENSE +21 -0
  3. fairdm-0.3.0/PKG-INFO +506 -0
  4. fairdm-0.3.0/README.md +416 -0
  5. fairdm-0.3.0/demo/README.md +466 -0
  6. fairdm-0.3.0/demo/__init__.py +1 -0
  7. fairdm-0.3.0/demo/admin.py +519 -0
  8. fairdm-0.3.0/demo/apps.py +22 -0
  9. fairdm-0.3.0/demo/config.py +460 -0
  10. fairdm-0.3.0/demo/factories.py +374 -0
  11. fairdm-0.3.0/demo/filters.py +475 -0
  12. fairdm-0.3.0/demo/forms.py +584 -0
  13. fairdm-0.3.0/demo/management/__init__.py +0 -0
  14. fairdm-0.3.0/demo/management/commands/__init__.py +0 -0
  15. fairdm-0.3.0/demo/management/commands/seed_contributors.py +42 -0
  16. fairdm-0.3.0/demo/management/commands/seed_overviews.py +39 -0
  17. fairdm-0.3.0/demo/management/commands/seed_profiles.py +503 -0
  18. fairdm-0.3.0/demo/management/commands/seed_record_search.py +40 -0
  19. fairdm-0.3.0/demo/migrations/0001_initial.py +724 -0
  20. fairdm-0.3.0/demo/migrations/0002_alter_customparentsample_options.py +17 -0
  21. fairdm-0.3.0/demo/migrations/0003_icp_ms_measurement_uncertainty_and_more.py +24 -0
  22. fairdm-0.3.0/demo/migrations/__init__.py +0 -0
  23. fairdm-0.3.0/demo/models.py +690 -0
  24. fairdm-0.3.0/demo/options.py +1 -0
  25. fairdm-0.3.0/demo/plugins.py +186 -0
  26. fairdm-0.3.0/demo/seed/__init__.py +0 -0
  27. fairdm-0.3.0/demo/seed/common.py +127 -0
  28. fairdm-0.3.0/demo/seed/contributors.py +361 -0
  29. fairdm-0.3.0/demo/seed/measurements.py +205 -0
  30. fairdm-0.3.0/demo/seed/projects.py +565 -0
  31. fairdm-0.3.0/demo/seed/record_search.py +318 -0
  32. fairdm-0.3.0/demo/seed/samples.py +237 -0
  33. fairdm-0.3.0/demo/static/scss/_bootstrap_vars.scss +1 -0
  34. fairdm-0.3.0/demo/static/scss/stylesheet.scss +2 -0
  35. fairdm-0.3.0/demo/tables.py +59 -0
  36. fairdm-0.3.0/demo/templates/demo/rocksample_overview.html +32 -0
  37. fairdm-0.3.0/demo/templates/demo/xrfmeasurement_overview.html +46 -0
  38. fairdm-0.3.0/demo/templates/fairdm/landing.html +20 -0
  39. fairdm-0.3.0/demo/tests/__init__.py +0 -0
  40. fairdm-0.3.0/demo/tests/test_admin_views.py +465 -0
  41. fairdm-0.3.0/demo/tests/test_api_smoke.py +54 -0
  42. fairdm-0.3.0/demo/tests/test_contributors.py +136 -0
  43. fairdm-0.3.0/demo/tests/test_forms.py +70 -0
  44. fairdm-0.3.0/demo/tests/test_registry_api.py +219 -0
  45. fairdm-0.3.0/fairdm/__init__.py +13 -0
  46. fairdm-0.3.0/fairdm/api/__init__.py +1 -0
  47. fairdm-0.3.0/fairdm/api/apps.py +22 -0
  48. fairdm-0.3.0/fairdm/api/checks.py +70 -0
  49. fairdm-0.3.0/fairdm/api/filters.py +503 -0
  50. fairdm-0.3.0/fairdm/api/pagination.py +40 -0
  51. fairdm-0.3.0/fairdm/api/permissions.py +103 -0
  52. fairdm-0.3.0/fairdm/api/router.py +63 -0
  53. fairdm-0.3.0/fairdm/api/schema.py +366 -0
  54. fairdm-0.3.0/fairdm/api/serializers.py +1248 -0
  55. fairdm-0.3.0/fairdm/api/settings.py +128 -0
  56. fairdm-0.3.0/fairdm/api/throttling.py +56 -0
  57. fairdm-0.3.0/fairdm/api/urls.py +23 -0
  58. fairdm-0.3.0/fairdm/api/viewsets.py +408 -0
  59. fairdm-0.3.0/fairdm/apps.py +129 -0
  60. fairdm-0.3.0/fairdm/backups/__init__.py +1 -0
  61. fairdm-0.3.0/fairdm/backups/apps.py +21 -0
  62. fairdm-0.3.0/fairdm/backups/keys.py +111 -0
  63. fairdm-0.3.0/fairdm/backups/management/__init__.py +0 -0
  64. fairdm-0.3.0/fairdm/backups/management/commands/__init__.py +0 -0
  65. fairdm-0.3.0/fairdm/backups/management/commands/backup.py +40 -0
  66. fairdm-0.3.0/fairdm/backups/media.py +55 -0
  67. fairdm-0.3.0/fairdm/backups/run.py +39 -0
  68. fairdm-0.3.0/fairdm/backups/signals.py +33 -0
  69. fairdm-0.3.0/fairdm/backups/tasks.py +21 -0
  70. fairdm-0.3.0/fairdm/conf/__init__.py +101 -0
  71. fairdm-0.3.0/fairdm/conf/addons.py +146 -0
  72. fairdm-0.3.0/fairdm/conf/celery.py +10 -0
  73. fairdm-0.3.0/fairdm/conf/checks.py +664 -0
  74. fairdm-0.3.0/fairdm/conf/development.py +122 -0
  75. fairdm-0.3.0/fairdm/conf/environment.py +62 -0
  76. fairdm-0.3.0/fairdm/conf/settings/__init__.py +1 -0
  77. fairdm-0.3.0/fairdm/conf/settings/addons.py +417 -0
  78. fairdm-0.3.0/fairdm/conf/settings/api.py +44 -0
  79. fairdm-0.3.0/fairdm/conf/settings/apps.py +192 -0
  80. fairdm-0.3.0/fairdm/conf/settings/auth.py +93 -0
  81. fairdm-0.3.0/fairdm/conf/settings/cache.py +37 -0
  82. fairdm-0.3.0/fairdm/conf/settings/celery.py +40 -0
  83. fairdm-0.3.0/fairdm/conf/settings/database.py +56 -0
  84. fairdm-0.3.0/fairdm/conf/settings/email.py +39 -0
  85. fairdm-0.3.0/fairdm/conf/settings/logging.py +72 -0
  86. fairdm-0.3.0/fairdm/conf/settings/security.py +61 -0
  87. fairdm-0.3.0/fairdm/conf/settings/static_media.py +108 -0
  88. fairdm-0.3.0/fairdm/conf/setup.py +373 -0
  89. fairdm-0.3.0/fairdm/conf/urls.py +74 -0
  90. fairdm-0.3.0/fairdm/config.py +62 -0
  91. fairdm-0.3.0/fairdm/contrib/__init__.py +9 -0
  92. fairdm-0.3.0/fairdm/contrib/admin/__init__.py +1 -0
  93. fairdm-0.3.0/fairdm/contrib/admin/admin.py +60 -0
  94. fairdm-0.3.0/fairdm/contrib/admin/apps.py +17 -0
  95. fairdm-0.3.0/fairdm/contrib/admin/sites.py +117 -0
  96. fairdm-0.3.0/fairdm/contrib/admin/templates/admin/base_site.html +6 -0
  97. fairdm-0.3.0/fairdm/contrib/admin/templates/admin/fixture_upload_form.html +14 -0
  98. fairdm-0.3.0/fairdm/contrib/admin/urls.py +13 -0
  99. fairdm-0.3.0/fairdm/contrib/admin/views.py +86 -0
  100. fairdm-0.3.0/fairdm/contrib/autocomplete/__init__.py +3 -0
  101. fairdm-0.3.0/fairdm/contrib/autocomplete/apps.py +12 -0
  102. fairdm-0.3.0/fairdm/contrib/autocomplete/fields.py +671 -0
  103. fairdm-0.3.0/fairdm/contrib/autocomplete/filters.py +94 -0
  104. fairdm-0.3.0/fairdm/contrib/autocomplete/templates/autocomplete/contributor_option.html +18 -0
  105. fairdm-0.3.0/fairdm/contrib/autocomplete/templates/autocomplete/record_option.html +8 -0
  106. fairdm-0.3.0/fairdm/contrib/autocomplete/throttling.py +65 -0
  107. fairdm-0.3.0/fairdm/contrib/autocomplete/urls.py +66 -0
  108. fairdm-0.3.0/fairdm/contrib/autocomplete/views.py +1048 -0
  109. fairdm-0.3.0/fairdm/contrib/collections/README.md +101 -0
  110. fairdm-0.3.0/fairdm/contrib/collections/__init__.py +3 -0
  111. fairdm-0.3.0/fairdm/contrib/collections/apps.py +62 -0
  112. fairdm-0.3.0/fairdm/contrib/collections/tables.py +183 -0
  113. fairdm-0.3.0/fairdm/contrib/collections/templates/collections/listing.html +33 -0
  114. fairdm-0.3.0/fairdm/contrib/collections/urls.py +9 -0
  115. fairdm-0.3.0/fairdm/contrib/collections/views.py +167 -0
  116. fairdm-0.3.0/fairdm/contrib/contributors/__init__.py +1 -0
  117. fairdm-0.3.0/fairdm/contrib/contributors/access.py +332 -0
  118. fairdm-0.3.0/fairdm/contrib/contributors/adapters.py +136 -0
  119. fairdm-0.3.0/fairdm/contrib/contributors/admin.py +790 -0
  120. fairdm-0.3.0/fairdm/contrib/contributors/apps.py +34 -0
  121. fairdm-0.3.0/fairdm/contrib/contributors/choices.py +67 -0
  122. fairdm-0.3.0/fairdm/contrib/contributors/exceptions.py +9 -0
  123. fairdm-0.3.0/fairdm/contrib/contributors/filters.py +100 -0
  124. fairdm-0.3.0/fairdm/contrib/contributors/forms/__init__.py +1 -0
  125. fairdm-0.3.0/fairdm/contrib/contributors/forms/account.py +79 -0
  126. fairdm-0.3.0/fairdm/contrib/contributors/forms/contribution.py +186 -0
  127. fairdm-0.3.0/fairdm/contrib/contributors/forms/forms.py +132 -0
  128. fairdm-0.3.0/fairdm/contrib/contributors/forms/organization.py +151 -0
  129. fairdm-0.3.0/fairdm/contrib/contributors/forms/person.py +84 -0
  130. fairdm-0.3.0/fairdm/contrib/contributors/forms/profile.py +430 -0
  131. fairdm-0.3.0/fairdm/contrib/contributors/forms/widgets.py +9 -0
  132. fairdm-0.3.0/fairdm/contrib/contributors/managers.py +311 -0
  133. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0001_initial.py +616 -0
  134. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0002_delete_member_remove_person_is_member_and_more.py +22 -0
  135. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0003_alter_organization_country.py +23 -0
  136. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0004_delete_contributorrole_and_more.py +60 -0
  137. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0005_alter_contributor_profile.py +16 -0
  138. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0006_cleanup_duplicate_types.py +48 -0
  139. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0007_add_unique_type_constraints.py +17 -0
  140. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0008_migrate_to_location_model.py +67 -0
  141. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0009_alter_contributor_lang_and_more.py +26 -0
  142. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0010_alter_contributoridentifier_managers.py +15 -0
  143. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0011_add_partial_dates_and_privacy.py +60 -0
  144. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0012_rename_to_affiliation.py +15 -0
  145. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0013_update_related_names.py +43 -0
  146. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0014_add_is_claimed_field.py +19 -0
  147. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0015_set_is_claimed.py +25 -0
  148. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0016_make_is_claimed_non_nullable.py +18 -0
  149. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0017_remove_manage_organization_permission.py +81 -0
  150. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0018_claiming_audit_log.py +43 -0
  151. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0019_alter_contributoridentifier_type.py +17 -0
  152. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0020_contributors_audit.py +148 -0
  153. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0021_alter_affiliation_end_date_help_text.py +17 -0
  154. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0022_contribution_level.py +25 -0
  155. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0023_levels_from_stored_permissions.py +178 -0
  156. fairdm-0.3.0/fairdm/contrib/contributors/migrations/0024_organization_location.py +29 -0
  157. fairdm-0.3.0/fairdm/contrib/contributors/migrations/__init__.py +0 -0
  158. fairdm-0.3.0/fairdm/contrib/contributors/models.py +2212 -0
  159. fairdm-0.3.0/fairdm/contrib/contributors/permissions.py +115 -0
  160. fairdm-0.3.0/fairdm/contrib/contributors/plugins/__init__.py +6 -0
  161. fairdm-0.3.0/fairdm/contrib/contributors/plugins/organisation.py +1 -0
  162. fairdm-0.3.0/fairdm/contrib/contributors/plugins/overview.py +295 -0
  163. fairdm-0.3.0/fairdm/contrib/contributors/plugins/person.py +46 -0
  164. fairdm-0.3.0/fairdm/contrib/contributors/plugins/shared.py +1017 -0
  165. fairdm-0.3.0/fairdm/contrib/contributors/plugins/update.py +77 -0
  166. fairdm-0.3.0/fairdm/contrib/contributors/profiles.py +119 -0
  167. fairdm-0.3.0/fairdm/contrib/contributors/receivers.py +38 -0
  168. fairdm-0.3.0/fairdm/contrib/contributors/resources.py +110 -0
  169. fairdm-0.3.0/fairdm/contrib/contributors/services/__init__.py +1 -0
  170. fairdm-0.3.0/fairdm/contrib/contributors/services/claiming.py +196 -0
  171. fairdm-0.3.0/fairdm/contrib/contributors/services/crediting.py +374 -0
  172. fairdm-0.3.0/fairdm/contrib/contributors/services/matching.py +44 -0
  173. fairdm-0.3.0/fairdm/contrib/contributors/services/merge.py +215 -0
  174. fairdm-0.3.0/fairdm/contrib/contributors/services/registries.py +441 -0
  175. fairdm-0.3.0/fairdm/contrib/contributors/signals.py +48 -0
  176. fairdm-0.3.0/fairdm/contrib/contributors/static/contributors/css/contributor-filter.css +32 -0
  177. fairdm-0.3.0/fairdm/contrib/contributors/static/contributors/js/contributor-filter.js +79 -0
  178. fairdm-0.3.0/fairdm/contrib/contributors/tasks.py +233 -0
  179. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/admin/change_form.html +49 -0
  180. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/admin/claim_person.html +77 -0
  181. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/admin/merge_person.html +70 -0
  182. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/claim_profile.html +66 -0
  183. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/contributor_card.html +5 -0
  184. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/organization_detail.html +49 -0
  185. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/overview/organization.html +196 -0
  186. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/overview/person.html +178 -0
  187. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/contribution_add_organization.html +189 -0
  188. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/contribution_add_person.html +201 -0
  189. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/contribution_edit.html +88 -0
  190. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/contribution_list.html +136 -0
  191. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/contribution_remove.html +66 -0
  192. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/plugins/update.html +20 -0
  193. fairdm-0.3.0/fairdm/contrib/contributors/templates/contributors/team.html +14 -0
  194. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/affiliations/row.html +18 -0
  195. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/affiliations.html +31 -0
  196. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/hierarchy/node.html +14 -0
  197. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/hierarchy.html +52 -0
  198. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/links.html +23 -0
  199. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/records.html +51 -0
  200. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/card/roles.html +27 -0
  201. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contribution/access.html +19 -0
  202. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contribution/affiliation.html +44 -0
  203. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contribution/controls.html +30 -0
  204. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contribution/list_item.html +17 -0
  205. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contribution/organization.html +38 -0
  206. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/affiliation.html +4 -0
  207. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/avatar.html +21 -0
  208. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/byline.html +28 -0
  209. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/card/contribution.html +21 -0
  210. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/card/index.html +12 -0
  211. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/card/organization.html +37 -0
  212. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/card/person.html +33 -0
  213. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/card/person_alt.html +24 -0
  214. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/icon.html +10 -0
  215. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/item.html +33 -0
  216. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/name.html +17 -0
  217. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/names.html +20 -0
  218. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/person/affiliation.html +9 -0
  219. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/person/affiliations.html +11 -0
  220. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/person/identifier.html +7 -0
  221. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/row.html +12 -0
  222. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/stack.html +23 -0
  223. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor/summary.html +18 -0
  224. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/contributor_card.html +4 -0
  225. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/org/avatar.html +20 -0
  226. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/organization_card.html +16 -0
  227. fairdm-0.3.0/fairdm/contrib/contributors/templates/cotton/person_card.html +23 -0
  228. fairdm-0.3.0/fairdm/contrib/contributors/templates/widgets/orcid.html +77 -0
  229. fairdm-0.3.0/fairdm/contrib/contributors/templatetags/__init__.py +1 -0
  230. fairdm-0.3.0/fairdm/contrib/contributors/templatetags/contributor_tags.py +112 -0
  231. fairdm-0.3.0/fairdm/contrib/contributors/urls.py +31 -0
  232. fairdm-0.3.0/fairdm/contrib/contributors/utils/__init__.py +90 -0
  233. fairdm-0.3.0/fairdm/contrib/contributors/utils/audit.py +47 -0
  234. fairdm-0.3.0/fairdm/contrib/contributors/utils/helpers.py +94 -0
  235. fairdm-0.3.0/fairdm/contrib/contributors/utils/tokens.py +77 -0
  236. fairdm-0.3.0/fairdm/contrib/contributors/utils/transforms.py +958 -0
  237. fairdm-0.3.0/fairdm/contrib/contributors/validators.py +223 -0
  238. fairdm-0.3.0/fairdm/contrib/contributors/views/__init__.py +10 -0
  239. fairdm-0.3.0/fairdm/contrib/contributors/views/claiming.py +111 -0
  240. fairdm-0.3.0/fairdm/contrib/contributors/views/organization.py +34 -0
  241. fairdm-0.3.0/fairdm/contrib/contributors/views/person.py +50 -0
  242. fairdm-0.3.0/fairdm/contrib/contributors/views/team.py +73 -0
  243. fairdm-0.3.0/fairdm/contrib/identity/__init__.py +1 -0
  244. fairdm-0.3.0/fairdm/contrib/identity/admin.py +101 -0
  245. fairdm-0.3.0/fairdm/contrib/identity/apps.py +12 -0
  246. fairdm-0.3.0/fairdm/contrib/identity/forms.py +1 -0
  247. fairdm-0.3.0/fairdm/contrib/identity/migrations/0001_initial.py +182 -0
  248. fairdm-0.3.0/fairdm/contrib/identity/migrations/0002_rename_database_to_identity.py +159 -0
  249. fairdm-0.3.0/fairdm/contrib/identity/migrations/0003_rename_databasetranslation_identitytranslation_and_more.py +27 -0
  250. fairdm-0.3.0/fairdm/contrib/identity/migrations/0004_alter_authoritytranslation_unique_together_and_more.py +27 -0
  251. fairdm-0.3.0/fairdm/contrib/identity/migrations/__init__.py +0 -0
  252. fairdm-0.3.0/fairdm/contrib/identity/models.py +131 -0
  253. fairdm-0.3.0/fairdm/contrib/identity/static/configuration/admin.css +28 -0
  254. fairdm-0.3.0/fairdm/contrib/import_export/__init__.py +1 -0
  255. fairdm-0.3.0/fairdm/contrib/import_export/apps.py +12 -0
  256. fairdm-0.3.0/fairdm/contrib/import_export/formats.py +10 -0
  257. fairdm-0.3.0/fairdm/contrib/import_export/forms.py +30 -0
  258. fairdm-0.3.0/fairdm/contrib/import_export/resources.py +130 -0
  259. fairdm-0.3.0/fairdm/contrib/import_export/templates/cotton/import_export/export_dropdown.html +21 -0
  260. fairdm-0.3.0/fairdm/contrib/import_export/templates/cotton/import_export/result/base_errors.html +1 -0
  261. fairdm-0.3.0/fairdm/contrib/import_export/templates/cotton/import_export/result/error.html +16 -0
  262. fairdm-0.3.0/fairdm/contrib/import_export/templates/cotton/import_export/result/preview.html +1 -0
  263. fairdm-0.3.0/fairdm/contrib/import_export/templates/cotton/import_export/result/validation_errors.html +1 -0
  264. fairdm-0.3.0/fairdm/contrib/import_export/templates/import_export/import.html +122 -0
  265. fairdm-0.3.0/fairdm/contrib/import_export/urls.py +5 -0
  266. fairdm-0.3.0/fairdm/contrib/import_export/utils.py +174 -0
  267. fairdm-0.3.0/fairdm/contrib/import_export/views.py +378 -0
  268. fairdm-0.3.0/fairdm/contrib/location/__init__.py +1 -0
  269. fairdm-0.3.0/fairdm/contrib/location/apps.py +12 -0
  270. fairdm-0.3.0/fairdm/contrib/location/migrations/0001_initial.py +81 -0
  271. fairdm-0.3.0/fairdm/contrib/location/migrations/0002_delete_point.py +16 -0
  272. fairdm-0.3.0/fairdm/contrib/location/migrations/__init__.py +0 -0
  273. fairdm-0.3.0/fairdm/contrib/plugins/__init__.py +73 -0
  274. fairdm-0.3.0/fairdm/contrib/plugins/access.py +199 -0
  275. fairdm-0.3.0/fairdm/contrib/plugins/apps.py +13 -0
  276. fairdm-0.3.0/fairdm/contrib/plugins/base.py +265 -0
  277. fairdm-0.3.0/fairdm/contrib/plugins/checks.py +220 -0
  278. fairdm-0.3.0/fairdm/contrib/plugins/menus.py +16 -0
  279. fairdm-0.3.0/fairdm/contrib/plugins/mixins.py +39 -0
  280. fairdm-0.3.0/fairdm/contrib/plugins/registration.py +229 -0
  281. fairdm-0.3.0/fairdm/contrib/plugins/templates/menus/tab.html +4 -0
  282. fairdm-0.3.0/fairdm/contrib/plugins/templates/menus/tabs.html +10 -0
  283. fairdm-0.3.0/fairdm/contrib/plugins/templatetags/__init__.py +1 -0
  284. fairdm-0.3.0/fairdm/contrib/plugins/templatetags/plugin_tags.py +61 -0
  285. fairdm-0.3.0/fairdm/contrib/plugins/utils.py +103 -0
  286. fairdm-0.3.0/fairdm/core/__init__.py +1 -0
  287. fairdm-0.3.0/fairdm/core/abstract.py +476 -0
  288. fairdm-0.3.0/fairdm/core/admin.py +21 -0
  289. fairdm-0.3.0/fairdm/core/apps.py +40 -0
  290. fairdm-0.3.0/fairdm/core/choices.py +14 -0
  291. fairdm-0.3.0/fairdm/core/dataset/__init__.py +1 -0
  292. fairdm-0.3.0/fairdm/core/dataset/admin.py +190 -0
  293. fairdm-0.3.0/fairdm/core/dataset/apps.py +13 -0
  294. fairdm-0.3.0/fairdm/core/dataset/filters.py +90 -0
  295. fairdm-0.3.0/fairdm/core/dataset/forms.py +164 -0
  296. fairdm-0.3.0/fairdm/core/dataset/migrations/0001_initial.py +216 -0
  297. fairdm-0.3.0/fairdm/core/dataset/migrations/0002_initial.py +92 -0
  298. fairdm-0.3.0/fairdm/core/dataset/migrations/0003_alter_dataset_options.py +28 -0
  299. fairdm-0.3.0/fairdm/core/dataset/migrations/0004_alter_dataset_reference.py +28 -0
  300. fairdm-0.3.0/fairdm/core/dataset/migrations/0005_alter_dataset_license.py +28 -0
  301. fairdm-0.3.0/fairdm/core/dataset/migrations/0006_cleanup_duplicate_types.py +61 -0
  302. fairdm-0.3.0/fairdm/core/dataset/migrations/0007_add_unique_type_constraints.py +31 -0
  303. fairdm-0.3.0/fairdm/core/dataset/migrations/0008_datasetliteraturerelation_alter_datasetdate_managers_and_more.py +193 -0
  304. fairdm-0.3.0/fairdm/core/dataset/migrations/0009_alter_dataset_project_on_delete.py +32 -0
  305. fairdm-0.3.0/fairdm/core/dataset/migrations/0010_add_dataset_permissions.py +30 -0
  306. fairdm-0.3.0/fairdm/core/dataset/migrations/0011_alter_dataset_options_alter_dataset_license_and_more.py +52 -0
  307. fairdm-0.3.0/fairdm/core/dataset/migrations/0012_dataset_published_alter_dataset_name.py +23 -0
  308. fairdm-0.3.0/fairdm/core/dataset/migrations/0013_alter_dataset_options.py +17 -0
  309. fairdm-0.3.0/fairdm/core/dataset/migrations/0014_alter_datasetdescription_value.py +19 -0
  310. fairdm-0.3.0/fairdm/core/dataset/migrations/0015_index_modified.py +25 -0
  311. fairdm-0.3.0/fairdm/core/dataset/migrations/__init__.py +0 -0
  312. fairdm-0.3.0/fairdm/core/dataset/models.py +532 -0
  313. fairdm-0.3.0/fairdm/core/dataset/plugins.py +707 -0
  314. fairdm-0.3.0/fairdm/core/dataset/templates/cotton/dataset/card.html +145 -0
  315. fairdm-0.3.0/fairdm/core/dataset/templates/dataset/dataset_card.html +2 -0
  316. fairdm-0.3.0/fairdm/core/dataset/templates/dataset/dataset_detail.html +166 -0
  317. fairdm-0.3.0/fairdm/core/dataset/templates/publishing/datacite/contributor.xml +14 -0
  318. fairdm-0.3.0/fairdm/core/dataset/templates/publishing/datacite44.xml +106 -0
  319. fairdm-0.3.0/fairdm/core/dataset/urls.py +18 -0
  320. fairdm-0.3.0/fairdm/core/dataset/views.py +62 -0
  321. fairdm-0.3.0/fairdm/core/dates.py +31 -0
  322. fairdm-0.3.0/fairdm/core/descriptions.py +85 -0
  323. fairdm-0.3.0/fairdm/core/editing.py +632 -0
  324. fairdm-0.3.0/fairdm/core/filters.py +16 -0
  325. fairdm-0.3.0/fairdm/core/forms.py +160 -0
  326. fairdm-0.3.0/fairdm/core/formsets.py +68 -0
  327. fairdm-0.3.0/fairdm/core/image_utils.py +32 -0
  328. fairdm-0.3.0/fairdm/core/managers.py +162 -0
  329. fairdm-0.3.0/fairdm/core/measurement/__init__.py +1 -0
  330. fairdm-0.3.0/fairdm/core/measurement/admin.py +178 -0
  331. fairdm-0.3.0/fairdm/core/measurement/apps.py +48 -0
  332. fairdm-0.3.0/fairdm/core/measurement/config.py +94 -0
  333. fairdm-0.3.0/fairdm/core/measurement/filters.py +130 -0
  334. fairdm-0.3.0/fairdm/core/measurement/forms.py +145 -0
  335. fairdm-0.3.0/fairdm/core/measurement/managers.py +160 -0
  336. fairdm-0.3.0/fairdm/core/measurement/migrations/0001_initial.py +217 -0
  337. fairdm-0.3.0/fairdm/core/measurement/migrations/0002_initial.py +69 -0
  338. fairdm-0.3.0/fairdm/core/measurement/migrations/0003_alter_measurement_options.py +27 -0
  339. fairdm-0.3.0/fairdm/core/measurement/migrations/0004_cleanup_duplicate_types.py +61 -0
  340. fairdm-0.3.0/fairdm/core/measurement/migrations/0005_add_unique_type_constraints.py +31 -0
  341. fairdm-0.3.0/fairdm/core/measurement/migrations/0006_alter_measurementdate_managers_and_more.py +37 -0
  342. fairdm-0.3.0/fairdm/core/measurement/migrations/0007_alter_measurementdate_type_and_more.py +24 -0
  343. fairdm-0.3.0/fairdm/core/measurement/migrations/0008_measurement_local_id.py +24 -0
  344. fairdm-0.3.0/fairdm/core/measurement/migrations/0009_alter_measurementidentifier_type.py +19 -0
  345. fairdm-0.3.0/fairdm/core/measurement/migrations/0010_alter_measurement_local_id.py +18 -0
  346. fairdm-0.3.0/fairdm/core/measurement/migrations/0011_alter_measurement_sample.py +21 -0
  347. fairdm-0.3.0/fairdm/core/measurement/migrations/0012_alter_measurement_name.py +18 -0
  348. fairdm-0.3.0/fairdm/core/measurement/migrations/0013_alter_measurementdescription_value.py +19 -0
  349. fairdm-0.3.0/fairdm/core/measurement/migrations/0014_index_modified.py +23 -0
  350. fairdm-0.3.0/fairdm/core/measurement/migrations/0015_located_measurements.py +49 -0
  351. fairdm-0.3.0/fairdm/core/measurement/migrations/__init__.py +0 -0
  352. fairdm-0.3.0/fairdm/core/measurement/models.py +339 -0
  353. fairdm-0.3.0/fairdm/core/measurement/plugins.py +293 -0
  354. fairdm-0.3.0/fairdm/core/measurement/templates/measurement/measurement_overview.html +167 -0
  355. fairdm-0.3.0/fairdm/core/measurement/urls.py +13 -0
  356. fairdm-0.3.0/fairdm/core/models.py +13 -0
  357. fairdm-0.3.0/fairdm/core/overview.py +134 -0
  358. fairdm-0.3.0/fairdm/core/permissions.py +76 -0
  359. fairdm-0.3.0/fairdm/core/plugins.py +573 -0
  360. fairdm-0.3.0/fairdm/core/project/__init__.py +1 -0
  361. fairdm-0.3.0/fairdm/core/project/admin.py +203 -0
  362. fairdm-0.3.0/fairdm/core/project/apps.py +13 -0
  363. fairdm-0.3.0/fairdm/core/project/filters.py +125 -0
  364. fairdm-0.3.0/fairdm/core/project/forms.py +116 -0
  365. fairdm-0.3.0/fairdm/core/project/migrations/0001_initial.py +277 -0
  366. fairdm-0.3.0/fairdm/core/project/migrations/0002_alter_project_options.py +27 -0
  367. fairdm-0.3.0/fairdm/core/project/migrations/0003_alter_projectdescription_type.py +19 -0
  368. fairdm-0.3.0/fairdm/core/project/migrations/0004_cleanup_duplicate_types.py +63 -0
  369. fairdm-0.3.0/fairdm/core/project/migrations/0005_add_unique_type_constraints.py +31 -0
  370. fairdm-0.3.0/fairdm/core/project/migrations/0006_alter_project_options_alter_projectdate_options_and_more.py +82 -0
  371. fairdm-0.3.0/fairdm/core/project/migrations/0007_project_created_by_alter_project_funding_and_more.py +39 -0
  372. fairdm-0.3.0/fairdm/core/project/migrations/0008_convert_funding_to_datacite_shape.py +45 -0
  373. fairdm-0.3.0/fairdm/core/project/migrations/0009_alter_project_name.py +18 -0
  374. fairdm-0.3.0/fairdm/core/project/migrations/0010_alter_projectdescription_value.py +19 -0
  375. fairdm-0.3.0/fairdm/core/project/migrations/0011_index_modified.py +23 -0
  376. fairdm-0.3.0/fairdm/core/project/migrations/__init__.py +0 -0
  377. fairdm-0.3.0/fairdm/core/project/models.py +393 -0
  378. fairdm-0.3.0/fairdm/core/project/plugins.py +557 -0
  379. fairdm-0.3.0/fairdm/core/project/receivers.py +5 -0
  380. fairdm-0.3.0/fairdm/core/project/serializers.py +25 -0
  381. fairdm-0.3.0/fairdm/core/project/templates/cotton/project/card.html +119 -0
  382. fairdm-0.3.0/fairdm/core/project/templates/cotton/project/create_button.html +8 -0
  383. fairdm-0.3.0/fairdm/core/project/templates/project/project_card.html +2 -0
  384. fairdm-0.3.0/fairdm/core/project/templates/project/project_detail.html +193 -0
  385. fairdm-0.3.0/fairdm/core/project/transforms.py +219 -0
  386. fairdm-0.3.0/fairdm/core/project/urls.py +18 -0
  387. fairdm-0.3.0/fairdm/core/project/validators.py +94 -0
  388. fairdm-0.3.0/fairdm/core/project/views.py +61 -0
  389. fairdm-0.3.0/fairdm/core/related_records.py +108 -0
  390. fairdm-0.3.0/fairdm/core/sample/__init__.py +1 -0
  391. fairdm-0.3.0/fairdm/core/sample/admin.py +211 -0
  392. fairdm-0.3.0/fairdm/core/sample/apps.py +13 -0
  393. fairdm-0.3.0/fairdm/core/sample/config.py +43 -0
  394. fairdm-0.3.0/fairdm/core/sample/filters.py +138 -0
  395. fairdm-0.3.0/fairdm/core/sample/forms.py +170 -0
  396. fairdm-0.3.0/fairdm/core/sample/managers.py +187 -0
  397. fairdm-0.3.0/fairdm/core/sample/migrations/0001_initial.py +325 -0
  398. fairdm-0.3.0/fairdm/core/sample/migrations/0002_alter_sample_options.py +27 -0
  399. fairdm-0.3.0/fairdm/core/sample/migrations/0003_cleanup_duplicate_types.py +61 -0
  400. fairdm-0.3.0/fairdm/core/sample/migrations/0004_add_unique_type_constraints.py +31 -0
  401. fairdm-0.3.0/fairdm/core/sample/migrations/0005_alter_sample_options_alter_samplerelation_options_and_more.py +73 -0
  402. fairdm-0.3.0/fairdm/core/sample/migrations/0006_alter_sample_local_id.py +24 -0
  403. fairdm-0.3.0/fairdm/core/sample/migrations/0007_alter_sample_status_alter_sample_uuid_and_more.py +31 -0
  404. fairdm-0.3.0/fairdm/core/sample/migrations/0008_migrate_sample_status_to_unknown.py +23 -0
  405. fairdm-0.3.0/fairdm/core/sample/migrations/0009_alter_sample_name.py +18 -0
  406. fairdm-0.3.0/fairdm/core/sample/migrations/0010_alter_sampledescription_value.py +19 -0
  407. fairdm-0.3.0/fairdm/core/sample/migrations/0011_index_modified.py +23 -0
  408. fairdm-0.3.0/fairdm/core/sample/migrations/0012_located_samples.py +54 -0
  409. fairdm-0.3.0/fairdm/core/sample/migrations/__init__.py +0 -0
  410. fairdm-0.3.0/fairdm/core/sample/models.py +475 -0
  411. fairdm-0.3.0/fairdm/core/sample/plugins.py +339 -0
  412. fairdm-0.3.0/fairdm/core/sample/templates/cotton/sample/card.html +74 -0
  413. fairdm-0.3.0/fairdm/core/sample/templates/sample/sample_detail.html +33 -0
  414. fairdm-0.3.0/fairdm/core/sample/templates/sample/sample_overview.html +155 -0
  415. fairdm-0.3.0/fairdm/core/sample/templates/sample/sample_type_detail.html +7 -0
  416. fairdm-0.3.0/fairdm/core/sample/urls.py +13 -0
  417. fairdm-0.3.0/fairdm/core/urls.py +10 -0
  418. fairdm-0.3.0/fairdm/core/utils.py +232 -0
  419. fairdm-0.3.0/fairdm/core/vocabularies.py +77 -0
  420. fairdm-0.3.0/fairdm/db/__init__.py +1 -0
  421. fairdm-0.3.0/fairdm/db/fields.py +61 -0
  422. fairdm-0.3.0/fairdm/db/managers.py +1 -0
  423. fairdm-0.3.0/fairdm/db/models.py +148 -0
  424. fairdm-0.3.0/fairdm/factories/__init__.py +137 -0
  425. fairdm-0.3.0/fairdm/factories/contributors.py +199 -0
  426. fairdm-0.3.0/fairdm/factories/core.py +717 -0
  427. fairdm-0.3.0/fairdm/factories/utils.py +146 -0
  428. fairdm-0.3.0/fairdm/fixtures/django-waffle.json +35 -0
  429. fairdm-0.3.0/fairdm/forms/__init__.py +10 -0
  430. fairdm-0.3.0/fairdm/forms/base.py +227 -0
  431. fairdm-0.3.0/fairdm/forms/fields.py +195 -0
  432. fairdm-0.3.0/fairdm/management/__init__.py +1 -0
  433. fairdm-0.3.0/fairdm/management/commands/__init__.py +1 -0
  434. fairdm-0.3.0/fairdm/management/commands/cleanup_permissions.py +52 -0
  435. fairdm-0.3.0/fairdm/management/commands/create_dev_accounts.py +165 -0
  436. fairdm-0.3.0/fairdm/management/commands/generate_fake_data.py +522 -0
  437. fairdm-0.3.0/fairdm/management/commands/seed_licenses.py +98 -0
  438. fairdm-0.3.0/fairdm/management/commands/show_config.py +58 -0
  439. fairdm-0.3.0/fairdm/management/commands/upgrade_vocabularies.py +385 -0
  440. fairdm-0.3.0/fairdm/menus.py +137 -0
  441. fairdm-0.3.0/fairdm/migrations/0001_initial.py +67 -0
  442. fairdm-0.3.0/fairdm/migrations/0002_rename_taggeditem_table.py +36 -0
  443. fairdm-0.3.0/fairdm/migrations/__init__.py +0 -0
  444. fairdm-0.3.0/fairdm/models.py +14 -0
  445. fairdm-0.3.0/fairdm/permissions.py +55 -0
  446. fairdm-0.3.0/fairdm/plugins.py +6 -0
  447. fairdm-0.3.0/fairdm/portal_roles.py +231 -0
  448. fairdm-0.3.0/fairdm/registry/__init__.py +27 -0
  449. fairdm-0.3.0/fairdm/registry/config.py +641 -0
  450. fairdm-0.3.0/fairdm/registry/exceptions.py +176 -0
  451. fairdm-0.3.0/fairdm/registry/factories.py +1153 -0
  452. fairdm-0.3.0/fairdm/registry/registry.py +324 -0
  453. fairdm-0.3.0/fairdm/static/brand/fairdm.svg +1 -0
  454. fairdm-0.3.0/fairdm/static/brand/icon.png +0 -0
  455. fairdm-0.3.0/fairdm/static/brand/icon.svg +90 -0
  456. fairdm-0.3.0/fairdm/static/brand/icon_dark.svg +90 -0
  457. fairdm-0.3.0/fairdm/static/brand/logo.svg +1 -0
  458. fairdm-0.3.0/fairdm/static/brand/orcid_16x16.webp +0 -0
  459. fairdm-0.3.0/fairdm/static/css/fairdm.css +402 -0
  460. fairdm-0.3.0/fairdm/static/icons/user.svg +7 -0
  461. fairdm-0.3.0/fairdm/static/img/ORCID.png +0 -0
  462. fairdm-0.3.0/fairdm/static/img/brand/icon.svg +83 -0
  463. fairdm-0.3.0/fairdm/static/img/brand/logo.svg +1 -0
  464. fairdm-0.3.0/fairdm/static/js/chart-theme.js +68 -0
  465. fairdm-0.3.0/fairdm/templates/api/docs/api_description.md +3 -0
  466. fairdm-0.3.0/fairdm/templates/api/docs/dataset_list.md +11 -0
  467. fairdm-0.3.0/fairdm/templates/api/docs/project_list.md +11 -0
  468. fairdm-0.3.0/fairdm/templates/api/docs/sample_list.md +11 -0
  469. fairdm-0.3.0/fairdm/templates/base.html +55 -0
  470. fairdm-0.3.0/fairdm/templates/cards/compact.html +2 -0
  471. fairdm-0.3.0/fairdm/templates/cards/large.html +46 -0
  472. fairdm-0.3.0/fairdm/templates/client-side_cropping_widget.html +140 -0
  473. fairdm-0.3.0/fairdm/templates/cotton/actions/create_new.html +20 -0
  474. fairdm-0.3.0/fairdm/templates/cotton/actions/manage.html +21 -0
  475. fairdm-0.3.0/fairdm/templates/cotton/actions/pending.html +21 -0
  476. fairdm-0.3.0/fairdm/templates/cotton/card/citation.html +29 -0
  477. fairdm-0.3.0/fairdm/templates/cotton/card/descriptions.html +35 -0
  478. fairdm-0.3.0/fairdm/templates/cotton/card/details/entry.html +20 -0
  479. fairdm-0.3.0/fairdm/templates/cotton/card/details.html +55 -0
  480. fairdm-0.3.0/fairdm/templates/cotton/card/funding.html +41 -0
  481. fairdm-0.3.0/fairdm/templates/cotton/card/identifiers.html +46 -0
  482. fairdm-0.3.0/fairdm/templates/cotton/card/location.html +34 -0
  483. fairdm-0.3.0/fairdm/templates/cotton/card/people.html +44 -0
  484. fairdm-0.3.0/fairdm/templates/cotton/card/placeholder.html +20 -0
  485. fairdm-0.3.0/fairdm/templates/cotton/card/readiness.html +49 -0
  486. fairdm-0.3.0/fairdm/templates/cotton/card/timeline.html +45 -0
  487. fairdm-0.3.0/fairdm/templates/cotton/components/object_card.html +68 -0
  488. fairdm-0.3.0/fairdm/templates/cotton/date.html +10 -0
  489. fairdm-0.3.0/fairdm/templates/cotton/entrance/aside.html +25 -0
  490. fairdm-0.3.0/fairdm/templates/cotton/icons/orcid.html +4 -0
  491. fairdm-0.3.0/fairdm/templates/cotton/landing/about.html +45 -0
  492. fairdm-0.3.0/fairdm/templates/cotton/landing/api.html +29 -0
  493. fairdm-0.3.0/fairdm/templates/cotton/landing/community.html +42 -0
  494. fairdm-0.3.0/fairdm/templates/cotton/landing/datasets.html +19 -0
  495. fairdm-0.3.0/fairdm/templates/cotton/landing/footer.html +33 -0
  496. fairdm-0.3.0/fairdm/templates/cotton/landing/hero.html +41 -0
  497. fairdm-0.3.0/fairdm/templates/cotton/landing/join.html +25 -0
  498. fairdm-0.3.0/fairdm/templates/cotton/landing/projects.html +19 -0
  499. fairdm-0.3.0/fairdm/templates/cotton/landing/stats.html +11 -0
  500. fairdm-0.3.0/fairdm/templates/cotton/landing/type_list.html +32 -0
  501. fairdm-0.3.0/fairdm/templates/cotton/landing/types.html +24 -0
  502. fairdm-0.3.0/fairdm/templates/cotton/link.html +12 -0
  503. fairdm-0.3.0/fairdm/templates/cotton/list/index.html +18 -0
  504. fairdm-0.3.0/fairdm/templates/cotton/list/row.html +14 -0
  505. fairdm-0.3.0/fairdm/templates/cotton/missing.html +8 -0
  506. fairdm-0.3.0/fairdm/templates/cotton/nav/link.html +13 -0
  507. fairdm-0.3.0/fairdm/templates/cotton/progress.html +21 -0
  508. fairdm-0.3.0/fairdm/templates/cotton/stats/index.html +22 -0
  509. fairdm-0.3.0/fairdm/templates/cotton/stats/item.html +34 -0
  510. fairdm-0.3.0/fairdm/templates/cotton/tabs/index.html +22 -0
  511. fairdm-0.3.0/fairdm/templates/cotton/tabs/tab.html +20 -0
  512. fairdm-0.3.0/fairdm/templates/django_tomselect/render/option.html +57 -0
  513. fairdm-0.3.0/fairdm/templates/django_tomselect/tomselect.html +63 -0
  514. fairdm-0.3.0/fairdm/templates/editing/delete_record.html +38 -0
  515. fairdm-0.3.0/fairdm/templates/editing/rows.html +6 -0
  516. fairdm-0.3.0/fairdm/templates/fairdm/dashboard.html +1 -0
  517. fairdm-0.3.0/fairdm/templates/fairdm/landing.html +78 -0
  518. fairdm-0.3.0/fairdm/templates/fairdm/plugin.html +10 -0
  519. fairdm-0.3.0/fairdm/templates/forms/checkbox.html +85 -0
  520. fairdm-0.3.0/fairdm/templates/forms/fieldset.html +22 -0
  521. fairdm-0.3.0/fairdm/templates/forms/widgets/array_select2.html +5 -0
  522. fairdm-0.3.0/fairdm/templates/forms/widgets/quantity_field.html +31 -0
  523. fairdm-0.3.0/fairdm/templates/forms/widgets/sortable_contributor.html +82 -0
  524. fairdm-0.3.0/fairdm/templates/forms/widgets/sortable_contributor2.html +81 -0
  525. fairdm-0.3.0/fairdm/templates/forms/widgets/xpostgres_array_widget.html +24 -0
  526. fairdm-0.3.0/fairdm/templates/icons/activity.svg +3 -0
  527. fairdm-0.3.0/fairdm/templates/icons/dashboard.svg +3 -0
  528. fairdm-0.3.0/fairdm/templates/icons/facebook.svg +1 -0
  529. fairdm-0.3.0/fairdm/templates/icons/filetype-xml.svg +3 -0
  530. fairdm-0.3.0/fairdm/templates/icons/grid.svg +3 -0
  531. fairdm-0.3.0/fairdm/templates/icons/linkedin.svg +1 -0
  532. fairdm-0.3.0/fairdm/templates/icons/missing_image - Copy.svg +37 -0
  533. fairdm-0.3.0/fairdm/templates/icons/missing_image.svg +4 -0
  534. fairdm-0.3.0/fairdm/templates/icons/orcid/authenticated.svg +4 -0
  535. fairdm-0.3.0/fairdm/templates/icons/orcid/readme.md +3 -0
  536. fairdm-0.3.0/fairdm/templates/icons/orcid/unauthenticated.svg +5 -0
  537. fairdm-0.3.0/fairdm/templates/icons/orcid.svg +16 -0
  538. fairdm-0.3.0/fairdm/templates/icons/organization.svg +1 -0
  539. fairdm-0.3.0/fairdm/templates/icons/ror.svg +12 -0
  540. fairdm-0.3.0/fairdm/templates/icons/spinner.svg +1 -0
  541. fairdm-0.3.0/fairdm/templates/icons/user.svg +7 -0
  542. fairdm-0.3.0/fairdm/templates/icons/whatsapp.svg +1 -0
  543. fairdm-0.3.0/fairdm/templates/icons/x_twitter.svg +1 -0
  544. fairdm-0.3.0/fairdm/templates/layouts/base.html +12 -0
  545. fairdm-0.3.0/fairdm/templates/location/widgets/location.html +54 -0
  546. fairdm-0.3.0/fairdm/templates/mvp_accounts/entrance/base.html +34 -0
  547. fairdm-0.3.0/fairdm/templates/overview/includes/map_library.html +30 -0
  548. fairdm-0.3.0/fairdm/templates/overview/includes/type_badge.html +48 -0
  549. fairdm-0.3.0/fairdm/templates/overview/page.html +196 -0
  550. fairdm-0.3.0/fairdm/templates/pages/api/tos.html +71 -0
  551. fairdm-0.3.0/fairdm/templates/pages/spectacular.html +26 -0
  552. fairdm-0.3.0/fairdm/templates/research_vocabs/base.html +42 -0
  553. fairdm-0.3.0/fairdm/templatetags/__init__.py +1 -0
  554. fairdm-0.3.0/fairdm/templatetags/fairdm.py +327 -0
  555. fairdm-0.3.0/fairdm/utils/__init__.py +90 -0
  556. fairdm-0.3.0/fairdm/utils/choices.py +232 -0
  557. fairdm-0.3.0/fairdm/utils/context_processors.py +62 -0
  558. fairdm-0.3.0/fairdm/utils/inspection.py +535 -0
  559. fairdm-0.3.0/fairdm/utils/location/__init__.py +1 -0
  560. fairdm-0.3.0/fairdm/utils/location/coverage.py +78 -0
  561. fairdm-0.3.0/fairdm/utils/location/db.py +53 -0
  562. fairdm-0.3.0/fairdm/utils/location/forms.py +200 -0
  563. fairdm-0.3.0/fairdm/utils/location/managers.py +139 -0
  564. fairdm-0.3.0/fairdm/utils/location/resources.py +190 -0
  565. fairdm-0.3.0/fairdm/utils/markdown.py +32 -0
  566. fairdm-0.3.0/fairdm/utils/models.py +18 -0
  567. fairdm-0.3.0/fairdm/utils/permissions.py +49 -0
  568. fairdm-0.3.0/fairdm/utils/utils.py +233 -0
  569. fairdm-0.3.0/fairdm/views/__init__.py +21 -0
  570. fairdm-0.3.0/fairdm/views/base.py +322 -0
  571. fairdm-0.3.0/fairdm/views/generic.py +239 -0
  572. fairdm-0.3.0/fairdm/views/mixins.py +66 -0
  573. fairdm-0.3.0/pyproject.toml +380 -0
@@ -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
+ [![Tests](https://github.com/FAIR-DM/fairdm/actions/workflows/tests.yml/badge.svg)](https://github.com/FAIR-DM/fairdm/actions/workflows/tests.yml)
94
+ [![Build](https://github.com/FAIR-DM/fairdm/actions/workflows/build.yml/badge.svg)](https://github.com/FAIR-DM/fairdm/actions/workflows/build.yml)
95
+ [![Publish](https://github.com/FAIR-DM/fairdm/actions/workflows/publish.yml/badge.svg)](https://github.com/FAIR-DM/fairdm/actions/workflows/publish.yml)
96
+ [![Documentation](https://readthedocs.org/projects/fairdm/badge/?version=latest)](https://fairdm.readthedocs.io/en/latest/)
97
+ [![Coverage](https://codecov.io/gh/FAIR-DM/fairdm/branch/main/graph/badge.svg?token=0Q18CLIKZE)](https://codecov.io/gh/FAIR-DM/fairdm)
98
+ [![PyPI](https://img.shields.io/pypi/v/fairdm)](https://pypi.org/project/fairdm/)
99
+ [![Development status](https://img.shields.io/pypi/status/fairdm)](https://pypi.org/project/fairdm/)
100
+ [![Python](https://img.shields.io/pypi/pyversions/fairdm)](https://pypi.org/project/fairdm/)
101
+ [![Django](https://img.shields.io/pypi/djversions/fairdm)](https://pypi.org/project/fairdm/)
102
+ [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
103
+ [![Licence](https://img.shields.io/github/license/FAIR-DM/fairdm)](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