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))
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))
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)
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')