Esempio n. 1
0
def add_user(request, project):
    obj = get_project(request, project)

    form = AddUserForm(request.POST)

    if not obj.enable_acl:
        messages.error(request, _('ACL not enabled for this project!'))
    elif form.is_valid():
        try:
            user = User.objects.get(
                Q(username=form.cleaned_data['name']) |
                Q(email=form.cleaned_data['name'])
            )
            obj.add_user(user)
            messages.success(
                request, _('User has been added to this project.')
            )
        except User.DoesNotExist:
            messages.error(request, _('No matching user found!'))
        except User.MultipleObjectsReturned:
            messages.error(request, _('More users matched!'))
    else:
        messages.error(request, _('Invalid user specified!'))

    return redirect_param(
        'project',
        '#acl',
        project=obj.slug,
    )
Esempio n. 2
0
def delete_dictionary(request, project, lang, pk):
    prj = get_project(request, project)
    if not request.user.has_perm('glossary.delete', prj):
        raise PermissionDenied()

    lang = get_object_or_404(Language, code=lang)
    word = get_object_or_404(
        Dictionary,
        project=prj,
        language=lang,
        id=pk
    )

    word.delete()

    params = {}
    for param in ('letter', 'limit', 'page'):
        if param in request.POST:
            params[param] = request.POST[param]

    if params:
        param = '?' + urlencode(params)
    else:
        param = ''

    return redirect_param(
        'show_dictionary',
        param,
        project=prj.slug,
        lang=lang.code
    )
Esempio n. 3
0
def show_check(request, name):
    """
    Details about failing check.
    """
    try:
        check = CHECKS[name]
    except KeyError:
        raise Http404("No check matches the given query.")

    ignore = "ignored" in request.GET

    url_params = {}

    if ignore:
        url_params["ignored"] = "true"

    checks = acl_checks(request.user).filter(check=name, ignore=ignore)

    if "language" in request.GET:
        checks = checks.filter(language__code=request.GET["language"])
        url_params["language"] = request.GET["language"]

    if "project" in request.GET:
        return redirect_param(
            "show_check_project", encode_optional(url_params), project=request.GET["project"], name=name
        )

    checks = checks.values("project__slug").annotate(count=Count("id"))

    return render(
        request,
        "check.html",
        {"checks": checks, "title": check.name, "check": check, "url_params": encode_optional(url_params)},
    )
Esempio n. 4
0
def delete_user(request, project):
    obj = get_project(request, project)

    form = AddUserForm(request.POST)

    if form.is_valid():
        try:
            user = User.objects.get(
                username=form.cleaned_data['name']
            )
            obj.remove_user(user)
            messages.success(
                request, _('User has been removed from this project.')
            )
        except User.DoesNotExist:
            messages.error(request, _('No matching user found!'))
        except User.MultipleObjectsReturned:
            messages.error(request, _('More users matched!'))
    else:
        messages.error(request, _('Invalid user specified!'))

    return redirect_param(
        'project',
        '#acl',
        project=obj.slug,
    )
Esempio n. 5
0
def make_owner(request, project):
    obj, form = check_user_form(request, project)

    if form is not None:
        obj.owners.add(form.cleaned_data['user'])

    return redirect_param(
        'project',
        '#acl',
        project=obj.slug,
    )
Esempio n. 6
0
def execute_locked(request, obj, message, call, *args, **kwargs):
    """
    Helper function to catch possible lock exception.
    """
    try:
        result = call(request, *args, **kwargs)
        # With False the call is supposed to show errors on its own
        if result is None or result:
            messages.success(request, message)
    except FileLockException:
        messages.error(request, _("Failed to lock the repository, another operation in progress."))

    return redirect_param(obj, "#repository")
Esempio n. 7
0
def add_user(request, project):
    obj, form = check_user_form(request, project)

    if form is not None and obj.enable_acl:
        obj.add_user(form.cleaned_data['user'])
        messages.success(
            request, _('User has been added to this project.')
        )

    return redirect_param(
        'project',
        '#acl',
        project=obj.slug,
    )
Esempio n. 8
0
def unlock_component(request, project, component):
    obj = get_component(request, project, component)

    if not request.user.has_perm('component.lock', obj):
        raise PermissionDenied()

    obj.do_lock(request.user, False)

    messages.success(
        request,
        _('Component is now open for translation updates.')
    )

    return redirect_param(obj, '#repository')
Esempio n. 9
0
def lock_project(request, project):
    obj = get_project(request, project)

    if not request.user.has_perm('component.lock', obj):
        raise PermissionDenied()

    for component in obj.component_set.all():
        component.do_lock(request.user)

    messages.success(
        request,
        _('All components are now locked for translation updates!')
    )

    return redirect_param(obj, '#repository')
Esempio n. 10
0
File: git.py Progetto: nijel/weblate
def execute_locked(request, obj, message, call, *args, **kwargs):
    """Helper function to catch possible lock exception."""
    try:
        result = call(*args, **kwargs)
        # With False the call is supposed to show errors on its own
        if result is None or result:
            messages.success(request, message)
    except Timeout as error:
        messages.error(
            request,
            _('Failed to lock the repository, another operation is in progress.')
        )
        report_error(error, request)

    return redirect_param(obj, '#repository')
Esempio n. 11
0
def remove_translation(request, project, component, lang):
    obj = get_translation(request, project, component, lang)

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

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

    obj.remove(request.user)
    messages.success(request, _('Translation has been removed.'))

    return redirect(obj.component)
