示例#1
0
文件: git.py 项目: JDGrimes/weblate
def update_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    if obj.do_update(request, method=request.GET.get('method', None)):
        messages.success(request, _('All repositories were updated.'))

    return redirect(obj)
示例#2
0
文件: git.py 项目: JDGrimes/weblate
def reset_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    if obj.do_reset(request):
        messages.success(request, _('All repositories have been reset.'))

    return redirect(obj)
示例#3
0
文件: basic.py 项目: Insoleet/weblate
def show_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

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

    new_lang_form = NewLanguageForm()

    return render(
        request,
        'subproject.html',
        {
            'object': obj,
            'project': obj.project,
            'translations': obj.translation_set.enabled(),
            'show_language': 1,
            'last_changes': last_changes,
            'last_changes_rss': reverse(
                'rss-subproject',
                kwargs={'subproject': obj.slug, 'project': obj.project.slug}
            ),
            'last_changes_url': urlencode(
                {'subproject': obj.slug, 'project': obj.project.slug}
            ),
            'new_lang_form': new_lang_form,
        }
    )
示例#4
0
文件: git.py 项目: JDGrimes/weblate
def push_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    if obj.do_push(request):
        messages.success(request, _('All repositories were pushed.'))

    return redirect(obj)
示例#5
0
文件: basic.py 项目: ccfwwm/weblate
def show_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

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

    new_lang_form = get_new_language_form(request, obj)(obj)

    return render(
        request,
        'subproject.html',
        {
            'object': obj,
            'project': obj.project,
            'translations': sort_objects(obj.translation_set.enabled()),
            'show_language': 1,
            'reports_form': ReportsForm(),
            'last_changes': last_changes,
            'last_changes_url': urlencode(
                {'subproject': obj.slug, 'project': obj.project.slug}
            ),
            'new_lang_form': new_lang_form,
        }
    )
