Merge pull request #58 from shanhuhai/master

Added a form to update consumer's call limit on the consumer's details page
This commit is contained in:
Simon Redfern 2018-09-21 17:56:05 +02:00 committed by GitHub
commit ed46c54b69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 206 additions and 8 deletions

3
.gitignore vendored
View File

@ -2,3 +2,6 @@
__pycache__/
apimanager/apimanager/local_settings.py
.idea
API-Manager.iml
apimanager/.DS_Store

View File

@ -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,
)

View File

@ -7,6 +7,74 @@
<div id="consumers-detail">
<h1>Consumer {{ consumer.app_name }}</h1>
<div class="row">
<div class="col-xs-12">
<h2>Params</h2>
<form action="" method="post">
{% csrf_token %}
{% if form.non_field_errors %}
<div class="alert alert-danger">
{{ form.non_field_errors }}
</div>
{% endif %}
<div class="row">
<div class="col-xs-6 col-sm-3">
{% if form.per_minute_call_limit.errors %}<div class="alert alert-danger">{{ form.per_minute_call_limit.errors }}</div>{% endif %}
<div class="form-group">
{{ form.per_minute_call_limit.label_tag }}
{{ form.per_minute_call_limit }}
</div>
</div>
<div class="col-xs-6 col-sm-3">
{% if form.per_hour_call_limit.errors %}<div class="alert alert-danger">{{ form.per_hour_call_limit.errors }}</div>{% endif %}
<div class="form-group">
{{ form.per_hour_call_limit.label_tag }}
{{ form.per_hour_call_limit }}
</div>
</div>
<div class="col-xs-6 col-sm-3">
{% if form.per_day_call_limit.errors %}<div class="alert alert-danger">{{ form.per_day_call_limit.errors }}</div>{% endif %}
<div class="form-group">
{{ form.per_day_call_limit.label_tag }}
{{ form.per_day_call_limit }}
</div>
</div>
<div class="col-xs-6 col-sm-3">
{% if form.per_week_call_limit.errors %}<div class="alert alert-danger">{{ form.per_week_call_limit.errors }}</div>{% endif %}
<div class="form-group">
{{ form.per_week_call_limit.label_tag }}
{{ form.per_week_call_limit }}
</div>
</div>
</div>
<div class="row">
<div class="col-xs-6 col-sm-6">
{% if form.per_month_call_limit.errors %}<div class="alert alert-danger">{{ form.per_month_call_limit.errors }}</div>{% endif %}
<div class="form-group">
{{ form.per_month_call_limit.label_tag }}
{{ form.per_month_call_limit }}
</div>
</div>
<div class="col-xs-6 col-sm-6">
{% if form.consumer_id.errors %}<div class="alert alert-danger">{{ form.consumer_id.errors }}</div>{% endif %}
<div class="form-group">
{{ form.consumer_id.label_tag }}
{{ form.consumer_id }}
</div>
</div>
</div>
<button type="submit" class="btn btn-primary">Update Consumer</button>
</form>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<div id="consumers-detail-consumer_id">

View File

@ -11,13 +11,13 @@ urlpatterns = [
url(r'^$',
IndexView.as_view(),
name='consumers-index'),
url(r'^(?P<consumer_id>[0-9]+)$',
url(r'^(?P<consumer_id>[0-9a-z\-]+)$',
DetailView.as_view(),
name='consumers-detail'),
url(r'^(?P<consumer_id>[0-9]+)/enable$',
url(r'^(?P<consumer_id>[0-9a-z\-]+)/enable$',
EnableView.as_view(),
name='consumers-enable'),
url(r'^(?P<consumer_id>[0-9]+)/disable$',
url(r'^(?P<consumer_id>[0-9a-z\-]+)/disable$',
DisableView.as_view(),
name='consumers-disable'),
]

View File

@ -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

View File

@ -8,4 +8,5 @@ gunicorn==19.6.0
matplotlib
django-bootstrap-datepicker-plus
django-mathfilters
django-bootstrap3
django-bootstrap3
django-bootstrap-datepicker-plus