Esempio n. 12
0
def perform_rename(form_cls, request, obj, perm, **kwargs):
    if not request.user.has_perm(perm, obj):
        raise PermissionDenied()

    form = form_cls(request, request.POST, instance=obj)
    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj, '#delete')

    form.save()
    Change.objects.create(
        user=request.user,
        author=request.user,
        **kwargs
    )

    return redirect(obj)
Esempio n. 13
0
def revoke_owner(request, project):
    obj, form = check_user_form(request, project)

    if form is not None:
        if obj.owners.count() <= 1:
            messages.error(request, _('You can not remove last owner!'))
        else:
            # Ensure owner stays within project
            obj.add_user(form.cleaned_data['user'])

            obj.owners.remove(form.cleaned_data['user'])

    return redirect_param(
        'project',
        '#acl',
        project=obj.slug,
    )
Esempio n. 14
0
def whiteboard_translation(request, project, component, lang):
    obj = get_translation(request, project, component, lang)

    if not request.user.has_perm('component.edit', obj):
        raise PermissionDenied()

    form = WhiteboardForm(request.POST)
    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj, '#whiteboard')

    WhiteboardMessage.objects.create(project=obj.component.project,
                                     component=obj.component,
                                     language=obj.language,
                                     **form.cleaned_data)

    return redirect(obj)
Esempio n. 15
0
def revoke_owner(request, project):
    obj, form = check_user_form(request, project)

    if form is not None:
        if obj.owners.count() <= 1:
            messages.error(request, _('You can not remove last owner!'))
        else:
            # Ensure owner stays within project
            obj.add_user(form.cleaned_data['user'])

            obj.owners.remove(form.cleaned_data['user'])

    return redirect_param(
        'project',
        '#acl',
        project=obj.slug,
    )
Esempio n. 16
0
def whiteboard_project(request, project):
    obj = get_project(request, project)

    if not request.user.has_perm('project.edit', obj):
        raise PermissionDenied()

    form = WhiteboardForm(request.POST)
    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj, '#whiteboard')

    WhiteboardMessage.objects.create(
        project=obj,
        **form.cleaned_data
    )

    return redirect(obj)
Esempio n. 17
0
def show_check(request, name):
    '''
    Details about failing check.
    '''
    try:
        check = CHECKS[name]
    except KeyError:
        raise Http404('No check matches the given query.')

    ignore = ('ignored' in request.GET)

    url_params = {}

    if ignore:
        url_params['ignored'] = 'true'

    checks = acl_checks(request.user).filter(
        check=name,
        ignore=ignore,
    )

    if 'language' in request.GET:
        checks = checks.filter(language__code=request.GET['language'])
        url_params['language'] = request.GET['language']

    if 'project' in request.GET:
        return redirect_param(
            'show_check_project',
            encode_optional(url_params),
            project=request.GET['project'],
            name=name,
        )

    checks = checks.values('project__slug').annotate(count=Count('id'))

    return render(
        request,
        'check.html',
        {
            'checks': checks,
            'title': check.name,
            'check': check,
            'url_params': encode_optional(url_params),
        }
    )
Esempio n. 18
0
def show_check(request, name):
    '''
    Details about failing check.
    '''
    try:
        check = CHECKS[name]
    except KeyError:
        raise Http404('No check matches the given query.')

    ignore = ('ignored' in request.GET)

    url_params = {}

    if ignore:
        url_params['ignored'] = 'true'

    checks = acl_checks(request.user).filter(
        check=name,
        ignore=ignore,
    )

    if 'language' in request.GET:
        checks = checks.filter(language__code=request.GET['language'])
        url_params['language'] = request.GET['language']

    if 'project' in request.GET:
        return redirect_param(
            'show_check_project',
            encode_optional(url_params),
            project=request.GET['project'],
            name=name,
        )

    checks = checks.values('project__slug').annotate(count=Count('id'))

    return render(
        request,
        'check.html',
        {
            'checks': checks,
            'title': check.name,
            'check': check,
            'url_params': encode_optional(url_params),
        }
    )
Esempio n. 19
0
def announcement_translation(request, project, component, lang):
    obj = get_translation(request, project, component, lang)

    if not request.user.has_perm("component.edit", obj):
        raise PermissionDenied()

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

    Announcement.objects.create(user=request.user,
                                project=obj.component.project,
                                component=obj.component,
                                language=obj.language,
                                **form.cleaned_data)

    return redirect(obj)
Esempio n. 20
0
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)
Esempio n. 21
0
def set_groups(request, project):
    """Change group assignment for a user."""
    obj, form = check_user_form(request,
                                project,
                                form_class=ProjectUserGroupForm,
                                pass_project=True)

    user = form.cleaned_data["user"]
    desired_groups = {group.id for group in form.cleaned_data["groups"]}
    current_groups = set(
        user.groups.filter(defining_project=obj).values_list("id", flat=True))

    for group in obj.defined_groups.all():
        if group.id in desired_groups:
            if group.id in current_groups:
                continue
            user.groups.add(group)
            Change.objects.create(
                project=obj,
                action=Change.ACTION_ADD_USER,
                user=request.user,
                details={
                    "username": user.username,
                    "group": group.name
                },
            )
        elif group.id in current_groups:
            if request.user == user:
                messages.error(request, _("You can not remove yourself!"))
                continue
            user.groups.remove(group)
            Change.objects.create(
                project=obj,
                action=Change.ACTION_REMOVE_USER,
                user=request.user,
                details={
                    "username": user.username,
                    "group": group.name
                },
            )

    return redirect_param("manage-access",
                          "#api" if user.is_bot else "",
                          project=obj.slug)
