From 7ddce2dd5234033ccbfb7732e81cbee2220bdddc Mon Sep 17 00:00:00 2001 From: Todd Dembrey <todd.dembrey@torchbox.com> Date: Fri, 5 Apr 2019 14:36:18 +0100 Subject: [PATCH] Refactor the location of the api into its own app --- opentech/{ => apply}/api/__init__.py | 0 opentech/apply/api/urls.py | 10 +++++++ opentech/apply/api/v1/__init__.py | 0 opentech/{api => apply/api/v1}/pagination.py | 0 .../apply/{funds => api/v1}/permissions.py | 0 .../apply/{funds => api/v1}/serializers.py | 3 +- opentech/apply/api/v1/urls.py | 29 +++++++++++++++++++ .../{funds/api_views.py => api/v1/views.py} | 7 +++-- opentech/apply/funds/urls.py | 1 - opentech/apply/urls.py | 2 ++ opentech/static_src/src/app/src/api/notes.js | 6 ++-- opentech/static_src/src/app/src/api/rounds.js | 4 +-- .../static_src/src/app/src/api/submissions.js | 8 ++--- opentech/static_src/src/app/src/api/utils.js | 2 +- .../static_src/src/app/webpack.dev.config.js | 2 +- 15 files changed, 59 insertions(+), 15 deletions(-) rename opentech/{ => apply}/api/__init__.py (100%) create mode 100644 opentech/apply/api/urls.py create mode 100644 opentech/apply/api/v1/__init__.py rename opentech/{api => apply/api/v1}/pagination.py (100%) rename opentech/apply/{funds => api/v1}/permissions.py (100%) rename opentech/apply/{funds => api/v1}/serializers.py (98%) create mode 100644 opentech/apply/api/v1/urls.py rename opentech/apply/{funds/api_views.py => api/v1/views.py} (97%) 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 000000000..52f7c206e --- /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 000000000..e69de29bb 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 cd828247a..bc2f7e1e0 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 000000000..d1996f19c --- /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 75d31ef1c..5bcf532da 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 82e31476a..d23951716 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 6138117fa..9b1c25c11 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 7dd077494..7f6de3c32 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 c7ef0a75b..c0520203a 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 88fdd2758..efbf81653 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 29e4a3ef5..703bf2d5b 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 f86535ada..3aac5c995 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', }), ]) -- GitLab