示例#6
0
文件: basic.py 项目: Insoleet/weblate
def new_language(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    form = NewLanguageForm(request.POST)

    if form.is_valid():
        language = Language.objects.get(code=form.cleaned_data['lang'])
        same_lang = obj.translation_set.filter(language=language)
        if same_lang.exists():
            messages.error(
                request,
                _('Chosen translation already exists in this project!')
            )
        elif obj.new_lang == 'contact':
            notify_new_language(obj, language, request.user)
            messages.success(
                request,
                _(
                    "A request for a new translation has been "
                    "sent to the project's maintainers."
                )
            )
        elif obj.new_lang == 'add':
            obj.add_new_language(language, request)
    else:
        messages.error(
            request,
            _('Failed to process new translation request!')
        )

    return redirect(
        'subproject',
        subproject=obj.slug,
        project=obj.project.slug
    )
示例#7
0
文件: git.py 项目: barmi/weblate
def push_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    if obj.do_push(request):
        messages.info(request, _("All repositories were pushed."))

    return redirect(obj)
示例#8
0
文件: js.py 项目: harleyknd1/weblate
def get_detail(request, project, subproject, checksum):
    """
    Returns source translation detail in all languages.
    """
    subproject = get_subproject(request, project, subproject)
    units = Unit.objects.filter(checksum=checksum, translation__subproject=subproject)
    try:
        source = units[0].source_info
    except IndexError:
        raise Http404("Non existing unit!")

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

    return render(
        request,
        "js/detail.html",
        {
            "units": units,
            "source": source,
            "project": subproject.project,
            "next": request.GET.get("next", ""),
            "priority_form": PriorityForm(initial={"priority": source.priority}),
            "check_flags_form": CheckFlagsForm(initial={"flags": source.check_flags}),
            "extra_flags": extra_flags,
            "check_flags": check_flags,
        },
    )
示例#9
0
文件: git.py 项目: barmi/weblate
def update_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    if obj.do_update(request):
        messages.info(request, _("All repositories were updated."))

    return redirect(obj)
示例#10
0
文件: git.py 项目: barmi/weblate
def reset_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    if obj.do_reset(request):
        messages.info(request, _("All repositories have been reset."))

    return redirect(obj)
示例#11
0
文件: views.py 项目: saily/weblate
def git_export(request, project, subproject, path):
    """Git HTTP server view.

    Wrapper around git-http-backend to provide Git repositories export over
    HTTP. Performs permission checks and hands over execution to the wrapper.
    """
    # Probably browser access
    if path == '':
        return redirect(
            'subproject',
            project=project,
            subproject=subproject,
            permanent=False
        )

    # HTTP authentication
    auth = request.META.get('HTTP_AUTHORIZATION', b'')

    if auth and not authenticate(request, auth):
        return response_authenticate()

    # Permissions
    obj = get_subproject(request, project, subproject)
    if not can_access_vcs(request.user, obj.project):
        raise PermissionDenied('No VCS permissions')

    return run_git_http(request, obj, path)
示例#12
0
文件: basic.py 项目: ccfwwm/weblate
def new_language(request, project, subproject):
    obj = get_subproject(request, project, subproject)

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

    form = get_new_language_form(request, obj)(obj, request.POST)

    if form.is_valid():
        langs = form.cleaned_data['lang']
        if isinstance(langs, string_types):
            langs = [langs]
        for language in Language.objects.filter(code__in=langs):
            if obj.new_lang == 'contact':
                notify_new_language(obj, language, request.user)
                messages.success(
                    request,
                    _(
                        "A request for a new translation has been "
                        "sent to the project's maintainers."
                    )
                )
            elif obj.new_lang == 'add':
                obj.add_new_language(language, request)
    else:
        messages.error(
            request,
            _('Invalid language chosen!')
        )

    return redirect(obj)
示例#13
0
def matrix(request, project, subproject):
    """Matrix view of all strings"""
    obj = get_subproject(request, project, subproject)

    show = False
    languages = None
    language_codes = None

    if 'lang' in request.GET:
        form = MatrixLanguageForm(obj, request.GET)
        show = form.is_valid()
    else:
        form = MatrixLanguageForm(obj)

    if show:
        languages = Language.objects.filter(
            code__in=form.cleaned_data['lang']
        )
        language_codes = ','.join(languages.values_list('code', flat=True))

    return render(
        request,
        'matrix.html',
        {
            'object': obj,
            'project': obj.project,
            'languages': languages,
            'language_codes': language_codes,
            'languages_form': form,
        }
    )
示例#14
0
文件: api.py 项目: saily/weblate
def export_stats(request, project, subproject):
    """Export stats in JSON format."""
    subprj = get_subproject(request, project, subproject)

    data = [
        trans.get_stats() for trans in subprj.translation_set.all()
    ]
    return export_response(
        request,
        'stats-{0}-{1}.csv'.format(subprj.project.slug, subprj.slug),
        (
            'name',
            'code',
            'total',
            'translated',
            'translated_percent',
            'total_words',
            'translated_words',
            'failing',
            'failing_percent',
            'fuzzy',
            'fuzzy_percent',
            'url_translate',
            'url',
            'last_change',
            'last_author',
        ),
        data
    )
示例#15
0
文件: js.py 项目: beck/weblate
def get_detail(request, project, subproject, checksum):
    '''
    Returns source translation detail in all languages.
    '''
    subproject = get_subproject(request, project, subproject)
    units = Unit.objects.filter(
        checksum=checksum,
        translation__subproject=subproject
    )
    source = units[0].source_info

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

    return render(
        request,
        'js/detail.html',
        {
            'units': units,
            'source': source,
            'next': request.GET.get('next', ''),
            'priority_form': PriorityForm(
                initial={'priority': source.priority}
            ),
            'check_flags_form': CheckFlagsForm(
                initial={'flags': source.check_flags}
            ),
            'extra_flags': extra_flags,
            'check_flags': check_flags,
        }
    )
示例#16
0
文件: git.py 项目: saily/weblate
def reset_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

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

    return perform_reset(request, obj)
示例#17
0
文件: git.py 项目: barmi/weblate
def commit_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)
    obj.commit_pending(request)

    messages.info(request, _("All pending translations were committed."))

    return redirect(obj)
示例#18
0
def unlock_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    obj.locked = False
    obj.save()

    messages.info(request, _("Subproject is now open for translation updates."))

    return redirect(obj)
示例#19
0
文件: api.py 项目: saily/weblate
def update_subproject(request, project, subproject):
    """API hook for updating git repos."""
    if not settings.ENABLE_HOOKS:
        return HttpResponseNotAllowed([])
    obj = get_subproject(request, project, subproject, True)
    if not obj.project.enable_hooks:
        return HttpResponseNotAllowed([])
    perform_update(obj)
    return hook_response()
示例#20
0
def update_subproject(request, project, subproject):
    '''
    API hook for updating git repos.
    '''
    if not appsettings.ENABLE_HOOKS:
        return HttpResponseNotAllowed([])
    obj = get_subproject(request, project, subproject, True)
    perform_update(obj)
    return HttpResponse('update triggered')
示例#21
0
文件: js.py 项目: beck/weblate
def git_status_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    return render(
        request,
        'js/git-status.html',
        {
            'object': obj,
        }
    )
示例#22
0
文件: source.py 项目: nrasic/weblate
def get_source(request, project, subproject):
    """
    Returns first translation in subproject
    (this assumes all have same source strings).
    """
    obj = get_subproject(request, project, subproject)
    try:
        return obj, obj.translation_set.all()[0]
    except (Translation.DoesNotExist, IndexError):
        raise Http404('No translation exists in this component.')