Esempio n. 22
0
def whiteboard_translation(request, project, component, lang):
    obj = get_translation(request, project, component, lang)

    if not request.user.has_perm('component.edit', obj):
        raise PermissionDenied()

    form = WhiteboardForm(request.POST)
    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj, '#whiteboard')

    WhiteboardMessage.objects.create(
        project=obj.component.project,
        component=obj.component,
        language=obj.language,
        **form.cleaned_data
    )

    return redirect(obj)
Esempio n. 23
0
def delete_user(request, project):
    obj, form = check_user_form(request, project)

    if form is not None and obj.enable_acl:
        is_owner = obj.owners.filter(id=form.cleaned_data['user'].id).exists()
        if is_owner and obj.owners.count() <= 1:
            messages.error(request, _('You can not remove last owner!'))
        else:
            if is_owner:
                obj.owners.remove(form.cleaned_data['user'])
            obj.remove_user(form.cleaned_data['user'])
            messages.success(request,
                             _('User has been removed from this project.'))

    return redirect_param(
        'project',
        '#acl',
        project=obj.slug,
    )
Esempio n. 24
0
def show_check(request, name):
    """Show details about failing check."""
    try:
        check = CHECKS[name]
    except KeyError:
        raise Http404("No check matches the given query.")

    ignore = "ignored" in request.GET

    url_params = {}

    if ignore:
        url_params["ignored"] = "true"

    checks = acl_checks(request.user).filter(check=name, ignore=ignore)

    if request.GET.get("language"):
        checks = checks.filter(
            unit__translation__language__code=request.GET["language"])
        url_params["language"] = request.GET["language"]

    if request.GET.get("project") and "/" not in request.GET["project"]:
        return redirect_param(
            "show_check_project",
            encode_optional(url_params),
            project=request.GET["project"],
            name=name,
        )

    checks = checks.values(project__slug=F(
        "unit__translation__component__project__slug")).annotate(
            count=Count("id"))

    return render(
        request,
        "check.html",
        {
            "checks": checks,
            "title": check.name,
            "check": check,
            "url_params": encode_optional(url_params),
        },
    )
Esempio n. 25
0
def show_check(request, name):
    """Show details about failing check."""
    try:
        check = CHECKS[name]
    except KeyError:
        raise Http404('No check matches the given query.')

    ignore = 'ignored' in request.GET

    url_params = {}

    if ignore:
        url_params['ignored'] = 'true'

    checks = acl_checks(request.user).filter(check=name, ignore=ignore)

    if request.GET.get('language'):
        checks = checks.filter(
            unit__translation__language__code=request.GET['language'])
        url_params['language'] = request.GET['language']

    if request.GET.get('project') and '/' not in request.GET['project']:
        return redirect_param(
            'show_check_project',
            encode_optional(url_params),
            project=request.GET['project'],
            name=name,
        )

    checks = checks.values(project__slug=F(
        'unit__translation__component__project__slug')).annotate(
            count=Count('id'))

    return render(
        request,
        'check.html',
        {
            'checks': checks,
            'title': check.name,
            'check': check,
            'url_params': encode_optional(url_params),
        },
    )
Esempio n. 26
0
def remove_project(request, project):
    obj = get_project(request, project)

    if not request.user.has_perm('project.edit', obj):
        raise PermissionDenied()

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

    project_removal.delay(obj.pk)
    messages.success(request, _('Project was scheduled for removal.'))
    Change.objects.create(action=Change.ACTION_REMOVE_PROJECT,
                          target=obj.slug,
                          user=request.user,
                          author=request.user)

    return redirect('home')
Esempio n. 27
0
def perform_rename(form_cls, request, obj, perm, **kwargs):
    if not request.user.has_perm(perm, obj):
        raise PermissionDenied()

    form = form_cls(request, request.POST, instance=obj)
    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj, '#delete')

    # Invalidate old stats
    obj.stats.invalidate()

    obj = form.save()
    # Invalidate new stats
    obj.stats.invalidate()

    Change.objects.create(user=request.user, author=request.user, **kwargs)

    return redirect(obj)
Esempio n. 28
0
def perform_rename(form_cls, request, obj, perm: str):
    if not request.user.has_perm(perm, obj):
        raise PermissionDenied()

    form = form_cls(request, request.POST, instance=obj)
    if not form.is_valid():
        show_form_errors(request, form)
        # Reload the object from db to revert possible rejected change
        obj.refresh_from_db()
        return redirect_param(obj, "#rename")

    # Invalidate old stats
    obj.stats.invalidate()

    obj = form.save()
    # Invalidate new stats
    obj.stats.invalidate()

    return redirect(obj)
Esempio n. 29
0
def execute_locked(request, obj, message, call, *args, **kwargs):
    """
    Helper function to catch possible lock exception.
    """
    try:
        result = call(*args, **kwargs)
        # With False the call is supposed to show errors on its own
        if result is None or result:
            messages.success(request, message)
    except FileLockException as error:
        messages.error(
            request,
            _('Failed to lock the repository, another operation in progress.'))
        report_error(
            error,
            sys.exc_info(),
        )

    return redirect_param(obj, '#repository')
Esempio n. 30
0
def remove_component(request, project, component):
    obj = get_component(request, project, component)

    if not request.user.has_perm('component.edit', obj):
        raise PermissionDenied()

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

    obj.delete()
    messages.success(request, _('Translation component has been removed.'))
    Change.objects.create(project=obj.project,
                          action=Change.ACTION_REMOVE_COMPONENT,
                          target=obj.slug,
                          user=request.user,
                          author=request.user)

    return redirect(obj.project)
