Beispiel #1
0
def change_project(request, project):
    obj = get_project(request, project)

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

    if request.method == 'POST':
        settings_form = ProjectSettingsForm(request, request.POST, instance=obj)
        if settings_form.is_valid():
            settings_form.save()
            messages.success(request, _('Settings saved'))
            return redirect('settings', project=obj.slug)
        else:
            messages.error(
                request,
                _('Invalid settings, please check the form for errors!')
            )
    else:
        settings_form = ProjectSettingsForm(request, instance=obj)

    return render(
        request,
        'project-settings.html',
        {
            'object': obj,
            'settings_form': settings_form,
        }
    )
Beispiel #2
0
def unwatch(request, project):
    obj = get_project(request, project)
    request.user.profile.watched.remove(obj)
    request.user.subscription_set.filter(
        Q(project=obj) | Q(component__project=obj)
    ).delete()
    return redirect(obj)
Beispiel #3
0
def show_engage(request, project, lang=None):
    # Get project object, skipping ACL
    obj = get_project(request, project, skip_acl=True)

    # Handle language parameter
    if lang is not None:
        language = Language.objects.try_get(code=lang)
    else:
        language = None
    if language:
        try_set_language(lang)
        stats_obj = obj.stats.get_single_language_stats(language)
    else:
        stats_obj = obj.stats

    return render(
        request,
        'engage.html',
        {
            'allow_index': True,
            'object': obj,
            'project': obj,
            'languages': stats_obj.languages,
            'total': obj.stats.source_strings,
            'percent': stats_obj.translated_percent,
            'language': language,
            'title': _('Get involved in {0}!').format(obj),
        }
    )
Beispiel #4
0
def push_project(request, project):
    obj = get_project(request, project)

    if not request.user.has_perm('vcs.push', obj):
        raise PermissionDenied()

    return perform_push(request, obj)
Beispiel #5
0
def cleanup_project(request, project):
    obj = get_project(request, project)

    if not request.user.has_perm('vcs.reset', obj):
        raise PermissionDenied()

    return perform_cleanup(request, obj)
Beispiel #6
0
def update_project(request, project):
    obj = get_project(request, project)

    if not request.user.has_perm('vcs.update', obj):
        raise PermissionDenied()

    return perform_update(request, obj)
Beispiel #7
0
def commit_project(request, project):
    obj = get_project(request, project)

    if not request.user.has_perm('vcs.commit', obj):
        raise PermissionDenied()

    return perform_commit(request, obj)
Beispiel #8
0
def show_engage(request, project, lang=None):
    # Get project object, skipping ACL
    obj = get_project(request, project, skip_acl=True)

    # Handle language parameter
    if lang is not None:
        language = get_object_or_404(Language, code=lang)
    else:
        language = None
    full_stats = obj.stats
    if language:
        try_set_language(lang)
        stats_obj = full_stats.get_single_language_stats(language)
    else:
        stats_obj = full_stats

    return render(
        request,
        'engage.html',
        {
            'allow_index': True,
            'object': obj,
            'project': obj,
            'full_stats': full_stats,
            'languages': stats_obj.languages,
            'total': obj.stats.source_strings,
            'percent': stats_obj.translated_percent,
            'language': language,
            'project_link': mark_safe('<a href="{}">{}</a>'.format(
                escape(obj.get_absolute_url()), escape(obj.name)
            )),
            'title': _('Get involved in {0}!').format(obj),
        }
    )
Beispiel #9
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
    )
Beispiel #10
0
def change_access(request, project):
    obj = get_project(request, project)

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

    form = ProjectAccessForm(request.POST, instance=obj)

    if not form.is_valid():
        for error in form.errors:
            for message in form.errors[error]:
                messages.error(request, message)
    else:
        form.save()
        Change.objects.create(
            project=obj,
            action=Change.ACTION_ACCESS_EDIT,
            user=request.user,
            details={'access_control': obj.access_control},
        )
        messages.success(
            request, _('Project access control has been changed.')
        )

    return redirect(
        'manage-access',
        project=obj.slug,
    )
Beispiel #11
0
def show_project(request, project):
    obj = get_project(request, project)
    user = request.user

    dict_langs = Language.objects.filter(
        dictionary__project=obj
    ).annotate(Count('dictionary'))

    last_changes = Change.objects.prefetch().filter(project=obj)[:10]

    language_stats = sort_unicode(
        obj.stats.get_language_stats(), lambda x: force_text(x.language.name)
    )

    # Paginate components of project.
    all_components = obj.component_set.select_related()
    components = prefetch_stats(get_paginator(
        request, all_components
    ))

    return render(
        request,
        'project.html',
        {
            'allow_index': True,
            'object': obj,
            'project': obj,
            'dicts': dict_langs,
            'last_changes': last_changes,
            'last_changes_url': urlencode(
                {'project': obj.slug}
            ),
            'language_stats': language_stats,
            'language_count': Language.objects.filter(
                translation__component__project=obj
            ).distinct().count(),
            'search_form': SearchForm(),
            'whiteboard_form': optional_form(
                WhiteboardForm, user, 'project.edit', obj
            ),
            'delete_form': optional_form(
                DeleteForm, user, 'project.edit', obj, obj=obj
            ),
            'rename_form': optional_form(
                ProjectRenameForm, user, 'project.edit', obj,
                request=request, instance=obj
            ),
            'replace_form': optional_form(ReplaceForm, user, 'unit.edit', obj),
            'bulk_state_form': optional_form(
                BulkStateForm, user, 'translation.auto', obj,
                user=user, obj=obj
            ),
            'components': components,
            'licenses': ', '.join(
                sorted({x.license for x in all_components if x.license})
            ),
        }
    )
