def auto_translation(request, project, component, lang): translation = get_translation(request, project, component, lang) project = translation.component.project if not request.user.has_perm('translation.auto', project): raise PermissionDenied() autoform = AutoForm(request.user, translation, request.POST) if translation.component.locked or not autoform.is_valid(): messages.error(request, _('Failed to process form!')) show_form_errors(request, autoform) return redirect(translation) auto = AutoTranslate(request.user, translation, autoform.cleaned_data['type'], request=request) if autoform.cleaned_data['auto_source'] == 'mt': auto.process_mt( autoform.cleaned_data['engines'], autoform.cleaned_data['threshold'], ) else: auto.process_others(autoform.cleaned_data['component'], ) import_message( request, auto.updated, _('Automatic translation completed, no strings were updated.'), ungettext('Automatic translation completed, %d string was updated.', 'Automatic translation completed, %d strings were updated.', auto.updated)) return redirect(translation)
def zen(request, project, component, lang): """Generic entry point for translating, suggesting and searching.""" translation = get_translation(request, project, component, lang) search_result, unitdata = get_zen_unitdata(translation, request) sort = get_sort_name(request) # Handle redirects if isinstance(search_result, HttpResponse): return search_result return render( request, "zen.html", { "object": translation, "project": translation.component.project, "unitdata": unitdata, "search_query": search_result["query"], "filter_name": search_result["name"], "filter_count": len(search_result["ids"]), "sort_name": sort["name"], "sort_query": sort["query"], "last_section": search_result["last_section"], "search_url": search_result["url"], "offset": search_result["offset"], "search_form": search_result["form"].reset_offset(), }, )
def zen(request, project, component, lang): """Generic entry point for translating, suggesting and searching.""" translation = get_translation(request, project, component, lang) search_result, unitdata = get_zen_unitdata(translation, request) # Handle redirects if isinstance(search_result, HttpResponse): return search_result return render( request, 'zen.html', { 'object': translation, 'project': translation.component.project, 'unitdata': unitdata, 'search_query': search_result['query'], 'filter_name': search_result['name'], 'filter_count': len(search_result['ids']), 'last_section': search_result['last_section'], 'search_url': search_result['url'], 'offset': search_result['offset'], 'search_form': search_result['form'].reset_offset(), } )
def parse_url(request, project, component=None, lang=None): context = {"components": None} if component is None: if lang is None: obj = get_project(request, project) unit_set = Unit.objects.filter(translation__component__project=obj) context["project"] = obj else: project = get_project(request, project) language = get_object_or_404(Language, code=lang) obj = ProjectLanguage(project, language) unit_set = Unit.objects.filter( translation__component__project=project, translation__language=language) context["project"] = project context["language"] = language elif lang is None: obj = get_component(request, project, component) unit_set = Unit.objects.filter(translation__component=obj) context["component"] = obj context["project"] = obj.project context["components"] = [obj] else: obj = get_translation(request, project, component, lang) unit_set = obj.unit_set.all() context["translation"] = obj context["component"] = obj.component context["project"] = obj.component.project context["components"] = [obj.component] if not request.user.has_perm("unit.edit", obj): raise PermissionDenied() return obj, unit_set, context
def new_unit(request, project, component, lang): translation = get_translation(request, project, component, lang) if not request.user.has_perm("unit.add", translation): raise PermissionDenied() form = get_new_unit_form(translation, request.user, request.POST) if not form.is_valid(): show_form_errors(request, form) else: if form.unit_exists(translation): messages.error(request, _("This string seems to already exist.")) else: # This is slow way of detecting unit, add_units should directly # create the database units, return them and they should be saved to # file as regular pending ones. existing = list(translation.unit_set.values_list("pk", flat=True)) translation.add_units(request, [form.as_tuple()]) messages.success(request, _("New string has been added.")) new_units = translation.unit_set.exclude(pk__in=existing) if form.cleaned_data["variant"]: for new_unit in new_units: flags = Flags(new_unit.extra_flags) flags.set_value("variant", form.cleaned_data["variant"]) new_unit.extra_flags = flags.format() new_unit.save( update_fields=["extra_flags"], same_content=True, run_checks=False, ) return redirect(new_unit) return redirect(translation)
def cleanup_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm('vcs.reset', obj): raise PermissionDenied() return perform_cleanup(request, obj)
def git_status_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm('meta:vcs.status', obj): raise PermissionDenied() target = obj.component if target.is_repo_link: target = target.linked_component return render( request, 'js/git-status.html', { 'object': obj, 'translation': obj, 'project': obj.component.project, 'changes': Change.objects.filter( action__in=Change.ACTIONS_REPOSITORY, component=target, ).order()[:10], 'statuses': [(None, obj.component.repository.status)], })
def push_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm('vcs.push', obj): raise PermissionDenied() return perform_push(request, obj)
def update_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm('vcs.update', obj): raise PermissionDenied() return perform_update(request, obj)
def reset_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm('vcs.reset', obj): raise PermissionDenied() return perform_reset(request, obj)
def git_status_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm("meta:vcs.status", obj): raise PermissionDenied() target = obj.component if target.is_repo_link: target = target.linked_component return render( request, "js/git-status.html", { "object": obj, "translation": obj, "project": obj.component.project, "changes": Change.objects.filter(action__in=Change.ACTIONS_REPOSITORY, component=target).order()[:10], "statuses": [(None, obj.component.repository.status)], "component": obj.component, }, )
def auto_translation(request, project, component, lang): translation = get_translation(request, project, component, lang) project = translation.component.project if not request.user.has_perm("translation.auto", project): raise PermissionDenied() autoform = AutoForm(translation.component, request.POST) if translation.component.locked or not autoform.is_valid(): messages.error(request, _("Failed to process form!")) show_form_errors(request, autoform) return redirect(translation) args = ( request.user.id, translation.id, autoform.cleaned_data["mode"], autoform.cleaned_data["filter_type"], autoform.cleaned_data["auto_source"], autoform.cleaned_data["component"], autoform.cleaned_data["engines"], autoform.cleaned_data["threshold"], ) if settings.CELERY_TASK_ALWAYS_EAGER: messages.success(request, auto_translate(*args)) else: task = auto_translate.delay(*args) messages.success(request, _("Automatic translation in progress"), f"task:{task.id}") return redirect(translation)
def update_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm("vcs.update", obj): raise PermissionDenied() return perform_update(request, obj)
def cleanup_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm("vcs.reset", obj): raise PermissionDenied() return perform_cleanup(request, obj)
def push_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm("vcs.push", obj): raise PermissionDenied() return perform_push(request, obj)
def show_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) obj.stats.ensure_all() last_changes = Change.objects.prefetch().order().filter( translation=obj)[:10] user = request.user # Get form form = get_upload_form(user, obj) search_form = SearchForm(request.user) return render( request, 'translation.html', { 'allow_index': True, 'object': obj, 'project': obj.component.project, 'form': form, 'download_form': DownloadForm(auto_id="id_dl_%s"), 'autoform': optional_form( AutoForm, user, 'translation.auto', obj, obj=obj.component), 'search_form': search_form, 'replace_form': optional_form(ReplaceForm, user, 'unit.edit', obj), 'bulk_state_form': optional_form(BulkStateForm, user, 'translation.auto', obj, user=user, obj=obj), 'new_unit_form': NewUnitForm(user, initial={'value': Unit(translation=obj, id_hash=-1)}), 'whiteboard_form': optional_form(WhiteboardForm, user, 'component.edit', obj), 'delete_form': optional_form(DeleteForm, user, 'translation.delete', obj, obj=obj), 'last_changes': last_changes, 'last_changes_url': urlencode(obj.get_reverse_url_kwargs()), 'other_translations': prefetch_stats(Translation.objects.prefetch().filter( component__project=obj.component.project, language=obj.language).exclude(pk=obj.pk)), 'exporters': list_exporters(obj), }, )
def git_status_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) target = obj.component if target.is_repo_link: target = target.linked_component return git_status_shared(request, obj, [obj.component])
def remove_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm('translation.delete', obj): raise PermissionDenied() return execute_locked( request, obj.component, _('Translation has been removed.'), obj.remove, user=request.user, )
def git_status_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) target = obj.component if target.is_repo_link: target = target.linked_component return git_status_shared( request, obj, Change.objects.filter(action__in=Change.ACTIONS_REPOSITORY, component=target).order()[:10], [obj.component], )
def new_unit(request, project, component, lang): translation = get_translation(request, project, component, lang) if not request.user.has_perm("unit.add", translation): raise PermissionDenied() form = get_new_unit_form(translation, request.user, request.POST) if not form.is_valid(): show_form_errors(request, form) else: created_unit = translation.add_unit(request, **form.as_kwargs()) messages.success(request, _("New string has been added.")) return redirect(created_unit) return redirect(translation)
def download_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) kwargs = {} if "format" in request.GET or "q" in request.GET: form = DownloadForm(request.GET) if not form.is_valid(): show_form_errors(request, form) return redirect(obj) kwargs["units"] = obj.unit_set.search(form.cleaned_data.get("q", "")) kwargs["fmt"] = form.cleaned_data["format"] return download_translation_file(obj, **kwargs)
def parse_params(request, project, component, lang): """Parses base object and unit set from request.""" if component == "-": project = get_project(request, project) language = get_object_or_404(Language, code=lang) obj = ProjectLanguage(project, language) unit_set = Unit.objects.filter(translation__component__project=project, translation__language=language) else: # Translation case obj = get_translation(request, project, component, lang) unit_set = obj.unit_set project = obj.component.project return obj, project, unit_set
def remove_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm('translation.delete', obj): raise PermissionDenied() form = DeleteForm(obj, request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj, '#delete') obj.remove(request.user) messages.success(request, _('Translation has been removed.')) return redirect(obj.component)
def new_unit(request, project, component, lang): translation = get_translation(request, project, component, lang) if not request.user.has_perm("unit.add", translation): raise PermissionDenied() form = get_new_unit_form(translation, request.user, request.POST) if not form.is_valid(): show_form_errors(request, form) else: if form.unit_exists(translation): messages.error(request, _("This string seems to already exist.")) else: translation.add_units(request, [form.as_tuple()]) messages.success(request, _("New string has been added.")) return redirect(translation)
def announcement_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm("component.edit", obj): raise PermissionDenied() form = AnnouncementForm(request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj, "#announcement") Announcement.objects.create(project=obj.component.project, component=obj.component, language=obj.language, **form.cleaned_data) return redirect(obj)
def download_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm("translation.download", obj): raise PermissionDenied() kwargs = {} if "format" in request.GET or "q" in request.GET: form = DownloadForm(request.GET) if not form.is_valid(): show_form_errors(request, form) return redirect(obj) kwargs["query_string"] = form.cleaned_data.get("q", "") kwargs["fmt"] = form.cleaned_data["format"] return download_translation_file(request, obj, **kwargs)
def whiteboard_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm('component.edit', obj): raise PermissionDenied() form = WhiteboardForm(request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj, '#whiteboard') WhiteboardMessage.objects.create(project=obj.component.project, component=obj.component, language=obj.language, **form.cleaned_data) return redirect(obj)
def load_zen(request, project, component, lang): """Load additional units for zen editor.""" translation = get_translation(request, project, component, lang) search_result, unitdata = get_zen_unitdata(translation, request) # Handle redirects if isinstance(search_result, HttpResponse): return search_result return render( request, 'zen-units.html', { 'object': translation, 'unitdata': unitdata, 'search_query': search_result['query'], 'search_url': search_result['url'], 'last_section': search_result['last_section'], })
def save_zen(request, project, component, lang): """Save handler for zen mode.""" def render_mesage(message): return render_to_string( 'message.html', {'tags': message.tags, 'message': message.message} ) translation = get_translation(request, project, component, lang) form = TranslationForm( request.user, translation, None, request.POST ) translationsum = '' if not form.is_valid(): show_form_errors(request, form) elif not request.user.has_perm('unit.edit', form.cleaned_data['unit']): messages.error( request, _('Insufficient privileges for saving translations.') ) else: unit = form.cleaned_data['unit'] perform_translation(unit, form, request) translationsum = hash_to_checksum(unit.get_target_hash()) response = { 'messages': '', 'state': 'success', 'translationsum': translationsum, } storage = get_messages(request) if storage: response['messages'] = '\n'.join([render_mesage(m) for m in storage]) tags = {m.tags for m in storage} if 'error' in tags: response['state'] = 'danger' elif 'warning' in tags: response['state'] = 'warning' elif 'info' in tags: response['state'] = 'info' return JsonResponse(data=response)
def download_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) kwargs = {} if 'format' in request.GET or 'type' in request.GET: form = DownloadForm(request.GET) if not form.is_valid(): show_form_errors(request, form) return redirect(obj) kwargs['units'] = obj.unit_set.search( form.cleaned_data, translation=obj, ) kwargs['fmt'] = form.cleaned_data['format'] return download_translation_file(obj, **kwargs)
def download_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) kwargs = {} if "format" in request.GET or "q" in request.GET: form = DownloadForm(request.GET) if not form.is_valid(): show_form_errors(request, form) return redirect(obj) kwargs["units"] = (obj.unit_set.search( form.cleaned_data.get("q", ""), project=obj.component.project).distinct().order_by( "position").prefetch_full()) kwargs["fmt"] = form.cleaned_data["format"] return download_translation_file(request, obj, **kwargs)
def whiteboard_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm('component.edit', obj): raise PermissionDenied() form = WhiteboardForm(request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj, '#whiteboard') WhiteboardMessage.objects.create( project=obj.component.project, component=obj.component, language=obj.language, **form.cleaned_data ) return redirect(obj)
def save_zen(request, project, component, lang): """Save handler for zen mode.""" translation = get_translation(request, project, component, lang) unit_set = translation.unit_set checksum_form = ChecksumForm(unit_set, request.POST) if not checksum_form.is_valid(): show_form_errors(request, checksum_form) return HttpResponseBadRequest("Invalid checksum") unit = checksum_form.cleaned_data["unit"] translationsum = "" form = TranslationForm(request.user, unit, request.POST) if not form.is_valid(): show_form_errors(request, form) elif not request.user.has_perm("unit.edit", unit): messages.error(request, _("Insufficient privileges for saving translations.")) else: perform_translation(unit, form, request) translationsum = hash_to_checksum(unit.get_target_hash()) response = { "messages": [], "state": "success", "translationsum": translationsum, "unit_flags": get_state_css(unit) if unit is not None else [], } storage = get_messages(request) if storage: response["messages"] = [{"tags": m.tags, "text": m.message} for m in storage] tags = {m.tags for m in storage} if "error" in tags: response["state"] = "danger" elif "warning" in tags: response["state"] = "warning" elif "info" in tags: response["state"] = "info" return JsonResponse(data=response)
def load_zen(request, project, component, lang): """Load additional units for zen editor.""" translation = get_translation(request, project, component, lang) search_result, unitdata = get_zen_unitdata(translation, request) # Handle redirects if isinstance(search_result, HttpResponse): return search_result return render( request, 'zen-units.html', { 'object': translation, 'unitdata': unitdata, 'search_query': search_result['query'], 'search_url': search_result['url'], 'last_section': search_result['last_section'], } )
def new_unit(request, project, component, lang): translation = get_translation(request, project, component, lang) if not request.user.has_perm('unit.add', translation): raise PermissionDenied() form = NewUnitForm(request.user, request.POST) if not form.is_valid(): show_form_errors(request, form) else: key = form.cleaned_data['key'] value = form.cleaned_data['value'][0] if translation.unit_set.filter(context=key).exists(): messages.error( request, _('Translation with this key seem to already exist!')) else: translation.new_unit(request, key, value) messages.success(request, _('New string has been added.')) return redirect(translation)
def auto_translation(request, project, component, lang): translation = get_translation(request, project, component, lang) project = translation.component.project if not request.user.has_perm('translation.auto', project): raise PermissionDenied() autoform = AutoForm(request.user, translation, request.POST) if translation.component.locked or not autoform.is_valid(): messages.error(request, _('Failed to process form!')) show_form_errors(request, autoform) return redirect(translation) auto = AutoTranslate( request.user, translation, autoform.cleaned_data['type'], request=request ) if autoform.cleaned_data['auto_source'] == 'mt': auto.process_mt( autoform.cleaned_data['engines'], autoform.cleaned_data['threshold'], ) else: auto.process_others( autoform.cleaned_data['component'], ) import_message( request, auto.updated, _('Automatic translation completed, no strings were updated.'), ungettext( 'Automatic translation completed, %d string was updated.', 'Automatic translation completed, %d strings were updated.', auto.updated ) ) return redirect(translation)
def parse_url(request, project, component=None, lang=None): context = {} if component is None: obj = get_project(request, project) unit_set = Unit.objects.filter(translation__component__project=obj) context['project'] = obj elif lang is None: obj = get_component(request, project, component) unit_set = Unit.objects.filter(translation__component=obj) context['component'] = obj context['project'] = obj.project else: obj = get_translation(request, project, component, lang) unit_set = obj.unit_set context['translation'] = obj context['component'] = obj.component context['project'] = obj.component.project if not request.user.has_perm('unit.edit', obj): raise PermissionDenied() return obj, unit_set, context
def new_unit(request, project, component, lang): translation = get_translation(request, project, component, lang) if not request.user.has_perm('unit.add', translation): raise PermissionDenied() form = NewUnitForm(request.user, request.POST) if not form.is_valid(): show_form_errors(request, form) else: key = form.cleaned_data['key'] value = form.cleaned_data['value'][0] if translation.unit_set.filter(context=key).exists(): messages.error( request, _('Translation with this key seem to already exist!') ) else: translation.new_unit(request, key, value) messages.success( request, _('New string has been added.') ) return redirect(translation)
def git_status_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) if not request.user.has_perm('meta:vcs.status', obj): raise PermissionDenied() target = obj.component if target.is_repo_link: target = target.linked_component return render( request, 'js/git-status.html', { 'object': obj, 'translation': obj, 'project': obj.component.project, 'changes': Change.objects.filter( action__in=Change.ACTIONS_REPOSITORY, component=target, )[:10], 'statuses': [(None, obj.component.repository.status)], } )
def get_object(self, request, project, component, lang): return get_translation(request, project, component, lang)
def show_translation(request, project, component, lang): obj = get_translation(request, project, component, lang) obj.stats.ensure_all() last_changes = Change.objects.prefetch().filter(translation=obj)[:10] user = request.user # Get form form = get_upload_form(user, obj) # Search form for everybody search_form = SearchForm() # Review form for logged in users if user.is_anonymous: review_form = None else: review_form = ReviewForm( initial={'exclude_user': user.username} ) return render( request, 'translation.html', { 'allow_index': True, 'object': obj, 'project': obj.component.project, 'form': form, 'download_form': DownloadForm(), 'autoform': optional_form( AutoForm, user, 'translation.auto', obj, user=user, obj=obj ), 'search_form': search_form, 'review_form': review_form, 'replace_form': optional_form(ReplaceForm, user, 'unit.edit', obj), 'bulk_state_form': optional_form( BulkStateForm, user, 'translation.auto', obj, user=user, obj=obj ), 'new_unit_form': NewUnitForm( user, initial={ 'value': Unit(translation=obj, id_hash=-1), }, ), 'whiteboard_form': optional_form( WhiteboardForm, user, 'component.edit', obj ), 'delete_form': optional_form( DeleteForm, user, 'translation.delete', obj, obj=obj ), 'last_changes': last_changes, 'last_changes_url': urlencode(obj.get_reverse_url_kwargs()), 'show_only_component': True, 'other_translations': prefetch_stats( Translation.objects.prefetch().filter( component__project=obj.component.project, language=obj.language, ).exclude( pk=obj.pk ) ), 'exporters': list_exporters(obj), } )
def upload_translation(request, project, component, lang): """Handling of translation uploads.""" obj = get_translation(request, project, component, lang) if not request.user.has_perm('upload.perform', obj): raise PermissionDenied() # Check method and lock if obj.component.locked: messages.error(request, _('Access denied.')) return redirect(obj) # Get correct form handler based on permissions form = get_upload_form( request.user, obj, request.POST, request.FILES ) # Check form validity if not form.is_valid(): messages.error(request, _('Please fix errors in the form.')) show_form_errors(request, form) return redirect(obj) # Create author name author = None if (request.user.has_perm('upload.authorship', obj) and form.cleaned_data['author_name'] != '' and form.cleaned_data['author_email'] != ''): author = '{0} <{1}>'.format( form.cleaned_data['author_name'], form.cleaned_data['author_email'] ) # Check for overwriting overwrite = False if request.user.has_perm('upload.overwrite', obj): overwrite = form.cleaned_data['upload_overwrite'] # Do actual import try: not_found, skipped, accepted, total = obj.merge_upload( request, request.FILES['file'], overwrite, author, method=form.cleaned_data['method'], fuzzy=form.cleaned_data['fuzzy'], ) if total == 0: message = _('No strings were imported from the uploaded file.') else: message = ungettext( 'Processed {0} string from the uploaded files ' '(skipped: {1}, not found: {2}, updated: {3}).', 'Processed {0} strings from the uploaded files ' '(skipped: {1}, not found: {2}, updated: {3}).', total ).format(total, skipped, not_found, accepted) if accepted == 0: messages.warning(request, message) else: messages.success(request, message) except Exception as error: messages.error( request, _('File content merge failed: %s') % force_text(error) ) report_error(error, request) return redirect(obj)
def translate(request, project, component, lang): """Generic entry point for translating, suggesting and searching.""" translation = get_translation(request, project, component, lang) # Check locks locked = translation.component.locked # Search results search_result = search(translation, request) # Handle redirects if isinstance(search_result, HttpResponse): return search_result # Get numer of results num_results = len(search_result['ids']) # Search offset offset = search_result['offset'] # Checksum unit access if search_result['checksum']: try: unit = translation.unit_set.get(id_hash=search_result['checksum']) offset = search_result['ids'].index(unit.id) + 1 except (Unit.DoesNotExist, ValueError): messages.warning(request, _('No string matched your search!')) return redirect(translation) # Check boundaries if not 0 < offset <= num_results: messages.info(request, _('The translation has come to an end.')) # Delete search del request.session[search_result['key']] # Redirect to translation return redirect(translation) # Some URLs we will most likely use base_unit_url = '{0}?{1}&offset='.format( translation.get_translate_url(), search_result['url'] ) this_unit_url = base_unit_url + str(offset) next_unit_url = base_unit_url + str(offset + 1) response = None # Any form submitted? if 'skip' in request.POST: return redirect(next_unit_url) if request.method == 'POST': if (not locked and 'accept' not in request.POST and 'accept_edit' not in request.POST and 'delete' not in request.POST and 'spam' not in request.POST and 'upvote' not in request.POST and 'downvote' not in request.POST): # Handle translation response = handle_translate( request, translation, this_unit_url, next_unit_url ) elif not locked or 'delete' in request.POST or 'spam' in request.POST: # Handle accepting/deleting suggestions response = handle_suggestions( translation, request, this_unit_url, next_unit_url, ) # Handle translation merging elif 'merge' in request.GET and not locked: response = handle_merge( translation, request, next_unit_url ) # Handle reverting elif 'revert' in request.GET and not locked: response = handle_revert( translation, request, this_unit_url ) # Pass possible redirect further if response is not None: return response # Grab actual unit try: unit = translation.unit_set.get(pk=search_result['ids'][offset - 1]) except Unit.DoesNotExist: # Can happen when using SID for other translation messages.error(request, _('Invalid search string!')) return redirect(translation) # Show secondary languages for logged in users if request.user.is_authenticated: secondary = unit.get_secondary_units(request.user) else: secondary = None # Spam protection antispam = AntispamForm() # Prepare form form = TranslationForm(request.user, translation, unit) return render( request, 'translate.html', { 'this_unit_url': this_unit_url, 'first_unit_url': base_unit_url + '1', 'last_unit_url': base_unit_url + str(num_results), 'next_unit_url': next_unit_url, 'prev_unit_url': base_unit_url + str(offset - 1), 'object': translation, 'project': translation.component.project, 'unit': unit, 'others': get_other_units(unit), 'total': translation.unit_set.all().count(), 'search_url': search_result['url'], 'search_items': search_result['items'], 'search_query': search_result['query'], 'offset': offset, 'filter_name': search_result['name'], 'filter_count': num_results, 'filter_pos': offset, 'form': form, 'antispam': antispam, 'comment_form': CommentForm(), 'search_form': search_result['form'].reset_offset(), 'secondary': secondary, 'locked': locked, 'glossary': Dictionary.objects.get_words(unit), 'addword_form': InlineWordForm(), } )