views.py 2.78 KB
Newer Older
1
import logging
2 3 4
import json
import re
from urlparse import urlparse
5
from collections import namedtuple, defaultdict
6

7

David Baumgold committed
8
from edxmako.shortcuts import render_to_string
9
from opaque_keys.edx.locations import SlashSeparatedCourseKey
10

11
from django.contrib.auth.decorators import login_required
12 13
from django.contrib.auth.models import User
from django.http import HttpResponse, Http404
14
from django.views.decorators.csrf import requires_csrf_token
15

16 17
from licenses.models import CourseSoftware
from licenses.models import get_courses_licenses, get_or_create_license, get_license
18 19


20
log = logging.getLogger("edx.licenses")
21 22


23
License = namedtuple('License', 'software serial')
24 25


26 27 28
def get_licenses_by_course(user, courses):
    licenses = get_courses_licenses(user, courses)
    licenses_by_course = defaultdict(list)
29

30 31 32 33
    # create missing licenses and group by course_id
    for software, license in licenses.iteritems():
        if license is None:
            licenses[software] = get_or_create_license(user, software)
34

35 36 37
        course_id = software.course_id
        serial = license.serial if license else None
        licenses_by_course[course_id].append(License(software, serial))
38

39 40 41 42 43 44
    # render elements
    data_by_course = {}
    for course_id, licenses in licenses_by_course.iteritems():
        context = {'licenses': licenses}
        template = 'licenses/serial_numbers.html'
        data_by_course[course_id] = render_to_string(template, context)
45

46
    return data_by_course
47 48


49
@login_required
50 51 52 53 54 55 56 57 58 59 60 61 62
@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<id>[^/]+/[^/]+/[^/]+)/.*/?$')
    match = re.match(pattern, url_path)

    if not match:
        raise Http404
    course_id = match.groupdict().get('id', '')
63
    course_key = SlashSeparatedCourseKey.from_deprecated_string(course_id)
64 65 66 67 68 69 70

    user_id = request.session.get('_auth_user_id')
    software_name = request.POST.get('software')
    generate = request.POST.get('generate', False) == 'true'

    try:
        software = CourseSoftware.objects.get(name=software_name,
71
                                              course_id=course_key)
72 73 74
    except CourseSoftware.DoesNotExist:
        raise Http404

75 76 77 78
    try:
        user = User.objects.get(id=user_id)
    except User.DoesNotExist:
        raise Http404
79 80

    if generate:
81
        software_license = get_or_create_license(user, software)
82
    else:
83
        software_license = get_license(user, software)
84

85 86
    if software_license:
        response = {'serial': software_license.serial}
87 88 89 90
    else:
        response = {'error': 'No serial number found'}

    return HttpResponse(json.dumps(response), mimetype='application/json')