Beispiel #12
0
def data_project(request, project):
    obj = get_project(request, project)
    return render(
        request,
        'data.html',
        {
            'object': obj,
            'project': obj,
        }
    )
Beispiel #13
0
def edit_dictionary(request, project, lang, pk):
    prj = get_project(request, project)
    if not request.user.has_perm('glossary.edit', prj):
        raise PermissionDenied()
    lang = get_object_or_404(Language, code=lang)
    word = get_object_or_404(
        Dictionary,
        project=prj,
        language=lang,
        id=pk,
    )

    if request.method == 'POST':
        form = WordForm(request.POST)
        if form.is_valid():
            word.edit(
                request,
                form.cleaned_data['source'],
                form.cleaned_data['target']
            )
            return redirect(
                'show_dictionary',
                project=prj.slug,
                lang=lang.code
            )
    else:
        form = WordForm(
            initial={'source': word.source, 'target': word.target}
        )

    last_changes = Change.objects.last_changes(request.user).filter(
        dictionary=word,
    )[:10]

    return render(
        request,
        'edit_dictionary.html',
        {
            'title': dict_title(prj, lang),
            'project': prj,
            'language': lang,
            'form': form,
            'last_changes': last_changes,
            'last_changes_url': urlencode({
                'project': prj.slug,
                'lang': lang.code,
                'glossary': 1
            }),
        }
    )
Beispiel #14
0
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)
    else:
        obj = get_component(request, project, component, skip_acl=True)

    # Handle language parameter
    if lang is not None:
        if 'native' not in request.GET:
            try_set_language(lang)
        lang = Language.objects.try_get(code=lang)
    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
    widget_obj.render()

    return HttpResponse(
        content_type=widget_obj.content_type,
        content=widget_obj.get_content()
    )
Beispiel #15
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')
Beispiel #16
0
def show_dictionaries(request, project):
    obj = get_project(request, project)
    dicts = Translation.objects.filter(
        component__project=obj
    ).values_list('language', flat=True).distinct()

    return render(
        request,
        'dictionaries.html',
        {
            'title': _('Dictionaries'),
            'dicts': Language.objects.filter(id__in=dicts),
            'project': obj,
        }
    )
Beispiel #17
0
def unlock_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, False)

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

    return redirect_param(obj, '#repository')
Beispiel #18
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)
Beispiel #19
0
def show_project(request, lang, project):
    try:
        obj = Language.objects.get(code=lang)
    except Language.DoesNotExist:
        obj = Language.objects.fuzzy_get(lang)
        if isinstance(obj, Language):
            return redirect(obj)
        raise Http404('No Language matches the given query.')

    pobj = get_project(request, project)

    last_changes = Change.objects.last_changes(request.user).filter(
        translation__language=obj,
        component__project=pobj
    )[:10]

    # Paginate translations.
    translation_list = obj.translation_set.prefetch().filter(
        component__project=pobj
    ).order_by(
        'component__project__slug', 'component__slug'
    )
    translations = get_paginator(request, translation_list)

    return render(
        request,
        'language-project.html',
        {
            'allow_index': True,
            'language': obj,
            'project': pobj,
            'last_changes': last_changes,
            'last_changes_url': urlencode(
                {'lang': obj.code, 'project': pobj.slug}
            ),
            'translations': translations,
            'title': '{0} - {1}'.format(pobj, obj),
            'show_only_component': True,
            'search_form': SiteSearchForm(),
        }
    )
Beispiel #20
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')
Beispiel #21
0
def check_user_form(request, project, verbose=False):
    """Check project permission and UserManageForm.

    This is simple helper to perform needed validation for all
    user management views.
    """
    obj = get_project(request, project)

    if (not request.user.has_perm('project.permissions', obj) or
            obj.access_control == obj.ACCESS_CUSTOM):
        raise PermissionDenied()

    form = UserManageForm(request.POST)

    if form.is_valid():
        return obj, form
    if verbose:
        for error in form.errors:
            for message in form.errors[error]:
                messages.error(request, message)
    return obj, None
Beispiel #22
0
def parse_url(request, project, component=None, lang=None):
    context = {}
    if component is None:
        obj = get_project(request, project)
        unit_set = Unit.objects.filter(translation__component__project=obj)
        context['project'] = obj
    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
    else:
        obj = get_translation(request, project, component, lang)
        unit_set = obj.unit_set
        context['translation'] = obj
        context['component'] = obj.component
        context['project'] = obj.component.project

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

    return obj, unit_set, context
Beispiel #23
0
def upload_dictionary(request, project, lang):
    prj = get_project(request, project)
    if not request.user.has_perm('glossary.upload', prj):
        raise PermissionDenied()
    lang = get_object_or_404(Language, code=lang)

    form = DictUploadForm(request.POST, request.FILES)
    if form.is_valid():
        try:
            count = Dictionary.objects.upload(
                request,
                prj,
                lang,
                request.FILES['file'],
                form.cleaned_data['method']
            )
            import_message(
                request, count,
                _('No words to import found in file.'),
                ungettext(
                    'Imported %d word from the uploaded file.',
                    'Imported %d words from the uploaded file.',
                    count
                )
            )
        except Exception as error:
            report_error(error, request)
            messages.error(
                request, _('File upload has failed: %s') % force_text(error)
            )
    else:
        messages.error(request, _('Failed to process form!'))
    return redirect(
        'show_dictionary',
        project=prj.slug,
        lang=lang.code
    )
