コード例 #1
0
ファイル: search.py プロジェクト: nijel/weblate
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
コード例 #2
0
ファイル: widgets.py プロジェクト: nijel/weblate
def render_widget(
    request,
    project,
    widget="287x66",
    color=None,
    lang=None,
    component=None,
    extension="png",
):
    # We intentionally skip ACL here to allow widget sharing
    if component is None:
        obj = get_project(request, project, skip_acl=True)
    elif component == "-":
        project = get_project(request, project, skip_acl=True)
        lang = get_object_or_404(Language, code=lang)
        obj = ProjectLanguage(project, lang)
    else:
        obj = get_component(request, project, component, skip_acl=True)

    # Handle language parameter
    if lang is not None and isinstance(lang, str):
        lang = Language.objects.fuzzy_get(code=lang, strict=True)
        if lang is None:
            raise Http404()
        if "native" not in request.GET:
            try_set_language(lang.code)
    else:
        try_set_language("en")

    # Get widget class
    try:
        widget_class = WIDGETS[widget]
    except KeyError:
        raise Http404()

    # Construct object
    widget_obj = widget_class(obj, color, lang)

    # Redirect widget
    if hasattr(widget_obj, "redirect"):
        return redirect(widget_obj.redirect(), permanent=True)

    # Invalid extension
    if extension != widget_obj.extension or color != widget_obj.color:
        kwargs = {
            "project": project,
            "widget": widget,
            "color": widget_obj.color,
            "extension": widget_obj.extension,
        }
        if lang:
            kwargs["lang"] = lang.code
            return redirect("widget-image", permanent=True, **kwargs)
        return redirect("widget-image", permanent=True, **kwargs)

    # Render widget
    response = HttpResponse(content_type=widget_obj.content_type)
    widget_obj.render(response)
    return response
コード例 #3
0
ファイル: views.py プロジェクト: lcsouzamenezes/weblate
def show_project(request, lang, project):
    try:
        language_object = Language.objects.get(code=lang)
    except Language.DoesNotExist:
        language_object = Language.objects.fuzzy_get(lang)
        if isinstance(language_object, Language):
            return redirect(language_object)
        raise Http404("No Language matches the given query.")

    project_object = get_project(request, project)
    obj = ProjectLanguage(project_object, language_object)
    user = request.user

    last_changes = Change.objects.last_changes(user).filter(
        language=language_object, project=project_object)[:10]

    return render(
        request,
        "language-project.html",
        {
            "allow_index":
            True,
            "language":
            language_object,
            "project":
            project_object,
            "object":
            obj,
            "last_changes":
            last_changes,
            "last_changes_url":
            urlencode({
                "lang": language_object.code,
                "project": project_object.slug
            }),
            "translations":
            obj.translation_set,
            "title":
            f"{project_object} - {language_object}",
            "search_form":
            SearchForm(user, language=language_object),
            "licenses":
            project_object.component_set.exclude(
                license="").order_by("license"),
            "language_stats":
            project_object.stats.get_single_language_stats(language_object),
            "delete_form":
            optional_form(ProjectLanguageDeleteForm,
                          user,
                          "translation.delete",
                          obj,
                          obj=obj),
        },
    )
コード例 #4
0
ファイル: edit.py プロジェクト: lacroixdavid1/weblate
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
コード例 #5
0
ファイル: settings.py プロジェクト: lcsouzamenezes/weblate
def remove_project_language(request, project, lang):
    project_object = get_project(request, project)
    language_object = get_object_or_404(Language, code=lang)
    obj = ProjectLanguage(project_object, language_object)

    if not request.user.has_perm("translation.delete", obj):
        raise PermissionDenied()

    form = ProjectLanguageDeleteForm(obj, request.POST)
    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj, "#delete")

    for translation in obj.translation_set:
        translation.remove(request.user)

    messages.success(request, _("Language of the project was removed."))
    return redirect(project_object)
