From 00cc8e8d767f48a50831942fb68914db0f200dcb Mon Sep 17 00:00:00 2001 From: Sebastian Henschel Date: Mon, 21 Nov 2016 14:55:35 +0100 Subject: [PATCH] Cleaned up after running pylint --- apimanager/apimanager/settings.py | 6 ++-- apimanager/apimanager/urls.py | 22 ++++---------- apimanager/base/api.py | 36 +++++++++++++++------- apimanager/base/apps.py | 10 +++++-- apimanager/base/context_processors.py | 14 +++++++-- apimanager/base/filters.py | 17 +++++++++++ apimanager/base/utils.py | 4 +++ apimanager/base/views.py | 5 ++++ apimanager/consumers/apps.py | 6 ++++ apimanager/consumers/urls.py | 21 ++++++++++--- apimanager/consumers/views.py | 20 ++++++++++--- apimanager/oauth/apps.py | 6 ++++ apimanager/oauth/urls.py | 5 ++++ apimanager/oauth/views.py | 43 +++++++++++++++++++-------- apimanager/users/apps.py | 7 +++++ apimanager/users/urls.py | 5 ++++ apimanager/users/views.py | 23 +++++++++----- 17 files changed, 187 insertions(+), 63 deletions(-) diff --git a/apimanager/apimanager/settings.py b/apimanager/apimanager/settings.py index 8f28d28..1458339 100644 --- a/apimanager/apimanager/settings.py +++ b/apimanager/apimanager/settings.py @@ -48,8 +48,8 @@ INSTALLED_APPS = [ 'oauth', 'consumers', 'users', -# 'api_calls', -# 'api_config', + #'api_calls', + #'api_config', ] MIDDLEWARE = [ @@ -176,7 +176,7 @@ OAUTH_CONSUMER_SECRET = None # Local settings can override anything in here try: from apimanager.local_settings import * -except: +except ImportError: pass if not OAUTH_CONSUMER_KEY: diff --git a/apimanager/apimanager/urls.py b/apimanager/apimanager/urls.py index 51dc762..3da51c8 100644 --- a/apimanager/apimanager/urls.py +++ b/apimanager/apimanager/urls.py @@ -1,18 +1,8 @@ -"""apimanager URL Configuration - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/1.10/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.conf.urls import url, include - 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +# -*- coding: utf-8 -*- """ +URLs for apimanager +""" + from django.conf.urls import url, include from base.views import HomeView @@ -23,6 +13,6 @@ urlpatterns = [ url(r'^oauth/', include('oauth.urls')), url(r'^consumers/', include('consumers.urls')), url(r'^users/', include('users.urls')), -# url(r'^api_calls/', include('api_calls.urls')), -# url(r'^api_config/', include('api_config.urls')), + #url(r'^api_calls/', include('api_calls.urls')), + #url(r'^api_config/', include('api_config.urls')), ] diff --git a/apimanager/base/api.py b/apimanager/base/api.py index efc1f57..80e796f 100644 --- a/apimanager/base/api.py +++ b/apimanager/base/api.py @@ -1,4 +1,10 @@ # -*- coding: utf-8 -*- +""" +Module to handle the OBP API + +It instantiates a convenience api object for imports, e.g.: +from base.api import api +""" from datetime import datetime import logging @@ -14,41 +20,50 @@ LOGGER = logging.getLogger(__name__) +def log(level, message): + """Logs a given message on a given level to log facility""" + now = datetime.now().strftime(DATE_FORMAT) + msg = '[{}] API: {}'.format(now, message) + LOGGER.log(level, msg) + + + class APIError(Exception): + """Exception class for API errors""" pass class API(object): - - def log(self, level, message): - now = datetime.now().strftime(DATE_FORMAT) - msg = '[{}] API: {}'.format(now, message) - LOGGER.log(level, msg) - + """Implements an interface to the OBP API""" def get(self, request, urlpath=''): + """Gets data from the API""" return self.call(request, 'GET', urlpath) def delete(self, request, urlpath): + """Deletes data from the API""" return self.call(request, 'DELETE', urlpath) def post(self, request, urlpath, payload): + """Posts data to the API""" return self.call(request, 'POST', urlpath, payload) def put(self, request, urlpath, payload): + """Puts data onto the API""" return self.call(request, 'PUT', urlpath, payload) def handle_response(self, response): + """Handles the response, e.g. errors or conversion to JSON""" prefix = 'APIError' if response.status_code in [404, 500]: msg = '{} {}: {}'.format( prefix, response.status_code, response.text) - self.log(logging.ERROR, msg) + log(logging.ERROR, msg) raise APIError(msg) elif response.status_code in [204]: return response.text @@ -61,8 +76,9 @@ class API(object): def call(self, request, method='GET', urlpath='', payload=None): + """Workhorse which actually calls the API""" url = settings.OAUTH_API + settings.OAUTH_API_BASE_PATH + urlpath - self.log(logging.INFO, '{} {}'.format(method, url)) + log(logging.INFO, '{} {}'.format(method, url)) if not hasattr(request, 'api'): request.api = OAuth1Session( settings.OAUTH_CONSUMER_KEY, @@ -77,8 +93,6 @@ class API(object): response = request.api.request(method, url) time_end = time.time() elapsed = int((time_end - time_start) * 1000) - self.log(logging.INFO, 'Took {} ms'.format(elapsed)) + log(logging.INFO, 'Took {} ms'.format(elapsed)) return self.handle_response(response) - - api = API() diff --git a/apimanager/base/apps.py b/apimanager/base/apps.py index 90dc713..17a2d23 100644 --- a/apimanager/base/apps.py +++ b/apimanager/base/apps.py @@ -1,5 +1,11 @@ +# -*- coding: utf-8 -*- +""" +App config for base app +""" + from django.apps import AppConfig -class HomeConfig(AppConfig): - name = 'home' +class BaseConfig(AppConfig): + """Config for base""" + name = 'base' diff --git a/apimanager/base/context_processors.py b/apimanager/base/context_processors.py index bf99014..667e474 100644 --- a/apimanager/base/context_processors.py +++ b/apimanager/base/context_processors.py @@ -1,17 +1,25 @@ # -*- coding: utf-8 -*- +""" +Context processors for base app +""" from django.conf import settings from base.api import api + def api_root(request): + """Returns the configured API_ROOT""" return {'API_ROOT': settings.OAUTH_API + settings.OAUTH_API_BASE_PATH} + + def api_username(request): + """Returns the API username of the logged-in user""" if request.user.is_authenticated: data = api.get(request, '/users/current') - api_username = data['username'] + username = data['username'] else: - api_username = 'not authenticated' - return {'API_USERNAME': api_username} + username = 'not authenticated' + return {'API_USERNAME': username} diff --git a/apimanager/base/filters.py b/apimanager/base/filters.py index ab8c096..f0c8ce4 100644 --- a/apimanager/base/filters.py +++ b/apimanager/base/filters.py @@ -1,18 +1,34 @@ # -*- coding: utf-8 -*- +""" +Base filters +""" from datetime import datetime, timedelta from django.conf import settings + + class BaseFilter(object): + """Base for custom filter classes""" + filter_type = None + def __init__(self, context, request_get): self.context = context self.request_get = request_get def _apply(self, data, filter_value): + """ + Actual application of filter + Needs to be implemented by child class! + """ raise AttributeError('Not implemented yet!') def apply(self, data): + """ + Apply filter to given data + Also setup of context variables for templates + """ filter_all = 'active_{}_all'.format(self.filter_type) self.context[filter_all] = True filter_active_value = 'active_{}'.format(self.filter_type) @@ -34,6 +50,7 @@ class BaseFilter(object): class FilterTime(BaseFilter): + """Filter items by datetime""" filter_type = 'time' def __init__(self, context, request_get, time_fieldname): diff --git a/apimanager/base/utils.py b/apimanager/base/utils.py index adc073b..f0b5d10 100644 --- a/apimanager/base/utils.py +++ b/apimanager/base/utils.py @@ -1,9 +1,13 @@ # -*- coding: utf-8 -*- +""" +Base utilities +""" from datetime import datetime from django.contrib.humanize.templatetags.humanize import naturaltime + def json_serial(obj): """JSON serializer for objects not serializable by default json code""" diff --git a/apimanager/base/views.py b/apimanager/base/views.py index 6b23ad5..1c924e6 100644 --- a/apimanager/base/views.py +++ b/apimanager/base/views.py @@ -1,9 +1,14 @@ # -*- coding: utf-8 -*- +""" +Views for base app +""" + from django.conf import settings from django.views.generic import TemplateView class HomeView(TemplateView): + """View for home page""" template_name = "home.html" def get_context_data(self, **kwargs): diff --git a/apimanager/consumers/apps.py b/apimanager/consumers/apps.py index c44c8b2..690e228 100644 --- a/apimanager/consumers/apps.py +++ b/apimanager/consumers/apps.py @@ -1,5 +1,11 @@ +# -*- coding: utf-8 -*- +""" +App config for consumers app +""" + from django.apps import AppConfig class AppsConfig(AppConfig): + """Config for consumers""" name = 'consumers' diff --git a/apimanager/consumers/urls.py b/apimanager/consumers/urls.py index dbb1b80..9a31b7c 100644 --- a/apimanager/consumers/urls.py +++ b/apimanager/consumers/urls.py @@ -1,10 +1,23 @@ +# -*- coding: utf-8 -*- +""" +URLs for consumers app +""" + from django.conf.urls import url from .views import IndexView, DetailView, EnableView, DisableView urlpatterns = [ - url(r'^$', IndexView.as_view(), name='consumers-index'), - url(r'^(?P[0-9]+)$', DetailView.as_view(), name='consumers-detail'), - url(r'^(?P[0-9]+)/enable$', EnableView.as_view(), name='consumers-enable'), - url(r'^(?P[0-9]+)/disable$', DisableView.as_view(), name='consumers-disable'), + url(r'^$', + IndexView.as_view(), + name='consumers-index'), + url(r'^(?P[0-9]+)$', + DetailView.as_view(), + name='consumers-detail'), + url(r'^(?P[0-9]+)/enable$', + EnableView.as_view(), + name='consumers-enable'), + url(r'^(?P[0-9]+)/disable$', + DisableView.as_view(), + name='consumers-disable'), ] diff --git a/apimanager/consumers/views.py b/apimanager/consumers/views.py index 6e15fcf..3f566d9 100644 --- a/apimanager/consumers/views.py +++ b/apimanager/consumers/views.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- -import json -from copy import deepcopy +""" +Views of consumers app +""" + from datetime import datetime from django.conf import settings @@ -11,11 +13,11 @@ from django.views.generic import TemplateView, RedirectView from base.api import api, APIError from base.filters import BaseFilter, FilterTime -from base.utils import json_serial class FilterAppType(BaseFilter): + """Filter consumers by application type""" filter_type = 'apptype' def _apply(self, data, filter_value): @@ -24,6 +26,7 @@ class FilterAppType(BaseFilter): class FilterEnabled(BaseFilter): + """Filter consumers by enabled state""" filter_type = 'enabled' def _apply(self, data, filter_value): @@ -34,9 +37,11 @@ class FilterEnabled(BaseFilter): class IndexView(LoginRequiredMixin, TemplateView): + """Index view for consumers""" template_name = "consumers/index.html" def scrub(self, consumers): + """Scrubs data in the given consumers to adher to certain formats""" for consumer in consumers: consumer['created'] = datetime.strptime( consumer['created'], settings.API_DATETIMEFORMAT) @@ -70,6 +75,7 @@ class IndexView(LoginRequiredMixin, TemplateView): class DetailView(LoginRequiredMixin, TemplateView): + """Detail view for a consumer""" template_name = "consumers/detail.html" def get_context_data(self, **kwargs): @@ -91,7 +97,11 @@ class DetailView(LoginRequiredMixin, TemplateView): class EnableDisableView(LoginRequiredMixin, RedirectView): - def get_redirect_url(self,*args, **kwargs): + """View to enable or disable a consumer""" + enabled = False + success = None + + def get_redirect_url(self, *args, **kwargs): try: urlpath = '/management/consumers/{}'.format(kwargs['consumer_id']) payload = {'enabled': self.enabled} @@ -108,10 +118,12 @@ class EnableDisableView(LoginRequiredMixin, RedirectView): class EnableView(EnableDisableView): + """View to enable a consumer""" enabled = True success = "Consumer has been enabled." class DisableView(EnableDisableView): + """View to disable a consumer""" enabled = False success = "Consumer has been disabled." diff --git a/apimanager/oauth/apps.py b/apimanager/oauth/apps.py index 17fcea2..a1f4f0c 100644 --- a/apimanager/oauth/apps.py +++ b/apimanager/oauth/apps.py @@ -1,5 +1,11 @@ +# -*- coding: utf-8 -*- +""" +App config for OAuth 1 app +""" + from django.apps import AppConfig class OauthConfig(AppConfig): + """Config for OAuth 1""" name = 'oauth' diff --git a/apimanager/oauth/urls.py b/apimanager/oauth/urls.py index 305337d..b16356c 100644 --- a/apimanager/oauth/urls.py +++ b/apimanager/oauth/urls.py @@ -1,3 +1,8 @@ +# -*- coding: utf-8 -*- +""" +URLs for OAuth 1 app +""" + from django.conf.urls import url from .views import InitiateView, AuthorizeView, LogoutView diff --git a/apimanager/oauth/views.py b/apimanager/oauth/views.py index a960c10..94ec616 100644 --- a/apimanager/oauth/views.py +++ b/apimanager/oauth/views.py @@ -1,4 +1,8 @@ # -*- coding: utf-8 -*- +""" +Views for OAuth 1 app +""" + import hashlib from django.conf import settings @@ -14,7 +18,13 @@ from base.api import api class InitiateView(RedirectView): + """View to initiate OAuth 1 session""" + def get_callback_uri(self, request): + """ + Gets the callback URI to where the user shall be returned after + authorization at OAuth 1 server + """ base_url = '{}://{}'.format( request.scheme, request.environ['HTTP_HOST']) uri = base_url + reverse('oauth-authorize') @@ -24,7 +34,7 @@ class InitiateView(RedirectView): def get_redirect_url(self, *args, **kwargs): callback_uri = self.get_callback_uri(self.request) - api = OAuth1Session( + session = OAuth1Session( settings.OAUTH_CONSUMER_KEY, client_secret=settings.OAUTH_CONSUMER_SECRET, callback_uri=callback_uri, @@ -32,22 +42,27 @@ class InitiateView(RedirectView): try: url = settings.OAUTH_API + settings.OAUTH_TOKEN_PATH - fetch_response = api.fetch_request_token(url) - except ValueError as exc: - messages.error(self.request, exc) + response = session.fetch_request_token(url) + except ValueError as err: + messages.error(self.request, err) return reverse('home') url = settings.OAUTH_API + settings.OAUTH_AUTHORIZATION_PATH - authorization_url = api.authorization_url(url) - self.request.session['oauth_token'] = fetch_response.get('oauth_token') - self.request.session['oauth_secret'] = fetch_response.get('oauth_token_secret') + authorization_url = session.authorization_url(url) + self.request.session['oauth_token'] = response.get('oauth_token') + self.request.session['oauth_secret'] = response.get('oauth_token_secret') self.request.session.modified = True return authorization_url class AuthorizeView(RedirectView): + """View to authorize user""" + def login_to_django(self): - # Kind of faking it to establish if a user is authenticated later on + """ + Logs the user into Django + Kind of faking it to establish if a user is authenticated later on + """ data = api.get(self.request, '/users/current') userid = data['user_id'] or data['email'] username = hashlib.sha256(userid.encode('utf-8')).hexdigest() @@ -58,24 +73,26 @@ class AuthorizeView(RedirectView): login(self.request, user) def get_redirect_url(self, *args, **kwargs): - api = OAuth1Session( + session = OAuth1Session( settings.OAUTH_CONSUMER_KEY, settings.OAUTH_CONSUMER_SECRET, resource_owner_key=self.request.session['oauth_token'], resource_owner_secret=self.request.session['oauth_secret'] ) - api.parse_authorization_response(self.request.build_absolute_uri()) + session.parse_authorization_response(self.request.build_absolute_uri()) url = settings.OAUTH_API + settings.OAUTH_ACCESS_TOKEN_PATH - fetch_response = api.fetch_access_token(url) + response = session.fetch_access_token(url) - self.request.session['oauth_token'] = fetch_response.get('oauth_token') - self.request.session['oauth_secret'] = fetch_response.get('oauth_token_secret') + self.request.session['oauth_token'] = response.get('oauth_token') + self.request.session['oauth_secret'] = response.get('oauth_token_secret') self.login_to_django() redirect_url = self.request.GET.get('next', reverse('consumers-index')) return redirect_url class LogoutView(RedirectView): + """View to logout""" + def get_redirect_url(self, *args, **kwargs): logout(self.request) return reverse('home') diff --git a/apimanager/users/apps.py b/apimanager/users/apps.py index 4ce1fab..3e2cfce 100644 --- a/apimanager/users/apps.py +++ b/apimanager/users/apps.py @@ -1,5 +1,12 @@ +# -*- coding: utf-8 -*- +""" +App config for users app +""" + from django.apps import AppConfig + class UsersConfig(AppConfig): + """Config for users""" name = 'users' diff --git a/apimanager/users/urls.py b/apimanager/users/urls.py index 03a2158..b430bac 100644 --- a/apimanager/users/urls.py +++ b/apimanager/users/urls.py @@ -1,3 +1,8 @@ +# -*- coding: utf-8 -*- +""" +URLs for users app +""" + from django.conf.urls import url from .views import IndexView, DetailView, AddEntitlementView, DeleteEntitlementView diff --git a/apimanager/users/views.py b/apimanager/users/views.py index bff2ed3..e43821b 100644 --- a/apimanager/users/views.py +++ b/apimanager/users/views.py @@ -1,30 +1,32 @@ # -*- coding: utf-8 -*- +""" +Views of users app +""" -import json -from copy import deepcopy -from datetime import datetime - -from django.conf import settings from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpResponseRedirect from django.urls import reverse -from django.views.generic import TemplateView, RedirectView, View +from django.views.generic import TemplateView, View from base.filters import BaseFilter from base.api import api, APIError class FilterRoleName(BaseFilter): + """Filter users by role names""" filter_type = 'role_name' def _apply(self, data, filter_value): - filtered = [x for x in data if filter_value in [e['role_name'] for e in x['entitlements']['list']]] + filtered = [x for x in data if filter_value in [ + e['role_name'] for e in x['entitlements']['list'] + ]] return filtered class IndexView(LoginRequiredMixin, TemplateView): + """Index view for users""" template_name = "users/index.html" def get_context_data(self, **kwargs): @@ -56,6 +58,7 @@ class IndexView(LoginRequiredMixin, TemplateView): class DetailView(LoginRequiredMixin, TemplateView): + """Detail view for a user""" template_name = 'users/detail.html' def get_context_data(self, **kwargs): @@ -86,7 +89,10 @@ class DetailView(LoginRequiredMixin, TemplateView): class AddEntitlementView(LoginRequiredMixin, View): + """View to add an entitlement by role name (and bank ID)""" + def post(self, request, *args, **kwargs): + """Posts entitlement data to API""" try: urlpath = '/users/{}/entitlements'.format(kwargs['user_id']) payload = { @@ -108,7 +114,10 @@ class AddEntitlementView(LoginRequiredMixin, View): class DeleteEntitlementView(LoginRequiredMixin, View): + """View to delete an entitlement""" + def post(self, request, *args, **kwargs): + """Deletes entitlement from API""" try: urlpath = '/users/{}/entitlement/{}'.format( kwargs['user_id'], kwargs['entitlement_id'])