Esempio n. 31
0
def create_token(request, project):
    """Create project token."""
    obj = get_project(request, project)

    if not request.user.has_perm("project.permissions", obj):
        raise PermissionDenied()

    form = ProjectTokenCreateForm(obj, request.POST)

    if form.is_valid():
        token = form.save()
        messages.info(
            request,
            render_to_string("trans/projecttoken-created.html",
                             {"token": token.auth_token.key}),
        )
    else:
        show_form_errors(request, form)

    return redirect_param("manage-access", "#api", project=obj.slug)
Esempio n. 32
0
def delete_dictionary(request, project, lang, pk):
    prj = get_project(request, project)
    if not request.user.has_perm('glossary.delete', prj):
        raise PermissionDenied()

    lang = get_object_or_404(Language, code=lang)
    word = get_object_or_404(Dictionary, project=prj, language=lang, id=pk)

    word.delete()

    params = {}
    for param in ('letter', 'limit', 'page'):
        if param in request.POST:
            params[param] = request.POST[param]

    if params:
        param = '?' + urlencode(params)
    else:
        param = ''

    return redirect_param('show_dictionary', param, project=prj.slug, lang=lang.code)
Esempio n. 33
0
def remove_project(request, project):
    obj = get_project(request, project)

    if not request.user.has_perm('project.edit', obj):
        raise PermissionDenied()

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

    project_removal.delay(obj.pk)
    messages.success(request, _('Project was scheduled for removal.'))
    Change.objects.create(
        action=Change.ACTION_REMOVE_PROJECT,
        target=obj.slug,
        user=request.user,
        author=request.user
    )

    return redirect('home')
Esempio n. 34
0
def delete_user(request, project):
    obj, form = check_user_form(request, project)

    if form is not None and obj.enable_acl:
        is_owner = obj.owners.filter(
            id=form.cleaned_data['user'].id
        ).exists()
        if is_owner and obj.owners.count() <= 1:
            messages.error(request, _('You can not remove last owner!'))
        else:
            if is_owner:
                obj.owners.remove(form.cleaned_data['user'])
            obj.remove_user(form.cleaned_data['user'])
            messages.success(
                request, _('User has been removed from this project.')
            )

    return redirect_param(
        'project',
        '#acl',
        project=obj.slug,
    )
Esempio n. 35
0
def remove_component(request, project, component):
    obj = get_component(request, project, component)

    if not request.user.has_perm('component.edit', obj):
        raise PermissionDenied()

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

    obj.delete()
    messages.success(request, _('Translation component has been removed.'))
    Change.objects.create(
        project=obj.project,
        action=Change.ACTION_REMOVE_COMPONENT,
        target=obj.slug,
        user=request.user,
        author=request.user
    )

    return redirect(obj.project)
Esempio n. 36
0
def delete_user(request, project):
    obj = get_project(request, project)

    form = AddUserForm(request.POST)

    if form.is_valid():
        try:
            user = User.objects.get(username=form.cleaned_data['name'])
            obj.remove_user(user)
            messages.success(request,
                             _('User has been removed from this project.'))
        except User.DoesNotExist:
            messages.error(request, _('No matching user found!'))
        except User.MultipleObjectsReturned:
            messages.error(request, _('More users matched!'))
    else:
        messages.error(request, _('Invalid user specified!'))

    return redirect_param(
        'project',
        '#acl',
        project=obj.slug,
    )
Esempio n. 37
0
def get_credits(request, project=None, component=None):
    """View for credits"""
    if project is None:
        obj = None
        kwargs = {'translation__pk__gt': 0}
    elif component is None:
        obj = get_project(request, project)
        kwargs = {'translation__component__project': obj}
    else:
        obj = get_component(request, project, component)
        kwargs = {'translation__component': obj}

    form = ReportsForm(request.POST)

    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj or 'home', '#reports')

    data = generate_credits(
        None if request.user.has_perm('reports.view', obj) else request.user,
        form.cleaned_data['start_date'], form.cleaned_data['end_date'],
        **kwargs)

    if form.cleaned_data['style'] == 'json':
        return JsonResponse(data=data, safe=False)

    if form.cleaned_data['style'] == 'html':
        start = '<table>'
        row_start = '<tr>'
        language_format = '<th>{0}</th>'
        translator_start = '<td><ul>'
        translator_format = '<li><a href="mailto:{0}">{1}</a></li>'
        translator_end = '</ul></td>'
        row_end = '</tr>'
        mime = 'text/html'
        end = '</table>'
    else:
        start = ''
        row_start = ''
        language_format = '* {0}\n'
        translator_start = ''
        translator_format = '    * {1} <{0}>'
        translator_end = ''
        row_end = ''
        mime = 'text/plain'
        end = ''

    result = []

    result.append(start)

    for language in data:
        name, translators = language.popitem()
        result.append(row_start)
        result.append(language_format.format(name))
        result.append(''.join((
            translator_start,
            '\n'.join([translator_format.format(*t) for t in translators]),
            translator_end,
        )))
        result.append(row_end)

    result.append(end)

    return HttpResponse(
        '\n'.join(result),
        content_type='{0}; charset=utf-8'.format(mime),
    )