示例#23
0
def lock_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    obj.commit_pending(request)

    obj.locked = True
    obj.save()

    messages.info(request, _("Subproject is now locked for translation updates!"))

    return redirect(obj)
示例#24
0
文件: lock.py 项目: chervol/weblate
def unlock_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    obj.do_unlock(request.user)

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

    return redirect(obj)
示例#25
0
def commit_subproject(request, project, subproject):
    '''
    API hook for updating git repos.
    '''
    if not appsettings.ENABLE_HOOKS:
        return HttpResponseNotAllowed([])
    obj = get_subproject(request, project, subproject, True)
    if not obj.project.enable_hooks:
        return HttpResponseNotAllowed([])
    obj.commit_pending(request)
    return hook_response('Commit performed')
示例#26
0
文件: lock.py 项目: beck/weblate
def unlock_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    obj.locked = False
    obj.save()

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

    return redirect(obj)
示例#27
0
def review_source(request, project, subproject):
    """
    Listing of source strings to review.
    """
    obj = get_subproject(request, project, subproject)

    # Grab first translation in subproject
    # (this assumes all have same source strings)
    try:
        source = obj.translation_set.all()[0]
    except Translation.DoesNotExist:
        raise Http404('No translation exists in this component.')

    # Grab search type and page number
    rqtype = request.GET.get('type', 'all')
    limit = request.GET.get('limit', 50)
    page = request.GET.get('page', 1)
    checksum = request.GET.get('checksum', '')
    ignored = 'ignored' in request.GET
    expand = False

    # Filter units:
    if checksum:
        sources = source.unit_set.filter(checksum=checksum)
        expand = True
    else:
        sources = source.unit_set.filter_type(rqtype, source, ignored)

    paginator = Paginator(sources, limit)

    try:
        sources = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        sources = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        sources = paginator.page(paginator.num_pages)

    return render(
        request,
        'source-review.html',
        {
            'object': obj,
            'source': source,
            'page_obj': sources,
            'rqtype': rqtype,
            'ignored': ignored,
            'expand': expand,
            'title': _('Review source strings in %s') % obj.__unicode__(),
        }
    )
示例#28
0
文件: lock.py 项目: chervol/weblate
def lock_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    obj.commit_pending(request)

    obj.do_lock(request.user)

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

    return redirect(obj)
示例#29
0
文件: api.py 项目: GabLeRoux/weblate
def export_stats(request, project, subproject):
    '''
    Exports stats in JSON format.
    '''
    subprj = get_subproject(request, project, subproject)

    try:
        indent = int(request.GET['indent'])
    except (ValueError, KeyError):
        indent = None

    jsonp = None
    if 'jsonp' in request.GET and request.GET['jsonp']:
        jsonp = request.GET['jsonp']

    response = []
    for trans in subprj.translation_set.all():
        response.append({
            'code': trans.language.code,
            'name': trans.language.name,
            'total': trans.total,
            'total_words': trans.total_words,
            'last_change': trans.last_change,
            'last_author': trans.get_last_author(),
            'translated': trans.translated,
            'translated_words': trans.translated_words,
            'translated_percent': trans.get_translated_percent(),
            'fuzzy': trans.fuzzy,
            'fuzzy_percent': trans.get_fuzzy_percent(),
            'failing': trans.failing_checks,
            'failing_percent': trans.get_failing_checks_percent(),
            'url': trans.get_share_url(),
            'url_translate': get_site_url(trans.get_absolute_url()),
        })
    json_data = json.dumps(
        response,
        default=json_dt_handler,
        indent=indent,
    )
    if jsonp:
        return HttpResponse(
            '{0}({1})'.format(
                jsonp,
                json_data,
            ),
            content_type='application/javascript'
        )
    return HttpResponse(
        json_data,
        content_type='application/json'
    )
示例#30
0
def unlock_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

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

    obj.do_unlock(request.user)

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

    return redirect(obj)
示例#31
0
文件: basic.py 项目: PosX/weblate
def show_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    last_changes = Change.objects.for_component(obj)[:10]

    try:
        sample = obj.translation_set.all()[0]
        source_words = sample.total_words
        total_strings = sample.total
    except IndexError:
        source_words = 0
        total_strings = 0

    if can_translate(request.user, project=obj.project):
        replace_form = ReplaceForm()
    else:
        replace_form = None

    return render(
        request,
        'subproject.html',
        {
            'allow_index': True,
            'object': obj,
            'project': obj.project,
            'translations': sort_objects(obj.translation_set.all()),
            'show_language': 1,
            'reports_form': ReportsForm(),
            'last_changes': last_changes,
            'last_changes_url': urlencode(
                {'subproject': obj.slug, 'project': obj.project.slug}
            ),
            'unit_count': Unit.objects.filter(
                translation__subproject=obj
            ).count(),
            'words_count': obj.get_total_words(),
            'language_count': Language.objects.filter(
                translation__subproject=obj
            ).distinct().count(),
            'strings_count': total_strings,
            'source_words_count': source_words,
            'replace_form': replace_form,
            'search_form': SearchForm(),
        }
    )