Beispiel #24
0
def manage_access(request, project):
    """User management view."""
    obj = get_project(request, project)

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

    if request.user.has_perm('billing:project.permissions', obj):
        access_form = ProjectAccessForm(instance=obj)
    else:
        access_form = DisabledProjectAccessForm(instance=obj)

    return render(
        request,
        'manage-access.html',
        {
            'object': obj,
            'project': obj,
            'groups': Group.objects.for_project(obj),
            'all_users': User.objects.for_project(obj),
            'add_user_form': UserManageForm(),
            'access_form': access_form,
        }
    )
Beispiel #25
0
def download_dictionary(request, project, lang):
    """Export dictionary into various formats."""
    prj = get_project(request, project)
    lang = get_object_or_404(Language, code=lang)

    # Parse parameters
    export_format = None
    if 'format' in request.GET:
        export_format = request.GET['format']
    if export_format not in ('csv', 'po', 'tbx', 'xliff'):
        export_format = 'csv'

    # Grab all words
    words = Dictionary.objects.filter(
        project=prj,
        language=lang
    ).order_by(Lower('source'))

    # Translate toolkit based export
    exporter = get_exporter(export_format)(
        prj, lang,
        get_site_url(reverse(
            'show_dictionary',
            kwargs={'project': prj.slug, 'lang': lang.code}
        )),
        fieldnames=('source', 'target'),
    )

    # Add words
    for word in words.iterator():
        exporter.add_dictionary(word)

    # Save to response
    return exporter.get_response(
        'glossary-{project}-{language}.{extension}'
    )
Beispiel #26
0
def git_status_project(request, project):
    obj = get_project(request, project)

    if not request.user.has_perm('meta:vcs.status', obj):
        raise PermissionDenied()

    statuses = [
        (force_text(component), component.repository.status)
        for component in obj.all_repo_components()
    ]

    return render(
        request,
        'js/git-status.html',
        {
            'object': obj,
            'project': obj,
            'changes': Change.objects.filter(
                component__project=obj,
                action__in=Change.ACTIONS_REPOSITORY,
            )[:10],
            'statuses': statuses,
        }
    )
Beispiel #27
0
def push_project(request, project):
    obj = get_project(request, project)
    return perform_push(request, obj)
Beispiel #28
0
def cleanup_project(request, project):
    obj = get_project(request, project)
    return perform_cleanup(request, obj)
Beispiel #29
0
def get_objects(request, kwargs):
    if 'project' in kwargs:
        return {'project': get_project(request, kwargs['project'])}
    if 'manage' in kwargs:
        return {'use_file': True}
    return {'user': request.user}
Beispiel #30
0
def show_project(request, project):
    obj = get_project(request, project)
    user = request.user

    last_changes = Change.objects.prefetch().order().filter(project=obj)[:10]

    language_stats = sort_unicode(obj.stats.get_language_stats(),
                                  lambda x: force_str(x.language))

    # Paginate components of project.
    all_components = obj.component_set.prefetch().order()
    components = prefetch_stats(get_paginator(request, all_components))

    return render(
        request,
        "project.html",
        {
            "allow_index":
            True,
            "object":
            obj,
            "project":
            obj,
            "last_changes":
            last_changes,
            "reports_form":
            ReportsForm(),
            "last_changes_url":
            urlencode({"project": obj.slug}),
            "language_stats":
            language_stats,
            "search_form":
            SearchForm(request.user),
            "announcement_form":
            optional_form(AnnouncementForm, user, "project.edit", obj),
            "delete_form":
            optional_form(
                ProjectDeleteForm, user, "project.edit", obj, obj=obj),
            "rename_form":
            optional_form(
                ProjectRenameForm,
                user,
                "project.edit",
                obj,
                request=request,
                instance=obj,
            ),
            "replace_form":
            optional_form(ReplaceForm, user, "unit.edit", obj),
            "bulk_state_form":
            optional_form(
                BulkEditForm,
                user,
                "translation.auto",
                obj,
                user=user,
                obj=obj,
                project=obj,
                auto_id="id_bulk_%s",
            ),
            "components":
            components,
            "licenses":
            obj.component_set.exclude(license="").order_by("license"),
        },
    )