Esempio n. 38
0
def show_check_subproject(request, name, project, subproject):
    """
    Show checks failing in a subproject.
    """
    subprj = get_subproject(request, project, subproject)
    try:
        check = CHECKS[name]
    except KeyError:
        raise Http404("No check matches the given query.")

    ignore = "ignored" in request.GET
    url_params = {}

    allchecks = acl_checks(request.user).filter(check=name, project=subprj.project, ignore=ignore)

    if ignore:
        url_params["ignored"] = "true"

    if check.source:
        url_params["type"] = check.check_id
        return redirect_param(
            "review_source", encode_optional(url_params), project=subprj.project.slug, subproject=subprj.slug
        )

    if "language" in request.GET:
        url_params["type"] = check.check_id
        return redirect_param(
            "translate",
            encode_optional(url_params),
            project=subprj.project.slug,
            subproject=subprj.slug,
            lang=request.GET["language"],
        )

    units = Unit.objects.none()

    if check.target:
        langs = allchecks.values_list("language", flat=True).distinct()
        for lang in langs:
            checks = allchecks.filter(language=lang).values_list("contentsum", flat=True)
            res = (
                Unit.objects.filter(
                    translation__subproject=subprj, contentsum__in=checks, translation__language=lang, translated=True
                )
                .values("translation__language__code")
                .annotate(count=Count("id"))
            )
            units |= res

    counts = {}
    for unit in units:
        key = unit["translation__language__code"]
        if key in counts:
            counts[key] += unit["count"]
        else:
            counts[key] = unit["count"]

    units = [{"translation__language__code": item, "count": counts[item]} for item in counts]

    return render(
        request,
        "check_subproject.html",
        {
            "checks": units,
            "title": "%s/%s" % (force_text(subprj), check.name),
            "check": check,
            "subproject": subprj,
            "url_params": encode_optional(url_params),
        },
    )
Esempio n. 39
0
def show_check_component(request, name, project, component):
    """Show checks failing in a component."""
    subprj = get_component(request, project, component)
    try:
        check = CHECKS[name]
    except KeyError:
        raise Http404('No check matches the given query.')

    ignore = ('ignored' in request.GET)
    url_params = {}

    allchecks = acl_checks(request.user).filter(
        check=name,
        project=subprj.project,
        ignore=ignore,
    )

    if ignore:
        url_params['ignored'] = 'true'

    if check.source:
        url_params['type'] = check.url_id
        return redirect_param(
            'review_source',
            encode_optional(url_params),
            project=subprj.project.slug,
            component=subprj.slug,
        )

    if request.GET.get('language') and '/' not in request.GET['language']:
        url_params['type'] = check.url_id
        return redirect_param(
            'translate',
            encode_optional(url_params),
            project=subprj.project.slug,
            component=subprj.slug,
            lang=request.GET['language'],
        )

    units = Unit.objects.none()

    if check.target:
        langs = allchecks.values_list(
            'language', flat=True
        ).distinct()
        for lang in langs:
            checks = allchecks.filter(
                language=lang,
            ).values_list('content_hash', flat=True)
            res = Unit.objects.filter(
                translation__component=subprj,
                content_hash__in=checks,
                translation__language=lang,
            ).values(
                'translation__language__code'
            ).annotate(count=Count('id'))
            units |= res

    counts = {}
    for unit in units:
        key = unit['translation__language__code']
        if key in counts:
            counts[key] += unit['count']
        else:
            counts[key] = unit['count']

    units = [
        {
            'translation__language__code': item,
            'count': counts[item]
        } for item in counts
    ]

    return render(
        request,
        'check_component.html',
        {
            'checks': units,
            'title': '{0}/{1}'.format(force_text(subprj), check.name),
            'check': check,
            'component': subprj,
            'url_params': encode_optional(url_params),
        }
    )
Esempio n. 40
0
def get_counts(request, project=None, component=None):
    """View for work counts"""
    if project is None:
        obj = None
        kwargs = {}
    elif component is None:
        obj = get_project(request, project)
        kwargs = {'project': obj}
    else:
        obj = get_component(request, project, component)
        kwargs = {'component': obj}

    form = ReportsForm(request.POST)

    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj or 'home', '#reports')

    data = generate_counts(
        None if request.user.has_perm('reports.view', obj) else request.user,
        form.cleaned_data['start_date'], form.cleaned_data['end_date'],
        **kwargs)

    if form.cleaned_data['style'] == 'json':
        return JsonResponse(data=data, safe=False)

    headers = (
        'Name',
        'Email',
        'Count total',
        'Source words total',
        'Source chars total',
        'Target words total',
        'Target chars total',
        'Count new',
        'Source words new',
        'Source chars new',
        'Target words new',
        'Target chars new',
        'Count approved',
        'Source words approved',
        'Source chars approved',
        'Target words approved',
        'Target chars approved',
        'Count edited',
        'Source words edited',
        'Source chars edited',
        'Target words edited',
        'Target chars edited',
    )

    if form.cleaned_data['style'] == 'html':
        start = HTML_HEADING.format(''.join(
            ['<th>{0}</th>'.format(h) for h in headers]))
        row_start = '<tr>'
        cell_name = cell_count = '<td>{0}</td>\n'
        row_end = '</tr>'
        mime = 'text/html'
        end = '</table>'
    else:
        start = '{0}\n{1} {2}\n{0}'.format(
            RST_HEADING,
            ' '.join(['{0:40}'.format(h) for h in headers[:2]]),
            ' '.join(['{0:24}'.format(h) for h in headers[2:]]),
        )
        row_start = ''
        cell_name = '{0:40} '
        cell_count = '{0:24} '
        row_end = ''
        mime = 'text/plain'
        end = RST_HEADING

    result = []

    result.append(start)

    for item in data:
        if row_start:
            result.append(row_start)
        result.append(''.join((
            cell_name.format(item['name']),
            cell_name.format(item['email']),
            cell_count.format(item['count']),
            cell_count.format(item['words']),
            cell_count.format(item['chars']),
            cell_count.format(item['t_words']),
            cell_count.format(item['t_chars']),
            cell_count.format(item['count_new']),
            cell_count.format(item['words_new']),
            cell_count.format(item['chars_new']),
            cell_count.format(item['t_words_new']),
            cell_count.format(item['t_chars_new']),
            cell_count.format(item['count_approve']),
            cell_count.format(item['words_approve']),
            cell_count.format(item['chars_approve']),
            cell_count.format(item['t_words_approve']),
            cell_count.format(item['t_chars_approve']),
            cell_count.format(item['count_edit']),
            cell_count.format(item['words_edit']),
            cell_count.format(item['chars_edit']),
            cell_count.format(item['t_words_edit']),
            cell_count.format(item['t_chars_edit']),
        )))
        if row_end:
            result.append(row_end)

    result.append(end)

    return HttpResponse(
        '\n'.join(result),
        content_type='{0}; charset=utf-8'.format(mime),
    )
