Ejemplo n.º 1
0
class ScreenshotDetail(DetailView):
    model = Screenshot
    _edit_form = None

    def get_object(self, *args, **kwargs):
        obj = super(ScreenshotDetail, self).get_object(*args, **kwargs)
        self.request.user.check_access(obj.component.project)
        return obj

    def get_context_data(self, **kwargs):
        result = super(ScreenshotDetail, self).get_context_data(**kwargs)
        component = result['object'].component
        if self.request.user.has_perm('screenshot.edit', component):
            if self._edit_form is not None:
                result['edit_form'] = self._edit_form
            else:
                result['edit_form'] = ScreenshotForm(instance=result['object'])
        return result

    def post(self, request, **kwargs):
        obj = self.get_object()
        if request.user.has_perm('screenshot.edit', obj.component):
            self._edit_form = ScreenshotForm(
                request.POST, request.FILES, instance=obj
            )
            if self._edit_form.is_valid():
                if request.FILES:
                    obj.user = request.user
                    request.user.profile.uploaded += 1
                    request.user.profile.save(update_fields=['uploaded'])
                self._edit_form.save()
            else:
                return self.get(request, **kwargs)
        return redirect(obj)
Ejemplo n.º 2
0
class ScreenshotDetail(DetailView):
    model = Screenshot
    _edit_form = None

    def get_object(self, *args, **kwargs):
        obj = super(ScreenshotDetail, self).get_object(*args, **kwargs)
        self.request.user.check_access(obj.component.project)
        return obj

    def get_context_data(self, **kwargs):
        result = super(ScreenshotDetail, self).get_context_data(**kwargs)
        component = result['object'].component
        if self.request.user.has_perm('screenshot.edit', component):
            if self._edit_form is not None:
                result['edit_form'] = self._edit_form
            else:
                result['edit_form'] = ScreenshotForm(instance=result['object'])
        return result

    def post(self, request, **kwargs):
        obj = self.get_object()
        if request.user.has_perm('screenshot.edit', obj.component):
            self._edit_form = ScreenshotForm(
                request.POST, request.FILES, instance=obj
            )
            if self._edit_form.is_valid():
                if request.FILES:
                    obj.user = request.user
                    request.user.profile.uploaded += 1
                    request.user.profile.save(update_fields=['uploaded'])
                self._edit_form.save()
            else:
                return self.get(request, **kwargs)
        return redirect(obj)
Ejemplo n.º 3
0
class ScreenshotDetail(DetailView):
    model = Screenshot
    _edit_form = None

    def get_object(self, *args, **kwargs):
        obj = super(ScreenshotDetail, self).get_object(*args, **kwargs)
        check_access(self.request, obj.component.project)
        return obj

    def get_context_data(self, **kwargs):
        result = super(ScreenshotDetail, self).get_context_data(**kwargs)
        component = result['object'].component
        if can_change_screenshot(self.request.user, component.project):
            if self._edit_form is not None:
                result['edit_form'] = self._edit_form
            else:
                result['edit_form'] = ScreenshotForm(instance=result['object'])
        return result

    def post(self, request, **kwargs):
        obj = self.get_object()
        if can_change_screenshot(request.user, obj.component.project):
            self._edit_form = ScreenshotForm(
                request.POST, request.FILES, instance=obj
            )
            if self._edit_form.is_valid():
                self._edit_form.save()
            else:
                return self.get(request, **kwargs)
        return redirect(obj)
Ejemplo n.º 4
0
    def post(self, request, **kwargs):
        component = self.get_component()
        if not request.user.has_perm('screenshot.add', component):
            raise PermissionDenied()
        self._add_form = ScreenshotForm(request.POST, request.FILES)
        if self._add_form.is_valid():
            obj = Screenshot.objects.create(
                component=component,
                user=request.user,
                **self._add_form.cleaned_data
            )
            request.user.profile.uploaded += 1
            request.user.profile.save(update_fields=['uploaded'])

            try_add_source(request, obj)
            messages.success(
                request,
                _(
                    'Screenshot has been uploaded, '
                    'you can now assign it to source strings.'
                )
            )
            return redirect(obj)
        messages.error(
            request,
            _('Failed to upload screenshot, please fix errors below.')
        )
        return self.get(request, **kwargs)