Beispiel #31
0
def show_glossary(request, project, lang):
    prj = get_project(request, project)
    lang = get_object_or_404(Language, code=lang)

    if request.method == "POST" and request.user.has_perm("glossary.add", prj):
        form = TermForm(prj, request.POST)
        if form.is_valid():
            Term.objects.create(
                request.user,
                language=lang,
                source=form.cleaned_data["source"],
                target=form.cleaned_data["target"],
                glossary=form.cleaned_data["glossary"],
            )
        return redirect_next(request.POST.get("next"), request.get_full_path())
    form = TermForm(prj)

    uploadform = GlossaryUploadForm(prj)

    terms = Term.objects.for_project(prj).filter(language=lang).order()

    letterform = LetterForm(request.GET)

    searchform = OneTermForm(request.GET)

    if searchform.is_valid() and searchform.cleaned_data["term"] != "":
        terms = terms.filter(source__substring=searchform.cleaned_data["term"])
        search = searchform.cleaned_data["term"]
    else:
        search = ""

    if letterform.is_valid() and letterform.cleaned_data["letter"] != "":
        terms = terms.filter(
            source__istartswith=letterform.cleaned_data["letter"])
        letter = letterform.cleaned_data["letter"]
    else:
        letter = ""

    terms = get_paginator(request, terms)

    last_changes = (Change.objects.last_changes(request.user).filter(
        project=prj, language=lang).exclude(glossary_term=None)[:10])

    exporters = EXPORTERS.list_exporters_filter(EXPORT_TYPES)

    return render(
        request,
        "glossary.html",
        {
            "title":
            dict_title(prj, lang),
            "project":
            prj,
            "language":
            lang,
            "page_obj":
            terms,
            "exporters":
            exporters,
            "form":
            form,
            "query_string":
            urlencode({
                "term": search,
                "letter": letter
            }),
            "uploadform":
            uploadform,
            "letterform":
            letterform,
            "searchform":
            searchform,
            "letter":
            letter,
            "last_changes":
            last_changes,
            "last_changes_url":
            urlencode((
                ("project", prj.slug),
                ("lang", lang.code),
                ("action", Change.ACTION_DICTIONARY_NEW),
                ("action", Change.ACTION_DICTIONARY_EDIT),
                ("action", Change.ACTION_DICTIONARY_UPLOAD),
            )),
        },
    )
Beispiel #32
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",
        "Edits total",
        "Source words total",
        "Source chars total",
        "Target words total",
        "Target chars total",
        "Count new",
        "Edits new",
        "Source words new",
        "Source chars new",
        "Target words new",
        "Target chars new",
        "Count approved",
        "Edits approved",
        "Source words approved",
        "Source chars approved",
        "Target words approved",
        "Target chars approved",
        "Count edited",
        "Edits edited",
        "Source words edited",
        "Source chars edited",
        "Target words edited",
        "Target chars edited",
    )

    if form.cleaned_data["style"] == "html":
        start = HTML_HEADING.format("".join(f"<th>{h}</th>" 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(f"{h:40}" for h in headers[:2]),
            " ".join(f"{h:24}" 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"] or "Anonymous"),
            cell_name.format(item["email"] or ""),
            cell_count.format(item["count"]),
            cell_count.format(item["edits"]),
            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["edits_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["edits_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["edits_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=f"{mime}; charset=utf-8")
Beispiel #33
0
 def get_object(self, request, project):
     return get_project(request, project)
Beispiel #34
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}

    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 or 'home', '#reports')

    data = generate_credits(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),
    )
Beispiel #35
0
def watch(request, project):
    obj = get_project(request, project)
    request.user.profile.watched.add(obj)
    return redirect(obj)
Beispiel #36
0
def unwatch(request, project):
    obj = get_project(request, project)
    request.user.profile.subscriptions.remove(obj)
    return redirect(obj)
Beispiel #37
0
def get_objects(request, kwargs):
    if "project" in kwargs:
        return {"project": get_project(request, kwargs["project"])}
    if "manage" in kwargs:
        return {"from_file": True}
    return {"user": request.user}
Beispiel #38
0
def show_dictionary(request, project, lang):
    prj = get_project(request, project)
    lang = get_object_or_404(Language, code=lang)

    if request.method == 'POST' and request.user.has_perm('glossary.add', prj):
        form = WordForm(request.POST)
        if form.is_valid():
            Dictionary.objects.create(request.user,
                                      project=prj,
                                      language=lang,
                                      source=form.cleaned_data['source'],
                                      target=form.cleaned_data['target'])
        return redirect_next(request.POST.get('next'), request.get_full_path())
    form = WordForm()

    uploadform = DictUploadForm()

    words = Dictionary.objects.filter(project=prj, language=lang).order()

    letterform = LetterForm(request.GET)

    searchform = OneWordForm(request.GET)

    if searchform.is_valid() and searchform.cleaned_data['term'] != '':
        words = words.filter(source__icontains=searchform.cleaned_data['term'])
        search = searchform.cleaned_data['term']
    else:
        search = ''

    if letterform.is_valid() and letterform.cleaned_data['letter'] != '':
        words = words.filter(
            source__istartswith=letterform.cleaned_data['letter'])
        letter = letterform.cleaned_data['letter']
    else:
        letter = ''

    words = get_paginator(request, words)

    last_changes = Change.objects.last_changes(request.user).filter(
        dictionary__project=prj, dictionary__language=lang)[:10]

    return render(
        request, 'dictionary.html', {
            'title':
            dict_title(prj, lang),
            'project':
            prj,
            'language':
            lang,
            'page_obj':
            words,
            'form':
            form,
            'query_string':
            urlencode({
                'term': search,
                'letter': letter
            }),
            'uploadform':
            uploadform,
            'letterform':
            letterform,
            'searchform':
            searchform,
            'letter':
            letter,
            'last_changes':
            last_changes,
            'last_changes_url':
            urlencode((
                ('project', prj.slug),
                ('lang', lang.code),
                ('action', Change.ACTION_DICTIONARY_NEW),
                ('action', Change.ACTION_DICTIONARY_EDIT),
                ('action', Change.ACTION_DICTIONARY_UPLOAD),
            )),
        })
Beispiel #39
0
def search(request, project=None, component=None, lang=None):
    """Perform site-wide search on units."""
    is_ratelimited = not check_rate_limit('search', request)
    search_form = SearchForm(request.user, request.GET)
    context = {
        'search_form': search_form,
    }
    if component:
        obj = get_component(request, project, component)
        context['component'] = obj
        context['project'] = obj.project
        context['back_url'] = obj.get_absolute_url()
    elif project:
        obj = get_project(request, project)
        context['project'] = obj
        context['back_url'] = obj.get_absolute_url()
    else:
        obj = None
        context['back_url'] = None
    if lang:
        s_language = get_object_or_404(Language, code=lang)
        context['language'] = s_language
        if obj:
            if component:
                context['back_url'] = obj.translation_set.get(
                    language=s_language).get_absolute_url()
            else:
                context['back_url'] = reverse('project-language',
                                              kwargs={
                                                  'project': project,
                                                  'lang': lang,
                                              })
        else:
            context['back_url'] = s_language.get_absolute_url()

    if not is_ratelimited and request.GET and search_form.is_valid():
        # Filter results by ACL
        if component:
            units = Unit.objects.filter(translation__component=obj)
        elif project:
            units = Unit.objects.filter(translation__component__project=obj)
        else:
            allowed_projects = request.user.allowed_projects
            units = Unit.objects.filter(
                translation__component__project__in=allowed_projects)
        units = units.search(search_form.cleaned_data.get("q", ""))
        if lang:
            units = units.filter(translation__language=context['language'])

        units = get_paginator(request, units.order())

        context['show_results'] = True
        context['page_obj'] = units
        context['title'] = _('Search for %s') % (search_form.cleaned_data['q'])
        context['query_string'] = search_form.urlencode()
        context['search_query'] = search_form.cleaned_data['q']
    elif is_ratelimited:
        messages.error(request,
                       _('Too many search queries, please try again later.'))
    elif request.GET:
        messages.error(request, _('Invalid search query!'))
        show_form_errors(request, search_form)

    return render(request, 'search.html', context)
Beispiel #40
0
def data_project(request, project):
    obj = get_project(request, project)
    return render(request, 'data.html', {
        'object': obj,
        'project': obj,
    })
Beispiel #41
0
def mute_project(request, project):
    obj = get_project(request, project)
    mute_real(request.user, scope=SCOPE_PROJECT, component=None, project=obj)
    return redirect(
        "{}?notify_project={}#notifications".format(reverse("profile"), obj.pk)
    )
Beispiel #42
0
def download_project(request, project):
    obj = get_project(request, project)
    obj.commit_pending("download", None)
    return download_multi(Translation.objects.filter(component__project=obj),
                          request.GET.get("format"))
Beispiel #43
0
def get_credits(request, project=None, component=None):
    """View for credits."""
    if project is None:
        obj = None
        kwargs = {"translation__isnull": False}
    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> ({2})</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}> ({2})"
        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=f"{mime}; charset=utf-8")
