def perform_suggestion(unit, form, request): ''' Handle suggesion saving. ''' if form.cleaned_data['target'][0] == '': messages.error(request, _('Your suggestion is empty!')) # Stay on same entry return False elif not can_suggest(request.user, unit.translation): # Need privilege to add messages.error( request, _('You don\'t have privileges to add suggestions!') ) # Stay on same entry return False # Invite user to become translator if there is nobody else recent_changes = Change.objects.content(True).filter( translation=unit.translation, ).exclude( user=None ) if not recent_changes.exists(): messages.info(request, _( 'There is currently no active translator for this ' 'translation, please consider becoming a translator ' 'as your suggestion might otherwise remain unreviewed.' )) # Create the suggestion Suggestion.objects.add( unit, join_plural(form.cleaned_data['target']), request, ) return True
def perform_suggestion(unit, form, request): ''' Handle suggesion saving. ''' if form.cleaned_data['target'][0] == '': messages.error(request, _('Your suggestion is empty!')) # Stay on same entry return False elif not can_suggest(request.user, unit.translation): # Need privilege to add messages.error(request, _('You don\'t have privileges to add suggestions!')) # Stay on same entry return False # Invite user to become translator if there is nobody else recent_changes = Change.objects.content(True).filter( translation=unit.translation, ).exclude(user=None) if not recent_changes.exists(): messages.info( request, _('There is currently no active translator for this ' 'translation, please consider becoming a translator ' 'as your suggestion might otherwise remain unreviewed.')) # Create the suggestion Suggestion.objects.add( unit, join_plural(form.cleaned_data['target']), request, ) return True
def weblate_logout(request): """ Logout handler, just wrapper around standard logout. """ messages.info(request, _("Thanks for using Weblate!")) return auth_views.logout(request, next_page=reverse("home"))
def weblate_logout(request): ''' Logout handler, just wrapper around standard logout. ''' messages.info(request, _('Thanks for using Weblate!')) return auth_views.logout( request, next_page=reverse('home'), )
def perform_translation(unit, form, request): ''' Handles translation and stores it to a backend. ''' # Remember old checks oldchecks = set( unit.active_checks().values_list('check', flat=True) ) # Run AutoFixes on user input if not unit.translation.is_template(): new_target, fixups = fix_target(form.cleaned_data['target'], unit) else: new_target = form.cleaned_data['target'] fixups = [] # Save saved = unit.translate( request, new_target, form.cleaned_data['fuzzy'] ) # Warn about applied fixups if len(fixups) > 0: messages.info( request, _('Following fixups were applied to translation: %s') % ', '.join([force_text(f) for f in fixups]) ) # Get new set of checks newchecks = set( unit.active_checks().values_list('check', flat=True) ) # Did we introduce any new failures? if saved and newchecks > oldchecks: # Show message to user messages.error( request, _( 'Some checks have failed on your translation: {0}' ).format( ', '.join( [force_text(CHECKS[check].name) for check in newchecks] ) ) ) # Stay on same entry return False return True
def delete_comment(request, pk): """ Deletes comment. """ comment_obj = get_object_or_404(Comment, pk=pk) comment_obj.project.check_acl(request) if not can_delete_comment(request.user, comment_obj.project): raise PermissionDenied() units = get_related_units(comment_obj) if units.exists(): fallback_url = units[0].get_absolute_url() else: fallback_url = comment_obj.project.get_absolute_url() comment_obj.delete() messages.info(request, _('Translation comment has been deleted.')) return redirect(request.POST.get('next', fallback_url))
def translate(request, project, subproject, lang): ''' Generic entry point for translating, suggesting and searching. ''' translation = get_translation(request, project, subproject, lang) # Check locks user_locked = translation.is_user_locked(request.user) project_locked = translation.subproject.locked own_lock = translation.lock_user == request.user locked = project_locked or user_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 try: offset = int(request.GET.get('offset', search_result.get('offset', 0))) except ValueError: offset = 0 # Check boundaries if offset < 0 or offset >= num_results: messages.info(request, _('You have reached end of translating.')) # Delete search del request.session['search_%s' % search_result['search_id']] # Redirect to translation return redirect(translation) # Some URLs we will most likely use base_unit_url = '%s?sid=%s&offset=' % ( translation.get_translate_url(), search_result['search_id'], ) this_unit_url = base_unit_url + str(offset) next_unit_url = base_unit_url + str(offset + 1) response = None # Any form submitted? if request.method == 'POST' and not project_locked: # Handle accepting/deleting suggestions if ('accept' not in request.POST and 'accept_edit' not in request.POST and 'delete' not in request.POST and 'upvote' not in request.POST and 'downvote' not in request.POST): response = handle_translate( translation, request, user_locked, this_unit_url, next_unit_url ) elif not locked: 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]) 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(translation, unit) return render( request, 'translate.html', { 'this_unit_url': this_unit_url, 'first_unit_url': base_unit_url + '0', 'last_unit_url': base_unit_url + str(num_results - 1), 'next_unit_url': next_unit_url, 'prev_unit_url': base_unit_url + str(offset - 1), 'object': translation, 'project': translation.subproject.project, 'unit': unit, 'others': Unit.objects.same(unit).exclude(target=unit.target), 'total': translation.unit_set.all().count(), 'search_id': search_result['search_id'], 'search_query': search_result['query'], 'offset': offset, 'filter_name': search_result['name'], 'filter_count': num_results, 'filter_pos': offset + 1, 'form': form, 'antispam': antispam, 'comment_form': CommentForm(), 'search_form': SearchForm(), 'update_lock': own_lock, 'secondary': secondary, 'locked': locked, 'user_locked': user_locked, 'project_locked': project_locked, 'glossary': Dictionary.objects.get_words(unit), 'addword_form': InlineWordForm(), } )
def translate(request, project, subproject, lang): ''' Generic entry point for translating, suggesting and searching. ''' translation = get_translation(request, project, subproject, lang) # Check locks user_locked = translation.is_user_locked(request.user) project_locked = translation.subproject.locked locked = project_locked or user_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 try: offset = int(request.GET.get('offset', search_result.get('offset', 0))) except ValueError: offset = 0 # Check boundaries if offset < 0 or offset >= num_results: messages.info(request, _('You have reached end of translating.')) # Delete search del request.session['search_%s' % search_result['search_id']] # Redirect to translation return redirect(translation) # Some URLs we will most likely use base_unit_url = '%s?sid=%s&offset=' % ( translation.get_translate_url(), search_result['search_id'], ) this_unit_url = base_unit_url + str(offset) next_unit_url = base_unit_url + str(offset + 1) response = None # Any form submitted? if request.method == 'POST' and not project_locked: # Handle accepting/deleting suggestions if ('accept' not in request.POST and 'accept_edit' not in request.POST and 'delete' not in request.POST and 'upvote' not in request.POST and 'downvote' not in request.POST): response = handle_translate(translation, request, user_locked, this_unit_url, next_unit_url) elif not locked: 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]) 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(translation, unit) return render( request, 'translate.html', { 'this_unit_url': this_unit_url, 'first_unit_url': base_unit_url + '0', 'last_unit_url': base_unit_url + str(num_results - 1), 'next_unit_url': next_unit_url, 'prev_unit_url': base_unit_url + str(offset - 1), 'object': translation, 'project': translation.subproject.project, 'unit': unit, 'others': Unit.objects.same(unit).exclude(target=unit.target), 'total': translation.unit_set.all().count(), 'search_id': search_result['search_id'], 'search_query': search_result['query'], 'offset': offset, 'filter_name': search_result['name'], 'filter_count': num_results, 'filter_pos': offset + 1, 'form': form, 'antispam': antispam, 'comment_form': CommentForm(), 'search_form': search_result['form'], 'update_lock': translation.lock_user == request.user, 'secondary': secondary, 'locked': locked, 'user_locked': user_locked, 'project_locked': project_locked, 'glossary': Dictionary.objects.get_words(unit), 'addword_form': InlineWordForm(), })