def save_zen(request, project, subproject, lang): ''' Save handler for zen mode. ''' translation = get_translation(request, project, subproject, lang) user_locked = translation.is_user_locked(request.user) form = TranslationForm(translation, None, request.POST) if not can_translate(request.user, translation): messages.error( request, _('You don\'t have privileges to save translations!') ) elif not form.is_valid(): messages.error(request, _('Failed to save translation!')) elif not user_locked: unit = form.cleaned_data['unit'] perform_translation(unit, form, request) return render( request, 'zen-response.html', {}, )
def show_translation(request, project, subproject, lang): obj = get_translation(request, project, subproject, lang) last_changes = Change.objects.prefetch().filter(translation=obj)[:10] # Check locks obj.is_locked(request.user) # Get form form = get_upload_form(request.user, obj.subproject.project)() # Is user allowed to do automatic translation? if can_automatic_translation(request.user, obj.subproject.project): autoform = AutoForm(obj, request.user) else: autoform = None # Search form for everybody search_form = SearchForm() # Review form for logged in users if request.user.is_anonymous(): review_form = None else: review_form = ReviewForm( initial={ 'date': timezone.now().date() - datetime.timedelta(days=31) }) replace_form = None if can_translate(request.user, obj): replace_form = ReplaceForm() return render( request, 'translation.html', { 'object': obj, 'project': obj.subproject.project, 'form': form, 'autoform': autoform, 'search_form': search_form, 'review_form': review_form, 'replace_form': replace_form, 'last_changes': last_changes, 'last_changes_url': urlencode(obj.get_kwargs()), 'show_only_component': True, 'other_translations': Translation.objects.prefetch().filter( subproject__project=obj.subproject.project, language=obj.language, ).exclude(pk=obj.pk), })
def handle_revert(translation, request, next_unit_url): if not can_translate(request.user, translation): messages.error( request, _('You don\'t have privileges to save translations!') ) return revertform = RevertForm(translation, request.GET) if not revertform.is_valid(): return unit = revertform.cleaned_data['unit'] change = Change.objects.get( pk=revertform.cleaned_data['revert'] ) if unit.checksum != change.unit.checksum: messages.error( request, _('Can not revert to different unit!') ) elif change.target == "": messages.error( request, _('Can not revert to empty translation!') ) else: # Store unit unit.target = change.target unit.save_backend(request, change_action=Change.ACTION_REVERT) # Redirect to next entry return HttpResponseRedirect(next_unit_url)
def handle_merge(translation, request, next_unit_url): ''' Handles unit merging. ''' if not can_translate(request.user, translation): messages.error(request, _('You don\'t have privileges to save translations!')) return mergeform = MergeForm(translation, request.GET) if not mergeform.is_valid(): messages.error(request, _('Invalid merge request!')) return unit = mergeform.cleaned_data['unit'] merged = Unit.objects.get(pk=mergeform.cleaned_data['merge']) if unit.checksum != merged.checksum: messages.error(request, _('Can not merge different messages!')) else: # Store unit unit.target = merged.target unit.fuzzy = merged.fuzzy saved = unit.save_backend(request) # Update stats if there was change if saved: request.user.profile.translated += 1 request.user.profile.save() # Redirect to next entry return HttpResponseRedirect(next_unit_url)
def search_replace(request, project, subproject, lang): translation = get_translation(request, project, subproject, lang) if not can_translate(request.user, translation): raise PermissionDenied() form = ReplaceForm(request.POST) if translation.subproject.locked or not form.is_valid(): messages.error(request, _('Failed to process form!')) return redirect(translation) search_text = form.cleaned_data['search'] replacement = form.cleaned_data['replacement'] matching = translation.unit_set.filter(target__contains=search_text) updated = matching.count() for unit in matching.iterator(): unit.target = unit.target.replace(search_text, replacement) unit.save_backend(request, change_action=Change.ACTION_REPLACE) import_message( request, updated, _('Search and replace completed, no strings were updated.'), ungettext('Search and replace completed, %d string was updated.', 'Search and replace completed, %d strings were updated.', updated)) return redirect(translation)
def handle_merge(translation, request, next_unit_url): """ Handles unit merging. """ if not can_translate(request.user, translation): messages.error(request, _("You don't have privileges to save translations!")) return mergeform = MergeForm(translation, request.GET) if not mergeform.is_valid(): messages.error(request, _("Invalid merge request!")) return unit = mergeform.cleaned_data["unit"] merged = Unit.objects.get(pk=mergeform.cleaned_data["merge"]) if unit.checksum != merged.checksum: messages.error(request, _("Can not merge different messages!")) else: # Store unit unit.target = merged.target unit.fuzzy = merged.fuzzy saved = unit.save_backend(request) # Update stats if there was change if saved: request.user.profile.translated += 1 request.user.profile.save() # Redirect to next entry return HttpResponseRedirect(next_unit_url)
def search_replace(request, project, subproject, lang): translation = get_translation(request, project, subproject, lang) if not can_translate(request.user, translation): raise PermissionDenied() form = ReplaceForm(request.POST) if translation.subproject.locked or not form.is_valid(): messages.error(request, _('Failed to process form!')) return redirect(translation) search_text = form.cleaned_data['search'] replacement = form.cleaned_data['replacement'] matching = translation.unit_set.filter(target__contains=search_text) updated = matching.count() for unit in matching.iterator(): unit.target = unit.target.replace(search_text, replacement) unit.save_backend(request, change_action=Change.ACTION_REPLACE) import_message( request, updated, _('Search and replace completed, no strings were updated.'), ungettext( 'Search and replace completed, %d string was updated.', 'Search and replace completed, %d strings were updated.', updated ) ) return redirect(translation)
def show_translation(request, project, subproject, lang): obj = get_translation(request, project, subproject, lang) last_changes = Change.objects.for_translation(obj)[:10] # Check locks obj.is_locked(request.user) # Get form form = get_upload_form(request.user, obj.subproject.project)() # Is user allowed to do automatic translation? if can_automatic_translation(request.user, obj.subproject.project): autoform = AutoForm(obj, request.user) else: autoform = None # Search form for everybody search_form = SearchForm() # Review form for logged in users if request.user.is_anonymous(): review_form = None else: review_form = ReviewForm( initial={ 'date': timezone.now().date() - datetime.timedelta(days=31) } ) replace_form = None if can_translate(request.user, obj): replace_form = ReplaceForm() return render( request, 'translation.html', { 'object': obj, 'project': obj.subproject.project, 'form': form, 'autoform': autoform, 'search_form': search_form, 'review_form': review_form, 'replace_form': replace_form, 'last_changes': last_changes, 'last_changes_url': urlencode(obj.get_kwargs()), 'show_only_component': True, 'other_translations': Translation.objects.prefetch().filter( subproject__project=obj.subproject.project, language=obj.language, ).exclude( pk=obj.pk ), } )
def handle_translate(translation, request, user_locked, this_unit_url, next_unit_url): ''' Saves translation or suggestion to database and backend. ''' # Antispam protection antispam = AntispamForm(request.POST) if not antispam.is_valid(): # Silently redirect to next entry return HttpResponseRedirect(next_unit_url) # Check whether translation is not outdated translation.check_sync() form = TranslationForm(translation, None, request.POST) if not form.is_valid(): return unit = form.cleaned_data['unit'] go_next = True if 'suggest' in request.POST: go_next = perform_suggestion(unit, form, request) elif not can_translate(request.user, unit.translation): messages.error( request, _('You don\'t have privileges to save translations!') ) elif not user_locked: # Custom commit message message = request.POST.get('commit_message') if message and message != unit.translation.commit_message: # Commit pending changes so that they don't get new message unit.translation.commit_pending(request, request.user) # Store new commit message unit.translation.commit_message = message unit.translation.save() go_next = perform_translation(unit, form, request) # Redirect to next entry if go_next: return HttpResponseRedirect(next_unit_url) else: return HttpResponseRedirect(this_unit_url)
def save_zen(request, project, subproject, lang): """ Save handler for zen mode. """ translation = get_translation(request, project, subproject, lang) user_locked = translation.is_user_locked(request.user) form = TranslationForm(translation, None, request.POST) if not can_translate(request.user, translation): messages.error(request, _("You don't have privileges to save translations!")) elif not form.is_valid(): messages.error(request, _("Failed to save translation!")) elif not user_locked: unit = form.cleaned_data["unit"] perform_translation(unit, form, request) return render(request, "zen-response.html", {})
def get_upload_form(user, translation, *args): ''' Returns correct upload form based on user permissions. ''' project = translation.subproject.project if can_author_translation(user, project): form = ExtraUploadForm elif can_overwrite_translation(user, project): form = UploadForm else: form = SimpleUploadForm result = form(*args) if not can_translate(user, translation): result.remove_translation_choice('translate') result.remove_translation_choice('fuzzy') if not can_suggest(user, translation): result.remove_translation_choice('suggest') return result
def search_replace(request, project, subproject=None, lang=None): if subproject is None: obj = get_project(request, project) perms = {'project': obj} unit_set = Unit.objects.filter(translation__subproject__project=obj) elif lang is None: obj = get_subproject(request, project, subproject) perms = {'project': obj.project} unit_set = Unit.objects.filter(translation__subproject=obj) else: obj = get_translation(request, project, subproject, lang) perms = {'translation': obj} unit_set = obj.unit_set if not can_translate(request.user, **perms): raise PermissionDenied() form = ReplaceForm(request.POST) if not form.is_valid(): messages.error(request, _('Failed to process form!')) return redirect(obj) search_text = form.cleaned_data['search'] replacement = form.cleaned_data['replacement'] matching = unit_set.filter(target__contains=search_text) updated = matching.count() for unit in matching.iterator(): unit.target = unit.target.replace(search_text, replacement) unit.save_backend(request, change_action=Change.ACTION_REPLACE) import_message( request, updated, _('Search and replace completed, no strings were updated.'), ungettext( 'Search and replace completed, %d string was updated.', 'Search and replace completed, %d strings were updated.', updated ) ) return redirect(obj)