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
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
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), }, )
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
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)
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, }, )
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
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), }, )