def show_project(request, project): obj = get_project(request, project) user = request.user dict_langs = Language.objects.filter(dictionary__project=obj).annotate( Count('dictionary')).order() last_changes = Change.objects.prefetch().order().filter(project=obj)[:10] language_stats = sort_unicode(obj.stats.get_language_stats(), lambda x: force_text(x.language.name)) # Paginate components of project. all_components = obj.component_set.select_related().order() components = prefetch_stats(get_paginator(request, all_components)) return render( request, 'project.html', { 'allow_index': True, 'object': obj, 'project': obj, 'dicts': dict_langs, 'last_changes': last_changes, 'last_changes_url': urlencode({'project': obj.slug}), 'language_stats': language_stats, 'search_form': SearchForm(), 'whiteboard_form': optional_form(WhiteboardForm, user, 'project.edit', obj), 'delete_form': optional_form(DeleteForm, user, 'project.edit', obj, obj=obj), 'rename_form': optional_form(ProjectRenameForm, user, 'project.edit', obj, request=request, instance=obj), 'replace_form': optional_form(ReplaceForm, user, 'unit.edit', obj), 'bulk_state_form': optional_form(BulkStateForm, user, 'translation.auto', obj, user=user, obj=obj), 'components': components, 'licenses': ', '.join(sorted({x.license for x in all_components if x.license})), })
def show_project(request, lang, project): try: obj = Language.objects.get(code=lang) except Language.DoesNotExist: obj = Language.objects.fuzzy_get(lang) if isinstance(obj, Language): return redirect(obj) raise Http404('No Language matches the given query.') pobj = get_project(request, project) last_changes = Change.objects.last_changes(request.user).filter( translation__language=obj, component__project=pobj)[:10] # Paginate translations. translation_list = obj.translation_set.prefetch().filter( component__project=pobj).order_by('component__project__slug', 'component__slug') translations = get_paginator(request, translation_list) return render( request, 'language-project.html', { 'allow_index': True, 'language': obj, 'project': pobj, 'last_changes': last_changes, 'last_changes_url': urlencode({ 'lang': obj.code, 'project': pobj.slug }), 'translations': translations, 'title': '{0} - {1}'.format(pobj, obj), 'show_only_component': True, 'search_form': SiteSearchForm(), })
def dashboard_user(request): """Home page of Weblate for authenticated user.""" user = request.user user_has_languages = user.is_authenticated and user.profile.languages.exists( ) user_translations = get_user_translations(request, user, user_has_languages) suggestions = get_suggestions(request, user, user_has_languages, user_translations) usersubscriptions = None componentlists = fetch_componentlists(request.user, user_translations) active_tab_id = user.profile.dashboard_view active_tab_slug = Profile.DASHBOARD_SLUGS.get(active_tab_id) if (active_tab_id == Profile.DASHBOARD_COMPONENT_LIST and user.profile.dashboard_component_list): active_tab_slug = user.profile.dashboard_component_list.tab_slug() if user.is_authenticated: usersubscriptions = user_translations.filter( component__project__in=user.watched_projects) if user.profile.hide_completed: usersubscriptions = get_untranslated(usersubscriptions) for componentlist in componentlists: componentlist.translations = get_untranslated( componentlist.translations) usersubscriptions = prefetch_stats(usersubscriptions) return render( request, "dashboard/user.html", { "allow_index": True, "suggestions": suggestions, "search_form": SearchForm(request.user), "usersubscriptions": get_paginator(request, usersubscriptions), "componentlists": componentlists, "all_componentlists": prefetch_stats( ComponentList.objects.filter( components__project_id__in=request.user.allowed_project_ids ).distinct().order()), "active_tab_slug": active_tab_slug, "reports_form": ReportsForm(), }, )
def show_project(request, project): obj = get_project(request, project) user = request.user dict_langs = Language.objects.filter( dictionary__project=obj ).annotate(Count('dictionary')) last_changes = Change.objects.prefetch().filter(project=obj)[:10] language_stats = sort_unicode( obj.stats.get_language_stats(), lambda x: force_text(x.language.name) ) # Paginate components of project. all_components = obj.component_set.select_related() components = prefetch_stats(get_paginator( request, all_components )) return render( request, 'project.html', { 'allow_index': True, 'object': obj, 'project': obj, 'dicts': dict_langs, 'last_changes': last_changes, 'last_changes_url': urlencode( {'project': obj.slug} ), 'language_stats': language_stats, 'language_count': Language.objects.filter( translation__component__project=obj ).distinct().count(), 'search_form': SearchForm(), 'whiteboard_form': optional_form( WhiteboardForm, user, 'project.edit', obj ), 'delete_form': optional_form( DeleteForm, user, 'project.edit', obj, obj=obj ), 'rename_form': optional_form( ProjectRenameForm, user, 'project.edit', obj, request=request, instance=obj ), 'replace_form': optional_form(ReplaceForm, user, 'unit.edit', obj), 'bulk_state_form': optional_form( BulkStateForm, user, 'translation.auto', obj, user=user, obj=obj ), 'components': components, 'licenses': ', '.join( sorted({x.license for x in all_components if x.license}) ), } )
def show_project(request, project): obj = get_project(request, project) dict_langs = Language.objects.filter(dictionary__project=obj).annotate( Count('dictionary')) last_changes = Change.objects.prefetch().filter(project=obj)[:10] language_stats = sort_unicode(obj.stats.get_language_stats(), lambda x: force_text(x.language.name)) # Is user allowed to do automatic translation? if request.user.has_perm('translation.auto', obj): mass_state_form = MassStateForm(request.user, obj) else: mass_state_form = None if request.user.has_perm('unit.edit', obj): replace_form = ReplaceForm() else: replace_form = None # Paginate components of project. all_components = obj.component_set.select_related() components = prefetch_stats(get_paginator(request, all_components)) return render( request, 'project.html', { 'allow_index': True, 'object': obj, 'project': obj, 'dicts': dict_langs, 'last_changes': last_changes, 'last_changes_url': urlencode({'project': obj.slug}), 'language_stats': language_stats, 'language_count': Language.objects.filter( translation__component__project=obj).distinct().count(), 'search_form': SearchForm(), 'replace_form': replace_form, 'mass_state_form': mass_state_form, 'components': components, 'licenses': ', '.join( sorted(set([x.license for x in all_components if x.license]))), })
def show_project(request, project): obj = get_project(request, project) user = request.user last_changes = Change.objects.prefetch().order().filter(project=obj)[:10] language_stats = sort_unicode( obj.stats.get_language_stats(), lambda x: force_str(x.language) ) # Paginate components of project. all_components = obj.component_set.prefetch().order() components = prefetch_stats(get_paginator(request, all_components)) return render( request, 'project.html', { 'allow_index': True, 'object': obj, 'project': obj, 'last_changes': last_changes, 'reports_form': ReportsForm(), 'last_changes_url': urlencode({'project': obj.slug}), 'language_stats': language_stats, 'search_form': SearchForm(request.user), 'whiteboard_form': optional_form(WhiteboardForm, user, 'project.edit', obj), 'delete_form': optional_form( DeleteForm, user, 'project.edit', obj, obj=obj ), 'rename_form': optional_form( ProjectRenameForm, user, 'project.edit', obj, request=request, instance=obj, ), 'replace_form': optional_form(ReplaceForm, user, 'unit.edit', obj), 'bulk_state_form': optional_form( BulkEditForm, user, 'translation.auto', obj, user=user, obj=obj, project=obj, auto_id="id_bulk_%s", ), 'components': components, 'licenses': obj.component_set.exclude(license='').order_by('license'), }, )
def list_projects(request): """List all projects.""" return render( request, "projects.html", { "allow_index": True, "projects": prefetch_project_flags( get_paginator(request, prefetch_stats(request.user.allowed_projects))), "title": _("Projects"), }, )
def review_source(request, project, component): """Listing of source strings to review.""" obj, source = get_source(request, project, component) # Grab search type and page number rqtype = request.GET.get('type', 'all') try: id_hash = checksum_to_hash(request.GET.get('checksum', '')) except ValueError: id_hash = None ignored = 'ignored' in request.GET expand = False query_string = {'type': rqtype} if ignored: query_string['ignored'] = 'true' # Filter units: if id_hash: sources = source.unit_set.filter(id_hash=id_hash) expand = True else: sources = source.unit_set.filter_type( rqtype, source.component.project, source.language, ignored ) sources = get_paginator(request, sources) return render( request, 'source-review.html', { 'object': obj, 'project': obj.project, 'source': source, 'page_obj': sources, 'query_string': urlencode(query_string), 'ignored': ignored, 'expand': expand, 'title': _('Review source strings in %s') % force_text(obj), } )
def show_glossary(request, project, lang): prj = get_project(request, project) lang = get_object_or_404(Language, code=lang) if request.method == "POST" and request.user.has_perm("glossary.add", prj): form = TermForm(prj, request.POST) if form.is_valid(): Term.objects.create( request.user, language=lang, source=form.cleaned_data["source"], target=form.cleaned_data["target"], glossary=form.cleaned_data["glossary"], ) return redirect_next(request.POST.get("next"), request.get_full_path()) form = TermForm(prj,) uploadform = GlossaryUploadForm(prj) terms = Term.objects.for_project(prj).filter(language=lang).order() letterform = LetterForm(request.GET) searchform = OneTermForm(request.GET) if searchform.is_valid() and searchform.cleaned_data["term"] != "": terms = terms.filter(source__substring=searchform.cleaned_data["term"]) search = searchform.cleaned_data["term"] else: search = "" if letterform.is_valid() and letterform.cleaned_data["letter"] != "": terms = terms.filter(source__istartswith=letterform.cleaned_data["letter"]) letter = letterform.cleaned_data["letter"] else: letter = "" terms = get_paginator(request, terms) last_changes = ( Change.objects.last_changes(request.user) .filter(project=prj, language=lang) .exclude(glossary_term=None)[:10] )
def review_source(request, project, component): """Listing of source strings to review.""" obj, source = get_source(request, project, component) # Grab search type and page number rqtype = request.GET.get('type', 'all') try: id_hash = checksum_to_hash(request.GET.get('checksum', '')) except ValueError: id_hash = None ignored = 'ignored' in request.GET expand = False query_string = {'type': rqtype} if ignored: query_string['ignored'] = 'true' # Filter units: if id_hash: sources = source.unit_set.filter(id_hash=id_hash) expand = True else: sources = source.unit_set.filter_type( rqtype, source.component.project, source.language, ignored ) sources = get_paginator(request, sources) return render( request, 'source-review.html', { 'object': obj, 'project': obj.project, 'source': source, 'page_obj': sources, 'query_string': urlencode(query_string), 'ignored': ignored, 'expand': expand, 'title': _('Review source strings in %s') % force_text(obj), } )
def show_project(request, lang, project): try: obj = Language.objects.get(code=lang) except Language.DoesNotExist: obj = Language.objects.fuzzy_get(lang) if isinstance(obj, Language): return redirect(obj) raise Http404('No Language matches the given query.') pobj = get_project(request, project) last_changes = Change.objects.last_changes(request.user).filter( translation__language=obj, component__project=pobj )[:10] # Paginate translations. translation_list = obj.translation_set.prefetch().filter( component__project=pobj ).order_by( 'component__project__slug', 'component__slug' ) translations = get_paginator(request, translation_list) return render( request, 'language-project.html', { 'allow_index': True, 'language': obj, 'project': pobj, 'last_changes': last_changes, 'last_changes_url': urlencode( {'lang': obj.code, 'project': pobj.slug} ), 'translations': translations, 'title': '{0} - {1}'.format(pobj, obj), 'show_only_component': True, 'search_form': SiteSearchForm(), } )
def show_project(request, lang, project): try: obj = Language.objects.get(code=lang) except Language.DoesNotExist: obj = Language.objects.fuzzy_get(lang) if isinstance(obj, Language): return redirect(obj) raise Http404("No Language matches the given query.") pobj = get_project(request, project) last_changes = Change.objects.last_changes(request.user).filter( language=obj, project=pobj)[:10] # Paginate translations. translation_list = (obj.translation_set.prefetch().filter( component__project=pobj).order_by("component__priority", "component__name")) translations = get_paginator(request, translation_list) return render( request, "language-project.html", { "allow_index": True, "language": obj, "project": pobj, "last_changes": last_changes, "last_changes_url": urlencode({ "lang": obj.code, "project": pobj.slug }), "translations": translations, "title": "{0} - {1}".format(pobj, obj), "search_form": SearchForm(request.user), "licenses": pobj.component_set.exclude(license="").order_by("license"), "language_stats": pobj.stats.get_single_language_stats(obj), }, )
def show_glossary(request, project, lang): prj = get_project(request, project) lang = get_object_or_404(Language, code=lang) if request.method == "POST" and request.user.has_perm("glossary.add", prj): form = TermForm(prj, request.POST) if form.is_valid(): Term.objects.create( request.user, language=lang, source=form.cleaned_data["source"], target=form.cleaned_data["target"], glossary=form.cleaned_data["glossary"], ) return redirect_next(request.POST.get("next"), request.get_full_path()) form = TermForm(prj) uploadform = GlossaryUploadForm(prj) terms = Term.objects.for_project(prj).filter(language=lang).order() letterform = LetterForm(request.GET) searchform = OneTermForm(request.GET) if searchform.is_valid() and searchform.cleaned_data["term"] != "": terms = terms.filter(source__substring=searchform.cleaned_data["term"]) search = searchform.cleaned_data["term"] else: search = "" if letterform.is_valid() and letterform.cleaned_data["letter"] != "": terms = terms.filter( source__istartswith=letterform.cleaned_data["letter"]) letter = letterform.cleaned_data["letter"] else: letter = "" terms = get_paginator(request, terms) last_changes = (Change.objects.last_changes(request.user).filter( project=prj, language=lang).exclude(glossary_term=None)[:10]) exporters = EXPORTERS.list_exporters_filter(EXPORT_TYPES) return render( request, "glossary.html", { "title": dict_title(prj, lang), "project": prj, "language": lang, "page_obj": terms, "exporters": exporters, "form": form, "query_string": urlencode({ "term": search, "letter": letter }), "uploadform": uploadform, "letterform": letterform, "searchform": searchform, "letter": letter, "last_changes": last_changes, "last_changes_url": urlencode(( ("project", prj.slug), ("lang", lang.code), ("action", Change.ACTION_DICTIONARY_NEW), ("action", Change.ACTION_DICTIONARY_EDIT), ("action", Change.ACTION_DICTIONARY_UPLOAD), )), }, )
def search(request, project=None, component=None, lang=None): """Perform site-wide search on units.""" is_ratelimited = not check_rate_limit("search", request) search_form = SearchForm(request.user, request.GET) context = {"search_form": search_form} if component: obj = get_component(request, project, component) context["component"] = obj context["project"] = obj.project context["back_url"] = obj.get_absolute_url() elif project: obj = get_project(request, project) context["project"] = obj context["back_url"] = obj.get_absolute_url() else: obj = None context["back_url"] = None if lang: s_language = get_object_or_404(Language, code=lang) context["language"] = s_language if obj: if component: context["back_url"] = obj.translation_set.get( language=s_language).get_absolute_url() else: context["back_url"] = reverse("project-language", kwargs={ "project": project, "lang": lang }) else: context["back_url"] = s_language.get_absolute_url() if not is_ratelimited and request.GET and search_form.is_valid(): # Filter results by ACL if component: units = Unit.objects.filter(translation__component=obj) elif project: units = Unit.objects.filter(translation__component__project=obj) else: units = Unit.objects.filter( translation__component__project_id__in=request.user. allowed_project_ids) units = units.search(search_form.cleaned_data.get("q", "")).distinct() if lang: units = units.filter(translation__language=context["language"]) units = get_paginator(request, units.order()) context["show_results"] = True context["page_obj"] = units context["title"] = _("Search for %s") % (search_form.cleaned_data["q"]) context["query_string"] = search_form.urlencode() context["search_query"] = search_form.cleaned_data["q"] elif is_ratelimited: messages.error(request, _("Too many search queries, please try again later.")) elif request.GET: messages.error(request, _("Invalid search query!")) show_form_errors(request, search_form) return render(request, "search.html", context)
def search(request, project=None, component=None, lang=None): """Perform site-wide search on units.""" is_ratelimited = not check_rate_limit("search", request) search_form = SearchForm(user=request.user, data=request.GET) sort = get_sort_name(request) context = {"search_form": search_form} if component: obj = get_component(request, project, component) context["component"] = obj context["project"] = obj.project context["back_url"] = obj.get_absolute_url() elif project: obj = get_project(request, project) context["project"] = obj context["back_url"] = obj.get_absolute_url() else: obj = None context["back_url"] = None if lang: s_language = get_object_or_404(Language, code=lang) context["language"] = s_language if obj: if component: context["back_url"] = obj.translation_set.get( language=s_language).get_absolute_url() else: context["back_url"] = reverse("project-language", kwargs={ "project": project, "lang": lang }) else: context["back_url"] = s_language.get_absolute_url() if not is_ratelimited and request.GET and search_form.is_valid(): # This is ugly way to hide query builder when showing results search_form = SearchForm(user=request.user, data=request.GET, show_builder=False) search_form.is_valid() # Filter results by ACL units = Unit.objects.prefetch_full().prefetch() if component: units = units.filter(translation__component=obj) elif project: units = units.filter(translation__component__project=obj) else: units = units.filter_access(request.user) units = units.search(search_form.cleaned_data.get("q", ""), project=context.get("project")).distinct() if lang: units = units.filter(translation__language=context["language"]) units = get_paginator(request, units.order_by_request(search_form.cleaned_data)) # Rebuild context from scratch here to get new form context = { "search_form": search_form, "show_results": True, "page_obj": units, "title": _("Search for %s") % (search_form.cleaned_data["q"]), "query_string": search_form.urlencode(), "search_query": search_form.cleaned_data["q"], "search_items": search_form.items(), "filter_name": search_form.get_name(), "sort_name": sort["name"], "sort_query": sort["query"], } elif is_ratelimited: messages.error(request, _("Too many search queries, please try again later.")) elif request.GET: messages.error(request, _("Invalid search query!")) show_form_errors(request, search_form) return render(request, "search.html", context)
def dashboard_user(request): """Home page of Weblate showing list of projects, stats and user links if logged in. """ user = request.user user_translations = get_user_translations(request, user) suggestions = get_suggestions(request, user, user_translations) usersubscriptions = None componentlists = list( ComponentList.objects.filter(show_dashboard=True, components__project__in=request.user. allowed_projects).distinct().order()) for componentlist in componentlists: componentlist.translations = prefetch_stats( user_translations.filter( component__in=componentlist.components.all())) # Filter out component lists with translations # This will remove the ones where user doesn't have access to anything componentlists = [c for c in componentlists if c.translations] active_tab_id = user.profile.dashboard_view active_tab_slug = Profile.DASHBOARD_SLUGS.get(active_tab_id) if (active_tab_id == Profile.DASHBOARD_COMPONENT_LIST and user.profile.dashboard_component_list): active_tab_slug = user.profile.dashboard_component_list.tab_slug() if user.is_authenticated: # Ensure ACL filtering applies (user could have been removed # from the project meanwhile) watched_projects = user.allowed_projects.filter(profile=user.profile) usersubscriptions = user_translations.filter( component__project__in=watched_projects) if user.profile.hide_completed: usersubscriptions = get_untranslated(usersubscriptions) for componentlist in componentlists: componentlist.translations = get_untranslated( componentlist.translations) usersubscriptions = prefetch_stats(usersubscriptions) return render( request, 'dashboard/user.html', { 'allow_index': True, 'suggestions': suggestions, 'search_form': SearchForm(request.user), 'usersubscriptions': get_paginator(request, usersubscriptions), 'componentlists': componentlists, 'all_componentlists': prefetch_stats( ComponentList.objects.filter( components__project__in=request.user.allowed_projects). distinct().order()), 'active_tab_slug': active_tab_slug, 'reports_form': ReportsForm(), })
def show_project(request, project): obj = get_project(request, project) user = request.user last_changes = Change.objects.prefetch().order().filter(project=obj)[:10] last_announcements = (Change.objects.prefetch().order().filter( project=obj, action=Change.ACTION_ANNOUNCEMENT)[:10]) language_stats = obj.stats.get_language_stats() # Show ghost translations for user languages component = None for component in obj.component_set.filter_access(user).all(): if component.can_add_new_language(user): break if component: add_ghost_translations(component, user, language_stats, GhostProjectLanguageStats) language_stats = sort_unicode( language_stats, lambda x: "{}-{}".format(user.profile.get_language_order(x.language), x .language), ) # Paginate components of project. all_components = obj.component_set.filter_access(user).prefetch().order() components = prefetch_stats(get_paginator(request, all_components)) return render( request, "project.html", { "allow_index": True, "object": obj, "project": obj, "last_changes": last_changes, "last_announcements": last_announcements, "reports_form": ReportsForm(), "last_changes_url": urlencode({"project": obj.slug}), "language_stats": language_stats, "search_form": SearchForm(request.user), "announcement_form": optional_form(AnnouncementForm, user, "project.edit", obj), "delete_form": optional_form( ProjectDeleteForm, user, "project.edit", obj, obj=obj), "rename_form": optional_form( ProjectRenameForm, user, "project.edit", obj, request=request, instance=obj, ), "replace_form": optional_form(ReplaceForm, user, "unit.edit", obj), "bulk_state_form": optional_form( BulkEditForm, user, "translation.auto", obj, user=user, obj=obj, project=obj, auto_id="id_bulk_%s", ), "components": components, "licenses": obj.component_set.exclude(license="").order_by("license"), }, )
def dashboard_user(request): """Home page of Weblate showing list of projects, stats and user links if logged in. """ user = request.user user_translations = get_user_translations(request, user) suggestions = get_suggestions(request, user, user_translations) usersubscriptions = None componentlists = list(ComponentList.objects.filter(show_dashboard=True)) for componentlist in componentlists: componentlist.translations = prefetch_stats( user_translations.filter( component__in=componentlist.components.all() ) ) # Filter out component lists with translations # This will remove the ones where user doesn't have access to anything componentlists = [c for c in componentlists if c.translations] active_tab_id = user.profile.dashboard_view active_tab_slug = Profile.DASHBOARD_SLUGS.get(active_tab_id) if (active_tab_id == Profile.DASHBOARD_COMPONENT_LIST and user.profile.dashboard_component_list): active_tab_slug = user.profile.dashboard_component_list.tab_slug() if user.is_authenticated: # Ensure ACL filtering applies (user could have been removed # from the project meanwhile) subscribed_projects = user.allowed_projects.filter( profile=user.profile ) usersubscriptions = user_translations.filter( component__project__in=subscribed_projects ) if user.profile.hide_completed: usersubscriptions = get_untranslated(usersubscriptions) user_translations = get_untranslated(user_translations) for componentlist in componentlists: componentlist.translations = get_untranslated( componentlist.translations ) usersubscriptions = prefetch_stats(usersubscriptions) return render( request, 'dashboard/user.html', { 'allow_index': True, 'suggestions': suggestions, 'search_form': SiteSearchForm(), 'usersubscriptions': get_paginator(request, usersubscriptions), 'userlanguages': prefetch_stats( get_paginator(request, user_translations) ), 'componentlists': componentlists, 'all_componentlists': prefetch_stats(ComponentList.objects.all()), 'active_tab_slug': active_tab_slug, } )
def show_dictionary(request, project, lang): prj = get_project(request, project) lang = get_object_or_404(Language, code=lang) if request.method == 'POST' and request.user.has_perm('glossary.add', prj): form = WordForm(request.POST) if form.is_valid(): Dictionary.objects.create( request.user, project=prj, language=lang, source=form.cleaned_data['source'], target=form.cleaned_data['target'] ) return redirect_next( request.POST.get('next'), request.get_full_path() ) else: form = WordForm() uploadform = DictUploadForm() words = Dictionary.objects.filter( project=prj, language=lang ).order_by(Lower('source')) letterform = LetterForm(request.GET) searchform = OneWordForm(request.GET) if searchform.is_valid() and searchform.cleaned_data['term'] != '': words = words.filter( source__icontains=searchform.cleaned_data['term'] ) search = searchform.cleaned_data['term'] else: search = '' if letterform.is_valid() and letterform.cleaned_data['letter'] != '': words = words.filter( source__istartswith=letterform.cleaned_data['letter'] ) letter = letterform.cleaned_data['letter'] else: letter = '' words = get_paginator(request, words) last_changes = Change.objects.last_changes(request.user).filter( dictionary__project=prj, dictionary__language=lang )[:10] return render( request, 'dictionary.html', { 'title': dict_title(prj, lang), 'project': prj, 'language': lang, 'page_obj': words, 'form': form, 'query_string': urlencode({ 'term': search, 'letter': letter }), 'uploadform': uploadform, 'letterform': letterform, 'searchform': searchform, 'letter': letter, 'last_changes': last_changes, 'last_changes_url': urlencode({ 'project': prj.slug, 'lang': lang.code, 'glossary': 1 }), } )
def show_dictionary(request, project, lang): prj = get_project(request, project) lang = get_object_or_404(Language, code=lang) if request.method == 'POST' and request.user.has_perm('glossary.add', prj): form = WordForm(request.POST) if form.is_valid(): Dictionary.objects.create( request.user, project=prj, language=lang, source=form.cleaned_data['source'], target=form.cleaned_data['target'] ) return redirect_next( request.POST.get('next'), request.get_full_path() ) form = WordForm() uploadform = DictUploadForm() words = Dictionary.objects.filter( project=prj, language=lang ).order_by(Lower('source')) letterform = LetterForm(request.GET) searchform = OneWordForm(request.GET) if searchform.is_valid() and searchform.cleaned_data['term'] != '': words = words.filter( source__icontains=searchform.cleaned_data['term'] ) search = searchform.cleaned_data['term'] else: search = '' if letterform.is_valid() and letterform.cleaned_data['letter'] != '': words = words.filter( source__istartswith=letterform.cleaned_data['letter'] ) letter = letterform.cleaned_data['letter'] else: letter = '' words = get_paginator(request, words) last_changes = Change.objects.last_changes(request.user).filter( dictionary__project=prj, dictionary__language=lang )[:10] return render( request, 'dictionary.html', { 'title': dict_title(prj, lang), 'project': prj, 'language': lang, 'page_obj': words, 'form': form, 'query_string': urlencode({ 'term': search, 'letter': letter }), 'uploadform': uploadform, 'letterform': letterform, 'searchform': searchform, 'letter': letter, 'last_changes': last_changes, 'last_changes_url': urlencode({ 'project': prj.slug, 'lang': lang.code, 'glossary': 1 }), } )
def search(request, project=None, component=None, lang=None): """Perform site-wide search on units.""" is_ratelimited = not check_rate_limit('search', request) search_form = SiteSearchForm(request.GET) context = { 'search_form': search_form, } search_kwargs = {} if component: obj = get_component(request, project, component) context['component'] = obj context['project'] = obj.project context['back_url'] = obj.get_absolute_url() search_kwargs = {'component': obj} elif project: obj = get_project(request, project) context['project'] = obj context['back_url'] = obj.get_absolute_url() search_kwargs = {'project': obj} else: obj = None context['back_url'] = None if lang: s_language = get_object_or_404(Language, code=lang) context['language'] = s_language search_kwargs = {'language': s_language} if obj: if component: context['back_url'] = obj.translation_set.get( language=s_language).get_absolute_url() else: context['back_url'] = reverse('project-language', kwargs={ 'project': project, 'lang': lang, }) else: context['back_url'] = s_language.get_absolute_url() if not is_ratelimited and request.GET and search_form.is_valid(): # Filter results by ACL if component: units = Unit.objects.filter(translation__component=obj) elif project: units = Unit.objects.filter(translation__component__project=obj) else: allowed_projects = request.user.allowed_projects units = Unit.objects.filter( translation__component__project__in=allowed_projects) units = units.search(search_form.cleaned_data, **search_kwargs) if lang: units = units.filter(translation__language=context['language']) units = get_paginator(request, units) context['show_results'] = True context['page_obj'] = units context['title'] = _('Search for %s') % (search_form.cleaned_data['q']) context['query_string'] = search_form.urlencode() context['search_query'] = search_form.cleaned_data['q'] elif is_ratelimited: messages.error(request, _('Too many search queries, please try again later.')) elif request.GET: messages.error(request, _('Invalid search query!')) show_form_errors(request, search_form) return render(request, 'search.html', context)
def show_project(request, project): obj = get_project(request, project) user = request.user last_changes = Change.objects.prefetch().order().filter(project=obj)[:10] language_stats = sort_unicode(obj.stats.get_language_stats(), lambda x: force_str(x.language)) # Paginate components of project. all_components = obj.component_set.prefetch().order() components = prefetch_stats(get_paginator(request, all_components)) return render( request, "project.html", { "allow_index": True, "object": obj, "project": obj, "last_changes": last_changes, "reports_form": ReportsForm(), "last_changes_url": urlencode({"project": obj.slug}), "language_stats": language_stats, "search_form": SearchForm(request.user), "announcement_form": optional_form(AnnouncementForm, user, "project.edit", obj), "delete_form": optional_form(DeleteForm, user, "project.edit", obj, obj=obj), "rename_form": optional_form( ProjectRenameForm, user, "project.edit", obj, request=request, instance=obj, ), "replace_form": optional_form(ReplaceForm, user, "unit.edit", obj), "bulk_state_form": optional_form( BulkEditForm, user, "translation.auto", obj, user=user, obj=obj, project=obj, auto_id="id_bulk_%s", ), "components": components, "licenses": obj.component_set.exclude(license="").order_by("license"), }, )
def search(request, project=None, component=None, lang=None): """Perform site-wide search on units.""" is_ratelimited = not check_rate_limit('search', request) search_form = SiteSearchForm(request.GET) context = { 'search_form': search_form, } search_kwargs = {} if component: obj = get_component(request, project, component) context['component'] = obj context['project'] = obj.project context['back_url'] = obj.get_absolute_url() search_kwargs = {'component': obj} elif project: obj = get_project(request, project) context['project'] = obj context['back_url'] = obj.get_absolute_url() search_kwargs = {'project': obj} else: obj = None context['back_url'] = None if lang: s_language = get_object_or_404(Language, code=lang) context['language'] = s_language search_kwargs = {'language': s_language} if obj: if component: context['back_url'] = obj.translation_set.get( language=s_language ).get_absolute_url() else: context['back_url'] = reverse( 'project-language', kwargs={ 'project': project, 'lang': lang, } ) else: context['back_url'] = s_language.get_absolute_url() if not is_ratelimited and request.GET and search_form.is_valid(): # Filter results by ACL if component: units = Unit.objects.filter(translation__component=obj) elif project: units = Unit.objects.filter(translation__component__project=obj) else: allowed_projects = request.user.allowed_projects units = Unit.objects.filter( translation__component__project__in=allowed_projects ) units = units.search( search_form.cleaned_data, **search_kwargs ) if lang: units = units.filter( translation__language=context['language'] ) units = get_paginator(request, units) context['show_results'] = True context['page_obj'] = units context['title'] = _('Search for %s') % ( search_form.cleaned_data['q'] ) context['query_string'] = search_form.urlencode() context['search_query'] = search_form.cleaned_data['q'] elif is_ratelimited: messages.error( request, _('Too many search queries, please try again later.') ) elif request.GET: messages.error(request, _('Invalid search query!')) show_form_errors(request, search_form) return render( request, 'search.html', context )
def show_project(request, project): obj = get_project(request, project) obj.stats.ensure_basic() user = request.user last_changes = obj.change_set.prefetch().order()[:10] last_announcements = (obj.change_set.prefetch().order().filter( action=Change.ACTION_ANNOUNCEMENT)[:10]) all_components = prefetch_stats( obj.child_components.filter_access(user).prefetch().order()) all_components = get_paginator(request, all_components) for component in all_components: component.is_shared = None if component.project == obj else component.project language_stats = obj.stats.get_language_stats() # Show ghost translations for user languages component = None for component in all_components: if component.can_add_new_language(user, fast=True): break if component: add_ghost_translations( component, user, language_stats, GhostProjectLanguageStats, is_shared=component.is_shared, ) language_stats = sort_unicode( language_stats, lambda x: f"{user.profile.get_translation_order(x)}-{x.language}", ) components = prefetch_tasks(all_components) return render( request, "project.html", { "allow_index": True, "object": obj, "project": obj, "last_changes": last_changes, "last_announcements": last_announcements, "reports_form": ReportsForm(), "last_changes_url": urlencode({"project": obj.slug}), "language_stats": [stat.obj or stat for stat in language_stats], "search_form": SearchForm(request.user), "announcement_form": optional_form(AnnouncementForm, user, "project.edit", obj), "delete_form": optional_form( ProjectDeleteForm, user, "project.edit", obj, obj=obj), "rename_form": optional_form( ProjectRenameForm, user, "project.edit", obj, request=request, instance=obj, ), "replace_form": optional_form(ReplaceForm, user, "unit.edit", obj), "bulk_state_form": optional_form( BulkEditForm, user, "translation.auto", obj, user=user, obj=obj, project=obj, auto_id="id_bulk_%s", ), "components": components, "licenses": sorted( (component for component in all_components if component.license), key=lambda component: component.license, ), }, )