Beispiel #44
0
def unwatch(request, project):
    obj = get_project(request, project)
    request.user.profile.subscriptions.remove(obj)
    return redirect(obj)
Beispiel #45
0
def show_check_project(request, name, project):
    """Show checks failing in a project."""
    prj = get_project(request, project)
    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=prj,
        ignore=ignore,
    )

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

    if request.GET.get('language'):
        allchecks = allchecks.filter(language__code=request.GET['language'])
        url_params['language'] = 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(
                content_hash__in=checks,
                translation__language=lang,
                translation__component__project=prj,
            ).values('translation__component__slug',
                     'translation__component__project__slug').annotate(
                         count=Count('id'))
            units |= res
    if check.source:
        checks = allchecks.filter(language=None, ).values_list('content_hash',
                                                               flat=True)
        for component in prj.component_set.iterator():
            try:
                lang_id = component.translation_set.values_list('language_id',
                                                                flat=True)[0]
            except IndexError:
                continue
            res = Unit.objects.filter(
                content_hash__in=checks,
                translation__language_id=lang_id,
                translation__component=component).values(
                    'translation__component__slug',
                    'translation__component__project__slug').annotate(
                        count=Count('id'))
            units |= res

    counts = {}
    for unit in units:
        key = '/'.join((unit['translation__component__project__slug'],
                        unit['translation__component__slug']))
        if key in counts:
            counts[key] += unit['count']
        else:
            counts[key] = unit['count']

    units = [{
        'translation__component__slug': item.split('/')[1],
        'translation__component__project__slug': item.split('/')[0],
        'count': counts[item]
    } for item in counts]

    return render(
        request, 'check_project.html', {
            'checks': units,
            'title': '{0}/{1}'.format(force_text(prj), check.name),
            'check': check,
            'project': prj,
            'url_params': encode_optional(url_params),
        })
Beispiel #46
0
def rename_project(request, project):
    obj = get_project(request, project)
    return perform_rename(ProjectRenameForm, request, obj, "project.edit")
Beispiel #47
0
def show_project(request, project):
    obj = get_project(request, project)
    user = request.user

    last_changes = Change.objects.prefetch().order().filter(project=obj)[:10]

    language_stats = sort_unicode(obj.stats.get_language_stats(),
                                  lambda x: force_text(x.language))

    # Paginate components of project.
    all_components = obj.component_set.prefetch().order()
    components = prefetch_stats(get_paginator(request, all_components))

    return render(
        request,
        'project.html',
        {
            'allow_index':
            True,
            'object':
            obj,
            'project':
            obj,
            'last_changes':
            last_changes,
            'reports_form':
            ReportsForm(),
            'last_changes_url':
            urlencode({'project': obj.slug}),
            'language_stats':
            language_stats,
            'search_form':
            SearchForm(request.user),
            'whiteboard_form':
            optional_form(WhiteboardForm, user, 'project.edit', obj),
            'delete_form':
            optional_form(DeleteForm, user, 'project.edit', obj, obj=obj),
            'rename_form':
            optional_form(
                ProjectRenameForm,
                user,
                'project.edit',
                obj,
                request=request,
                instance=obj,
            ),
            'replace_form':
            optional_form(ReplaceForm, user, 'unit.edit', obj),
            'bulk_state_form':
            optional_form(
                BulkEditForm,
                user,
                'translation.auto',
                obj,
                user=user,
                obj=obj,
                project=obj,
                auto_id="id_bulk_%s",
            ),
            'components':
            components,
            'licenses':
            obj.component_set.exclude(license='').order_by('license'),
        },
    )
