68 lines
2.7 KiB
Python
68 lines
2.7 KiB
Python
"""Programs views for use with Studio."""
|
|
from django.conf import settings
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.core.exceptions import ImproperlyConfigured
|
|
from django.core.urlresolvers import reverse
|
|
from django.http import Http404, JsonResponse
|
|
from django.utils.decorators import method_decorator
|
|
from django.views.generic import View
|
|
from provider.oauth2.models import Client
|
|
|
|
from edxmako.shortcuts import render_to_response
|
|
from openedx.core.djangoapps.programs.models import ProgramsApiConfig
|
|
from openedx.core.lib.token_utils import JwtBuilder
|
|
|
|
|
|
class ProgramAuthoringView(View):
|
|
"""View rendering a template which hosts the Programs authoring app.
|
|
|
|
The Programs authoring app is a Backbone SPA. The app handles its own routing
|
|
and provides a UI which can be used to create and publish new Programs.
|
|
"""
|
|
|
|
@method_decorator(login_required)
|
|
def get(self, request, *args, **kwargs):
|
|
"""Populate the template context with values required for the authoring app to run."""
|
|
programs_config = ProgramsApiConfig.current()
|
|
|
|
if programs_config.is_studio_tab_enabled and request.user.is_staff:
|
|
return render_to_response('program_authoring.html', {
|
|
'lms_base_url': '//{}/'.format(settings.LMS_BASE),
|
|
'programs_api_url': programs_config.public_api_url,
|
|
'programs_token_url': reverse('programs_id_token'),
|
|
'studio_home_url': reverse('home'),
|
|
'uses_pattern_library': True
|
|
})
|
|
else:
|
|
raise Http404
|
|
|
|
|
|
class ProgramsIdTokenView(View):
|
|
"""Provides id tokens to JavaScript clients for use with the Programs API."""
|
|
|
|
@method_decorator(login_required)
|
|
def get(self, request, *args, **kwargs):
|
|
"""Generate and return a token, if the integration is enabled."""
|
|
if ProgramsApiConfig.current().is_studio_tab_enabled:
|
|
# TODO: Use the system's JWT_AUDIENCE and JWT_SECRET_KEY instead of client ID and name.
|
|
client_name = 'programs'
|
|
|
|
try:
|
|
client = Client.objects.get(name=client_name)
|
|
except Client.DoesNotExist:
|
|
raise ImproperlyConfigured(
|
|
'OAuth2 Client with name [{}] does not exist.'.format(client_name)
|
|
)
|
|
|
|
scopes = ['email', 'profile']
|
|
expires_in = settings.OAUTH_ID_TOKEN_EXPIRATION
|
|
jwt = JwtBuilder(request.user, secret=client.client_secret).build_token(
|
|
scopes,
|
|
expires_in,
|
|
aud=client.client_id
|
|
)
|
|
|
|
return JsonResponse({'id_token': jwt})
|
|
else:
|
|
raise Http404
|