Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
93 changes: 59 additions & 34 deletions backend/elixir/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# patterns is no longer supported, to achieve the same effect use re_path
from django.urls import re_path
from django.urls import re_path # patterns
from django.conf.urls.static import static
from django.views.static import serve
from django.conf import settings
Expand All @@ -9,35 +8,63 @@
from elixir import edit_permissions

urlpatterns = [
re_path(r'^user-list/?$', views.UserList.as_view()),
re_path(r'^edit-permissions/?$', edit_permissions.EditPermissions.as_view()),
re_path(r'^edit-permissions/(?P<pk>[0-9]+)/?$', edit_permissions.EditPermissions.as_view()),
re_path(r'^t(ool)?/?$', views.ResourceList.as_view()),
re_path(r'^t(ool)?/validate/?$', views.ResourceCreateValidator.as_view()),
re_path(r'^t(ool)?/(biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/?$', views.ResourceDetail.as_view()),
re_path(r'^t(ool)?/(biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/validate/?$', views.ResourceUpdateValidator.as_view()),
# url(r'^t(ool)?/(biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/i(ssues)?/(?P<issueId>[a-zA-Z0-9.~_-]+)?$', views.IssueView.as_view()),
re_path(r'^t(ool)?/(biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/disown/?$', views.DisownResourceView.as_view()),
re_path(r'^f(unction)?/?$', views.FunctionList.as_view()),
re_path(r'^o(ntology)?/(?P<name>[a-zA-Z0-9.~_-]+)/?$', views.OntologyDetail.as_view()),
re_path(r'^used-terms/(?P<ontology>[a-zA-Z0-9.~_-]+)/?$', views.UsedTermsList.as_view()),
re_path(r'^stats/?$', views.Stats.as_view()),
re_path(r'^stats/total-entries/?$', views.TotalEntriesStats.as_view()),
re_path(r'^stats/annotation-count/?$', views.AnnotationCountStats.as_view()),
re_path(r'^stats/users/?$', views.UserStats.as_view()),
re_path(r'^env/?$', views.Environment.as_view()),
re_path(r'^sitemap.xml$', sitemap.Sitemap.as_view()),
re_path(r'^d(omain)?/?$', views.DomainView.as_view()),
re_path(r'^d(omain)?/(?P<domain>[a-zA-Z0-9.~_-]+)/?$', views.DomainResourceView.as_view()),
re_path(r'^request/?$', views.ResourceRequestView.as_view()),
re_path(r'^request/conclude/?$', views.ProcessResourceRequest.as_view()),
re_path(r'^tool-list/?$', views.ToolList.as_view()),
re_path(r'^w/?$', views.WorkflowView.as_view()),
re_path(r'^w/(?P<id>[a-zA-Z0-9.~_-]+)/?$', views.WorkflowDetailView.as_view()),
re_path(r'^(biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/?$', views.ResourceDetail.as_view()),
re_path(r'^(biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/validate/?$', views.ResourceUpdateValidator.as_view()),
# url(r'^(biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/i(ssues)?/(?P<issueId>[a-zA-Z0-9.~_-]+)?$', views.IssueView.as_view()),
re_path(r'^(biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/disown/?$', views.DisownResourceView.as_view()),
re_path(r"^user-list/?$", views.UserList.as_view()),
re_path(r"^edit-permissions/?$", edit_permissions.EditPermissions.as_view()),
re_path(
r"^edit-permissions/(?P<pk>[0-9]+)/?$",
edit_permissions.EditPermissions.as_view(),
),
re_path(r"^t(?:ool)?/?$", views.ResourceList.as_view()),
re_path(r"^t(?:ool)?/validate/?$", views.ResourceCreateValidator.as_view()),
re_path(
r"^t(?:ool)?/(?:biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/?$",
views.ResourceDetail.as_view(),
),
re_path(
r"^t(?:ool)?/(?:biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/validate/?$",
views.ResourceUpdateValidator.as_view(),
),
# url(r'^t(?:ool)?/(?:biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/i(?:ssues)?/(?P<issueId>[a-zA-Z0-9.~_-]+)?$', views.IssueView.as_view()),
re_path(
r"^t(?:ool)?/(?:biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/disown/?$",
views.DisownResourceView.as_view(),
),
re_path(r"^f(?:unction)?/?$", views.FunctionList.as_view()),
re_path(
r"^o(?:ntology)?/(?P<name>[a-zA-Z0-9.~_-]+)/?$", views.OntologyDetail.as_view()
),
re_path(
r"^used-terms/(?P<ontology>[a-zA-Z0-9.~_-]+)/?$", views.UsedTermsList.as_view()
),
re_path(r"^stats/?$", views.Stats.as_view()),
re_path(r"^stats/total-entries/?$", views.TotalEntriesStats.as_view()),
re_path(r"^stats/annotation-count/?$", views.AnnotationCountStats.as_view()),
re_path(r"^stats/users/?$", views.UserStats.as_view()),
re_path(r"^env/?$", views.Environment.as_view()),
re_path(r"^sitemap.xml$", sitemap.Sitemap.as_view()),
re_path(r"^d(?:omain)?/?$", views.DomainView.as_view()),
re_path(
r"^d(?:omain)?/(?P<domain>[a-zA-Z0-9.~_-]+)/?$",
views.DomainResourceView.as_view(),
),
re_path(r"^request/?$", views.ResourceRequestView.as_view()),
re_path(r"^request/conclude/?$", views.ProcessResourceRequest.as_view()),
re_path(r"^tool-list/?$", views.ToolList.as_view()),
re_path(r"^w/?$", views.WorkflowView.as_view()),
re_path(r"^w/(?P<id>[a-zA-Z0-9.~_-]+)/?$", views.WorkflowDetailView.as_view()),
re_path(
r"^(?:biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/?$",
views.ResourceDetail.as_view(),
),
re_path(
r"^(?:biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/validate/?$",
views.ResourceUpdateValidator.as_view(),
),
# url(r'^(?:biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/i(?:ssues)?/(?P<issueId>[a-zA-Z0-9.~_-]+)?$', views.IssueView.as_view()),
re_path(
r"^(?:biotools\:)?(?P<biotoolsID>[a-zA-Z0-9.~_-]+)/disown/?$",
views.DisownResourceView.as_view(),
),
]