示例#32
0
def search_replace(request, project, subproject=None, lang=None):
    if subproject is None:
        obj = get_project(request, project)
        perms = {'project': obj}
        unit_set = Unit.objects.filter(translation__subproject__project=obj)
    elif lang is None:
        obj = get_subproject(request, project, subproject)
        perms = {'project': obj.project}
        unit_set = Unit.objects.filter(translation__subproject=obj)
    else:
        obj = get_translation(request, project, subproject, lang)
        perms = {'translation': obj}
        unit_set = obj.unit_set

    if not can_translate(request.user, **perms):
        raise PermissionDenied()

    form = ReplaceForm(request.POST)

    if not form.is_valid():
        messages.error(request, _('Failed to process form!'))
        return redirect(obj)

    search_text = form.cleaned_data['search']
    replacement = form.cleaned_data['replacement']

    matching = unit_set.filter(target__contains=search_text)
    updated = matching.count()

    for unit in matching.iterator():
        unit.target = unit.target.replace(search_text, replacement)
        unit.save_backend(request, change_action=Change.ACTION_REPLACE)

    import_message(
        request, updated,
        _('Search and replace completed, no strings were updated.'),
        ungettext(
            'Search and replace completed, %d string was updated.',
            'Search and replace completed, %d strings were updated.',
            updated
        )
    )

    return redirect(obj)
示例#33
0
def git_status_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

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

    return render(
        request, 'js/git-status.html', {
            'object':
            obj,
            'project':
            obj.project,
            'changes':
            Change.objects.filter(
                action__in=Change.ACTIONS_REPOSITORY,
                subproject=obj,
            )[:10],
            'statuses': [(None, obj.repository.status)],
        })
示例#34
0
def review_source(request, project, subproject):
    '''
    Listing of source strings to review.
    '''
    obj = get_subproject(request, project, subproject)

    # Grab first translation in subproject
    # (this assumes all have same source strings)
    try:
        source = obj.translation_set.all()[0]
    except Translation.DoesNotExist:
        raise Http404('No translation exists in this subproject.')

    # Grab search type and page number
    rqtype = request.GET.get('type', 'all')
    limit = request.GET.get('limit', 50)
    page = request.GET.get('page', 1)
    ignored = 'ignored' in request.GET

    # Fiter units
    sources = source.unit_set.filter_type(rqtype, source, ignored)

    paginator = Paginator(sources, limit)

    try:
        sources = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        sources = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        sources = paginator.page(paginator.num_pages)

    return render_to_response(
        'source-review.html',
        RequestContext(
            request, {
                'object': obj,
                'source': source,
                'sources': sources,
                'rqtype': rqtype,
                'title': _('Review source strings in %s') % obj.__unicode__(),
            }))
示例#35
0
def show_source(request, project, subproject):
    """
    Show source strings summary and checks.
    """
    obj = get_subproject(request, project, subproject)

    # Grab first translation in subproject
    # (this assumes all have same source strings)
    try:
        source = obj.translation_set.all()[0]
    except Translation.DoesNotExist:
        raise Http404('No translation exists in this subproject.')

    return render(
        request, 'source.html', {
            'object': obj,
            'source': source,
            'title': _('Source strings in %s') % obj.__unicode__(),
        })
示例#36
0
def show_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    last_changes = Change.objects.for_component(obj)[:10]

    if can_translate(request.user, project=obj.project):
        replace_form = ReplaceForm()
        mass_state_form = MassStateForm(request.user, obj)
    else:
        replace_form = None
        mass_state_form = None

    return render(
        request, 'subproject.html', {
            'allow_index':
            True,
            'object':
            obj,
            'project':
            obj.project,
            'translations':
            sort_objects(prefetch_stats(obj.translation_set.all())),
            'show_language':
            1,
            'reports_form':
            ReportsForm(),
            'last_changes':
            last_changes,
            'last_changes_url':
            urlencode({
                'subproject': obj.slug,
                'project': obj.project.slug
            }),
            'language_count':
            Language.objects.filter(
                translation__subproject=obj).distinct().count(),
            'replace_form':
            replace_form,
            'mass_state_form':
            mass_state_form,
            'search_form':
            SearchForm(),
        })