Ejemplo n.º 5
0
 def post(self, request, **kwargs):
     component = self.get_component(kwargs)
     if not can_add_screenshot(request.user, component.project):
         raise PermissionDenied()
     self._add_form = ScreenshotForm(request.POST, request.FILES)
     if self._add_form.is_valid():
         obj = Screenshot.objects.create(
             component=component,
             **self._add_form.cleaned_data
         )
         try_add_source(request, obj)
         messages.success(
             request,
             _(
                 'Screenshot has been uploaded, '
                 'you can now assign it to source strings.'
             )
         )
         return redirect(obj)
     else:
         messages.error(
             request,
             _('Failed to upload screenshot, please fix errors below.')
         )
         return self.get(request, **kwargs)
Ejemplo n.º 6
0
    def post(self, request, **kwargs):
        component = self.get_component()
        if not request.user.has_perm("screenshot.add", component):
            raise PermissionDenied()
        self._add_form = ScreenshotForm(component, request.POST, request.FILES)
        if self._add_form.is_valid():
            obj = Screenshot.objects.create(user=request.user,
                                            **self._add_form.cleaned_data)
            request.user.profile.increase_count("uploaded")
            obj.change_set.create(
                action=Change.ACTION_SCREENSHOT_ADDED,
                user=request.user,
                target=obj.name,
            )

            try_add_source(request, obj)
            messages.success(
                request,
                _("Screenshot has been uploaded, "
                  "you can now assign it to source strings."),
            )
            return redirect(obj)
        messages.error(
            request,
            _("Failed to upload screenshot, please fix errors below."))
        return self.get(request, **kwargs)
Ejemplo n.º 7
0
class ScreenshotDetail(DetailView):
    model = Screenshot
    _edit_form = None

    def get_object(self, *args, **kwargs):
        obj = super().get_object(*args, **kwargs)
        self.request.user.check_access_component(obj.component)
        return obj

    def get_context_data(self, **kwargs):
        result = super().get_context_data(**kwargs)
        component = result["object"].component
        if self.request.user.has_perm("screenshot.edit", component):
            if self._edit_form is not None:
                result["edit_form"] = self._edit_form
            else:
                result["edit_form"] = ScreenshotForm(instance=result["object"])
        return result

    def post(self, request, **kwargs):
        obj = self.get_object()
        if request.user.has_perm("screenshot.edit", obj.component):
            self._edit_form = ScreenshotForm(request.POST,
                                             request.FILES,
                                             instance=obj)
            if self._edit_form.is_valid():
                if request.FILES:
                    obj.user = request.user
                    request.user.profile.increase_count("uploaded")
                self._edit_form.save()
            else:
                return self.get(request, **kwargs)
        return redirect(obj)
Ejemplo n.º 8
0
class ScreenshotDetail(DetailView):
    model = Screenshot
    _edit_form = None

    def get_object(self, *args, **kwargs):
        obj = super(ScreenshotDetail, self).get_object(*args, **kwargs)
        check_access(self.request, obj.component.project)
        return obj

    def get_context_data(self, **kwargs):
        result = super(ScreenshotDetail, self).get_context_data(**kwargs)
        component = result['object'].component
        if can_change_screenshot(self.request.user, component.project):
            if self._edit_form is not None:
                result['edit_form'] = self._edit_form
            else:
                result['edit_form'] = ScreenshotForm(instance=result['object'])
        return result

    def post(self, request, **kwargs):
        obj = self.get_object()
        if can_change_screenshot(request.user, obj.component.project):
            self._edit_form = ScreenshotForm(
                request.POST, request.FILES, instance=obj
            )
            if self._edit_form.is_valid():
                self._edit_form.save()
            else:
                return self.get(request, **kwargs)
        return redirect(obj)
