diff --git a/opentech/api/__init__.py b/opentech/apply/api/__init__.py similarity index 100% rename from opentech/api/__init__.py rename to opentech/apply/api/__init__.py diff --git a/opentech/apply/api/urls.py b/opentech/apply/api/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..52f7c206e9b288a4582041c19bdfac655c795555 --- /dev/null +++ b/opentech/apply/api/urls.py @@ -0,0 +1,10 @@ +from django.urls import include, path + +from .v1 import urls as v1_urls + +app_name = 'api' + + +urlpatterns = [ + path('v1/', include(v1_urls)), +] diff --git a/opentech/apply/api/v1/__init__.py b/opentech/apply/api/v1/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/opentech/api/pagination.py b/opentech/apply/api/v1/pagination.py similarity index 100% rename from opentech/api/pagination.py rename to opentech/apply/api/v1/pagination.py diff --git a/opentech/apply/funds/permissions.py b/opentech/apply/api/v1/permissions.py similarity index 100% rename from opentech/apply/funds/permissions.py rename to opentech/apply/api/v1/permissions.py diff --git a/opentech/apply/funds/serializers.py b/opentech/apply/api/v1/serializers.py similarity index 98% rename from opentech/apply/funds/serializers.py rename to opentech/apply/api/v1/serializers.py index cd828247a3e32144b6a4d6066e2f76d7de0b8b80..bc2f7e1e0b24fd57cfdc3315fe19c88d9d1e7377 100644 --- a/opentech/apply/funds/serializers.py +++ b/opentech/apply/api/v1/serializers.py @@ -7,6 +7,7 @@ from rest_framework import serializers from opentech.apply.activity.models import Activity from opentech.apply.determinations.views import DeterminationCreateOrUpdateView +from opentech.apply.funds.models import ApplicationSubmission, RoundsAndLabs from opentech.apply.review.models import Review, ReviewOpinion from opentech.apply.review.options import RECOMMENDATION_CHOICES from opentech.apply.users.groups import PARTNER_GROUP_NAME, STAFF_GROUP_NAME @@ -112,7 +113,7 @@ class TimestampField(serializers.Field): class SubmissionListSerializer(serializers.ModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='funds:api:submissions:detail') + url = serializers.HyperlinkedIdentityField(view_name='api:v1:submissions:detail') round = serializers.SerializerMethodField() last_update = TimestampField() diff --git a/opentech/apply/api/v1/urls.py b/opentech/apply/api/v1/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..d1996f19ca456d1dcb84d2a3b6f1b2a438bb03d3 --- /dev/null +++ b/opentech/apply/api/v1/urls.py @@ -0,0 +1,29 @@ +from django.urls import include, path + +from .views import ( + CommentList, + CommentListCreate, + RoundLabDetail, + RoundLabList, + SubmissionAction, + SubmissionList, + SubmissionDetail, +) + +app_name = 'v1' + +urlpatterns = [ + path('submissions/', include(([ + path('', SubmissionList.as_view(), name='list'), + path('<int:pk>/', SubmissionDetail.as_view(), name='detail'), + path('<int:pk>/actions/', SubmissionAction.as_view(), name='actions'), + path('<int:pk>/comments/', CommentListCreate.as_view(), name='comments'), + ], 'submissions'))), + path('rounds/', include(([ + path('', RoundLabList.as_view(), name='list'), + path('<int:pk>/', RoundLabDetail.as_view(), name='detail'), + ], 'rounds'))), + path('comments/', include(([ + path('', CommentList.as_view(), name='list'), + ], 'comments'))) +] diff --git a/opentech/apply/funds/api_views.py b/opentech/apply/api/v1/views.py similarity index 97% rename from opentech/apply/funds/api_views.py rename to opentech/apply/api/v1/views.py index 75d31ef1c336ecf530bb79fc760384b152b22ec1..5bcf532dab1dab76e49693d68591cd530a51e9f8 100644 --- a/opentech/apply/funds/api_views.py +++ b/opentech/apply/api/v1/views.py @@ -12,14 +12,17 @@ from rest_framework.exceptions import (NotFound, PermissionDenied, from rest_framework_api_key.permissions import HasAPIKey from django_filters import rest_framework as filters -from opentech.api.pagination import StandardResultsSetPagination +from opentech.apply.funds.models import ApplicationSubmission, RoundsAndLabs +from opentech.apply.funds.workflow import PHASES + from opentech.apply.activity.models import Activity, COMMENT from opentech.apply.activity.messaging import messenger, MESSAGES from opentech.apply.determinations.views import DeterminationCreateOrUpdateView from opentech.apply.review.models import Review from opentech.apply.funds.models import FundType, LabType -from .models import ApplicationSubmission, RoundsAndLabs +from .pagination import StandardResultsSetPagination +from .permissions import IsApplyStaffUser from .serializers import ( CommentSerializer, CommentCreateSerializer, diff --git a/opentech/apply/funds/urls.py b/opentech/apply/funds/urls.py index 82e31476aa4bf6312cac9d9bac97da4ca8f6cd57..d23951716fdde872d409577af00fc19be8c41292 100644 --- a/opentech/apply/funds/urls.py +++ b/opentech/apply/funds/urls.py @@ -95,5 +95,4 @@ urlpatterns = [ path('submissions/', include(submission_urls)), path('rounds/', include(rounds_urls)), path('projects/', include(projects_urls)), - path('api/', include(api_urls)), ] diff --git a/opentech/apply/urls.py b/opentech/apply/urls.py index 6138117fab04d25e24a59884ba270f81a3b7f2ec..9b1c25c11b2acbc2718da9fff12caa1c3e0ab3f4 100644 --- a/opentech/apply/urls.py +++ b/opentech/apply/urls.py @@ -6,6 +6,7 @@ from two_factor.urls import urlpatterns as tf_urls from .utils import views from .users import urls as users_urls from .dashboard import urls as dashboard_urls +from .api import urls as api_urls from opentech.urls import base_urlpatterns @@ -14,6 +15,7 @@ urlpatterns = [ path('apply/', include('opentech.apply.funds.urls', 'apply')), path('activity/', include('opentech.apply.activity.urls', 'activity')), path('', include(users_urls)), + path('api/', include(api_urls)), path('dashboard/', include(dashboard_urls)), path('hijack/', include('hijack.urls', 'hijack')), path('', include(tf_urls, 'two_factor')), diff --git a/opentech/static_src/src/app/src/api/notes.js b/opentech/static_src/src/app/src/api/notes.js index 7dd077494a5c963a905e0663fe5dae565215d041..7f6de3c328255015a6c149bbbcdf36a850a02c7c 100644 --- a/opentech/static_src/src/app/src/api/notes.js +++ b/opentech/static_src/src/app/src/api/notes.js @@ -1,6 +1,6 @@ export function fetchNotesForSubmission(submissionID, visibility = 'team') { return { - path: `/apply/api/submissions/${submissionID}/comments/`, + path: `/v1/submissions/${submissionID}/comments/`, params: { visibility, page_size: 1000, @@ -11,7 +11,7 @@ export function fetchNotesForSubmission(submissionID, visibility = 'team') { export function fetchNewNotesForSubmission(submissionID, latestID, visibility = 'team') { return { - path: `/apply/api/submissions/${submissionID}/comments/`, + path: `/v1/submissions/${submissionID}/comments/`, params: { visibility, newer: latestID, @@ -23,7 +23,7 @@ export function fetchNewNotesForSubmission(submissionID, latestID, visibility = export function createNoteForSubmission(submissionID, note) { return { - path: `/apply/api/submissions/${submissionID}/comments/`, + path: `/v1/submissions/${submissionID}/comments/`, method: 'POST', options: { body: note, diff --git a/opentech/static_src/src/app/src/api/rounds.js b/opentech/static_src/src/app/src/api/rounds.js index c7ef0a75be9a4e641419fa1e2227d6fe8e55464b..c0520203ac1884994ffa09206a9f2109d2c0c4c7 100644 --- a/opentech/static_src/src/app/src/api/rounds.js +++ b/opentech/static_src/src/app/src/api/rounds.js @@ -1,12 +1,12 @@ export function fetchRound(id) { return { - path:`/apply/api/rounds/${id}/`, + path:`/v1/rounds/${id}/`, }; } export function fetchRounds() { return { - path:`/apply/api/rounds/`, + path:`/v1/rounds/`, params: { page_size: 1000, }, diff --git a/opentech/static_src/src/app/src/api/submissions.js b/opentech/static_src/src/app/src/api/submissions.js index 88fdd2758424b915fee9b5c76d38607574030fef..efbf81653c9673092715bb7fc9cd9f4773069f50 100644 --- a/opentech/static_src/src/app/src/api/submissions.js +++ b/opentech/static_src/src/app/src/api/submissions.js @@ -1,6 +1,6 @@ export function fetchSubmissionsByRound(id) { return { - path:'/apply/api/submissions/', + path:'/v1/submissions/', params: { round: id, page_size: 1000, @@ -10,7 +10,7 @@ export function fetchSubmissionsByRound(id) { export function fetchSubmission(id) { return { - path: `/apply/api/submissions/${id}/`, + path: `/v1/submissions/${id}/`, }; } @@ -20,14 +20,14 @@ export function fetchSubmissionsByStatuses(statuses) { statuses.forEach(v => params.append('status', v)); return { - path:'/apply/api/submissions/', + path:'/v1/submissions/', params, }; } export function executeSubmissionAction(submissionID, action) { return { - path: `/apply/api/submissions/${submissionID}/actions/`, + path: `/v1/submissions/${submissionID}/actions/`, method: 'POST', options: { body: { diff --git a/opentech/static_src/src/app/src/api/utils.js b/opentech/static_src/src/app/src/api/utils.js index 29e4a3ef537aaa4054ba4738a0eb1fb989c288a8..703bf2d5b7f31f2fa8a54178f88165fe2bcefdd9 100644 --- a/opentech/static_src/src/app/src/api/utils.js +++ b/opentech/static_src/src/app/src/api/utils.js @@ -6,7 +6,7 @@ const getBaseUrl = () => { export function apiFetch({path, method = 'GET', params = new URLSearchParams, options = {}}) { const url = new URL(getBaseUrl()); - url.pathname = path; + url.pathname = url.pathname + path; for (const [paramKey, paramValue] of getIteratorForParams(params)) { url.searchParams.append(paramKey, paramValue); diff --git a/opentech/static_src/src/app/webpack.dev.config.js b/opentech/static_src/src/app/webpack.dev.config.js index f86535ada9080507d6fed9941b029213df88656b..3aac5c995417b371daa9ed33c41ba549060f128c 100644 --- a/opentech/static_src/src/app/webpack.dev.config.js +++ b/opentech/static_src/src/app/webpack.dev.config.js @@ -15,7 +15,7 @@ devConfig.plugins = devConfig.plugins.concat([ new webpack.NoEmitOnErrorsPlugin(), new BundleTracker({filename: './opentech/static_compiled/app/webpack-stats.json'}), new webpack.EnvironmentPlugin({ - API_BASE_URL: 'http://apply.localhost:8000/', + API_BASE_URL: 'http://apply.localhost:8000/api', }), ])