Beispiel #48
0
def show_dictionary(request, project, lang):
    prj = get_project(request, project)
    lang = get_object_or_404(Language, code=lang)

    if request.method == 'POST' and request.user.has_perm('glossary.add', prj):
        form = WordForm(request.POST)
        if form.is_valid():
            Dictionary.objects.create(request.user,
                                      project=prj,
                                      language=lang,
                                      source=form.cleaned_data['source'],
                                      target=form.cleaned_data['target'])
        return redirect_next(request.POST.get('next'), request.get_full_path())
    else:
        form = WordForm()

    uploadform = DictUploadForm()

    words = Dictionary.objects.filter(project=prj,
                                      language=lang).order_by(Lower('source'))

    letterform = LetterForm(request.GET)

    if letterform.is_valid() and letterform.cleaned_data['letter'] != '':
        words = words.filter(
            source__istartswith=letterform.cleaned_data['letter'])
        letter = letterform.cleaned_data['letter']
    else:
        letter = ''

    words = get_paginator(request, words)

    last_changes = Change.objects.last_changes(request.user).filter(
        dictionary__project=prj, dictionary__language=lang)[:10]

    return render(
        request, 'dictionary.html', {
            'title':
            dict_title(prj, lang),
            'project':
            prj,
            'language':
            lang,
            'page_obj':
            words,
            'form':
            form,
            'query_string':
            'letter={}'.format(letter) if letter else '',
            'uploadform':
            uploadform,
            'letterform':
            letterform,
            'letter':
            letter,
            'last_changes':
            last_changes,
            'last_changes_url':
            urlencode({
                'project': prj.slug,
                'lang': lang.code,
                'glossary': 1
            }),
        })
Beispiel #49
0
def file_sync_project(request, project):
    obj = get_project(request, project)
    return perform_file_sync(request, obj)
Beispiel #50
0
def unwatch(request, project):
    obj = get_project(request, project)
    request.user.profile.watched.remove(obj)
    request.user.subscription_set.filter(
        Q(project=obj) | Q(component__project=obj)).delete()
    return redirect(obj)
Beispiel #51
0
def show_dictionary(request, project, lang):
    prj = get_project(request, project)
    lang = get_object_or_404(Language, code=lang)

    if request.method == 'POST' and request.user.has_perm('glossary.add', prj):
        form = WordForm(request.POST)
        if form.is_valid():
            Dictionary.objects.create(
                request.user,
                project=prj,
                language=lang,
                source=form.cleaned_data['source'],
                target=form.cleaned_data['target']
            )
        return redirect_next(
            request.POST.get('next'), request.get_full_path()
        )
    else:
        form = WordForm()

    uploadform = DictUploadForm()

    words = Dictionary.objects.filter(
        project=prj, language=lang
    ).order_by(Lower('source'))

    letterform = LetterForm(request.GET)

    searchform = OneWordForm(request.GET)

    if searchform.is_valid() and searchform.cleaned_data['term'] != '':
        words = words.filter(
            source__icontains=searchform.cleaned_data['term']
        )
        search = searchform.cleaned_data['term']
    else:
        search = ''

    if letterform.is_valid() and letterform.cleaned_data['letter'] != '':
        words = words.filter(
            source__istartswith=letterform.cleaned_data['letter']
        )
        letter = letterform.cleaned_data['letter']
    else:
        letter = ''

    words = get_paginator(request, words)

    last_changes = Change.objects.last_changes(request.user).filter(
        dictionary__project=prj,
        dictionary__language=lang
    )[:10]

    return render(
        request,
        'dictionary.html',
        {
            'title': dict_title(prj, lang),
            'project': prj,
            'language': lang,
            'page_obj': words,
            'form': form,
            'query_string': urlencode({
                'term': search,
                'letter': letter
            }),
            'uploadform': uploadform,
            'letterform': letterform,
            'searchform': searchform,
            'letter': letter,
            'last_changes': last_changes,
            'last_changes_url': urlencode({
                'project': prj.slug,
                'lang': lang.code,
                'glossary': 1
            }),
        }
    )