Ejemplo n.º 9
0
 def post(self, request, **kwargs):
     obj = self.get_object()
     if request.user.has_perm('screenshot.edit', obj.component):
         self._edit_form = ScreenshotForm(
             request.POST, request.FILES, instance=obj
         )
         if self._edit_form.is_valid():
             self._edit_form.save()
         else:
             return self.get(request, **kwargs)
     return redirect(obj)
Ejemplo n.º 10
0
 def post(self, request, **kwargs):
     obj = self.get_object()
     if can_change_screenshot(request.user, obj.component.project):
         self._edit_form = ScreenshotForm(
             request.POST, request.FILES, instance=obj
         )
         if self._edit_form.is_valid():
             self._edit_form.save()
         else:
             return self.get(request, **kwargs)
     return redirect(obj)
Ejemplo n.º 11
0
 def post(self, request, **kwargs):
     obj = self.get_object()
     if request.user.has_perm("screenshot.edit", obj.component):
         self._edit_form = ScreenshotForm(request.POST, request.FILES, instance=obj)
         if self._edit_form.is_valid():
             if request.FILES:
                 obj.user = request.user
                 request.user.profile.increase_count("uploaded")
             self._edit_form.save()
         else:
             return self.get(request, **kwargs)
     return redirect(obj)
Ejemplo n.º 12
0
 def post(self, request, **kwargs):
     obj = self.get_object()
     if request.user.has_perm('screenshot.edit', obj.component):
         self._edit_form = ScreenshotForm(
             request.POST, request.FILES, instance=obj
         )
         if self._edit_form.is_valid():
             if request.FILES:
                 obj.user = request.user
                 request.user.profile.uploaded += 1
                 request.user.profile.save(update_fields=['uploaded'])
             self._edit_form.save()
         else:
             return self.get(request, **kwargs)
     return redirect(obj)
Ejemplo n.º 13
0
 def post(self, request, **kwargs):
     component = self.get_component(kwargs)
     if not can_add_screenshot(request.user, component.project):
         raise PermissionDenied()
     self._add_form = ScreenshotForm(request.POST, request.FILES)
     if self._add_form.is_valid():
         obj = Screenshot.objects.create(
             component=component,
             **self._add_form.cleaned_data
         )
         try_add_source(request, obj)
         messages.success(
             request,
             _(
                 'Screenshot has been uploaded, '
                 'you can now assign it to source strings.'
             )
         )
         return redirect(obj)
     else:
         messages.error(
             request,
             _('Failed to upload screenshot, please fix errors below.')
         )
         return self.get(request, **kwargs)
Ejemplo n.º 14
0
    def post(self, request, **kwargs):
        component = self.get_component()
        if not request.user.has_perm('screenshot.add', component):
            raise PermissionDenied()
        self._add_form = ScreenshotForm(request.POST, request.FILES)
        if self._add_form.is_valid():
            obj = Screenshot.objects.create(
                component=component,
                user=request.user,
                **self._add_form.cleaned_data
            )
            request.user.profile.uploaded += 1
            request.user.profile.save(update_fields=['uploaded'])

            try_add_source(request, obj)
            messages.success(
                request,
                _(
                    'Screenshot has been uploaded, '
                    'you can now assign it to source strings.'
                )
            )
            return redirect(obj)
        messages.error(
            request,
            _('Failed to upload screenshot, please fix errors below.')
        )
        return self.get(request, **kwargs)
Ejemplo n.º 15
0
 def get_context_data(self, **kwargs):
     result = super(ScreenshotDetail, self).get_context_data(**kwargs)
     component = result['object'].component
     if can_change_screenshot(self.request.user, component.project):
         if self._edit_form is not None:
             result['edit_form'] = self._edit_form
         else:
             result['edit_form'] = ScreenshotForm(instance=result['object'])
     return result
