diff --git a/.gitignore b/.gitignore index 0d4ee97..e94cf66 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ __pycache__/ apimanager/apimanager/local_settings.py +.idea +API-Manager.iml +apimanager/.DS_Store \ No newline at end of file diff --git a/apimanager/consumers/forms.py b/apimanager/consumers/forms.py new file mode 100644 index 0000000..2a1305d --- /dev/null +++ b/apimanager/consumers/forms.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +""" +Forms of consumers app +""" + +from django import forms + + + +class ApiConsumersForm(forms.Form): + + consumer_id = forms.CharField( + label='Consumer ID', + widget=forms.TextInput( + attrs={ + 'class': 'form-control', + } + ), + required=False, + ) + + per_minute_call_limit = forms.IntegerField( + label='per_minute_call_limit', + widget=forms.NumberInput( + attrs={ + 'class': 'form-control', + } + ), + required=False, + ) + + per_hour_call_limit = forms.IntegerField( + label='per_hour_call_limit', + widget=forms.NumberInput( + attrs={ + 'class': 'form-control', + } + ), + required=False, + ) + per_day_call_limit = forms.IntegerField( + label='per_day_call_limit', + widget=forms.NumberInput( + attrs={ + 'class': 'form-control', + } + ), + required=False, + ) + per_week_call_limit = forms.IntegerField( + label='per_week_call_limit', + widget=forms.NumberInput( + attrs={ + 'class': 'form-control', + } + ), + required=False, + ) + + per_month_call_limit = forms.IntegerField( + label='per_month_call_limit', + widget=forms.NumberInput( + attrs={ + 'class': 'form-control', + } + ), + required=False, + ) diff --git a/apimanager/consumers/templates/consumers/detail.html b/apimanager/consumers/templates/consumers/detail.html index 584a80e..c93412f 100644 --- a/apimanager/consumers/templates/consumers/detail.html +++ b/apimanager/consumers/templates/consumers/detail.html @@ -7,6 +7,74 @@

Consumer {{ consumer.app_name }}

+ +
+
+ +

Params