Beispiel #52
0
def widgets(request, project):
    obj = get_project(request, project)

    # Parse possible language selection
    form = EngageForm(request.user, obj, request.GET)
    lang = None
    component = None
    if form.is_valid():
        if form.cleaned_data["lang"]:
            lang = Language.objects.get(code=form.cleaned_data["lang"]).code
        if form.cleaned_data["component"]:
            component = Component.objects.get(
                slug=form.cleaned_data["component"], project=obj
            ).slug

    kwargs = {"project": obj.slug}
    if lang is not None:
        kwargs["lang"] = lang
    engage_url = get_site_url(reverse("engage", kwargs=kwargs))
    engage_url_track = "{0}?utm_source=widget".format(engage_url)
    engage_link = mark_safe(
        '<a href="{0}" id="engage-link">{0}</a>'.format(escape(engage_url))
    )
    widget_base_url = get_site_url(reverse("widgets", kwargs={"project": obj.slug}))
    widget_list = []
    for widget_name in sorted(WIDGETS, key=widgets_sorter):
        widget_class = WIDGETS[widget_name]
        if not widget_class.show:
            continue
        color_list = []
        for color in widget_class.colors:
            kwargs = {
                "project": obj.slug,
                "widget": widget_name,
                "color": color,
                "extension": widget_class.extension,
            }
            if lang is not None:
                kwargs["lang"] = lang
            if component is not None:
                kwargs["component"] = component
            color_url = reverse("widget-image", kwargs=kwargs)
            color_list.append({"name": color, "url": get_site_url(color_url)})
        widget_list.append(
            {"name": widget_name, "colors": color_list, "verbose": widget_class.verbose}
        )

    return render(
        request,
        "widgets.html",
        {
            "engage_url": engage_url,
            "engage_link": engage_link,
            "engage_url_track": engage_url_track,
            "widget_list": widget_list,
            "widget_base_url": widget_base_url,
            "object": obj,
            "project": obj,
            "image_src": widget_list[0]["colors"][0]["url"],
            "form": form,
        },
    )
Beispiel #53
0
def reset_project(request, project):
    obj = get_project(request, project)
    return perform_reset(request, obj)
Beispiel #54
0
def show_project(request, project):
    obj = get_project(request, project)
    obj.stats.ensure_basic()
    user = request.user

    last_changes = Change.objects.prefetch().order().filter(project=obj)[:10]
    last_announcements = (Change.objects.prefetch().order().filter(
        project=obj, action=Change.ACTION_ANNOUNCEMENT)[:10])

    language_stats = obj.stats.get_language_stats()
    # Show ghost translations for user languages
    component = None
    for component in obj.component_set.filter_access(user).all():
        if component.can_add_new_language(user):
            break
    if component:
        add_ghost_translations(component, user, language_stats,
                               GhostProjectLanguageStats)

    language_stats = sort_unicode(
        language_stats,
        lambda x: "{}-{}".format(user.profile.get_language_order(x.language), x
                                 .language),
    )

    all_components = obj.component_set.filter_access(user).prefetch().order()
    components = prefetch_tasks(prefetch_stats(all_components))

    return render(
        request,
        "project.html",
        {
            "allow_index":
            True,
            "object":
            obj,
            "project":
            obj,
            "last_changes":
            last_changes,
            "last_announcements":
            last_announcements,
            "reports_form":
            ReportsForm(),
            "last_changes_url":
            urlencode({"project": obj.slug}),
            "language_stats": [stat.obj or stat for stat in language_stats],
            "search_form":
            SearchForm(request.user),
            "announcement_form":
            optional_form(AnnouncementForm, user, "project.edit", obj),
            "delete_form":
            optional_form(
                ProjectDeleteForm, user, "project.edit", obj, obj=obj),
            "rename_form":
            optional_form(
                ProjectRenameForm,
                user,
                "project.edit",
                obj,
                request=request,
                instance=obj,
            ),
            "replace_form":
            optional_form(ReplaceForm, user, "unit.edit", obj),
            "bulk_state_form":
            optional_form(
                BulkEditForm,
                user,
                "translation.auto",
                obj,
                user=user,
                obj=obj,
                project=obj,
                auto_id="id_bulk_%s",
            ),
            "components":
            components,
            "licenses":
            obj.component_set.exclude(license="").order_by("license"),
        },
    )
Beispiel #55
0
def show_project(request, project):
    obj = get_project(request, project)
    user = request.user

    dict_langs = Language.objects.filter(dictionary__project=obj).annotate(
        Count('dictionary')).order()

    last_changes = Change.objects.prefetch().order().filter(project=obj)[:10]

    language_stats = sort_unicode(obj.stats.get_language_stats(),
                                  lambda x: force_text(x.language.name))

    # Paginate components of project.
    all_components = obj.component_set.prefetch().order()
    components = prefetch_stats(get_paginator(request, all_components))

    return render(
        request, 'project.html', {
            'allow_index':
            True,
            'object':
            obj,
            'project':
            obj,
            'dicts':
            dict_langs,
            'last_changes':
            last_changes,
            'last_changes_url':
            urlencode({'project': obj.slug}),
            'language_stats':
            language_stats,
            'search_form':
            SearchForm(),
            'whiteboard_form':
            optional_form(WhiteboardForm, user, 'project.edit', obj),
            'delete_form':
            optional_form(DeleteForm, user, 'project.edit', obj, obj=obj),
            'rename_form':
            optional_form(ProjectRenameForm,
                          user,
                          'project.edit',
                          obj,
                          request=request,
                          instance=obj),
            'replace_form':
            optional_form(ReplaceForm, user, 'unit.edit', obj),
            'bulk_state_form':
            optional_form(BulkStateForm,
                          user,
                          'translation.auto',
                          obj,
                          user=user,
                          obj=obj),
            'components':
            components,
            'licenses':
            ', '.join(
                sorted(
                    all_components.exclude(license='').values_list(
                        'license', flat=True))),
        })