Ejemplo n.º 16
0
 def get_context_data(self, **kwargs):
     result = super().get_context_data(**kwargs)
     component = result["object"].component
     if self.request.user.has_perm("screenshot.edit", component):
         if self._edit_form is not None:
             result["edit_form"] = self._edit_form
         else:
             result["edit_form"] = ScreenshotForm(instance=result["object"])
     return result
Ejemplo n.º 17
0
 def get_context_data(self):
     result = super(ScreenshotList, self).get_context_data()
     component = self.kwargs['component']
     result['object'] = component
     if can_add_screenshot(self.request.user, component.project):
         if self._add_form is not None:
             result['add_form'] = self._add_form
         else:
             result['add_form'] = ScreenshotForm()
     return result
Ejemplo n.º 18
0
 def get_context_data(self):
     result = super().get_context_data()
     component = self.kwargs['component']
     result['object'] = component
     if self.request.user.has_perm('screenshot.add', component):
         if self._add_form is not None:
             result['add_form'] = self._add_form
         else:
             result['add_form'] = ScreenshotForm()
     return result
Ejemplo n.º 19
0
 def get_context_data(self, **kwargs):
     result = super().get_context_data(**kwargs)
     component = self.kwargs["component"]
     result["object"] = component
     if self.request.user.has_perm("screenshot.add", component):
         if self._add_form is not None:
             result["add_form"] = self._add_form
         else:
             result["add_form"] = ScreenshotForm()
     return result
Ejemplo n.º 20
0
 def post(self, request, **kwargs):
     obj = self.get_object()
     if can_change_screenshot(request.user, obj.component.project):
         self._edit_form = ScreenshotForm(
             request.POST, request.FILES, instance=obj
         )
         if self._edit_form.is_valid():
             self._edit_form.save()
         else:
             return self.get(request, **kwargs)
     return redirect(obj)
Ejemplo n.º 21
0
class ScreenshotList(ListView, ComponentViewMixin):
    paginate_by = 25
    model = Screenshot
    _add_form = None

    def get_queryset(self):
        self.kwargs["component"] = self.get_component()
        return (
            Screenshot.objects.filter(translation__component=self.kwargs["component"])
            .prefetch_related("translation__language")
            .order()
        )

    def get_context_data(self, **kwargs):
        result = super().get_context_data(**kwargs)
        component = self.kwargs["component"]
        result["object"] = component
        if self.request.user.has_perm("screenshot.add", component):
            if self._add_form is not None:
                result["add_form"] = self._add_form
            else:
                result["add_form"] = ScreenshotForm(component)
        return result

    def post(self, request, **kwargs):
        component = self.get_component()
        if not request.user.has_perm("screenshot.add", component):
            raise PermissionDenied()
        self._add_form = ScreenshotForm(component, request.POST, request.FILES)
        if self._add_form.is_valid():
            obj = Screenshot.objects.create(
                user=request.user, **self._add_form.cleaned_data
            )
            request.user.profile.increase_count("uploaded")
            obj.change_set.create(
                action=Change.ACTION_SCREENSHOT_ADDED,
                user=request.user,
                target=obj.name,
            )

            try_add_source(request, obj)
            messages.success(
                request,
                _(
                    "Screenshot has been uploaded, "
                    "you can now assign it to source strings."
                ),
            )
            return redirect(obj)
        messages.error(
            request, _("Failed to upload screenshot, please fix errors below.")
        )
        return self.get(request, **kwargs)
