def local(request, document_id, grade): document = get_object_or_404(Document, pk=document_id) if request.method == 'POST': WordFormSet = modelformset_factory( LocalWord, form=RestrictedWordForm, exclude=('document', 'isConfirmed', 'isDeferred', 'grade'), can_delete=True) formset = WordFormSet(request.POST, queryset=LocalWord.objects.filter(grade=grade, document=document)) if formset.is_valid(): instances = formset.save() writeLocalTables([document]) redirect = 'dictionary_local_g1' if grade == 1 else 'dictionary_local_g2' return HttpResponseRedirect(reverse(redirect, args=[document_id])) else: return render_to_response('dictionary/local.html', locals(), context_instance=RequestContext(request)) filterform = FilterForm(request.GET) if filterform.is_valid(): currentFilter = filterform.cleaned_data['filter'] words_list = LocalWord.objects.filter(grade=grade, document=document, untranslated__contains=currentFilter).order_by('untranslated', 'type') paginator = Paginator(words_list, MAX_WORDS_PER_PAGE) try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 try: words = paginator.page(page) except InvalidPage: words = paginator.page(paginator.num_pages) WordFormSet = modelformset_factory( LocalWord, form=RestrictedWordForm, exclude=('document', 'isConfirmed', 'isDeferred', 'grade'), can_delete=True, extra=0) formset = WordFormSet(queryset=words.object_list) return render_to_response('dictionary/local.html', locals(), context_instance=RequestContext(request))
def confirm(request, grade, deferred=False): if [word for word in get_conflicting_words(grade)]: redirect = ('dictionary_confirm_deferred_conflicting_duplicates_g' if deferred else 'dictionary_confirm_conflicting_duplicates_g') + str(grade) return HttpResponseRedirect(reverse(redirect)) WordFormSet = formset_factory(ConfirmDeferredWordForm if deferred else ConfirmWordForm, extra=0) if request.method == 'POST': formset = WordFormSet(request.POST) if formset.is_valid(): # FIXME: in Djano 1.3+ formset formmsets are iterable, so you can just say # for form in formset: for form in formset.forms: update_word_tables(form, grade, deferred) # FIXME: in principle we need to regenerate the liblouis tables, # i.e. the white lists now. However we do this asynchronously # (using a cron job) for now. There are several reasons for this: # 1) It is slow as hell if done inside a transaction. To do this # outside the transaction we need transaction context managers # (https://docs.djangoproject.com/en/1.3/topics/db/transactions/#controlling-transaction-management-in-views) # which are only available in Django 1.3. # 2) We need to serialize the table writing so they do not write # on top of each other. This is easy if it is done periodically. # 3) Of course it would be nice to use some kind of message queue # for this (e.g. rabbitmq and celery), but for now this poor mans # solution seems good enough # redirect to self as there might be more words redirect = ('dictionary_confirm_deferred_g' if deferred else 'dictionary_confirm_g') + str(grade) return HttpResponseRedirect(reverse(redirect)) else: return render(request, 'dictionary/confirm.html', locals()) # create a default for all unconfirmed homographs which have no default, i.e. no restriction word entry unconfirmed_homographs = set((smart_unicode(word) for word in LocalWord.objects.filter(grade=grade, type=5, isConfirmed=False, isDeferred=deferred, document__state__sort_order=final_sort_order).values_list('untranslated', flat=True))) if unconfirmed_homographs: covered_entries = set((smart_unicode(word) for word in chain( LocalWord.objects.filter(grade=grade, type=0, untranslated__in=unconfirmed_homographs).values_list('untranslated', flat=True), GlobalWord.objects.filter(grade=grade, type=0, untranslated__in=unconfirmed_homographs).values_list('untranslated', flat=True)))) for word in unconfirmed_homographs - covered_entries: document = Document.objects.filter(localword__grade=grade, localword__type=5, localword__isConfirmed=False, localword__untranslated=word)[0] w = LocalWord(untranslated=word, braille=translate(getTables(grade), word), grade=grade, type=0, document=document) w.save() filterform = FilterForm(request.GET) if filterform.is_valid(): currentFilter = filterform.cleaned_data['filter'] words_to_confirm = LocalWord.objects.filter(grade=grade, isConfirmed=False, isDeferred=deferred, untranslated__contains=currentFilter, document__state__sort_order=final_sort_order).order_by('untranslated', 'type').values('untranslated', 'braille', 'type', 'homograph_disambiguation', 'isLocal').distinct() paginator = Paginator(words_to_confirm, MAX_WORDS_PER_PAGE) try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 try: words = paginator.page(page) except InvalidPage: words = paginator.page(paginator.num_pages) have_type = any((word['type']!=0 for word in words.object_list)) have_homograph_disambiguation = any((word['homograph_disambiguation']!='' for word in words.object_list)) formset = WordFormSet(initial=words.object_list) return render(request, 'dictionary/confirm.html', locals())