Beispiel #56
0
def show_project(request, project):
    obj = get_project(request, project)
    user = request.user

    dict_langs = Language.objects.filter(dictionary__project=obj).annotate(
        Count('dictionary'))

    last_changes = Change.objects.prefetch().filter(project=obj)[:10]

    language_stats = sort_unicode(obj.stats.get_language_stats(),
                                  lambda x: force_text(x.language.name))

    # Paginate components of project.
    all_components = obj.component_set.select_related()
    components = prefetch_stats(get_paginator(request, all_components))

    return render(
        request,
        'project.html',
        {
            'allow_index':
            True,
            'object':
            obj,
            'project':
            obj,
            'dicts':
            dict_langs,
            'last_changes':
            last_changes,
            'last_changes_url':
            urlencode({'project': obj.slug}),
            'language_stats':
            language_stats,
            'language_count':
            Language.objects.filter(
                translation__component__project=obj).distinct().count(),
            'search_form':
            SearchForm(),
            'delete_form':
            optional_form(DeleteForm, user, 'project.edit', obj, obj=obj),
            'rename_form':
            optional_form(ProjectRenameForm,
                          user,
                          'project.edit',
                          obj,
                          request=request,
                          instance=obj),
            # ProjectRenameForm, ComponentRenameForm, ComponentMoveForm,
            'replace_form':
            optional_form(ReplaceForm, user, 'unit.edit', obj),
            'mass_state_form':
            optional_form(BulkStateForm,
                          user,
                          'translation.auto',
                          obj,
                          user=user,
                          obj=obj),
            'components':
            components,
            'licenses':
            ', '.join(
                sorted(set([x.license for x in all_components if x.license]))),
        })
Beispiel #57
0
def show_check_project(request, name, project):
    """Show checks failing in a project."""
    prj = get_project(request, project)
    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=prj,
        ignore=ignore,
    )

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

    if request.GET.get('language'):
        allchecks = allchecks.filter(language__code=request.GET['language'])
        url_params['language'] = 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(
                content_hash__in=checks,
                translation__language=lang,
                translation__component__project=prj,
            ).values(
                'translation__component__slug',
                'translation__component__project__slug'
            ).annotate(count=Count('id'))
            units |= res
    if check.source:
        checks = allchecks.filter(
            language=None,
        ).values_list(
            'content_hash', flat=True
        )
        for component in prj.component_set.all():
            try:
                lang_id = component.translation_set.values_list(
                    'language_id', flat=True
                )[0]
            except IndexError:
                continue
            res = Unit.objects.filter(
                content_hash__in=checks,
                translation__language_id=lang_id,
                translation__component=component
            ).values(
                'translation__component__slug',
                'translation__component__project__slug'
            ).annotate(count=Count('id'))
            units |= res

    counts = {}
    for unit in units:
        key = '/'.join((
            unit['translation__component__project__slug'],
            unit['translation__component__slug']
        ))
        if key in counts:
            counts[key] += unit['count']
        else:
            counts[key] = unit['count']

    units = [
        {
            'translation__component__slug': item.split('/')[1],
            'translation__component__project__slug': item.split('/')[0],
            'count': counts[item]
        } for item in counts
    ]

    return render(
        request,
        'check_project.html',
        {
            'checks': units,
            'title': '{0}/{1}'.format(force_text(prj), check.name),
            'check': check,
            'project': prj,
            'url_params': encode_optional(url_params),
        }
    )
Beispiel #58
0
def widgets(request, project):
    obj = get_project(request, project)

    # Parse possible language selection
    form = EngageForm(obj, request.GET)
    lang = None
    component = None
    if form.is_valid():
        if form.cleaned_data['lang']:
            lang = Language.objects.get(code=form.cleaned_data['lang']).code
        if form.cleaned_data['component']:
            component = Component.objects.get(
                slug=form.cleaned_data['component'], project=obj).slug

    kwargs = {'project': obj.slug}
    if lang is not None:
        kwargs['lang'] = lang
    engage_url = get_site_url(reverse('engage', kwargs=kwargs))
    engage_url_track = '{0}?utm_source=widget'.format(engage_url)
    engage_link = mark_safe('<a href="{0}" id="engage-link">{0}</a>'.format(
        escape(engage_url)))
    widget_base_url = get_site_url(
        reverse('widgets', kwargs={'project': obj.slug}))
    widget_list = []
    for widget_name in sorted(WIDGETS, key=widgets_sorter):
        widget_class = WIDGETS[widget_name]
        if not widget_class.show:
            continue
        color_list = []
        for color in widget_class.colors:
            kwargs = {
                'project': obj.slug,
                'widget': widget_name,
                'color': color,
                'extension': widget_class.extension,
            }
            if lang is not None:
                kwargs['lang'] = lang
            if component is not None:
                kwargs['component'] = component
            color_url = reverse('widget-image', kwargs=kwargs)
            color_list.append({
                'name': color,
                'url': get_site_url(color_url),
            })
        widget_list.append({
            'name': widget_name,
            'colors': color_list,
            'verbose': widget_class.verbose,
        })

    return render(
        request, 'widgets.html', {
            'engage_url': engage_url,
            'engage_link': engage_link,
            'engage_url_track': engage_url_track,
            'widget_list': widget_list,
            'widget_base_url': widget_base_url,
            'object': obj,
            'project': obj,
            'image_src': widget_list[0]['colors'][0]['url'],
            'form': form,
        })
Beispiel #59
0
def get_objects(request, kwargs):
    if 'project' in kwargs:
        return {'project': get_project(request, kwargs['project'])}
    return {'user': request.user}
Beispiel #60
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}

    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 or 'home', '#reports')

    data = generate_counts(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),
    )