Ejemplo n.º 22
0
class ScreenshotList(ListView):
    paginate_by = 25
    model = Screenshot
    _add_form = None

    def get_component(self, kwargs):
        return get_subproject(
            self.request,
            kwargs['project'],
            kwargs['subproject']
        )

    def get_queryset(self):
        self.kwargs['component'] = self.get_component(self.kwargs)
        return Screenshot.objects.filter(component=self.kwargs['component'])

    def get_context_data(self):
        result = super(ScreenshotList, self).get_context_data()
        component = self.kwargs['component']
        result['object'] = component
        if can_add_screenshot(self.request.user, component.project):
            if self._add_form is not None:
                result['add_form'] = self._add_form
            else:
                result['add_form'] = ScreenshotForm()
        return result

    def post(self, request, **kwargs):
        component = self.get_component(kwargs)
        if not can_add_screenshot(request.user, component.project):
            raise PermissionDenied()
        self._add_form = ScreenshotForm(request.POST, request.FILES)
        if self._add_form.is_valid():
            obj = Screenshot.objects.create(
                component=component,
                **self._add_form.cleaned_data
            )
            try_add_source(request, obj)
            messages.success(
                request,
                _(
                    'Screenshot has been uploaded, '
                    'you can now assign it to source strings.'
                )
            )
            return redirect(obj)
        else:
            messages.error(
                request,
                _('Failed to upload screenshot, please fix errors below.')
            )
            return self.get(request, **kwargs)
Ejemplo n.º 23
0
class ScreenshotList(ListView):
    paginate_by = 25
    model = Screenshot
    _add_form = None

    def get_component(self, kwargs):
        return get_subproject(
            self.request,
            kwargs['project'],
            kwargs['subproject']
        )

    def get_queryset(self):
        self.kwargs['component'] = self.get_component(self.kwargs)
        return Screenshot.objects.filter(component=self.kwargs['component'])

    def get_context_data(self):
        result = super(ScreenshotList, self).get_context_data()
        component = self.kwargs['component']
        result['object'] = component
        if can_add_screenshot(self.request.user, component.project):
            if self._add_form is not None:
                result['add_form'] = self._add_form
            else:
                result['add_form'] = ScreenshotForm()
        return result

    def post(self, request, **kwargs):
        component = self.get_component(kwargs)
        if not can_add_screenshot(request.user, component.project):
            raise PermissionDenied()
        self._add_form = ScreenshotForm(request.POST, request.FILES)
        if self._add_form.is_valid():
            obj = Screenshot.objects.create(
                component=component,
                **self._add_form.cleaned_data
            )
            try_add_source(request, obj)
            messages.success(
                request,
                _(
                    'Screenshot has been uploaded, '
                    'you can now assign it to source strings.'
                )
            )
            return redirect(obj)
        else:
            messages.error(
                request,
                _('Failed to upload screenshot, please fix errors below.')
            )
            return self.get(request, **kwargs)
Ejemplo n.º 24
0
 def post(self, request, **kwargs):
     obj = self.get_object()
     if request.user.has_perm('screenshot.edit', obj.component):
         self._edit_form = ScreenshotForm(
             request.POST, request.FILES, instance=obj
         )
         if self._edit_form.is_valid():
             if request.FILES:
                 obj.user = request.user
                 request.user.profile.uploaded += 1
                 request.user.profile.save(update_fields=['uploaded'])
             self._edit_form.save()
         else:
             return self.get(request, **kwargs)
     return redirect(obj)
Ejemplo n.º 25
0
class ScreenshotList(ListView, ComponentViewMixin):
    paginate_by = 25
    model = Screenshot
    _add_form = None

    def get_queryset(self):
        self.kwargs['component'] = self.get_component()
        return Screenshot.objects.filter(component=self.kwargs['component']).order()

    def get_context_data(self):
        result = super(ScreenshotList, self).get_context_data()
        component = self.kwargs['component']
        result['object'] = component
        if self.request.user.has_perm('screenshot.add', component):
            if self._add_form is not None:
                result['add_form'] = self._add_form
            else:
                result['add_form'] = ScreenshotForm()
        return result

    def post(self, request, **kwargs):
        component = self.get_component()
        if not request.user.has_perm('screenshot.add', component):
            raise PermissionDenied()
        self._add_form = ScreenshotForm(request.POST, request.FILES)
        if self._add_form.is_valid():
            obj = Screenshot.objects.create(
                component=component,
                user=request.user,
                **self._add_form.cleaned_data
            )
            request.user.profile.uploaded += 1
            request.user.profile.save(update_fields=['uploaded'])

            try_add_source(request, obj)
            messages.success(
                request,
                _(
                    'Screenshot has been uploaded, '
                    'you can now assign it to source strings.'
                )
            )
            return redirect(obj)
        messages.error(
            request,
            _('Failed to upload screenshot, please fix errors below.')
        )
        return self.get(request, **kwargs)
