Exemple #1
0
def five_sec_widget(request, pagename):
    """display a `five seconds widget` as specified by the query parameters.
    Also handle POST requests from the widget, saving blueprints and performing related updates.
    """
    if request.method == 'POST':

        new_fc_urn = handle_blueprint_post(request, Flashcard)
        # temp hack for FSI, manually update the lesson we took the flashcard from
        from django.utils.safestring import mark_safe
        from ductus.resource.ductmodels import BlueprintSaveContext
        from ductus.wiki.views import _fully_handle_blueprint_post
        try:
            url = request.POST['fsi_url']
            card_index = int(request.POST['fsi_index'])
        except KeyError:
            raise ValidationError(
                "the widget should provide FSI specific fields")

        page = WikiPage.objects.get(name=url)
        revision = page.get_latest_revision()
        urn = 'urn:' + revision.urn
        resource_database = get_resource_database()
        old_fcd = resource_database.get_resource_object(urn)
        fcd_bp = json.loads(resource_json(old_fcd))

        # remove href and add a @patch statement so that the blueprint updates the database
        fcd_bp['resource']['@patch'] = urn
        del fcd_bp['href']

        # set the flashcard href saved above
        fcd_bp['resource']['cards']['array'][card_index][
            'href'] = new_fc_urn.urn
        # remove all 'resource' keys in the blueprint as ResourceElement ignores the hrefs otherwise
        for fc in fcd_bp['resource']['cards']['array']:
            del fc['resource']
        for interaction in fcd_bp['resource']['interactions']['array']:
            del interaction['resource']

        request.POST = request.POST.copy()
        request.POST['blueprint'] = json.dumps(fcd_bp)
        request.POST['log_message'] = '5sec widget (subtitle)'
        prefix, pagename = url.split(':')
        response = _fully_handle_blueprint_post(request, prefix, pagename)

        return response

    # define what to do when GETing /special/five-sec-widget?method=something
    if request.method == 'GET':
        methods = {
            'get-audio-to-subtitle': fsw_get_audio_to_subtitle,
            'get-phrase-to-record': fsw_get_phrase_to_record,
        }
        try:
            return methods[request.GET.get('method', None)](request)
        except KeyError:
            pass

    return render_to_response('flashcards/five_sec_widget.html', {},
                              RequestContext(request))
Exemple #2
0
def five_sec_widget(request, pagename):
    """display a `five seconds widget` as specified by the query parameters.
    Also handle POST requests from the widget, saving blueprints and performing related updates.
    """
    if request.method == 'POST':

        new_fc_urn = handle_blueprint_post(request, Flashcard)
        # temp hack for FSI, manually update the lesson we took the flashcard from
        from django.utils.safestring import mark_safe
        from ductus.resource.ductmodels import BlueprintSaveContext
        from ductus.wiki.views import _fully_handle_blueprint_post
        try:
            url = request.POST['fsi_url']
            card_index = int(request.POST['fsi_index'])
        except KeyError:
            raise ValidationError("the widget should provide FSI specific fields")

        page = WikiPage.objects.get(name=url)
        revision = page.get_latest_revision()
        urn = 'urn:' + revision.urn
        resource_database = get_resource_database()
        old_fcd = resource_database.get_resource_object(urn)
        fcd_bp = json.loads(resource_json(old_fcd))

        # remove href and add a @patch statement so that the blueprint updates the database
        fcd_bp['resource']['@patch'] = urn
        del fcd_bp['href']

        # set the flashcard href saved above
        fcd_bp['resource']['cards']['array'][card_index]['href'] = new_fc_urn.urn
        # remove all 'resource' keys in the blueprint as ResourceElement ignores the hrefs otherwise
        for fc in fcd_bp['resource']['cards']['array']:
            del fc['resource']
        for interaction in fcd_bp['resource']['interactions']['array']:
            del interaction['resource']

        request.POST = request.POST.copy()
        request.POST['blueprint'] = json.dumps(fcd_bp)
        request.POST['log_message'] = '5sec widget (subtitle)'
        prefix, pagename = url.split(':')
        response = _fully_handle_blueprint_post(request, prefix, pagename)

        return response

    # define what to do when GETing /special/five-sec-widget?method=something
    if request.method == 'GET':
        methods = {
            'get-audio-to-subtitle': fsw_get_audio_to_subtitle,
            'get-phrase-to-record': fsw_get_phrase_to_record,
        }
        try:
            return methods[request.GET.get('method', None)](request)
        except KeyError:
            pass

    return render_to_response('flashcards/five_sec_widget.html', {
    }, RequestContext(request))
