From e9ec63e4b6488ad278edfa98f4566d861da796a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s=20Rocha?= Date: Mon, 15 Oct 2012 18:45:36 -0400 Subject: [PATCH] Add ajax endpoint to retrieve and assign course software licenses --- lms/djangoapps/licenses/models.py | 2 +- lms/djangoapps/licenses/views.py | 53 ++++++++++++++++++++++++++++++- lms/urls.py | 8 +++++ 3 files changed, 61 insertions(+), 2 deletions(-) diff --git a/lms/djangoapps/licenses/models.py b/lms/djangoapps/licenses/models.py index 929fba10ec..d259892f5d 100644 --- a/lms/djangoapps/licenses/models.py +++ b/lms/djangoapps/licenses/models.py @@ -65,7 +65,7 @@ def _create_license(user, software): # table/rows with select_for_update to prevent race conditions with transaction.commit_on_success(): selected = UserLicense.objects.select_for_update() - license = selected.filter(user__isnull=True)[0] + license = selected.filter(user__isnull=True, software=software)[0] license.user = user license.save() except IndexError: diff --git a/lms/djangoapps/licenses/views.py b/lms/djangoapps/licenses/views.py index 7cf8e6591e..9b32478e0e 100644 --- a/lms/djangoapps/licenses/views.py +++ b/lms/djangoapps/licenses/views.py @@ -1,9 +1,18 @@ import logging +import json +import re +from urlparse import urlparse from collections import namedtuple, defaultdict + from mitxmako.shortcuts import render_to_string -from models import get_courses_licenses, get_or_create_license +from django.contrib.auth.models import User +from django.http import HttpResponse, Http404 +from django.views.decorators.csrf import requires_csrf_token, csrf_protect + +from models import CourseSoftware +from models import get_courses_licenses, get_or_create_license, get_license log = logging.getLogger("mitx.licenses") @@ -33,3 +42,45 @@ def get_licenses_by_course(user, courses): data_by_course[course_id] = render_to_string(template, context) return data_by_course + + +@requires_csrf_token +def user_software_license(request): + if request.method != 'POST' or not request.is_ajax(): + raise Http404 + + # get the course id from the referer + url_path = urlparse(request.META.get('HTTP_REFERER', '')).path + pattern = re.compile('^/courses/(?P[^/]+/[^/]+/[^/]+)/.*/?$') + match = re.match(pattern, url_path) + + if not match: + raise Http404 + course_id = match.groupdict().get('id', '') + + user_id = request.session.get('_auth_user_id') + software_name = request.POST.get('software') + generate = request.POST.get('generate', False) == 'true' + + print user_id, software_name, generate + + try: + software = CourseSoftware.objects.get(name=software_name, + course_id=course_id) + print software + except CourseSoftware.DoesNotExist: + raise Http404 + + user = User.objects.get(id=user_id) + + if generate: + license = get_or_create_license(user, software) + else: + license = get_license(user, software) + + if license: + response = {'serial': license.serial} + else: + response = {'error': 'No serial number found'} + + return HttpResponse(json.dumps(response), mimetype='application/json') diff --git a/lms/urls.py b/lms/urls.py index 89a541ab06..e025478387 100644 --- a/lms/urls.py +++ b/lms/urls.py @@ -154,6 +154,14 @@ if settings.COURSEWARE_ENABLED: url(r'^preview/chemcalc', 'courseware.module_render.preview_chemcalc', name='preview_chemcalc'), + # Software Licenses + + # TODO: for now, this is the endpoint of an ajax replay + # service that retrieve and assigns license numbers for + # software assigned to a course. The numbers have to be loaded + # into the database. + url(r'^software-licenses$', 'licenses.views.user_software_license', name="user_software_license"), + url(r'^courses/(?P[^/]+/[^/]+/[^/]+)/xqueue/(?P[^/]*)/(?P.*?)/(?P[^/]*)$', 'courseware.module_render.xqueue_callback', name='xqueue_callback'),