Ejemplo n.º 26
0
def get_detail(request, project, component, checksum):
    """Return source translation detail in all languages."""
    component = get_component(request, project, component)
    try:
        units = Unit.objects.filter(
            id_hash=checksum_to_hash(checksum),
            translation__component=component
        ).order_by(*Unit.ordering)
    except ValueError:
        raise Http404('Non existing unit!')
    try:
        source = units[0].source_info
    except IndexError:
        raise Http404('Non existing unit!')

    check_flags = [
        (CHECKS[x].ignore_string, CHECKS[x].name) for x in CHECKS
    ]
    extra_flags = [(x, EXTRA_FLAGS[x]) for x in EXTRA_FLAGS]

    return render(
        request,
        'js/detail.html',
        {
            'units': units,
            'source': source,
            'project': component.project,
            'next': request.GET.get('next', ''),
            'priority_form': PriorityForm(
                initial={'priority': source.priority}
            ),
            'context_form': ContextForm(
                initial={'context': source.context}
            ),

            'check_flags_form': CheckFlagsForm(
                initial={'flags': source.check_flags}
            ),
            'screenshot_form': ScreenshotForm(),
            'extra_flags': extra_flags,
            'check_flags': check_flags,
        }
    )
Ejemplo n.º 27
0
def translate(request, project, component, lang):  # noqa: C901
    """Generic entry point for translating, suggesting and searching."""
    obj, project, unit_set = parse_params(request, project, component, lang)
    user = request.user

    # Search results
    search_result = search(obj, project, 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
    payload = request.GET or request.POST
    if payload.get("checksum"):
        checksum_form = ChecksumForm(unit_set, payload)
        if checksum_form.is_valid():
            unit = checksum_form.cleaned_data["unit"]
            try:
                offset = search_result["ids"].index(unit.id) + 1
            except ValueError:
                offset = None
        else:
            offset = None
        if offset is None:
            messages.warning(request, _("No strings found!"))
            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)

    # 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 ("accept" in request.POST or "accept_edit" in request.POST
                or "delete" in request.POST or "spam" in request.POST
                or "upvote" in request.POST or "downvote" in request.POST):
            # Handle accepting/deleting suggestions
            response = handle_suggestions(request, unit, this_unit_url,
                                          next_unit_url)
        else:
            # Handle translation
            response = handle_translate(request, unit, this_unit_url,
                                        next_unit_url)

    # Handle translation merging
    elif "merge" in request.POST:
        response = handle_merge(unit, request, next_unit_url)

    # Handle reverting
    elif "revert" in request.GET:
        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 user.is_authenticated:
        secondary = unit.get_secondary_units(user)
    else:
        secondary = None

    # Prepare form
    form = TranslationForm(user, unit)
    sort = get_sort_name(request, obj)

    screenshot_form = None
    if user.has_perm("screenshot.add", unit.translation):
        screenshot_form = ScreenshotForm(
            unit.translation.component,
            initial={"translation": unit.translation})

    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(user.profile.nearby_strings),
            "nearby_keys":
            unit.nearby_keys(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,
            "comment_form":
            CommentForm(
                project,
                initial={
                    "scope": "global" if unit.is_source else "translation"
                },
            ),
            "context_form":
            ContextForm(instance=unit.source_unit, user=user),
            "search_form":
            search_result["form"].reset_offset(),
            "secondary":
            secondary,
            "locked":
            unit.translation.component.locked,
            "glossary":
            get_glossary_terms(unit),
            "addterm_form":
            TermForm(unit, user),
            "last_changes":
            unit.change_set.prefetch().order()[:10].preload("unit"),
            "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())),
            "new_unit_form":
            get_new_unit_form(
                unit.translation, user, initial={"variant": unit.pk}),
            "screenshot_form":
            screenshot_form,
        },
    )