def comment(request, pk): ''' Adds new comment. ''' translation = get_object_or_404(Unit, pk=pk) translation.check_acl(request) form = CommentForm(request.POST) if form.is_valid(): if form.cleaned_data['scope'] == 'global': lang = None else: lang = translation.translation.language Comment.objects.add( translation, request.user, lang, form.cleaned_data['comment'] ) messages.success(request, _('Posted new comment')) else: messages.error(request, _('Failed to add comment!')) return redirect(request.POST.get('next', translation))
def comment(request, pk): """Add new comment.""" unit = get_object_or_404(Unit, pk=pk) request.user.check_access(unit.translation.component.project) if not request.user.has_perm('comment.add', unit.translation): raise PermissionDenied() form = CommentForm(request.POST) if form.is_valid(): if form.cleaned_data['scope'] == 'global': lang = None else: lang = unit.translation.language Comment.objects.add( unit, request.user, lang, form.cleaned_data['comment'] ) messages.success(request, _('Posted new comment')) else: messages.error(request, _('Failed to add comment!')) return redirect_next(request.POST.get('next'), unit)
def comment(request, pk): """ Adds new comment. """ translation = get_object_or_404(Unit, pk=pk) translation.check_acl(request) if request.POST.get("type", "") == "source": lang = None else: lang = translation.translation.language form = CommentForm(request.POST) if form.is_valid(): Comment.objects.add(translation, request.user, lang, form.cleaned_data["comment"]) messages.info(request, _("Posted new comment")) else: messages.error(request, _("Failed to add comment!")) return redirect(request.POST.get("next", translation))
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 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) except (Unit.DoesNotExist, IndexError): messages.warning(request, _('No string matched your search!')) return redirect(translation) # Check boundaries if not 0 <= offset < num_results: messages.info(request, _('You have reached end of translating.')) # 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) elif 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(request.user.profile, translation, unit) others = Unit.objects.same(unit, False) # Is it only this unit? if others.count() == 1: others = Unit.objects.none() 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': others, 'others_count': others.exclude(target=unit.target).count(), 'total': translation.unit_set.all().count(), 'search_url': search_result['url'], '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'].reset_offset(), '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(), })
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(initial={ 'scope': 'global' if unit.translation.is_source else 'translation' }), 'context_form': ContextForm(instance=unit.source_info), 'search_form': search_result['form'].reset_offset(), 'secondary': secondary, 'locked': locked, 'glossary': Dictionary.objects.get_words(unit), 'addword_form': InlineWordForm(), }, )
def translate(request, project, component, lang): """Generic entry point for translating, suggesting and searching.""" obj, project, unit_set = parse_params(request, project, component, lang) # Search results search_result = search(obj, unit_set, 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 checksum_form = ChecksumForm(unit_set, request.GET or request.POST) if checksum_form.is_valid(): unit = checksum_form.cleaned_data["unit"] try: offset = search_result["ids"].index(unit.id) + 1 except ValueError: messages.warning(request, _("No string matched your search!")) return redirect(obj) else: # 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"]] return redirect(obj) # Grab actual unit try: unit = 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(obj) # Check locks locked = unit.translation.component.locked # Some URLs we will most likely use base_unit_url = "{}?{}&offset=".format(obj.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" and "merge" not in request.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, unit, 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(request, unit, this_unit_url, next_unit_url) # Handle translation merging elif "merge" in request.POST and not locked: response = handle_merge(unit, request, next_unit_url) # Handle reverting elif "revert" in request.GET and not locked: response = handle_revert(unit, request, this_unit_url) # Pass possible redirect further if response is not None: return response # Show secondary languages for signed 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, unit) sort = get_sort_name(request) 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": obj, "project": project, "unit": unit, "nearby": unit.nearby(request.user.profile.nearby_strings), "nearby_keys": unit.nearby_keys(request.user.profile.nearby_strings), "others": get_other_units(unit), "search_url": search_result["url"], "search_items": search_result["items"], "search_query": search_result["query"], "offset": offset, "sort_name": sort["name"], "sort_query": sort["query"], "filter_name": search_result["name"], "filter_count": num_results, "filter_pos": offset, "form": form, "antispam": antispam, "comment_form": CommentForm( project, initial={ "scope": "global" if unit.is_source else "translation" }, ), "context_form": ContextForm(instance=unit.source_unit, user=request.user), "search_form": search_result["form"].reset_offset(), "secondary": secondary, "locked": locked, "glossary": Term.objects.get_terms(unit), "addterm_form": TermForm(project), "last_changes": unit.change_set.prefetch().order()[:10], "screenshots": (unit.source_unit.screenshots.all() | unit.screenshots.all()).order, "last_changes_url": urlencode(unit.translation.get_reverse_url_kwargs()), "display_checks": list(get_display_checks(unit)), "machinery_services": json.dumps(list(MACHINE_TRANSLATION_SERVICES.keys())), }, )
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 signed 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) sort = get_sort_name(request) 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), "search_url": search_result["url"], "search_items": search_result["items"], "search_query": search_result["query"], "offset": offset, "sort_name": sort["name"], "sort_query": sort["query"], "filter_name": search_result["name"], "filter_count": num_results, "filter_pos": offset, "form": form, "antispam": antispam, "comment_form": CommentForm( translation, initial={ "scope": "global" if unit.translation.is_source else "translation" }, ), "context_form": ContextForm(instance=unit.source_info, user=request.user), "search_form": search_result["form"].reset_offset(), "secondary": secondary, "locked": locked, "glossary": Dictionary.objects.get_words(unit), "addword_form": InlineWordForm(), "last_changes": unit.change_set.prefetch().order()[:10], "last_changes_url": urlencode(unit.translation.get_reverse_url_kwargs()), }, )
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(), })