+
+ {% csrf_token %} + {% if form.non_field_errors %} +
+ {{ form.non_field_errors }} +
+ {% endif %} + +
+
+ {% if form.per_minute_call_limit.errors %}
{{ form.per_minute_call_limit.errors }}
{% endif %} +
+ {{ form.per_minute_call_limit.label_tag }} + {{ form.per_minute_call_limit }} +
+
+
+ {% if form.per_hour_call_limit.errors %}
{{ form.per_hour_call_limit.errors }}
{% endif %} +
+ {{ form.per_hour_call_limit.label_tag }} + {{ form.per_hour_call_limit }} +
+
+
+ {% if form.per_day_call_limit.errors %}
{{ form.per_day_call_limit.errors }}
{% endif %} +
+ {{ form.per_day_call_limit.label_tag }} + {{ form.per_day_call_limit }} +
+
+
+ {% if form.per_week_call_limit.errors %}
{{ form.per_week_call_limit.errors }}
{% endif %} +
+ {{ form.per_week_call_limit.label_tag }} + {{ form.per_week_call_limit }} +
+
+
+ +
+
+ {% if form.per_month_call_limit.errors %}
{{ form.per_month_call_limit.errors }}
{% endif %} +
+ {{ form.per_month_call_limit.label_tag }} + {{ form.per_month_call_limit }} +
+
+
+ {% if form.consumer_id.errors %}
{{ form.consumer_id.errors }}
{% endif %} +
+ {{ form.consumer_id.label_tag }} + {{ form.consumer_id }} +
+
+
+ + + + + +
+
+
diff --git a/apimanager/consumers/urls.py b/apimanager/consumers/urls.py index 9a31b7c..97678ef 100644 --- a/apimanager/consumers/urls.py +++ b/apimanager/consumers/urls.py @@ -11,13 +11,13 @@ urlpatterns = [ url(r'^$', IndexView.as_view(), name='consumers-index'), - url(r'^(?P[0-9]+)$', + url(r'^(?P[0-9a-z\-]+)$', DetailView.as_view(), name='consumers-detail'), - url(r'^(?P[0-9]+)/enable$', + url(r'^(?P[0-9a-z\-]+)/enable$', EnableView.as_view(), name='consumers-enable'), - url(r'^(?P[0-9]+)/disable$', + url(r'^(?P[0-9a-z\-]+)/disable$', DisableView.as_view(), name='consumers-disable'), ] diff --git a/apimanager/consumers/views.py b/apimanager/consumers/views.py index c4c238c..0e7e254 100644 --- a/apimanager/consumers/views.py +++ b/apimanager/consumers/views.py @@ -9,11 +9,13 @@ from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse -from django.views.generic import TemplateView, RedirectView +from django.views.generic import TemplateView, RedirectView, FormView from obp.api import API, APIError from base.filters import BaseFilter, FilterTime +from .forms import ApiConsumersForm + class FilterAppType(BaseFilter): """Filter consumers by application type""" @@ -69,7 +71,7 @@ class IndexView(LoginRequiredMixin, TemplateView): urlpath = '/management/consumers' consumers = api.get(urlpath) consumers = FilterEnabled(context, self.request.GET)\ - .apply(consumers['list']) + .apply(consumers['consumers']) consumers = FilterAppType(context, self.request.GET)\ .apply(consumers) consumers = FilterTime(context, self.request.GET, 'created')\ @@ -87,16 +89,71 @@ class IndexView(LoginRequiredMixin, TemplateView): return context -class DetailView(LoginRequiredMixin, TemplateView): +class DetailView(LoginRequiredMixin, FormView): """Detail view for a consumer""" + form_class = ApiConsumersForm template_name = "consumers/detail.html" + def dispatch(self, request, *args, **kwargs): + self.api = API(request.session.get('obp')) + return super(DetailView, self).dispatch(request, *args, **kwargs) + + def get_form(self): + """ + Get bound form either from request.GET or initials + We need a bound form because we already send a request to the API + without user intervention on initial request + """ + if self.request.GET: + data = self.request.GET + + else: + fields = self.form_class.declared_fields + data = {} + for name, field in fields.items(): + if field.initial: + data[name] = field.initial + form = self.form_class(data) + return form + + def form_valid(self, form): + + """Put limits data to API""" + try: + + + data = '' + form = ApiConsumersForm(self.request.POST) + if form.is_valid(): + data = form.cleaned_data + + + urlpath = '/management/consumers/{}/consumer/calls_limit'.format(data['consumer_id']) + + payload = { + 'per_minute_call_limit': data['per_minute_call_limit'], + 'per_hour_call_limit': data['per_hour_call_limit'], + 'per_day_call_limit': data['per_day_call_limit'], + 'per_week_call_limit': data['per_week_call_limit'], + 'per_month_call_limit': data['per_month_call_limit'] + } + user = self.api.put(urlpath, payload=payload) + except APIError as err: + messages.error(self.request, err) + return super(DetailView, self).form_invalid(form) + + msg = 'calls limit of consumer {} has been updated successfully.'.format( + data['consumer_id']) + messages.success(self.request, msg) + self.success_url = self.request.path + return super(DetailView, self).form_valid(form) + def get_context_data(self, **kwargs): context = super(DetailView, self).get_context_data(**kwargs) api = API(self.request.session.get('obp')) try: - urlpath = '/management/consumers/{}'.format(kwargs['consumer_id']) + urlpath = '/management/consumers/{}'.format(self.kwargs['consumer_id']) consumer = api.get(urlpath) consumer['created'] = datetime.strptime( consumer['created'], settings.API_DATETIMEFORMAT) @@ -105,6 +162,7 @@ class DetailView(LoginRequiredMixin, TemplateView): context.update({ 'consumer': consumer, + 'form': self.get_form() }) return context diff --git a/requirements.txt b/requirements.txt index 9123025..fac2447 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,5 @@ gunicorn==19.6.0 matplotlib django-bootstrap-datepicker-plus django-mathfilters -django-bootstrap3 \ No newline at end of file +django-bootstrap3 +django-bootstrap-datepicker-plus \ No newline at end of file