示例#37
0
def export_stats(request, project, subproject):
    '''
    Exports stats in JSON format.
    '''
    subprj = get_subproject(request, project, subproject)

    jsonp = None
    if 'jsonp' in request.GET and request.GET['jsonp']:
        jsonp = request.GET['jsonp']

    response = []
    for trans in subprj.translation_set.all():
        response.append(trans.get_stats())
    if jsonp:
        return HttpResponse('{0}({1})'.format(
            jsonp, json.dumps(
                response,
                cls=DjangoJSONEncoder,
            )),
                            content_type='application/javascript')
    return JsonResponse(data=response, safe=False)
示例#38
0
def new_language(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    form_class = get_new_language_form(request, obj)

    if request.method == 'POST':
        form = form_class(obj, request.POST)

        if form.is_valid():
            langs = form.cleaned_data['lang']
            for language in Language.objects.filter(code__in=langs):
                if obj.new_lang == 'contact':
                    notify_new_language(obj, language, request.user)
                    messages.success(
                        request,
                        _(
                            "A request for a new translation has been "
                            "sent to the project's maintainers."
                        )
                    )
                elif obj.new_lang == 'add':
                    obj.add_new_language(language, request)
            return redirect(obj)
        else:
            messages.error(
                request,
                _('Please fix errors in the form.')
            )
    else:
        form = form_class(obj)

    return render(
        request,
        'new-language.html',
        {
            'object': obj,
            'project': obj.project,
            'form': form,
        }
    )
示例#39
0
def get_detail(request, project, subproject, checksum):
    """Return source translation detail in all languages."""
    subproject = get_subproject(request, project, subproject)
    try:
        units = Unit.objects.filter(
            id_hash=checksum_to_hash(checksum),
            translation__subproject=subproject
        )
    except ValueError:
        raise Http404('Non existing unit!')
    try:
        source = units[0].source_info
    except IndexError:
        raise Http404('Non existing unit!')

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

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

            'check_flags_form': CheckFlagsForm(
                initial={'flags': source.check_flags}
            ),
            'screenshot_form': ScreenshotForm(),
            'extra_flags': extra_flags,
            'check_flags': check_flags,
        }
    )
示例#40
0
def matrix_load(request, project, subproject):
    """Backend for matrix view of all strings"""
    obj = get_subproject(request, project, subproject)

    try:
        offset = int(request.GET.get('offset'))
    except ValueError:
        return HttpResponseServerError('Missing offset')
    language_codes = request.GET.get('lang')
    if not language_codes or offset is None:
        return HttpResponseServerError('Missing lang')

    # Can not use filter to keep ordering
    translations = [
        get_object_or_404(obj.translation_set, language__code=lang)
        for lang in language_codes.split(',')
    ]

    data = []

    for unit in translations[0].unit_set.all()[offset:offset + 20]:
        units = []
        for translation in translations:
            try:
                units.append(translation.unit_set.get(id_hash=unit.id_hash))
            except Unit.DoesNotExist:
                units.append(None)

        data.append((unit, units))

    return render(
        request,
        'matrix-table.html',
        {
            'object': obj,
            'data': data,
            'last': translations[0].unit_set.count() <= offset + 20
        }
    )