urlpatterns = format_suffix_patterns(urlpatterns)
Expand All @@ -48,7 +75,5 @@


urlpatterns += [
re_path(r'^media/(?P<path>.*)$', serve, {
'document_root': settings.MEDIA_ROOT
})
]
re_path(r"^media/(?P<path>.*)$", serve, {"document_root": settings.MEDIA_ROOT})
]
17 changes: 14 additions & 3 deletions backend/elixirapp/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ def getenv(key, default=None, castf=str, ns=ENV_NAMESPACE):
'django_extensions',
'rest_framework_simplejwt',
'background_task',
'corsheaders'
'corsheaders',
'drf_spectacular',
)


Expand Down Expand Up @@ -202,7 +203,17 @@ def getenv(key, default=None, castf=str, ns=ENV_NAMESPACE):
),
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': getenv('PAGE_SIZE', 50, castf=int),
'NON_FIELD_ERRORS_KEY': 'general_errors'
'NON_FIELD_ERRORS_KEY': 'general_errors',
'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
}

# Spectacular settings for API docs
SPECTACULAR_SETTINGS = {
'TITLE': 'bio.tools API',
'DESCRIPTION': 'bio.tools is a registry of software tools and databases for life sciences',
'VERSION': '1.0.0',
'SCHEMA_PATH_PREFIX': '/api',
'SWAGGER_UI_FAVICON_HREF': '/img/favicon.ico',
}

# REST Auth
Expand Down Expand Up @@ -242,7 +253,7 @@ def getenv(key, default=None, castf=str, ns=ENV_NAMESPACE):

DEPLOYMENT = getenv('DEPLOYMENT', 'dev')

RESERVED_URL_KEYWORDS = ['t', 'tool', 'user-list', 'edit-permissions', 'validate', 'f', 'function', 'o', 'ontology', 'used-terms', 'stats', 'env', 'sitemap.xml', 'd', 'domain', 'request', 'tool-list', 'w', 'register', 'edit-subdomain', 'subdomain', 'login', 'signup', 'reset-password', 'profile', 'requests', 'workflows', '404', 'documentation', 'about', 'schema', 'governance', 'roadmap', 'events', 'mail', 'faq', 'apidoc', 'changelog', 'helpdesk', 'projects']
RESERVED_URL_KEYWORDS = ['t', 'tool', 'user-list', 'edit-permissions', 'validate', 'f', 'function', 'o', 'ontology', 'used-terms', 'stats', 'env', 'sitemap.xml', 'd', 'domain', 'request', 'tool-list', 'w', 'register', 'edit-subdomain', 'subdomain', 'login', 'signup', 'reset-password', 'profile', 'requests', 'workflows', '404', 'documentation', 'about', 'schema', 'governance', 'roadmap', 'events', 'mail', 'faq', 'apidoc', 'changelog', 'helpdesk', 'projects', 'redoc']