Esempio n. 41
0
def show_check_subproject(request, name, project, subproject):
    '''
    Show checks failing in a subproject.
    '''
    subprj = get_subproject(request, project, subproject)
    try:
        check = CHECKS[name]
    except KeyError:
        raise Http404('No check matches the given query.')

    ignore = ('ignored' in request.GET)
    url_params = {}

    allchecks = Check.objects.filter(
        check=name,
        project=subprj.project,
        ignore=ignore,
    )

    if ignore:
        url_params['ignored'] = 'true'

    if check.source:
        url_params['type'] = check.check_id
        return redirect_param(
            'review_source',
            encode_optional(url_params),
            project=subprj.project.slug,
            subproject=subprj.slug,
        )

    if 'language' in request.GET:
        return redirect_param(
            'translate',
            encode_optional(url_params),
            project=subprj.project.slug,
            subproject=subprj.slug,
            lang=request.GET['language'],
        )

    units = Unit.objects.none()

    if check.target:
        langs = allchecks.values_list(
            'language', flat=True
        ).distinct()
        for lang in langs:
            checks = allchecks.filter(
                language=lang,
            ).values_list('contentsum', flat=True)
            res = Unit.objects.filter(
                translation__subproject=subprj,
                contentsum__in=checks,
                translation__language=lang,
                translated=True
            ).values(
                'translation__language__code'
            ).annotate(count=Count('id'))
            units |= res

    counts = {}
    for unit in units:
        key = unit['translation__language__code']
        if key in counts:
            counts[key] += unit['count']
        else:
            counts[key] = unit['count']

    units = [
        {
            'translation__language__code': item,
            'count': counts[item]
        } for item in counts
    ]

    return render(
        request,
        'check_subproject.html',
        {
            'checks': units,
            'title': '%s/%s' % (subprj.__unicode__(), check.name),
            'check': check,
            'subproject': subprj,
            'url_params': encode_optional(url_params),
        }
    )
Esempio n. 42
0
def get_credits(request, project, component):
    """View for credits"""
    obj = get_component(request, project, component)

    if not request.user.has_perm('reports.view', obj):
        raise PermissionDenied()

    form = ReportsForm(request.POST)

    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj, '#reports')

    data = generate_credits(
        obj,
        form.cleaned_data['start_date'],
        form.cleaned_data['end_date'],
    )

    if form.cleaned_data['style'] == 'json':
        return JsonResponse(data=data, safe=False)

    if form.cleaned_data['style'] == 'html':
        start = '<table>'
        row_start = '<tr>'
        language_format = '<th>{0}</th>'
        translator_start = '<td><ul>'
        translator_format = '<li><a href="mailto:{0}">{1}</a></li>'
        translator_end = '</ul></td>'
        row_end = '</tr>'
        mime = 'text/html'
        end = '</table>'
    else:
        start = ''
        row_start = ''
        language_format = '* {0}\n'
        translator_start = ''
        translator_format = '    * {1} <{0}>'
        translator_end = ''
        row_end = ''
        mime = 'text/plain'
        end = ''

    result = []

    result.append(start)

    for language in data:
        name, translators = language.popitem()
        result.append(row_start)
        result.append(language_format.format(name))
        result.append(
            ''.join((
                translator_start,
                '\n'.join(
                    [translator_format.format(*t) for t in translators]
                ),
                translator_end,
            ))
        )
        result.append(row_end)

    result.append(end)

    return HttpResponse(
        '\n'.join(result),
        content_type='{0}; charset=utf-8'.format(mime),
    )
Esempio n. 43
0
def get_counts(request, project, component):
    """View for work counts"""
    obj = get_component(request, project, component)

    if not request.user.has_perm('reports.view', obj):
        raise PermissionDenied()

    form = ReportsForm(request.POST)

    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj, '#reports')

    data = generate_counts(
        obj,
        form.cleaned_data['start_date'],
        form.cleaned_data['end_date'],
    )

    if form.cleaned_data['style'] == 'json':
        return JsonResponse(data=data, safe=False)

    headers = (
        'Name',
        'Email',
        'Words total',
        'Count total',
        'Words edited',
        'Count edited',
        'Words new',
        'Count new',
    )

    if form.cleaned_data['style'] == 'html':
        start = HTML_HEADING.format(''.join(
            ['<th>{0}</th>'.format(h) for h in headers]))
        row_start = '<tr>'
        cell_name = cell_count = '<td>{0}</td>\n'
        row_end = '</tr>'
        mime = 'text/html'
        end = '</table>'
    else:
        start = '{0}\n{1} {2}\n{0}'.format(
            RST_HEADING,
            ' '.join(['{0:40}'.format(h) for h in headers[:2]]),
            ' '.join(['{0:12}'.format(h) for h in headers[2:]]),
        )
        row_start = ''
        cell_name = '{0:40} '
        cell_count = '{0:12} '
        row_end = ''
        mime = 'text/plain'
        end = RST_HEADING

    result = []

    result.append(start)

    for item in data:
        if row_start:
            result.append(row_start)
        result.append(''.join((
            cell_name.format(item['name']),
            cell_name.format(item['email']),
            cell_count.format(item['words']),
            cell_count.format(item['count']),
            cell_count.format(item['words_new']),
            cell_count.format(item['count_new']),
            cell_count.format(item['words_edit']),
            cell_count.format(item['count_edit']),
        )))
        if row_end:
            result.append(row_end)

    result.append(end)

    return HttpResponse(
        '\n'.join(result),
        content_type='{0}; charset=utf-8'.format(mime),
    )