示例#41
0
def new_language(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    form = get_new_language_form(request, obj)(obj, request.POST)

    if form.is_valid():
        langs = form.cleaned_data['lang']
        if isinstance(langs, string_types):
            langs = [langs]
        for language in Language.objects.filter(code__in=langs):
            if obj.new_lang == 'contact':
                notify_new_language(obj, language, request.user)
                messages.success(
                    request,
                    _("A request for a new translation has been "
                      "sent to the project's maintainers."))
            elif obj.new_lang == 'add':
                obj.add_new_language(language, request)
    else:
        messages.error(request, _('Invalid language chosen!'))

    return redirect(obj)
示例#42
0
def new_language(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    form = NewLanguageForm(request.POST)

    if form.is_valid():
        language = Language.objects.get(code=form.cleaned_data['lang'])
        same_lang = obj.translation_set.filter(language=language)
        if same_lang.exists():
            messages.error(
                request,
                _('Chosen translation already exists in this project!')
            )
        elif obj.new_lang == 'contact':
            notify_new_language(obj, language, request.user)
            messages.success(
                request,
                _(
                    "A request for a new translation has been "
                    "sent to the project's maintainers."
                )
            )
        elif obj.new_lang == 'add':
            obj.add_new_language(language, request)
    else:
        messages.error(
            request,
            _(
                'Please choose the language into which '
                'you would like to translate.'
            )
        )

    return redirect(
        'subproject',
        subproject=obj.slug,
        project=obj.project.slug
    )
示例#43
0
文件: api.py 项目: paour/weblate
def export_stats(request, project, subproject):
    '''
    Exports stats in JSON format.
    '''
    subprj = get_subproject(request, project, subproject)

    try:
        indent = int(request.GET['indent'])
    except:
        indent = None

    response = []
    for trans in subprj.translation_set.all():
        response.append({
            'code': trans.language.code,
            'name': trans.language.name,
            'total': trans.total,
            'total_words': trans.total_words,
            'last_change': trans.get_last_change(),
            'last_author': trans.get_last_author(),
            'translated': trans.translated,
            'translated_words': trans.translated_words,
            'translated_percent': trans.get_translated_percent(),
            'fuzzy': trans.fuzzy,
            'fuzzy_percent': trans.get_fuzzy_percent(),
            'failing': trans.failing_checks,
            'failing_percent': trans.get_failing_checks_percent(),
            'url': trans.get_share_url(),
            'url_translate': get_site_url(trans.get_absolute_url()),
        })
    return HttpResponse(
        json.dumps(
            response,
            default=json_dt_handler,
            indent=indent,
        ),
        content_type='application/json'
    )
示例#44
0
def export_stats(request, project, subproject):
    '''
    Exports stats in JSON format.
    '''
    subprj = get_subproject(request, project, subproject)

    jsonp = None
    if 'jsonp' in request.GET and request.GET['jsonp']:
        jsonp = request.GET['jsonp']

    response = []
    for trans in subprj.translation_set.all():
        response.append({
            'code': trans.language.code,
            'name': trans.language.name,
            'total': trans.total,
            'total_words': trans.total_words,
            'last_change': trans.last_change,
            'last_author': trans.get_last_author(),
            'translated': trans.translated,
            'translated_words': trans.translated_words,
            'translated_percent': trans.get_translated_percent(),
            'fuzzy': trans.fuzzy,
            'fuzzy_percent': trans.get_fuzzy_percent(),
            'failing': trans.failing_checks,
            'failing_percent': trans.get_failing_checks_percent(),
            'url': trans.get_share_url(),
            'url_translate': trans.get_absolute_url(),
        })
    if jsonp:
        return HttpResponse('{0}({1})'.format(
            jsonp, json.dumps(
                response,
                cls=DjangoJSONEncoder,
            )),
                            content_type='application/javascript')
    return JsonResponse(data=response, safe=False)
示例#45
0
def show_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

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

    new_lang_form = NewLanguageForm()

    return render(
        request,
        'subproject.html',
        {
            'object': obj,
            'project': obj.project,
            'translations': obj.translation_set.enabled(),
            'show_language': 1,
            'last_changes': last_changes,
            'last_changes_url': urlencode(
                {'subproject': obj.slug, 'project': obj.project.slug}
            ),
            'new_lang_form': new_lang_form,
        }
    )
示例#46
0
def export_stats(request, project, subproject):
    """Export stats in JSON format."""
    subprj = get_subproject(request, project, subproject)

    data = [trans.get_stats() for trans in subprj.translation_set.all()]
    return export_response(
        request, 'stats-{0}-{1}.csv'.format(subprj.project.slug, subprj.slug),
        (
            'name',
            'code',
            'total',
            'translated',
            'translated_percent',
            'total_words',
            'translated_words',
            'failing',
            'failing_percent',
            'fuzzy',
            'fuzzy_percent',
            'url_translate',
            'url',
            'last_change',
            'last_author',
        ), data)
示例#47
0
文件: feeds.py 项目: AlexMost/weblate
 def get_object(self, request, project, subproject):
     return get_subproject(request, project, subproject)
示例#48
0
文件: git.py 项目: blockgiven/weblate
def commit_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    return perform_commit(request, obj)
示例#49
0
文件: git.py 项目: blockgiven/weblate
def reset_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    return perform_reset(request, obj)
示例#50
0
文件: git.py 项目: blockgiven/weblate
def push_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    return perform_push(request, obj)
示例#51
0
文件: git.py 项目: blockgiven/weblate
def update_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    return perform_update(request, obj)
示例#52
0
文件: reports.py 项目: wandeg/weblate
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():
        return redirect(obj)

    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),
    )
