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