# Settings for Github Ecosystem
Expand Down
81 changes: 51 additions & 30 deletions backend/elixirapp/urls.py
Original file line number Diff line number Diff line change
@@ -1,45 +1,66 @@
"""elixirapp URL Configuration

The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.8/topics/http/urls/
https://docs.djangoproject.com/en/1.8/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
1. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""

from dj_rest_auth.views import PasswordResetView, PasswordResetConfirmView
from dj_rest_auth.registration.views import SocialAccountListView, SocialAccountDisconnectView
from dj_rest_auth.registration.views import (
SocialAccountListView,
SocialAccountDisconnectView,
)
from django.contrib import admin
from django.urls import include, path, re_path
from elixir import views
from drf_spectacular.views import (
SpectacularAPIView,
SpectacularSwaggerView,
)

urlpatterns = [
re_path(r'^admin/', admin.site.urls),
# url(r'^', include('django.contrib.auth.urls')),
# url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
# url(r'^api-token-auth/', 'rest_framework_jwt.views.obtain_jwt_token'),
path('rest-auth/', include('dj_rest_auth.urls')),
path('rest-auth/registration/',
include('dj_rest_auth.registration.urls')),
# Password reset
path('rest-auth/password/reset/',
PasswordResetView.as_view(),
name='rest_password_reset'
),
path('rest-auth/password/reset/confirm/<uidb64>/<token>/',
PasswordResetConfirmView.as_view(),
name='password_reset_confirm'),
path('accounts/', include('allauth.urls')),
path('', include('elixir.urls')),

# Social auth
path('rest-auth/orcid/', views.OrcidLogin.as_view(), name='orcid_login'),
path('rest-auth/orcid/connect/', views.OrcidConnect.as_view(), name='orcid_connect'),
path('rest-auth/socialaccounts/', SocialAccountListView.as_view(), name='social_account_list'),
path('rest-auth/socialaccounts/<int:pk>/disconnect/', SocialAccountDisconnectView.as_view(), name='social_account_disconnect'),
re_path(r"^admin/", admin.site.urls),
path("rest-auth/", include("dj_rest_auth.urls")),
path("rest-auth/registration/", include("dj_rest_auth.registration.urls")),
# Password reset
path(
"rest-auth/password/reset/",
PasswordResetView.as_view(),
name="rest_password_reset",
),
path(
"rest-auth/password/reset/confirm/<uidb64>/<token>/",
PasswordResetConfirmView.as_view(),
name="password_reset_confirm",
),
path("accounts/", include("allauth.urls")),
path("schema/", SpectacularAPIView.as_view(), name="schema"),
path("", include("elixir.urls")),
# Swagger for /api
re_path(
r"^$", SpectacularSwaggerView.as_view(url_name="schema"), name="swagger-ui"
),
# Social auth
path("rest-auth/orcid/", views.OrcidLogin.as_view(), name="orcid_login"),
path(
"rest-auth/orcid/connect/", views.OrcidConnect.as_view(), name="orcid_connect"
),
path(
"rest-auth/socialaccounts/",
SocialAccountListView.as_view(),
name="social_account_list",
),
path(
"rest-auth/socialaccounts/<int:pk>/disconnect/",
SocialAccountDisconnectView.as_view(),
name="social_account_disconnect",
),
]
2 changes: 1 addition & 1 deletion backend/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ djangorestframework-xml==2.0.0
djangorestframework-yaml==2.0.0
djangorestframework-simplejwt==5.4.0
dj-rest-auth==7.0.1
drf-spectacular==0.29.0
elasticsearch==7.12.1
jsonfield==3.1.0
lxml==5.3.0
Expand All @@ -29,4 +30,3 @@ rstr==3.2.2
six==1.17.0
tzdata==2025.2
urllib3==1.26.20