示例#53
0
def git_export(request, project, subproject, path):
    """
    Wrapper around git-http-backend to provide Git
    repositories export over HTTP.
    """
    # Probably browser access
    if path == '':
        return redirect('subproject',
                        project=project,
                        subproject=subproject,
                        permanent=False)

    # HTTP authentication
    auth = request.META.get('HTTP_AUTHORIZATION', b'')

    if auth:
        if not authenticate(request, auth):
            return response_authenticate()

    # Permissions
    try:
        obj = get_subproject(request, project, subproject)
    except PermissionDenied:
        if not request.user.is_authenticated():
            return response_authenticate()
        raise

    # Invoke Git HTTP backend
    process = subprocess.Popen(
        ['/usr/lib/git-core/git-http-backend'],
        env={
            'REQUEST_METHOD': request.method,
            'PATH_TRANSLATED': os.path.join(obj.get_path(), path),
            'GIT_HTTP_EXPORT_ALL': '1',
            'CONTENT_TYPE': request.META.get('CONTENT_TYPE', ''),
            'QUERY_STRING': request.META.get('QUERY_STRING', ''),
        },
        stdin=subprocess.PIPE,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
    )
    output, output_err = process.communicate(request.body)
    retcode = process.poll()

    # Log error
    if output_err:
        obj.log_error('git: {0}'.format(output_err.decode('utf-8')))

    # Handle failure
    if retcode:
        return HttpResponseServerError(output_err)

    headers, content = output.split(b'\r\n\r\n', 1)
    message = message_from_string(headers.decode('utf-8'))

    # Handle status in response
    if 'status' in message:
        return HttpResponse(status=int(message['status'].split()[0]))

    # Send content
    response = HttpResponse(content_type=message['content-type'])
    response.write(content)
    return response
示例#54
0
 def get_component(self, kwargs):
     return get_subproject(
         self.request,
         kwargs['project'],
         kwargs['subproject']
     )
示例#55
0
def search(request, project=None, subproject=None, lang=None):
    """Perform site-wide search on units."""
    search_form = SiteSearchForm(request.GET)
    context = {
        'search_form': search_form,
    }
    search_kwargs = {}
    if subproject:
        obj = get_subproject(request, project, subproject)
        context['subproject'] = obj
        context['project'] = obj.project
        search_kwargs = {'subproject': obj}
    elif project:
        obj = get_project(request, project)
        context['project'] = obj
        search_kwargs = {'project': obj}
    else:
        obj = None
    if lang:
        s_language = get_object_or_404(Language, code=lang)
        context['language'] = s_language
        search_kwargs = {'language': s_language}

    if search_form.is_valid():
        # Filter results by ACL
        if subproject:
            units = Unit.objects.filter(translation__subproject=obj)
        elif project:
            units = Unit.objects.filter(translation__subproject__project=obj)
        else:
            projects = Project.objects.get_acl_ids(request.user)
            units = Unit.objects.filter(
                translation__subproject__project_id__in=projects
            )
        units = units.search(
            search_form.cleaned_data,
            **search_kwargs
        )
        if lang:
            units = units.filter(
                translation__language=context['language']
            )

        page, limit = get_page_limit(request, 50)

        paginator = Paginator(units, limit)

        try:
            units = paginator.page(page)
        except EmptyPage:
            # If page is out of range (e.g. 9999), deliver last page of
            # results.
            units = paginator.page(paginator.num_pages)

        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']
    else:
        messages.error(request, _('Invalid search query!'))

    return render(
        request,
        'search.html',
        context
    )
示例#56
0
def search_replace(request, project, subproject=None, lang=None):
    context = {}
    if subproject is None:
        obj = get_project(request, project)
        perms = {'project': obj}
        unit_set = Unit.objects.filter(translation__subproject__project=obj)
        context['project'] = obj
    elif lang is None:
        obj = get_subproject(request, project, subproject)
        perms = {'project': obj.project}
        unit_set = Unit.objects.filter(translation__subproject=obj)
        context['subproject'] = obj
        context['project'] = obj.project
    else:
        obj = get_translation(request, project, subproject, lang)
        perms = {'translation': obj}
        unit_set = obj.unit_set
        context['translation'] = obj
        context['subproject'] = obj.subproject
        context['project'] = obj.subproject.project

    if not can_translate(request.user, **perms):
        raise PermissionDenied()

    form = ReplaceForm(request.POST)

    if not form.is_valid():
        messages.error(request, _('Failed to process form!'))
        return redirect(obj)

    search_text = form.cleaned_data['search']
    replacement = form.cleaned_data['replacement']

    matching = unit_set.filter(target__contains=search_text)

    if matching.count() == 0:
        updated = 0

    else:
        confirm = ReplaceConfirmForm(matching, request.POST)

        if not confirm.is_valid():
            for unit in matching:
                unit.replacement = unit.target.replace(search_text,
                                                       replacement)
            context.update({
                'matching': matching,
                'search_query': search_text,
                'replacement': replacement,
                'form': form,
                'confirm': ReplaceConfirmForm(matching),
            })
            return render(request, 'replace.html', context)

        matching = confirm.cleaned_data['units']
        updated = matching.count()

        for unit in matching.iterator():
            if not can_translate(request.user, unit):
                continue
            unit.target = unit.target.replace(search_text, replacement)
            unit.save_backend(request, change_action=Change.ACTION_REPLACE)

    import_message(
        request, updated,
        _('Search and replace completed, no strings were updated.'),
        ungettext('Search and replace completed, %d string was updated.',
                  'Search and replace completed, %d strings were updated.',
                  updated))

    return redirect(obj)
