Source code for invenio_oauthclient.views.settings
# -*- coding: utf-8 -*-
#
# This file is part of Invenio.
# Copyright (C) 2015-2018 CERN.
#
# Invenio is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.
"""Account settings blueprint for oauthclient."""
from __future__ import absolute_import
from operator import itemgetter
import six
from flask import Blueprint, current_app, render_template, request
from flask_babelex import gettext as _
from flask_breadcrumbs import register_breadcrumb
from flask_login import current_user, login_required
from flask_menu import register_menu
from ..models import RemoteAccount
blueprint = Blueprint(
'invenio_oauthclient_settings',
__name__,
url_prefix='/account/settings/linkedaccounts',
static_folder='../static',
template_folder='../templates',
)
[docs]@blueprint.route('/', methods=['GET', 'POST'])
@login_required
@register_menu(
blueprint, 'settings.oauthclient',
_('%(icon)s Linked accounts', icon='<i class="fa fa-link fa-fw"></i>'),
order=3,
active_when=lambda: request.endpoint.startswith(
'invenio_oauthclient_settings.'),
visible_when=lambda: bool(current_app.config.get(
'OAUTHCLIENT_REMOTE_APPS')) is not False
)
@register_breadcrumb(
blueprint, 'breadcrumbs.settings.oauthclient', _('Linked accounts')
)
def index():
"""List linked accounts."""
oauth = current_app.extensions['oauthlib.client']
services = []
service_map = {}
i = 0
for appid, conf in six.iteritems(
current_app.config['OAUTHCLIENT_REMOTE_APPS']):
if not conf.get('hide', False):
services.append(dict(
appid=appid,
title=conf['title'],
icon=conf.get('icon', None),
description=conf.get('description', None),
account=None
))
service_map[oauth.remote_apps[appid].consumer_key] = i
i += 1
# Fetch already linked accounts
accounts = RemoteAccount.query.filter_by(
user_id=current_user.get_id()
).all()
for a in accounts:
if a.client_id in service_map:
services[service_map[a.client_id]]['account'] = a
# Sort according to title
services.sort(key=itemgetter('title'))
return render_template(
'invenio_oauthclient/settings/index.html',
services=services
)