Exemple #3
0
def fsw_get_flashcard(request, extra_tags, prompt_side, answer_side):
    """return a JSON flashcard object
    extra_tags: a list of tags the flashcard deck must have
    prompt_side: the index (0 based) of the side to use as prompt (which cannot be empty)
    answer_side: the index (0 based) of the side that must be empty
    """
    if request.method != 'GET':
        raise ImmediateResponse(
            HttpTextResponseBadRequest('only GET is allowed'))

    # get the language to search for
    language = request.GET.get(
        'language', getattr(settings, "FIVE_SEC_WIDGET_DEFAULT_LANGUAGE",
                            'en'))
    search_tags = ['target-language:' + language] + extra_tags
    # get a list of pages tagged as we want
    url_list = search_pages(tags=search_tags)

    if not url_list:
        raise Http404('No material available for this language')

    #url_list = [url for url in url_list if url.split(':')[0] == language]
    # pick a randomly chosen flashcard that has no text transcript in side[0]
    resource_database = get_resource_database()
    while True:
        url = url_list[random.randint(0, len(url_list) - 1)]
        try:
            page = WikiPage.objects.get(name=url['absolute_pagename'])
        except WikiPage.DoesNotExist:
            url_list.remove(url)
            if len(url_list) > 0:
                continue
            else:
                raise Http404('wikipage does not exist: ' + url['path'])

        revision = page.get_latest_revision()
        urn = 'urn:' + revision.urn
        fcd = resource_database.get_resource_object(urn)
        card_index = random.randint(0, len(fcd.cards.array) - 1)
        fc = fcd.cards.array[card_index].get()
        prompt = fc.sides.array[prompt_side].get()
        answer = fc.sides.array[answer_side].get()
        if prompt and not answer:
            break

    resource = resource_json(fc)
    # temporary hack for FSI: add the URL this flashcard is taken from
    tmp_resource = json.loads(resource)
    tmp_resource['fsi_url'] = url['absolute_pagename']
    tmp_resource['fsi_index'] = card_index
    return render_json_response(tmp_resource)
Exemple #4
0
def fsw_get_flashcard(request, extra_tags, prompt_side, answer_side):
    """return a JSON flashcard object
    extra_tags: a list of tags the flashcard deck must have
    prompt_side: the index (0 based) of the side to use as prompt (which cannot be empty)
    answer_side: the index (0 based) of the side that must be empty
    """
    if request.method == 'GET':
        # get the language to search for
        language = request.GET.get('language', getattr(settings, "FIVE_SEC_WIDGET_DEFAULT_LANGUAGE", 'en'))
        search_tags = ['target-language:' + language] + extra_tags
        # get a list of pages tagged as we want
        try:
            url_list = search_pages(tags=search_tags)
        except IndexingError:
            raise Http404('Indexing error, contact the site administrator')

        if url_list != []:
            #url_list = [url for url in url_list if url.split(':')[0] == language]
            # pick a randomly chosen flashcard that has no text transcript in side[0]
            resource_database = get_resource_database()
            while True:
                url = url_list[random.randint(0, len(url_list) - 1)]
                try:
                    page = WikiPage.objects.get(name=url['absolute_pagename'])
                except WikiPage.DoesNotExist:
                    url_list.remove(url)
                    if len(url_list) > 0:
                        continue
                    else:
                        raise Http404('wikipage does not exist: ' + url['path'])

                revision = page.get_latest_revision()
                urn = 'urn:' + revision.urn
                fcd = resource_database.get_resource_object(urn)
                card_index = random.randint(0, len(fcd.cards.array) - 1)
                fc = fcd.cards.array[card_index].get()
                prompt = fc.sides.array[prompt_side].get()
                answer = fc.sides.array[answer_side].get()
                if prompt and not answer:
                    break

            resource = resource_json(fc)
            # temporary hack for FSI: add the URL this flashcard is taken from
            tmp_resource = json.loads(resource)
            tmp_resource['fsi_url'] = url['absolute_pagename']
            tmp_resource['fsi_index'] = card_index
            return render_json_response(tmp_resource)

        raise Http404('No material available for this language')