示例#57
0
文件: basic.py 项目: z0x010/weblate
def show_subproject(request, project, subproject):
    obj = get_subproject(request, project, subproject)

    last_changes = Change.objects.for_component(obj)[:10]

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

    try:
        sample = obj.translation_set.all()[0]
        source_words = sample.total_words
        total_strings = sample.total
    except IndexError:
        source_words = 0
        total_strings = 0

    if can_translate(request.user, project=obj.project):
        replace_form = ReplaceForm()
    else:
        replace_form = None

    return render(
        request, 'subproject.html', {
            'object':
            obj,
            'project':
            obj.project,
            'translations':
            sort_objects(obj.translation_set.enabled()),
            'show_language':
            1,
            'reports_form':
            ReportsForm(),
            'last_changes':
            last_changes,
            'last_changes_url':
            urlencode({
                'subproject': obj.slug,
                'project': obj.project.slug
            }),
            'settings_form':
            settings_form,
            'unit_count':
            Unit.objects.filter(translation__subproject=obj).count(),
            'words_count':
            obj.get_total_words(),
            'language_count':
            Language.objects.filter(
                translation__subproject=obj).distinct().count(),
            'strings_count':
            total_strings,
            'source_words_count':
            source_words,
            'replace_form':
            replace_form,
            'search_form':
            SearchForm(),
        })
示例#58
0
def export_stats(request, project, subproject):
    '''
    Exports stats in JSON format.
    '''
    subprj = get_subproject(request, project, subproject)

    try:
        indent = int(request.GET['indent'])
    except (ValueError, KeyError):
        indent = None

    jsonp = None
    if 'jsonp' in request.GET and request.GET['jsonp']:
        jsonp = request.GET['jsonp']

    response = []
    for trans in subprj.translation_set.all():
        response.append({
            'code':
            trans.language.code,
            'name':
            trans.language.name,
            'total':
            trans.total,
            'total_words':
            trans.total_words,
            'last_change':
            trans.last_change,
            'last_author':
            trans.get_last_author(),
            'translated':
            trans.translated,
            'translated_words':
            trans.translated_words,
            'translated_percent':
            trans.get_translated_percent(),
            'fuzzy':
            trans.fuzzy,
            'fuzzy_percent':
            trans.get_fuzzy_percent(),
            'failing':
            trans.failing_checks,
            'failing_percent':
            trans.get_failing_checks_percent(),
            'url':
            trans.get_share_url(),
            'url_translate':
            get_site_url(trans.get_absolute_url()),
        })
    json_data = json.dumps(
        response,
        default=json_dt_handler,
        indent=indent,
    )
    if jsonp:
        return HttpResponse('{0}({1})'.format(
            jsonp,
            json_data,
        ),
                            content_type='application/javascript')
    return HttpResponse(json_data, content_type='application/json')
示例#59
0
文件: reports.py 项目: wandeg/weblate
def get_counts(request, project, subproject):
    """View for work counts"""
    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():
        return redirect(obj)

    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)

    if form.cleaned_data['style'] == 'html':
        start = ('<table>\n<tr><th>Name</th><th>Email</th>'
                 '<th>Words</th><th>Count</th></tr>')
        row_start = '<tr>'
        cell_name = cell_email = cell_words = cell_count = '<td>{0}</td>\n'
        row_end = '</tr>'
        mime = 'text/html'
        end = '</table>'
    else:
        heading = ' '.join([
            '=' * 40,
            '=' * 40,
            '=' * 10,
            '=' * 10,
        ])
        start = '{0}\n{1:40} {2:40} {3:10} {4:10}\n{0}'.format(
            heading, 'Name', 'Email', 'Words', 'Count')
        row_start = ''
        cell_name = cell_email = '{0:40} '
        cell_words = cell_count = '{0:10} '
        row_end = ''
        mime = 'text/plain'
        end = heading

    result = []

    result.append(start)

    for item in data:
        if row_start:
            result.append(row_start)
        result.append('{0}{1}{2}{3}'.format(
            cell_name.format(item['name']),
            cell_email.format(item['email']),
            cell_words.format(item['words']),
            cell_count.format(item['count']),
        ))
        if row_end:
            result.append(row_end)

    result.append(end)

    return HttpResponse(
        '\n'.join(result),
        content_type='{0}; charset=utf-8'.format(mime),
    )
示例#60
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.url_id
        return redirect_param(
            'review_source',
            encode_optional(url_params),
            project=subprj.project.slug,
            subproject=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,
            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(
                'content_hash', flat=True)
            res = Unit.objects.filter(
                translation__subproject=subprj,
                content_hash__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': '{0}/{1}'.format(force_text(subprj), check.name),
            'check': check,
            'subproject': subprj,
            'url_params': encode_optional(url_params),
        })