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

+
+
+
+
+
+
+
+
+
+
+
+
+ {% csrf_token %} + {% for api_collection in api_collections %} +
+
+
+
+
{{ api_collection.api_collection_id }}
+
+
+
+
{{ api_collection.api_collection_name }}
+
+
+ +
+ {% if forloop.counter0 == 0 %} +
+
+ saved. +
+
+ {% endif %} + {% if forloop.counter0 > 0 %} +
+
+ +
+
+ {% endif %} +
+ +
+
+
+ {% endfor %} +
+{% 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 %}