diff --git a/apimanager/apicollections/__init__.py b/apimanager/apicollections/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/apimanager/apicollections/apps.py b/apimanager/apicollections/apps.py
new file mode 100644
index 0000000..c4ab07c
--- /dev/null
+++ b/apimanager/apicollections/apps.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+"""
+App config for config app
+"""
+
+from django.apps import AppConfig
+
+class ApiCollectionsConfig(AppConfig):
+ """Config for apicollections"""
+ name = 'apicollections'
diff --git a/apimanager/apicollections/forms.py b/apimanager/apicollections/forms.py
new file mode 100644
index 0000000..2f77fb2
--- /dev/null
+++ b/apimanager/apicollections/forms.py
@@ -0,0 +1,13 @@
+from django import forms
+
+
+class ApiCollectionsForm(forms.Form):
+ api_collections_body = forms.CharField(
+ label='API Collections Body',
+ widget=forms.Textarea(
+ attrs={
+ 'class': 'form-control',
+ }
+ ),
+ required=False
+ )
\ No newline at end of file
diff --git a/apimanager/apicollections/static/apicollections/js/apicollections.js b/apimanager/apicollections/static/apicollections/js/apicollections.js
new file mode 100644
index 0000000..6a1f8f8
--- /dev/null
+++ b/apimanager/apicollections/static/apicollections/js/apicollections.js
@@ -0,0 +1,30 @@
+$(document).ready(function($) {
+ $('.runner button.forSave').click(function(e) {
+ e.preventDefault();
+ var t = $(this);
+ var runner = t.parent().parent().parent();
+ var api_collection_body = $(runner).find('.api-collection-body').val();
+
+ $('.runner button.forSave').attr("disabled","disabled");
+ $('.runner button.forDelete').attr("disabled","disabled");
+ $.post('save/apicollection', {
+ 'api-collection-body': api_collection_body,
+ }, function (response) {
+ location.reload();
+ });
+ });
+
+ $('.runner button.forDelete').click(function(e) {
+ e.preventDefault();
+ var t = $(this);
+ var runner = t.parent().parent().parent();
+ var api_collection_id = $(runner).find('.api_collection_id').html();
+ $('.runner button.forSave').attr("disabled","disabled");
+ $('.runner button.forDelete').attr("disabled","disabled");
+ $.post('delete/apicollection', {
+ 'api_collection_id': api_collection_id
+ }, function (response) {
+ location.reload();
+ });
+ });
+});
diff --git a/apimanager/apicollections/templates/apicollections/index.html b/apimanager/apicollections/templates/apicollections/index.html
new file mode 100644
index 0000000..8bc020a
--- /dev/null
+++ b/apimanager/apicollections/templates/apicollections/index.html
@@ -0,0 +1,60 @@
+{% extends 'base.html' %}
+{% load static %}
+{% block page_title %}{{ block.super }} / API Collections{% endblock page_title %}
+
+{% block content %}
+
API Collections
+
+
+
+
+
+
+
+
+
+
+
+
+{% endblock %}
+
+
+{% block extrajs %}
+
+{% endblock extrajs %}
diff --git a/apimanager/apicollections/urls.py b/apimanager/apicollections/urls.py
new file mode 100644
index 0000000..afb0f13
--- /dev/null
+++ b/apimanager/apicollections/urls.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+"""
+URLs for config app
+"""
+
+from django.conf.urls import url
+
+from apicollections.views import IndexView, apicollections_save, apicollections_delete
+
+urlpatterns = [
+ url(r'^$',
+ IndexView.as_view(),
+ name='apicollections-index'),
+ url(r'save/apicollection', apicollections_save,
+ name='apicollection-save'),
+ url(r'delete/apicollection', apicollections_delete,
+ name='apicollection-delete')
+]
diff --git a/apimanager/apicollections/views.py b/apimanager/apicollections/views.py
new file mode 100644
index 0000000..8236093
--- /dev/null
+++ b/apimanager/apicollections/views.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+"""
+Views of config app
+"""
+
+import json
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.views.generic import FormView
+from obp.api import API, APIError
+from base.utils import exception_handle, error_once_only
+from .forms import ApiCollectionsForm
+from django.urls import reverse_lazy
+from django.views.decorators.csrf import csrf_exempt
+
+
+class IndexView(LoginRequiredMixin, FormView):
+ """Index view for config"""
+ template_name = "apicollections/index.html"
+ form_class = ApiCollectionsForm
+ success_url = reverse_lazy('apicollections-index')
+
+ def get_context_data(self, **kwargs):
+ context = super(IndexView, self).get_context_data(**kwargs)
+ api = API(self.request.session.get('obp'))
+ urlpath = '/my/api-collections'
+ api_collections =[]
+ try:
+ response = api.get(urlpath)
+ if 'code' in response and response['code'] >= 400:
+ error_once_only(self.request, response['message'])
+ else:
+ api_collections=response['api_collections']
+ except APIError as err:
+ error_once_only(self.request, Exception("OBP-API server is not running or do not response properly. "
+ "Please check OBP-API server. "
+ "Details: " + str(err)))
+ except BaseException as err:
+ error_once_only(self.request, (Exception("Unknown Error. Details:" + str(err))))
+ else:
+ # set the default endpoint there, the first item will be the new endpoint.
+ default_api_endpoint = {
+ "api_collection_name": "Testing",
+ "is_sharable": True,
+ "description":"This is for testing"
+ }
+ api_collections.insert(0,json.dumps(default_api_endpoint))
+
+ context.update({
+ 'api_collections': api_collections
+ })
+ return context
+
+@exception_handle
+@csrf_exempt
+def apicollections_save(request):
+ api_collection_body = request.POST.get('api-collection-body')
+ api = API(request.session.get('obp'))
+ urlpath = '/my/api-collections'
+ result = api.post(urlpath, payload =json.loads( api_collection_body))
+ return result
+
+
+@exception_handle
+@csrf_exempt
+def apicollections_delete(request):
+ api_collection_id = request.POST.get('api_collection_id')
+
+ api = API(request.session.get('obp'))
+ urlpath = '/my/api-collections/{}'.format(api_collection_id)
+ result = api.delete(urlpath)
+ return result
diff --git a/apimanager/apimanager/settings.py b/apimanager/apimanager/settings.py
index 632903d..abdcb1e 100644
--- a/apimanager/apimanager/settings.py
+++ b/apimanager/apimanager/settings.py
@@ -58,7 +58,8 @@ INSTALLED_APPS = [
'config',
'webui',
'methodrouting',
- 'dynamicendpoints'
+ 'dynamicendpoints',
+ 'apicollections'
]
MIDDLEWARE = [
diff --git a/apimanager/apimanager/urls.py b/apimanager/apimanager/urls.py
index 01e4db3..3fba52b 100644
--- a/apimanager/apimanager/urls.py
+++ b/apimanager/apimanager/urls.py
@@ -40,4 +40,5 @@ urlpatterns = [
url(r'^webui/', include('webui.urls')),
url(r'^methodrouting/', include('methodrouting.urls')),
url(r'^dynamicendpoints/', include('dynamicendpoints.urls')),
+ url(r'^apicollections/', include('apicollections.urls')),
]
diff --git a/apimanager/base/templates/base.html b/apimanager/base/templates/base.html
index 7533831..d2ff5a3 100644
--- a/apimanager/base/templates/base.html
+++ b/apimanager/base/templates/base.html
@@ -70,13 +70,15 @@
{% url "webui-index" as webui_props_index_url %}
{% url "methodrouting-index" as methodrouting_index_url %}
{% url "dynamicendpoints-index" as dynamic_endpoints_index_url %}
+ {% url "apicollections-index" as api_collections_index_url %}
Configurations