Esempio n. 44
0
def get_counts(request, project=None, component=None):
    """View for work counts."""
    if project is None:
        obj = None
        kwargs = {}
    elif component is None:
        obj = get_project(request, project)
        kwargs = {"project": obj}
    else:
        obj = get_component(request, project, component)
        kwargs = {"component": obj}

    form = ReportsForm(request.POST)

    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj or "home", "#reports")

    data = generate_counts(
        None if request.user.has_perm("reports.view", obj) else request.user,
        form.cleaned_data["start_date"], form.cleaned_data["end_date"],
        **kwargs)

    if form.cleaned_data["style"] == "json":
        return JsonResponse(data=data, safe=False)

    headers = (
        "Name",
        "Email",
        "Count total",
        "Source words total",
        "Source chars total",
        "Target words total",
        "Target chars total",
        "Count new",
        "Source words new",
        "Source chars new",
        "Target words new",
        "Target chars new",
        "Count approved",
        "Source words approved",
        "Source chars approved",
        "Target words approved",
        "Target chars approved",
        "Count edited",
        "Source words edited",
        "Source chars edited",
        "Target words edited",
        "Target chars edited",
    )

    if form.cleaned_data["style"] == "html":
        start = HTML_HEADING.format("".join("<th>{0}</th>".format(h)
                                            for h in headers))
        row_start = "<tr>"
        cell_name = cell_count = "<td>{0}</td>\n"
        row_end = "</tr>"
        mime = "text/html"
        end = "</table>"
    else:
        start = "{0}\n{1} {2}\n{0}".format(
            RST_HEADING,
            " ".join("{0:40}".format(h) for h in headers[:2]),
            " ".join("{0:24}".format(h) for h in headers[2:]),
        )
        row_start = ""
        cell_name = "{0:40} "
        cell_count = "{0:24} "
        row_end = ""
        mime = "text/plain"
        end = RST_HEADING

    result = []

    result.append(start)

    for item in data:
        if row_start:
            result.append(row_start)
        result.append(
            cell_name.format(item["name"] or "Anonymous") +
            cell_name.format(item["email"] or "") +
            cell_count.format(item["count"]) +
            cell_count.format(item["words"]) +
            cell_count.format(item["chars"]) +
            cell_count.format(item["t_words"]) +
            cell_count.format(item["t_chars"]) +
            cell_count.format(item["count_new"]) +
            cell_count.format(item["words_new"]) +
            cell_count.format(item["chars_new"]) +
            cell_count.format(item["t_words_new"]) +
            cell_count.format(item["t_chars_new"]) +
            cell_count.format(item["count_approve"]) +
            cell_count.format(item["words_approve"]) +
            cell_count.format(item["chars_approve"]) +
            cell_count.format(item["t_words_approve"]) +
            cell_count.format(item["t_chars_approve"]) +
            cell_count.format(item["count_edit"]) +
            cell_count.format(item["words_edit"]) +
            cell_count.format(item["chars_edit"]) +
            cell_count.format(item["t_words_edit"]) +
            cell_count.format(item["t_chars_edit"]))
        if row_end:
            result.append(row_end)

    result.append(end)

    return HttpResponse("\n".join(result),
                        content_type="{0}; charset=utf-8".format(mime))
Esempio n. 45
0
def get_credits(request, project=None, component=None):
    """View for credits."""
    if project is None:
        obj = None
        kwargs = {"translation__pk__gt": 0}
    elif component is None:
        obj = get_project(request, project)
        kwargs = {"translation__component__project": obj}
    else:
        obj = get_component(request, project, component)
        kwargs = {"translation__component": obj}

    form = ReportsForm(request.POST)

    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj or "home", "#reports")

    data = generate_credits(
        None if request.user.has_perm("reports.view", obj) else request.user,
        form.cleaned_data["start_date"], form.cleaned_data["end_date"],
        **kwargs)

    if form.cleaned_data["style"] == "json":
        return JsonResponse(data=data, safe=False)

    if form.cleaned_data["style"] == "html":
        start = "<table>"
        row_start = "<tr>"
        language_format = "<th>{0}</th>"
        translator_start = "<td><ul>"
        translator_format = '<li><a href="mailto:{0}">{1}</a></li>'
        translator_end = "</ul></td>"
        row_end = "</tr>"
        mime = "text/html"
        end = "</table>"
    else:
        start = ""
        row_start = ""
        language_format = "* {0}\n"
        translator_start = ""
        translator_format = "    * {1} <{0}>"
        translator_end = ""
        row_end = ""
        mime = "text/plain"
        end = ""

    result = []

    result.append(start)

    for language in data:
        name, translators = language.popitem()
        result.append(row_start)
        result.append(language_format.format(name))
        result.append(translator_start + "\n".join(
            translator_format.format(*t)
            for t in translators) + translator_end)
        result.append(row_end)

    result.append(end)

    return HttpResponse("\n".join(result),
                        content_type="{0}; charset=utf-8".format(mime))