コード例 #6
0
def show_language(request, lang):
    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.")

    user = request.user

    if request.method == "POST" and user.has_perm("language.edit"):
        if obj.translation_set.exists():
            messages.error(
                request,
                _("Remove all translations using this language first."))
        else:
            obj.delete()
            messages.success(request, _("Language %s removed.") % obj)
            return redirect("languages")

    last_changes = Change.objects.last_changes(user).filter(
        language=obj)[:10].preload()
    projects = user.allowed_projects
    projects = prefetch_project_flags(
        prefetch_stats(
            projects.filter(component__translation__language=obj).distinct()))
    projects = [ProjectLanguage(project, obj) for project in projects]

    ProjectLanguageStats.prefetch_many([project.stats for project in projects])

    return render(
        request,
        "language.html",
        {
            "allow_index": True,
            "object": obj,
            "last_changes": last_changes,
            "last_changes_url": urlencode({"lang": obj.code}),
            "search_form": SearchForm(user, language=obj),
            "projects": projects,
        },
    )
コード例 #7
0
    def collect_project(self, project: Project):
        languages = prefetch_stats(
            [ProjectLanguage(project, language) for language in project.languages]
        )
        for project_language in languages:
            self.collect_project_language(project_language)
        data = {
            "components": project.component_set.count(),
            "translations": Translation.objects.filter(
                component__project=project
            ).count(),
            "memory": project.memory_set.count(),
            "screenshots": Screenshot.objects.filter(
                translation__component__project=project
            ).count(),
            "changes": project.change_set.filter(
                timestamp__date=datetime.date.today() - datetime.timedelta(days=1)
            ).count(),
            "contributors": project.change_set.filter(
                timestamp__date__gte=datetime.date.today() - datetime.timedelta(days=30)
            )
            .values("user")
            .distinct()
            .count(),
        }
        keys = [
            f"machinery-accounting:internal:{project.id}",
            f"machinery-accounting:external:{project.id}",
        ]
        for key, value in cache.get_many(keys).items():
            if ":internal:" in key:
                data["machinery:internal"] = value
            else:
                data["machinery:external"] = value
        cache.delete_many(keys)

        self.create_metrics(
            data, project.stats, SOURCE_KEYS, Metric.SCOPE_PROJECT, project.pk
        )
        return data
コード例 #8
0
ファイル: views.py プロジェクト: mashanz/weblate
def show_project(request, lang, project):
    try:
        language_object = Language.objects.get(code=lang)
    except Language.DoesNotExist:
        language_object = Language.objects.fuzzy_get(lang)
        if isinstance(language_object, Language):
            return redirect(language_object)
        raise Http404("No Language matches the given query.")

    project_object = get_project(request, project)
    obj = ProjectLanguage(project_object, language_object)
    user = request.user

    last_changes = Change.objects.last_changes(user).filter(
        language=language_object, project=project_object)[:10]

    translations = list(obj.translation_set)

    # Add ghost translations
    if user.is_authenticated:
        existing = {translation.component.slug for translation in translations}
        for component in project_object.child_components:
            if component.slug in existing:
                continue
            if component.can_add_new_language(user, fast=True):
                translations.append(
                    GhostTranslation(component, language_object))

    return render(
        request,
        "language-project.html",
        {
            "allow_index":
            True,
            "language":
            language_object,
            "project":
            project_object,
            "object":
            obj,
            "last_changes":
            last_changes,
            "last_changes_url":
            urlencode({
                "lang": language_object.code,
                "project": project_object.slug
            }),
            "translations":
            translations,
            "title":
            f"{project_object} - {language_object}",
            "search_form":
            SearchForm(user, language=language_object),
            "licenses":
            project_object.component_set.exclude(
                license="").order_by("license"),
            "language_stats":
            project_object.stats.get_single_language_stats(language_object),
            "delete_form":
            optional_form(ProjectLanguageDeleteForm,
                          user,
                          "translation.delete",
                          obj,
                          obj=obj),
        },
    )