Esempio n. 46
0
def get_credits(request, project, subproject):
    """View for credits"""
    obj = get_subproject(request, project, subproject)

    if not can_view_reports(request.user, obj.project):
        raise PermissionDenied()

    form = ReportsForm(request.POST)

    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj, '#reports')

    data = generate_credits(
        obj,
        form.cleaned_data['start_date'],
        form.cleaned_data['end_date'],
    )

    if form.cleaned_data['style'] == 'json':
        return JsonResponse(data=data, safe=False)

    if form.cleaned_data['style'] == 'html':
        start = '<table>'
        row_start = '<tr>'
        language_format = '<th>{0}</th>'
        translator_start = '<td><ul>'
        translator_format = '<li><a href="mailto:{0}">{1}</a></li>'
        translator_end = '</ul></td>'
        row_end = '</tr>'
        mime = 'text/html'
        end = '</table>'
    else:
        start = ''
        row_start = ''
        language_format = '* {0}\n'
        translator_start = ''
        translator_format = '    * {1} <{0}>'
        translator_end = ''
        row_end = ''
        mime = 'text/plain'
        end = ''

    result = []

    result.append(start)

    for language in data:
        name, translators = language.popitem()
        result.append(row_start)
        result.append(language_format.format(name))
        result.append(''.join((
            translator_start,
            '\n'.join([translator_format.format(*t) for t in translators]),
            translator_end,
        )))
        result.append(row_end)

    result.append(end)

    return HttpResponse(
        '\n'.join(result),
        content_type='{0}; charset=utf-8'.format(mime),
    )
Esempio n. 47
0
def get_counts(request, project, component):
    """View for work counts"""
    obj = get_component(request, project, component)

    if not request.user.has_perm('reports.view', obj):
        raise PermissionDenied()

    form = ReportsForm(request.POST)

    if not form.is_valid():
        show_form_errors(request, form)
        return redirect_param(obj, '#reports')

    data = generate_counts(
        obj,
        form.cleaned_data['start_date'],
        form.cleaned_data['end_date'],
    )

    if form.cleaned_data['style'] == 'json':
        return JsonResponse(data=data, safe=False)

    headers = (
        'Name',
        'Email',
        'Words total',
        'Count total',
        'Words edited',
        'Count edited',
        'Words new',
        'Count new',
    )

    if form.cleaned_data['style'] == 'html':
        start = HTML_HEADING.format(
            ''.join(['<th>{0}</th>'.format(h) for h in headers])
        )
        row_start = '<tr>'
        cell_name = cell_count = '<td>{0}</td>\n'
        row_end = '</tr>'
        mime = 'text/html'
        end = '</table>'
    else:
        start = '{0}\n{1} {2}\n{0}'.format(
            RST_HEADING,
            ' '.join(['{0:40}'.format(h) for h in headers[:2]]),
            ' '.join(['{0:12}'.format(h) for h in headers[2:]]),
        )
        row_start = ''
        cell_name = '{0:40} '
        cell_count = '{0:12} '
        row_end = ''
        mime = 'text/plain'
        end = RST_HEADING

    result = []

    result.append(start)

    for item in data:
        if row_start:
            result.append(row_start)
        result.append(
            ''.join((
                cell_name.format(item['name']),
                cell_name.format(item['email']),
                cell_count.format(item['words']),
                cell_count.format(item['count']),
                cell_count.format(item['words_new']),
                cell_count.format(item['count_new']),
                cell_count.format(item['words_edit']),
                cell_count.format(item['count_edit']),
            ))
        )
        if row_end:
            result.append(row_end)

    result.append(end)

    return HttpResponse(
        '\n'.join(result),
        content_type='{0}; charset=utf-8'.format(mime),
    )
Esempio n. 48
0
def show_check_subproject(request, name, project, subproject):
    '''
    Show checks failing in a subproject.
    '''
    subprj = get_subproject(request, project, subproject)
    try:
        check = CHECKS[name]
    except KeyError:
        raise Http404('No check matches the given query.')

    ignore = ('ignored' in request.GET)
    url_params = {}

    allchecks = Check.objects.filter(
        check=name,
        project=subprj.project,
        ignore=ignore,
    )

    if ignore:
        url_params['ignored'] = 'true'

    if check.source:
        url_params['type'] = check.check_id
        return redirect_param(
            'review_source',
            encode_optional(url_params),
            project=subprj.project.slug,
            subproject=subprj.slug,
        )

    if 'language' in request.GET:
        return redirect_param(
            'translate',
            encode_optional(url_params),
            project=subprj.project.slug,
            subproject=subprj.slug,
            lang=request.GET['language'],
        )

    units = Unit.objects.none()

    if check.target:
        langs = allchecks.values_list('language', flat=True).distinct()
        for lang in langs:
            checks = allchecks.filter(language=lang, ).values_list(
                'contentsum', flat=True)
            res = Unit.objects.filter(
                translation__subproject=subprj,
                contentsum__in=checks,
                translation__language=lang,
                translated=True).values(
                    'translation__language__code').annotate(count=Count('id'))
            units |= res

    counts = {}
    for unit in units:
        key = unit['translation__language__code']
        if key in counts:
            counts[key] += unit['count']
        else:
            counts[key] = unit['count']

    units = [{
        'translation__language__code': item,
        'count': counts[item]
    } for item in counts]

    return render(
        request, 'check_subproject.html', {
            'checks': units,
            'title': '%s/%s' % (subprj.__unicode__(), check.name),
            'check': check,
            'subproject': subprj,
            'url_params': encode_optional(url_params),
        })