Ejemplo n.º 1
0
def machinery(request):
    locale = utils.get_project_locale_from_request(request, Locale.objects) or 'en-GB'

    return render(request, 'machinery/machinery.html', {
        'locale': Locale.objects.get(code=locale),
        'locales': Locale.objects.all(),
    })
Ejemplo n.º 2
0
def translate_locale_agnostic(request, slug, part):
    """Locale Agnostic Translate view."""
    user = request.user
    query = urlparse(request.get_full_path()).query
    query = '?%s' % query if query else ''

    if slug.lower() == 'all-projects':
        project_locales = Locale.objects.available()
    else:
        project = get_object_or_404(Project.objects.available(), slug=slug)
        project_locales = project.locales

    if user.is_authenticated():
        locale = user.profile.custom_homepage

        if locale and project_locales.filter(code=locale).exists():
            path = reverse(
                'pontoon.translate',
                kwargs=dict(slug=slug, locale=locale, part=part))
            return redirect("%s%s" % (path, query))

    locale = utils.get_project_locale_from_request(request, project_locales)
    path = (
        reverse(
            'pontoon.translate',
            kwargs=dict(slug=slug, locale=locale, part=part))
        if locale
        else reverse(
            'pontoon.projects.project',
            kwargs=dict(slug=slug)))
    return redirect("%s%s" % (path, query))
Ejemplo n.º 3
0
def home(request):
    """Home view."""

    user = request.user
    project = Project.objects.get(id=1)

    # Redirect user to the selected home page or '/'.
    if user.is_authenticated() and user.profile.custom_homepage != '':
        # If custom homepage not set yet, set it to the most contributed locale team page
        if user.profile.custom_homepage is None:
            if user.top_contributed_locale:
                user.profile.custom_homepage = user.top_contributed_locale
                user.profile.save(update_fields=['custom_homepage'])

        if user.profile.custom_homepage:
            return redirect('pontoon.teams.team',
                            locale=user.profile.custom_homepage)

    locale = utils.get_project_locale_from_request(request,
                                                   project.locales) or 'en-GB'
    path = Resource.objects.filter(
        project=project,
        translatedresources__locale__code=locale).values_list('path',
                                                              flat=True)[0]

    return translate(request, locale, project.slug, path)
Ejemplo n.º 4
0
def homepage(request):
    user = request.user

    # Redirect user to the selected home page or '/'.
    if user.is_authenticated() and user.profile.custom_homepage != '':
        # If custom homepage not set yet, set it to the most contributed locale team page
        if user.profile.custom_homepage is None:
            if user.top_contributed_locale:
                user.profile.custom_homepage = user.top_contributed_locale
                user.profile.save(update_fields=['custom_homepage'])

        if user.profile.custom_homepage:
            return redirect('pontoon.teams.team', locale=user.profile.custom_homepage)

    # Guess user's team page or redirect to /teams
    locale = get_project_locale_from_request(request, Locale.objects.visible())
    if locale not in ('en-US', 'en', None):
        start_url = reverse('pontoon.teams.team', kwargs={
            'locale': locale,
        })
    else:
        start_url = reverse('pontoon.teams')

    return render(request, 'homepage.html', {
        'start_url': start_url,
    })
Ejemplo n.º 5
0
def homepage(request):
    user = request.user

    # Redirect user to the selected home page or '/'.
    if user.is_authenticated() and user.profile.custom_homepage != '':
        # If custom homepage not set yet, set it to the most contributed locale team page
        if user.profile.custom_homepage is None:
            if user.top_contributed_locale:
                user.profile.custom_homepage = user.top_contributed_locale
                user.profile.save(update_fields=['custom_homepage'])

        if user.profile.custom_homepage:
            return redirect('pontoon.teams.team', locale=user.profile.custom_homepage)

    # Guess user's team page or redirect to /teams
    locale = get_project_locale_from_request(request, Locale.objects.visible())
    if locale not in ('en-US', 'en', None):
        start_url = reverse('pontoon.teams.team', kwargs={
            'locale': locale,
        })
    else:
        start_url = reverse('pontoon.teams')

    homepage = Homepage.objects.last()

    content = Template(homepage.text).render(Context({
        'start_url': start_url,
    }))

    return render(request, 'homepage.html', {
        'content': content,
        'title': homepage.title,
        'homepage_id': homepage.id,
    })
Ejemplo n.º 6
0
def home(request):
    """Home view."""
    project = Project.objects.get(id=1)
    locale = utils.get_project_locale_from_request(request, project.locales) or "en-GB"
    path = Resource.objects.filter(project=project, translatedresources__locale__code=locale)[0].path

    return translate(request, locale, project.slug, path)
Ejemplo n.º 7
0
def machinery(request):
    locale = utils.get_project_locale_from_request(request, Locale.objects) or 'en-GB'

    return render(request, 'machinery/machinery.html', {
        'locale': Locale.objects.get(code=locale),
        'locales': Locale.objects.all(),
    })
Ejemplo n.º 8
0
def translate(request, locale, slug, part):
    """Translate view."""
    locale = get_object_or_404(Locale, code__iexact=locale)
    project = get_object_or_404(Project.objects.distinct(),
                                slug=slug,
                                disabled=False,
                                resources__isnull=False)

    projects = (Project.objects.filter(
        disabled=False, pk__in=Resource.objects.values(
            'project')).prefetch_related('subpage_set').order_by("name"))

    return render(
        request, 'translate.html', {
            'accept_language':
            utils.get_project_locale_from_request(request, Locale.objects),
            'download_form':
            forms.DownloadFileForm(),
            'upload_form':
            forms.UploadFileForm(),
            'locale':
            locale,
            'locales':
            Locale.objects.all(),
            'part':
            part,
            'project':
            project,
            'projects':
            projects,
        })
Ejemplo n.º 9
0
def search(request):
    """Terminology search view."""
    locale = utils.get_project_locale_from_request(request, Locale.objects) or "en-GB"

    return render(
        request, "search.html", {"locale": Locale.objects.get(code__iexact=locale), "locales": Locale.objects.all()}
    )
Ejemplo n.º 10
0
def translate_locale_agnostic(request, slug, part):
    """Locale Agnostic Translate view."""
    user = request.user
    query = urlparse(request.get_full_path()).query
    query = "?%s" % query if query else ""

    if slug.lower() == "all-projects":
        project_locales = Locale.objects.available()
    else:
        project = get_object_or_404(Project.objects.available(), slug=slug)
        project_locales = project.locales

    if user.is_authenticated():
        locale = user.profile.custom_homepage

        if locale and project_locales.filter(code=locale).exists():
            path = reverse(
                "pontoon.translate",
                kwargs=dict(project=slug, locale=locale, resource=part),
            )
            return redirect("%s%s" % (path, query))

    locale = utils.get_project_locale_from_request(request, project_locales)
    path = (reverse("pontoon.translate",
                    kwargs=dict(project=slug, locale=locale, resource=part))
            if locale else reverse("pontoon.projects.project",
                                   kwargs=dict(slug=slug)))
    return redirect("%s%s" % (path, query))
Ejemplo n.º 11
0
def translate(request, locale, slug, part):
    """Translate view."""
    locale = get_object_or_404(Locale, code__iexact=locale)
    project = get_object_or_404(
        Project.objects.distinct(),
        slug=slug,
        disabled=False,
        resources__isnull=False
    )

    # Check if user authenticated
    if not request.user.is_authenticated() and not project.pk == 1:
        return render(request, '403.html', status=403)

    projects = (
        Project.objects.filter(
            disabled=False,
            pk__in=Resource.objects.values('project')
        )
        .prefetch_related('subpage_set')
        .order_by("name")
    )

    return render(request, 'translate.html', {
        'accept_language': utils.get_project_locale_from_request(request, Locale.objects),
        'download_form': forms.DownloadFileForm(),
        'upload_form': forms.UploadFileForm(),
        'locale': locale,
        'locales': Locale.objects.all(),
        'part': part,
        'project': project,
        'projects': projects,
    })
Ejemplo n.º 12
0
def home(request):
    """Home view."""
    log.debug("Home view.")

    project = Project.objects.get(id=1)
    locale = utils.get_project_locale_from_request(request, project.locales) or "en-GB"

    return translate(request, locale, project.slug)
Ejemplo n.º 13
0
def home(request):
    """Home view."""
    project = Project.objects.get(id=1)
    locale = utils.get_project_locale_from_request(
        request, project.locales) or 'en-GB'
    path = Resource.objects.filter(project=project, translatedresources__locale__code=locale)[0].path

    return translate(request, locale, project.slug, path)
Ejemplo n.º 14
0
def machinery(request):
    locale = utils.get_project_locale_from_request(request, Locale.objects) or 'en-GB'

    return render(request, 'machinery/machinery.html', {
        'locale': Locale.objects.get(code=locale),
        'locales': Locale.objects.all(),
        'is_google_translate_supported': bool(settings.GOOGLE_TRANSLATE_API_KEY),
        'is_microsoft_translator_supported': bool(settings.MICROSOFT_TRANSLATOR_API_KEY),
    })
Ejemplo n.º 15
0
def home(request):
    """Home view."""
    log.debug("Home view.")

    project = Project.objects.get(id=1)
    locale = utils.get_project_locale_from_request(
        request, project.locales) or 'en-GB'

    return translate(request, locale, project.slug)
Ejemplo n.º 16
0
def machinery(request):
    locale = utils.get_project_locale_from_request(request, Locale.objects) or 'en-GB'

    return render(request, 'machinery/machinery.html', {
        'locale': Locale.objects.get(code=locale),
        'locales': Locale.objects.all(),
        'is_google_translate_supported': bool(settings.GOOGLE_TRANSLATE_API_KEY),
        'is_microsoft_translator_supported': bool(settings.MICROSOFT_TRANSLATOR_API_KEY),
    })
Ejemplo n.º 17
0
def search(request):
    """Terminology search view."""
    locale = utils.get_project_locale_from_request(
        request, Locale.objects) or 'en-GB'

    return render(request, 'search.html', {
        'locale': Locale.objects.get(code__iexact=locale),
        'locales': Locale.objects.all(),
    })
Ejemplo n.º 18
0
def search(request, template="search.html"):
    """Terminology search view."""
    log.debug("Terminology search view.")

    locale = utils.get_project_locale_from_request(request, Locale.objects) or "en-GB"

    data = {"locale": Locale.objects.get(code__iexact=locale), "locales": Locale.objects.all()}

    return render(request, template, data)
Ejemplo n.º 19
0
def search(request):
    """Terminology search view."""
    locale = utils.get_project_locale_from_request(
        request, Locale.objects) or 'en-GB'

    return render(request, 'search.html', {
        'locale': Locale.objects.get(code__iexact=locale),
        'locales': Locale.objects.all(),
    })
Ejemplo n.º 20
0
def home(request):
    """Home view."""
    log.debug("Home view.")

    project = Project.objects.get(id=1)
    locale = utils.get_project_locale_from_request(
        request, project.locales) or 'en-GB'
    path = Resource.objects.filter(project=project, stats__locale__code=locale)[0].path

    return translate(request, locale, project.slug, path)
Ejemplo n.º 21
0
def search(request, template='search.html'):
    """Terminology search view."""
    log.debug("Terminology search view.")

    locale = utils.get_project_locale_from_request(request,
                                                   Locale.objects) or 'en-GB'

    data = {
        'locale': Locale.objects.get(code__iexact=locale),
        'locales': Locale.objects.all(),
    }

    return render(request, template, data)
Ejemplo n.º 22
0
def search(request, template='search.html'):
    """Terminology search view."""
    log.debug("Terminology search view.")

    locale = utils.get_project_locale_from_request(
        request, Locale.objects) or 'en-GB'

    data = {
        'locale': Locale.objects.get(code__iexact=locale),
        'locales': Locale.objects.all(),
    }

    return render(request, template, data)
Ejemplo n.º 23
0
def machinery(request):
    locale = utils.get_project_locale_from_request(request, Locale.objects) or "en-GB"

    return render(
        request,
        "machinery/machinery.html",
        {
            "locale": Locale.objects.get(code=locale),
            "locales": Locale.objects.all(),
            "is_google_translate_supported": bool(settings.GOOGLE_TRANSLATE_API_KEY),
            "is_microsoft_translator_supported": bool(
                settings.MICROSOFT_TRANSLATOR_API_KEY
            ),
        },
    )
Ejemplo n.º 24
0
def get_preferred_locale(request):
    """Return the locale the current user prefers.

    Used to decide in which language to show the Translate page.

    Note that this function returns a single locale, instead of a list of
    locales to use as fallbacks. We will likely want to change that in the
    future, in some specific ways (the fallback chain might be different
    depending on the content, e.g. UI strings, errors and warnings, etc.).

    """
    user = request.user
    if user.is_authenticated and user.profile.custom_homepage:
        return user.profile.custom_homepage

    locale = get_project_locale_from_request(request, Locale.objects)
    if locale not in ('en', None):
        return locale

    return 'en-US'
Ejemplo n.º 25
0
def translate_locale_agnostic(request, slug, part):
    """Locale Agnostic Translate view."""
    user = request.user
    project = get_object_or_404(Project.objects.available(), slug=slug)

    if user.is_authenticated():
        locale = user.profile.custom_homepage

        if locale and project.locales.filter(code=locale).exists():
            return redirect('pontoon.translate',
                            slug=slug,
                            locale=locale,
                            part=part)

    locale = utils.get_project_locale_from_request(request, project.locales)

    if locale:
        return redirect('pontoon.translate',
                        slug=slug,
                        locale=locale,
                        part=part)
    else:
        return redirect('pontoon.projects.project', slug=slug)
Ejemplo n.º 26
0
def homepage(request):
    user = request.user

    # Redirect user to the selected home page or '/'.
    if user.is_authenticated and user.profile.custom_homepage != "":
        # If custom homepage not set yet, set it to the most contributed locale team page
        if user.profile.custom_homepage is None:
            if user.top_contributed_locale:
                user.profile.custom_homepage = user.top_contributed_locale
                user.profile.save(update_fields=["custom_homepage"])

        if user.profile.custom_homepage:
            return redirect("pontoon.teams.team",
                            locale=user.profile.custom_homepage)

    # Guess user's team page or redirect to /teams
    locale = get_project_locale_from_request(request,
                                             Locale.objects.available())
    if locale not in ("en-US", "en", None):
        start_url = reverse("pontoon.teams.team", kwargs={"locale": locale})
    else:
        start_url = reverse("pontoon.teams")

    homepage = Homepage.objects.last()

    content = Template(homepage.text).render(Context({"start_url": start_url}))

    return render(
        request,
        "homepage.html",
        {
            "content": content,
            "title": homepage.title,
            "homepage_id": homepage.id
        },
    )
Ejemplo n.º 27
0
def home(request):
    """Home view."""

    user = request.user
    project = Project.objects.get(id=1)

    # Redirect user to the selected home page or '/'.
    if user.is_authenticated() and user.profile.custom_homepage != '':
        # If custom homepage not set yet, set it to the most contributed locale team page
        if user.profile.custom_homepage is None:
            if user.top_contributed_locale:
                user.profile.custom_homepage = user.top_contributed_locale
                user.profile.save(update_fields=['custom_homepage'])

        if user.profile.custom_homepage:
            return redirect('pontoon.teams.team', locale=user.profile.custom_homepage)

    locale = utils.get_project_locale_from_request(request, project.locales) or 'en-GB'
    path = Resource.objects.filter(
        project=project,
        translatedresources__locale__code=locale
    ).values_list('path', flat=True)[0]

    return translate(request, locale, project.slug, path)
Ejemplo n.º 28
0
def translate(request, locale, slug, part=None, template='translate.html'):
    """Translate view."""
    log.debug("Translate view.")

    invalid_locale = invalid_project = False

    # Validate locale
    try:
        l = Locale.objects.get(code=locale)
    except Locale.DoesNotExist:
        invalid_locale = True

    # Validate project
    try:
        p = Project.objects.get(
            disabled=False,
            slug=slug, pk__in=Resource.objects.values('project'))
    except Project.DoesNotExist:
        invalid_project = True

    if invalid_locale:
        if invalid_project:
            raise Http404
        else:
            messages.error(request, "Oops, locale is not supported.")
            request.session['translate_error'] = {
                'none': None,
            }
            return HttpResponseRedirect(reverse('pontoon.home'))

    if invalid_project:
        messages.error(request, "Oops, project could not be found.")
        request.session['translate_error'] = {
            'none': None,
        }
        return HttpResponseRedirect(reverse('pontoon.home'))

    # Validate project locales
    if p.locales.filter(code=locale).count() == 0:
        request.session['translate_error'] = {
            'none': None,
        }
        messages.error(
            request, "Oops, locale is not supported for this project.")
        return HttpResponseRedirect(reverse('pontoon.home'))

    # Check if user authenticated
    if not p.pk == 1:
        if not request.user.is_authenticated():
            messages.error(request, "You need to sign in first.")
            request.session['translate_error'] = {
                'redirect': request.get_full_path(),
            }
            return HttpResponseRedirect(reverse('pontoon.home'))

    # Set project details (locales and pages or paths + stats)
    projects = Project.objects.filter(
        disabled=False, pk__in=Resource.objects.values('project')) \
        .order_by("name")

    for project in projects:
        pages = Subpage.objects.filter(project=project)
        r = Entity.objects.filter(obsolete=False).values('resource')
        resources = Resource.objects.filter(project=project, pk__in=r)
        details = {}

        for loc in project.locales.all():
            if len(pages) == 0 and len(resources) > 1:
                locale_details = Stats.objects \
                    .filter(resource__in=resources, locale=loc) \
                    .order_by('resource__path') \
                    .values(
                        'resource__path',
                        'resource__entity_count',
                        'translated_count',
                        'approved_count',
                    )
            else:
                locale_details = pages.values('name')

            details[loc.code.lower()] = list(locale_details)

        project.details = json.dumps(details)

    data = {
        'accept_language': utils.get_project_locale_from_request(
            request, Locale.objects),
        'locale': l,
        'locales': Locale.objects.all(),
        'page_url': p.url,
        'project': p,
        'projects': projects,
    }

    # Set subpage
    pages = Subpage.objects.filter(project=p)
    if len(pages) > 0:
        try:
            page = pages.get(name=part)
        except Subpage.DoesNotExist:
            page = pages[0]  # If page not specified or doesn't exist

        data['page_url'] = page.url
        data['part'] = page.name

    # Set part if subpages not defined and entities in more than one file
    else:
        resources = Resource.objects.filter(project=p, entity_count__gt=0)
        paths = sorted([i for i in resources.values_list('path', flat=True)])

        if len(paths) > 1:
            data['part'] = part if part in paths else paths[0]

    # Set profile image from Gravatar
    if request.user.is_authenticated():
        data['gravatar_url'] = get_gravatar_url(request.user.email, 44)

    # Set error data
    translate_error = request.session.pop('translate_error', {})
    if translate_error:
        data['redirect'] = translate_error.get('redirect', None)

    return render(request, template, data)
Ejemplo n.º 29
0
def manage_project(request, slug=None, template='admin_project.html'):
    """Admin project."""
    log.debug("Admin project.")

    if not request.user.has_perm('base.can_manage_project'):
        raise PermissionDenied

    form = ProjectForm()
    subpage_formset = SubpageInlineFormSet()
    repo_formset = RepositoryInlineFormSet()
    external_resource_formset = ExternalResourceInlineFormSet()
    tag_formset = TagInlineFormSet()
    locales_readonly = Locale.objects.none()
    locales_selected = Locale.objects.none()
    subtitle = 'Add project'
    pk = None
    project = None

    # Save project
    if request.method == 'POST':
        locales_readonly = Locale.objects.filter(
            pk__in=request.POST.getlist('locales_readonly')
        )
        locales_selected = Locale.objects.filter(
            pk__in=request.POST.getlist('locales')
        ).exclude(
            pk__in=locales_readonly
        )

        # Update existing project
        try:
            pk = request.POST['pk']
            project = Project.objects.get(pk=pk)
            form = ProjectForm(request.POST, instance=project)
            # Needed if form invalid
            subpage_formset = SubpageInlineFormSet(request.POST, instance=project)
            repo_formset = RepositoryInlineFormSet(request.POST, instance=project)
            tag_formset = (
                TagInlineFormSet(request.POST, instance=project)
                if project.tags_enabled
                else None
            )
            external_resource_formset = ExternalResourceInlineFormSet(
                request.POST, instance=project
            )
            subtitle = 'Edit project'

        # Add a new project
        except MultiValueDictKeyError:
            form = ProjectForm(request.POST)
            # Needed if form invalid
            subpage_formset = SubpageInlineFormSet(request.POST)
            repo_formset = RepositoryInlineFormSet(request.POST)
            external_resource_formset = ExternalResourceInlineFormSet(request.POST)
            tag_formset = None

        if form.is_valid():
            project = form.save(commit=False)
            subpage_formset = SubpageInlineFormSet(request.POST, instance=project)
            repo_formset = RepositoryInlineFormSet(request.POST, instance=project)
            external_resource_formset = ExternalResourceInlineFormSet(
                request.POST, instance=project
            )
            if tag_formset:
                tag_formset = TagInlineFormSet(request.POST, instance=project)
            formsets_valid = (
                subpage_formset.is_valid()
                and repo_formset.is_valid()
                and external_resource_formset.is_valid()
                and (tag_formset.is_valid() if tag_formset else True)
            )
            if formsets_valid:
                project.save()

                # Manually save ProjectLocales due to intermediary model
                locales_form = form.cleaned_data.get('locales', [])
                locales_readonly_form = form.cleaned_data.get('locales_readonly', [])
                locales = locales_form | locales_readonly_form

                (
                    ProjectLocale.objects
                    .filter(project=project)
                    .exclude(locale__pk__in=[l.pk for l in locales])
                    .delete()
                )
                for locale in locales:
                    ProjectLocale.objects.get_or_create(project=project, locale=locale)

                # Update readonly flags
                locales_readonly_pks = [l.pk for l in locales_readonly_form]
                project_locales = ProjectLocale.objects.filter(project=project)
                project_locales.exclude(
                    locale__pk__in=locales_readonly_pks
                ).update(readonly=False)
                project_locales.filter(
                    locale__pk__in=locales_readonly_pks,
                ).update(readonly=True)

                subpage_formset.save()
                repo_formset.save()
                external_resource_formset.save()
                if tag_formset:
                    tag_formset.save()

                # If the data source is database and there are new strings, save them.
                if project.data_source == 'database':
                    _save_new_strings(project, request.POST.get('new_strings', ''))
                    _create_or_update_translated_resources(project, locales)

                # Properly displays formsets, but removes errors (if valid only)
                subpage_formset = SubpageInlineFormSet(instance=project)
                repo_formset = RepositoryInlineFormSet(instance=project)
                external_resource_formset = ExternalResourceInlineFormSet(instance=project)
                if project.tags_enabled:
                    tag_formset = TagInlineFormSet(instance=project)
                subtitle += '. Saved.'
                pk = project.pk
            else:
                subtitle += '. Error.'
        else:
            subtitle += '. Error.'

    # If URL specified and found, show edit, otherwise show add form
    elif slug is not None:
        try:
            project = Project.objects.get(slug=slug)
            pk = project.pk
            form = ProjectForm(instance=project)
            subpage_formset = SubpageInlineFormSet(instance=project)
            repo_formset = RepositoryInlineFormSet(instance=project)
            tag_formset = (
                TagInlineFormSet(instance=project)
                if project.tags_enabled
                else None
            )
            external_resource_formset = ExternalResourceInlineFormSet(instance=project)
            locales_readonly = Locale.objects.filter(
                project_locale__readonly=True,
                project_locale__project=project,
            )
            locales_selected = project.locales.exclude(pk__in=locales_readonly)
            subtitle = 'Edit project'
        except Project.DoesNotExist:
            form = ProjectForm(initial={'slug': slug})

    # Override default label suffix
    form.label_suffix = ''

    projects = []
    for p in Project.objects.prefetch_related('locales').order_by('name'):
        projects.append({
            'name': p.name,
            # Cannot use values_list() here, because it hits the DB again
            'locales': [l.pk for l in p.locales.all()],
        })
        
    locales_available = Locale.objects.exclude(pk__in=locales_selected)
    
    # Admins reason in terms of locale codes (see bug 1394194)
    locales_readonly = locales_readonly.order_by('code')
    locales_selected = locales_selected.order_by('code')
    locales_available = locales_available.order_by('code')

    data = {
        'slug': slug,
        'form': form,
        'subpage_formset': subpage_formset,
        'repo_formset': repo_formset,
        'tag_formset': tag_formset,
        'external_resource_formset': external_resource_formset,
        'locales_readonly': locales_readonly,
        'locales_selected': locales_selected,
        'locales_available': locales_available,
        'subtitle': subtitle,
        'pk': pk,
        'project': project,
        'projects': projects,
    }

    # Set locale in Translate link
    if hasattr(project, 'locales') and locales_selected:
        locale = utils.get_project_locale_from_request(
            request, project.locales) or locales_selected[0].code
        if locale:
            data['translate_locale'] = locale

    if Resource.objects.filter(project=project).exists():
        data['ready'] = True

    return render(request, template, data)
Ejemplo n.º 30
0
def translate(request, locale, slug, part, template="translate.html"):
    """Translate view."""

    invalid_locale = invalid_project = False

    # Validate locale
    try:
        l = Locale.objects.get(code__iexact=locale)
    except Locale.DoesNotExist:
        invalid_locale = True

    # Validate project
    try:
        p = Project.objects.get(disabled=False, slug=slug, pk__in=Resource.objects.values("project"))
    except Project.DoesNotExist:
        invalid_project = True

    if invalid_locale:
        if invalid_project:
            raise Http404
        else:
            messages.error(request, "Oops, locale is not supported.")
            request.session["translate_error"] = {"none": None}
            return HttpResponseRedirect(reverse("pontoon.home"))

    if invalid_project:
        messages.error(request, "Oops, project could not be found.")
        request.session["translate_error"] = {"none": None}
        return HttpResponseRedirect(reverse("pontoon.home"))

    # Validate project locales
    if p.locales.filter(code__iexact=locale).count() == 0:
        request.session["translate_error"] = {"none": None}
        messages.error(request, "Oops, locale is not supported for this project.")
        return HttpResponseRedirect(reverse("pontoon.home"))

    # Check if user authenticated
    if not p.pk == 1:
        if not request.user.is_authenticated():
            messages.error(request, "You need to sign in first.")
            request.session["translate_error"] = {"redirect": request.get_full_path()}
            return HttpResponseRedirect(reverse("pontoon.home"))

    projects = (
        Project.objects.filter(disabled=False, pk__in=Resource.objects.values("project"))
        .prefetch_related("subpage_set")
        .order_by("name")
    )

    data = {
        "accept_language": utils.get_project_locale_from_request(request, Locale.objects),
        "locale": l,
        "locales": Locale.objects.all(),
        "page_url": p.url,
        "project": p,
        "projects": projects,
    }

    # Set subpage
    pages = Subpage.objects.filter(project=p)
    if len(pages) > 0:
        try:
            page = pages.get(name=part)

        # If page not specified or doesn't exist
        except Subpage.DoesNotExist:
            page = pages[0]
            locale_pages = pages.filter(resources__stats__locale=l)
            if locale_pages:
                page = locale_pages[0]

        data["page_url"] = page.url
        data["part"] = page.name

    # Set path if subpages not defined
    else:
        paths = (
            Resource.objects.filter(project=p, entity_count__gt=0, stats__locale=l)
            .order_by("path")
            .values_list("path", flat=True)
        )

        if paths:
            data["part"] = part if part in paths else paths[0]

    # Set error data
    translate_error = request.session.pop("translate_error", {})
    if translate_error:
        data["redirect"] = translate_error.get("redirect", None)

    return render(request, template, data)
Ejemplo n.º 31
0
def manage_project(request, slug=None, template="admin_project.html"):
    """Admin project."""
    log.debug("Admin project.")

    if not request.user.has_perm("base.can_manage_project"):
        raise PermissionDenied

    form = ProjectForm()
    subpage_formset = SubpageInlineFormSet()
    repo_formset = RepositoryInlineFormSet()
    external_resource_formset = ExternalResourceInlineFormSet()
    tag_formset = TagInlineFormSet()
    locales_readonly = Locale.objects.none()
    locales_selected = Locale.objects.none()
    subtitle = "Add project"
    pk = None
    project = None

    # Save project
    if request.method == "POST":
        locales_readonly = Locale.objects.filter(
            pk__in=request.POST.getlist("locales_readonly"))
        locales_selected = Locale.objects.filter(
            pk__in=request.POST.getlist("locales")).exclude(
                pk__in=locales_readonly)

        # Update existing project
        try:
            pk = request.POST["pk"]
            project = Project.objects.visible_for(request.user).get(pk=pk)
            form = ProjectForm(request.POST, instance=project)
            # Needed if form invalid
            subpage_formset = SubpageInlineFormSet(request.POST,
                                                   instance=project)
            repo_formset = RepositoryInlineFormSet(request.POST,
                                                   instance=project)
            tag_formset = (TagInlineFormSet(request.POST, instance=project)
                           if project.tags_enabled else None)
            external_resource_formset = ExternalResourceInlineFormSet(
                request.POST, instance=project)
            subtitle = "Edit project"

        # Add a new project
        except MultiValueDictKeyError:
            form = ProjectForm(request.POST)
            # Needed if form invalid
            subpage_formset = SubpageInlineFormSet(request.POST)
            repo_formset = RepositoryInlineFormSet(request.POST)
            external_resource_formset = ExternalResourceInlineFormSet(
                request.POST)
            tag_formset = None

        if form.is_valid():
            project = form.save(commit=False)
            subpage_formset = SubpageInlineFormSet(request.POST,
                                                   instance=project)
            repo_formset = RepositoryInlineFormSet(request.POST,
                                                   instance=project)
            external_resource_formset = ExternalResourceInlineFormSet(
                request.POST, instance=project)
            if tag_formset:
                tag_formset = TagInlineFormSet(request.POST, instance=project)
            formsets_valid = (
                subpage_formset.is_valid() and repo_formset.is_valid()
                and external_resource_formset.is_valid()
                and (tag_formset.is_valid() if tag_formset else True))
            if formsets_valid:
                project.save()

                # Manually save ProjectLocales due to intermediary model
                locales_form = form.cleaned_data.get("locales", [])
                locales_readonly_form = form.cleaned_data.get(
                    "locales_readonly", [])
                locales = locales_form | locales_readonly_form

                (ProjectLocale.objects.filter(project=project).exclude(
                    locale__pk__in=[l.pk for l in locales]).delete())
                for locale in locales:
                    ProjectLocale.objects.get_or_create(project=project,
                                                        locale=locale)

                # Update readonly flags
                locales_readonly_pks = [l.pk for l in locales_readonly_form]
                project_locales = ProjectLocale.objects.filter(project=project)
                project_locales.exclude(
                    locale__pk__in=locales_readonly_pks).update(readonly=False)
                project_locales.filter(
                    locale__pk__in=locales_readonly_pks, ).update(
                        readonly=True)

                subpage_formset.save()
                repo_formset.save()
                external_resource_formset.save()
                if tag_formset:
                    tag_formset.save()

                # If the data source is database and there are new strings, save them.
                if project.data_source == Project.DataSource.DATABASE:
                    _save_new_strings(project,
                                      request.POST.get("new_strings", ""))
                    _create_or_update_translated_resources(project, locales)

                # Properly displays formsets, but removes errors (if valid only)
                subpage_formset = SubpageInlineFormSet(instance=project)
                repo_formset = RepositoryInlineFormSet(instance=project)
                external_resource_formset = ExternalResourceInlineFormSet(
                    instance=project)
                if project.tags_enabled:
                    tag_formset = TagInlineFormSet(instance=project)
                subtitle += ". Saved."
                pk = project.pk
            else:
                subtitle += ". Error."
        else:
            subtitle += ". Error."

    # If URL specified and found, show edit, otherwise show add form
    elif slug is not None:
        try:
            project = Project.objects.get(slug=slug)
            pk = project.pk
            form = ProjectForm(instance=project)
            subpage_formset = SubpageInlineFormSet(instance=project)
            repo_formset = RepositoryInlineFormSet(instance=project)
            tag_formset = (TagInlineFormSet(
                instance=project) if project.tags_enabled else None)
            external_resource_formset = ExternalResourceInlineFormSet(
                instance=project)
            locales_readonly = Locale.objects.filter(
                project_locale__readonly=True,
                project_locale__project=project,
            )
            locales_selected = project.locales.exclude(pk__in=locales_readonly)
            subtitle = "Edit project"
        except Project.DoesNotExist:
            form = ProjectForm(initial={"slug": slug})

    # Override default label suffix
    form.label_suffix = ""

    projects = []
    for p in Project.objects.prefetch_related("locales").order_by("name"):
        projects.append({
            "name": p.name,
            # Cannot use values_list() here, because it hits the DB again
            "locales": [l.pk for l in p.locales.all()],
        })

    locales_available = Locale.objects.exclude(
        pk__in=locales_readonly).exclude(pk__in=locales_selected)

    # Admins reason in terms of locale codes (see bug 1394194)
    locales_readonly = locales_readonly.order_by("code")
    locales_selected = locales_selected.order_by("code")
    locales_available = locales_available.order_by("code")

    data = {
        "slug": slug,
        "form": form,
        "subpage_formset": subpage_formset,
        "repo_formset": repo_formset,
        "tag_formset": tag_formset,
        "external_resource_formset": external_resource_formset,
        "locales_readonly": locales_readonly,
        "locales_selected": locales_selected,
        "locales_available": locales_available,
        "subtitle": subtitle,
        "pk": pk,
        "project": project,
        "projects": projects,
    }

    # Set locale in Translate link
    if Resource.objects.filter(project=project).exists() and locales_selected:
        locale = (utils.get_project_locale_from_request(
            request, project.locales) or locales_selected[0].code)
        if locale:
            data["translate_locale"] = locale

    return render(request, template, data)
Ejemplo n.º 32
0
def translate(request, locale, slug, part=None, template='translate.html'):
    """Translate view."""
    log.debug("Translate view.")

    invalid_locale = invalid_project = False

    # Validate locale
    try:
        l = Locale.objects.get(code__iexact=locale)
    except Locale.DoesNotExist:
        invalid_locale = True

    # Validate project
    try:
        p = Project.objects.get(
            disabled=False,
            slug=slug, pk__in=Resource.objects.values('project'))
    except Project.DoesNotExist:
        invalid_project = True

    if invalid_locale:
        if invalid_project:
            raise Http404
        else:
            messages.error(request, "Oops, locale is not supported.")
            request.session['translate_error'] = {
                'none': None,
            }
            return HttpResponseRedirect(reverse('pontoon.home'))

    if invalid_project:
        messages.error(request, "Oops, project could not be found.")
        request.session['translate_error'] = {
            'none': None,
        }
        return HttpResponseRedirect(reverse('pontoon.home'))

    # Validate project locales
    if p.locales.filter(code__iexact=locale).count() == 0:
        request.session['translate_error'] = {
            'none': None,
        }
        messages.error(
            request, "Oops, locale is not supported for this project.")
        return HttpResponseRedirect(reverse('pontoon.home'))

    # Check if user authenticated
    if not p.pk == 1:
        if not request.user.is_authenticated():
            messages.error(request, "You need to sign in first.")
            request.session['translate_error'] = {
                'redirect': request.get_full_path(),
            }
            return HttpResponseRedirect(reverse('pontoon.home'))

    # Set project details (locales and pages or paths + stats)
    projects = Project.objects.filter(
        disabled=False, pk__in=Resource.objects.values('project')) \
        .order_by("name")

    for project in projects:
        pages = Subpage.objects.filter(project=project)
        r = Entity.objects.filter(obsolete=False).values('resource')
        resources = Resource.objects.filter(project=project, pk__in=r)
        details = {}

        for loc in project.locales.all():
            stats = Stats.objects.filter(resource__in=resources, locale=loc)

            if len(pages) == 0 and len(resources) > 1:
                locale_details = stats.order_by('resource__path') \
                    .values(
                        'resource__path',
                        'resource__entity_count',
                        'translated_count',
                        'approved_count',
                    )
            else:
                locale_details = pages.values('name')
                if len(pages) > 0 and pages[0].resources.exists():
                    locale_details = pages.filter(
                        resources__stats=stats).values('name')

            details[loc.code.lower()] = list(locale_details)

        project.details = json.dumps(details)

    data = {
        'accept_language': utils.get_project_locale_from_request(
            request, Locale.objects),
        'locale': l,
        'locales': Locale.objects.all(),
        'page_url': p.url,
        'project': p,
        'projects': projects,
    }

    # Set subpage
    pages = Subpage.objects.filter(project=p)
    setPart = False
    if len(pages) > 0:
        try:
            page = pages.get(name=part)
            if pages.count() > 1:
                setPart = True

        # If page not specified or doesn't exist
        except Subpage.DoesNotExist:
            page = pages[0]
            if pages.count() > 1:
                setPart = True
            locale_pages = pages.filter(resources__stats__locale=l)
            if locale_pages:
                page = locale_pages[0]
                setPart = True if locale_pages.count() > 1 else False

        data['page_url'] = page.url
        if setPart:
            data['part'] = page.name

    # Set part if subpages not defined and entities in more than one file
    else:
        paths = (Resource.objects
                    .filter(project=p, entity_count__gt=0, stats__locale=l)
                    .order_by('path')
                    .values_list('path', flat=True))

        if len(paths) > 1:
            data['part'] = part if part in paths else paths[0]

    # Set error data
    translate_error = request.session.pop('translate_error', {})
    if translate_error:
        data['redirect'] = translate_error.get('redirect', None)

    return render(request, template, data)
Ejemplo n.º 33
0
def translate(request, locale, slug, part=None, template="translate.html"):
    """Translate view."""
    log.debug("Translate view.")

    invalid_locale = invalid_project = False

    # Validate locale
    try:
        l = Locale.objects.get(code__iexact=locale)
    except Locale.DoesNotExist:
        invalid_locale = True

    # Validate project
    try:
        p = Project.objects.get(disabled=False, slug=slug, pk__in=Resource.objects.values("project"))
    except Project.DoesNotExist:
        invalid_project = True

    if invalid_locale:
        if invalid_project:
            raise Http404
        else:
            messages.error(request, "Oops, locale is not supported.")
            request.session["translate_error"] = {"none": None}
            return HttpResponseRedirect(reverse("pontoon.home"))

    if invalid_project:
        messages.error(request, "Oops, project could not be found.")
        request.session["translate_error"] = {"none": None}
        return HttpResponseRedirect(reverse("pontoon.home"))

    # Validate project locales
    if p.locales.filter(code__iexact=locale).count() == 0:
        request.session["translate_error"] = {"none": None}
        messages.error(request, "Oops, locale is not supported for this project.")
        return HttpResponseRedirect(reverse("pontoon.home"))

    # Check if user authenticated
    if not p.pk == 1:
        if not request.user.is_authenticated():
            messages.error(request, "You need to sign in first.")
            request.session["translate_error"] = {"redirect": request.get_full_path()}
            return HttpResponseRedirect(reverse("pontoon.home"))

    # Set project details (locales and pages or paths + stats)
    projects = Project.objects.filter(disabled=False, pk__in=Resource.objects.values("project")).order_by("name")

    for project in projects:
        pages = Subpage.objects.filter(project=project)
        r = Entity.objects.filter(obsolete=False).values("resource")
        resources = Resource.objects.filter(project=project, pk__in=r)
        details = {}

        for loc in project.locales.all():
            stats = Stats.objects.filter(resource__in=resources, locale=loc)

            if len(pages) == 0 and len(resources) > 1:
                locale_details = stats.order_by("resource__path").values(
                    "resource__path", "resource__entity_count", "translated_count", "approved_count"
                )
            else:
                locale_details = pages.values("name")
                if len(pages) > 0 and pages[0].resource is not None:
                    locale_details = pages.filter(resource__stats=stats).values("name")

            details[loc.code.lower()] = list(locale_details)

        project.details = json.dumps(details)

    data = {
        "accept_language": utils.get_project_locale_from_request(request, Locale.objects),
        "locale": l,
        "locales": Locale.objects.all(),
        "page_url": p.url,
        "project": p,
        "projects": projects,
    }

    # Set subpage
    pages = Subpage.objects.filter(project=p)
    if len(pages) > 0:
        try:
            page = pages.get(name=part)
        except Subpage.DoesNotExist:
            # If page not specified or doesn't exist
            page = pages[0]
            locale_pages = pages.filter(resource__stats__locale=l)
            if locale_pages:
                page = locale_pages[0]

        data["page_url"] = page.url
        data["part"] = page.name

    # Set part if subpages not defined and entities in more than one file
    else:
        resources = Resource.objects.filter(project=p, entity_count__gt=0)

        if resources.count() > 1:
            paths = resources.filter(stats__locale=l).order_by("path").values_list("path", flat=True)
            data["part"] = part if part in paths else paths[0]

    # Set profile image from Gravatar
    if request.user.is_authenticated():
        data["gravatar_url"] = get_gravatar_url(request.user.email, 44)

    # Set error data
    translate_error = request.session.pop("translate_error", {})
    if translate_error:
        data["redirect"] = translate_error.get("redirect", None)

    return render(request, template, data)
Ejemplo n.º 34
0
def manage_project(request, slug=None, template='admin_project.html'):
    """Admin project."""
    log.debug("Admin project.")

    if not request.user.has_perm('base.can_manage'):
        return render(request, '403.html', status=403)

    SubpageInlineFormSet = inlineformset_factory(Project, Subpage, extra=1)
    form = ProjectForm()
    formset = SubpageInlineFormSet()
    locales_selected = []
    subtitle = 'Add project'
    pk = None
    project = None
    message = 'Before localizing projects, \
               you need to import strings from the repository.'
    autoupdate = False

    # Save project
    if request.method == 'POST':
        locales_selected = Locale.objects.filter(
            pk__in=request.POST.getlist('locales'))

        # Update existing project
        try:
            pk = request.POST['pk']
            project = Project.objects.get(pk=pk)
            form = ProjectForm(request.POST, instance=project)
            # Needed if form invalid
            formset = SubpageInlineFormSet(request.POST, instance=project)
            subtitle = 'Edit project'

        # Add a new project
        except MultiValueDictKeyError:
            form = ProjectForm(request.POST)
            # Needed if form invalid
            formset = SubpageInlineFormSet(request.POST)

        if form.is_valid():
            if set(project.locales.all()) != set(locales_selected):
                autoupdate = True

            project = form.save(commit=False)
            formset = SubpageInlineFormSet(request.POST, instance=project)
            if formset.is_valid():
                project.save()
                # http://bit.ly/1glKN50
                form.save_m2m()
                formset.save()
                # Properly displays formset, but removes errors (if valid only)
                formset = SubpageInlineFormSet(instance=project)
                subtitle += '. Saved.'
                pk = project.pk
                if not Resource.objects.filter(project=project).exists():
                    messages.warning(request, message)
                elif autoupdate:
                    messages.warning(request, 'After updating locales, \
                        strings need to be imported from the repository.')
            else:
                subtitle += '. Error.'
        else:
            subtitle += '. Error.'

    # If URL specified and found, show edit, otherwise show add form
    elif slug is not None:
        try:
            project = Project.objects.get(slug=slug)
            pk = project.pk
            form = ProjectForm(instance=project)
            formset = SubpageInlineFormSet(instance=project)
            locales_selected = project.locales.all()
            subtitle = 'Edit project'
            if not Resource.objects.filter(project=project).exists():
                messages.warning(request, message)
        except Project.DoesNotExist:
            form = ProjectForm(initial={'slug': slug})

    data = {
        'form': form,
        'formset': formset,
        'locales_selected': locales_selected,
        'locales_available': Locale.objects.exclude(pk__in=locales_selected),
        'REPOSITORY_TYPE_CHOICES': Project.REPOSITORY_TYPE_CHOICES,
        'subtitle': subtitle,
        'pk': pk,
        'autoupdate': autoupdate,
    }

    # Set locale in Translate link
    if project:
        locale = utils.get_project_locale_from_request(
            request, project.locales) or locales_selected[0].code
        if locale:
            data['translate_locale'] = locale

    if Resource.objects.filter(project=project).exists():
        data['ready'] = True

    return render(request, template, data)
Ejemplo n.º 35
0
def manage_project(request, slug=None, template='admin_project.html'):
    """Admin project."""
    log.debug("Admin project.")

    if not request.user.has_perm('base.can_manage'):
        return render(request, '403.html', status=403)

    form = ProjectForm()
    subpage_formset = SubpageInlineFormSet()
    repo_formset = RepositoryInlineFormSet()
    locales_selected = []
    subtitle = 'Add project'
    pk = None
    project = None

    # Save project
    if request.method == 'POST':
        locales_selected = Locale.objects.filter(
            pk__in=request.POST.getlist('locales'))

        # Update existing project
        try:
            pk = request.POST['pk']
            project = Project.objects.get(pk=pk)
            form = ProjectForm(request.POST, instance=project)
            # Needed if form invalid
            subpage_formset = SubpageInlineFormSet(request.POST, instance=project)
            repo_formset = RepositoryInlineFormSet(request.POST, instance=project)
            subtitle = 'Edit project'

        # Add a new project
        except MultiValueDictKeyError:
            form = ProjectForm(request.POST)
            # Needed if form invalid
            subpage_formset = SubpageInlineFormSet(request.POST)
            repo_formset = RepositoryInlineFormSet(request.POST)

        if form.is_valid():
            project = form.save(commit=False)
            subpage_formset = SubpageInlineFormSet(request.POST, instance=project)
            repo_formset = RepositoryInlineFormSet(request.POST, instance=project)

            if subpage_formset.is_valid() and repo_formset.is_valid():
                project.save()

                # Manually save ProjectLocales due to intermediary
                # model.
                locales = form.cleaned_data.get('locales', [])
                (ProjectLocale.objects
                    .filter(project=project)
                    .exclude(locale__pk__in=[l.pk for l in locales])
                    .delete())
                for locale in locales:
                    ProjectLocale.objects.get_or_create(project=project, locale=locale)

                subpage_formset.save()
                repo_formset.save()
                # Properly displays formsets, but removes errors (if valid only)
                subpage_formset = SubpageInlineFormSet(instance=project)
                repo_formset = RepositoryInlineFormSet(instance=project)
                subtitle += '. Saved.'
                pk = project.pk
            else:
                subtitle += '. Error.'
        else:
            subtitle += '. Error.'

    # If URL specified and found, show edit, otherwise show add form
    elif slug is not None:
        try:
            project = Project.objects.get(slug=slug)
            pk = project.pk
            form = ProjectForm(instance=project)
            subpage_formset = SubpageInlineFormSet(instance=project)
            repo_formset = RepositoryInlineFormSet(instance=project)
            locales_selected = project.locales.all()
            subtitle = 'Edit project'
        except Project.DoesNotExist:
            form = ProjectForm(initial={'slug': slug})

    # Override default label suffix
    form.label_suffix = ''

    data = {
        'form': form,
        'subpage_formset': subpage_formset,
        'repo_formset': repo_formset,
        'locales_selected': locales_selected,
        'locales_available': Locale.objects.exclude(pk__in=locales_selected),
        'subtitle': subtitle,
        'pk': pk,
    }

    # Set locale in Translate link
    if hasattr(project, 'locales') and locales_selected:
        locale = utils.get_project_locale_from_request(
            request, project.locales) or locales_selected[0].code
        if locale:
            data['translate_locale'] = locale

    if Resource.objects.filter(project=project).exists():
        data['ready'] = True

    return render(request, template, data)
Ejemplo n.º 36
0
def translate(request, locale, slug, part, template='translate.html'):
    """Translate view."""

    invalid_locale = invalid_project = False

    # Validate locale
    try:
        l = Locale.objects.get(code__iexact=locale)
    except Locale.DoesNotExist:
        invalid_locale = True

    # Validate project
    try:
        p = Project.objects.get(disabled=False,
                                slug=slug,
                                pk__in=Resource.objects.values('project'))
    except Project.DoesNotExist:
        invalid_project = True

    if invalid_locale:
        if invalid_project:
            raise Http404
        else:
            messages.error(request, "Oops, locale is not supported.")
            request.session['translate_error'] = {
                'none': None,
            }
            return HttpResponseRedirect(reverse('pontoon.home'))

    if invalid_project:
        messages.error(request, "Oops, project could not be found.")
        request.session['translate_error'] = {
            'none': None,
        }
        return HttpResponseRedirect(reverse('pontoon.home'))

    # Validate project locales
    if p.locales.filter(code__iexact=locale).count() == 0:
        request.session['translate_error'] = {
            'none': None,
        }
        messages.error(request,
                       "Oops, locale is not supported for this project.")
        return HttpResponseRedirect(reverse('pontoon.home'))

    # Check if user authenticated
    if not p.pk == 1:
        if not request.user.is_authenticated():
            messages.error(request, "You need to sign in first.")
            request.session['translate_error'] = {
                'redirect': request.get_full_path(),
            }
            return HttpResponseRedirect(reverse('pontoon.home'))

    projects = (Project.objects.filter(
        disabled=False, pk__in=Resource.objects.values(
            'project')).prefetch_related('subpage_set').order_by("name"))

    data = {
        'accept_language':
        utils.get_project_locale_from_request(request, Locale.objects),
        'locale':
        l,
        'locales':
        Locale.objects.all(),
        'page_url':
        p.url,
        'project':
        p,
        'projects':
        projects,
    }

    # Set subpage
    pages = Subpage.objects.filter(project=p)
    if len(pages) > 0:
        try:
            page = pages.get(name=part)

        # If page not specified or doesn't exist
        except Subpage.DoesNotExist:
            page = pages[0]
            locale_pages = pages.filter(resources__stats__locale=l)
            if locale_pages:
                page = locale_pages[0]

        data['page_url'] = page.url
        data['part'] = page.name

    # Set path if subpages not defined
    else:
        paths = (Resource.objects.filter(
            project=p, entity_count__gt=0,
            stats__locale=l).order_by('path').values_list('path', flat=True))

        if paths:
            data['part'] = part if part in paths else paths[0]

    # Set error data
    translate_error = request.session.pop('translate_error', {})
    if translate_error:
        data['redirect'] = translate_error.get('redirect', None)

    return render(request, template, data)
Ejemplo n.º 37
0
def manage_project(request, slug=None, template='admin_project.html'):
    """Admin project."""
    log.debug("Admin project.")

    if not request.user.has_perm('base.can_manage'):
        return render(request, '403.html', status=403)

    SubpageInlineFormSet = inlineformset_factory(Project, Subpage, extra=1)
    form = ProjectForm()
    formset = SubpageInlineFormSet()
    locales_selected = []
    subtitle = 'Add project'
    pk = None
    project = None
    message = 'Before localizing projects, \
               you need to import strings from the repository.'

    autoupdate = False

    # Save project
    if request.method == 'POST':
        locales_selected = Locale.objects.filter(
            pk__in=request.POST.getlist('locales'))

        # Update existing project
        try:
            pk = request.POST['pk']
            project = Project.objects.get(pk=pk)
            form = ProjectForm(request.POST, instance=project)
            # Needed if form invalid
            formset = SubpageInlineFormSet(request.POST, instance=project)
            subtitle = 'Edit project'

        # Add a new project
        except MultiValueDictKeyError:
            form = ProjectForm(request.POST)
            # Needed if form invalid
            formset = SubpageInlineFormSet(request.POST)

        if form.is_valid():
            if set(project.locales.all()) != set(locales_selected):
                autoupdate = True

            project = form.save(commit=False)
            formset = SubpageInlineFormSet(request.POST, instance=project)
            if formset.is_valid():
                project.save()
                # http://bit.ly/1glKN50
                form.save_m2m()
                formset.save()
                # Properly displays formset, but removes errors (if valid only)
                formset = SubpageInlineFormSet(instance=project)
                subtitle += '. Saved.'
                pk = project.pk
                if not Resource.objects.filter(project=project).exists():
                    messages.warning(request, message)
                elif autoupdate:
                    messages.warning(
                        request, 'After updating locales, \
                        strings need to be imported from the repository.')
            else:
                subtitle += '. Error.'
        else:
            subtitle += '. Error.'

    # If URL specified and found, show edit, otherwise show add form
    elif slug is not None:
        try:
            project = Project.objects.get(slug=slug)
            pk = project.pk
            form = ProjectForm(instance=project)
            formset = SubpageInlineFormSet(instance=project)
            locales_selected = project.locales.all()
            subtitle = 'Edit project'
            if not Resource.objects.filter(project=project).exists():
                messages.warning(request, message)
        except Project.DoesNotExist:
            form = ProjectForm(initial={'slug': slug})

    data = {
        'form': form,
        'formset': formset,
        'locales_selected': locales_selected,
        'locales_available': Locale.objects.exclude(pk__in=locales_selected),
        'REPOSITORY_TYPE_CHOICES': Project.REPOSITORY_TYPE_CHOICES,
        'subtitle': subtitle,
        'pk': pk,
        'autoupdate': autoupdate,
    }

    # Set locale in Translate link
    if project:
        locale = utils.get_project_locale_from_request(
            request, project.locales) or locales_selected[0].code
        if locale:
            data['translate_locale'] = locale

    if Resource.objects.filter(project=project).exists():
        data['ready'] = True

    return render(request, template, data)
Ejemplo n.º 38
0
def manage_project(request, slug=None, template='admin_project.html'):
    """Admin project."""
    log.debug("Admin project.")

    if not request.user.has_perm('base.can_manage_project'):
        raise PermissionDenied

    form = ProjectForm()
    subpage_formset = SubpageInlineFormSet()
    repo_formset = RepositoryInlineFormSet()
    external_resource_formset = ExternalResourceInlineFormSet()
    tag_formset = TagInlineFormSet()
    locales_readonly = []
    locales_selected = []
    subtitle = 'Add project'
    pk = None
    project = None

    # Save project
    if request.method == 'POST':
        locales_readonly = Locale.objects.filter(
            pk__in=request.POST.getlist('locales_readonly'))
        locales_selected = Locale.objects.filter(
            pk__in=request.POST.getlist('locales')).exclude(
                pk__in=locales_readonly)

        # Update existing project
        try:
            pk = request.POST['pk']
            project = Project.objects.get(pk=pk)
            form = ProjectForm(request.POST, instance=project)
            # Needed if form invalid
            subpage_formset = SubpageInlineFormSet(request.POST,
                                                   instance=project)
            repo_formset = RepositoryInlineFormSet(request.POST,
                                                   instance=project)
            tag_formset = (TagInlineFormSet(request.POST, instance=project)
                           if project.tags_enabled else None)
            external_resource_formset = ExternalResourceInlineFormSet(
                request.POST, instance=project)
            subtitle = 'Edit project'

        # Add a new project
        except MultiValueDictKeyError:
            form = ProjectForm(request.POST)
            # Needed if form invalid
            subpage_formset = SubpageInlineFormSet(request.POST)
            repo_formset = RepositoryInlineFormSet(request.POST)
            external_resource_formset = ExternalResourceInlineFormSet(
                request.POST)
            tag_formset = None

        if form.is_valid():
            project = form.save(commit=False)
            subpage_formset = SubpageInlineFormSet(request.POST,
                                                   instance=project)
            repo_formset = RepositoryInlineFormSet(request.POST,
                                                   instance=project)
            external_resource_formset = ExternalResourceInlineFormSet(
                request.POST, instance=project)
            if tag_formset:
                tag_formset = TagInlineFormSet(request.POST, instance=project)
            formsets_valid = (
                subpage_formset.is_valid() and repo_formset.is_valid()
                and external_resource_formset.is_valid()
                and (tag_formset.is_valid() if tag_formset else True))
            if formsets_valid:
                project.save()

                # Manually save ProjectLocales due to intermediary model
                locales_form = form.cleaned_data.get('locales', [])
                locales_readonly_form = form.cleaned_data.get(
                    'locales_readonly', [])
                locales = locales_form | locales_readonly_form

                (ProjectLocale.objects.filter(project=project).exclude(
                    locale__pk__in=[l.pk for l in locales]).delete())
                for locale in locales:
                    ProjectLocale.objects.get_or_create(project=project,
                                                        locale=locale)

                # Update readonly flags
                locales_readonly_pks = [l.pk for l in locales_readonly_form]
                project_locales = ProjectLocale.objects.filter(project=project)
                project_locales.exclude(
                    locale__pk__in=locales_readonly_pks).update(readonly=False)
                project_locales.filter(
                    locale__pk__in=locales_readonly_pks, ).update(
                        readonly=True)

                subpage_formset.save()
                repo_formset.save()
                external_resource_formset.save()
                if tag_formset:
                    tag_formset.save()

                # If the data source is database and there are new strings, save them.
                if project.data_source == 'database':
                    _save_new_strings(project,
                                      request.POST.get('new_strings', ''))
                    _create_or_update_translated_resources(project, locales)

                # Properly displays formsets, but removes errors (if valid only)
                subpage_formset = SubpageInlineFormSet(instance=project)
                repo_formset = RepositoryInlineFormSet(instance=project)
                external_resource_formset = ExternalResourceInlineFormSet(
                    instance=project)
                if project.tags_enabled:
                    tag_formset = TagInlineFormSet(instance=project)
                subtitle += '. Saved.'
                pk = project.pk
            else:
                subtitle += '. Error.'
        else:
            subtitle += '. Error.'

    # If URL specified and found, show edit, otherwise show add form
    elif slug is not None:
        try:
            project = Project.objects.get(slug=slug)
            pk = project.pk
            form = ProjectForm(instance=project)
            subpage_formset = SubpageInlineFormSet(instance=project)
            repo_formset = RepositoryInlineFormSet(instance=project)
            tag_formset = (TagInlineFormSet(
                instance=project) if project.tags_enabled else None)
            external_resource_formset = ExternalResourceInlineFormSet(
                instance=project)
            locales_readonly = Locale.objects.filter(
                project_locale__readonly=True,
                project_locale__project=project,
            )
            locales_selected = project.locales.exclude(pk__in=locales_readonly)
            subtitle = 'Edit project'
        except Project.DoesNotExist:
            form = ProjectForm(initial={'slug': slug})

    # Override default label suffix
    form.label_suffix = ''

    projects = []
    for p in Project.objects.prefetch_related('locales').order_by('name'):
        projects.append({
            'name': p.name,
            # Cannot use values_list() here, because it hits the DB again
            'locales': [l.pk for l in p.locales.all()],
        })

    data = {
        'slug': slug,
        'form': form,
        'subpage_formset': subpage_formset,
        'repo_formset': repo_formset,
        'tag_formset': tag_formset,
        'external_resource_formset': external_resource_formset,
        'locales_readonly': locales_readonly,
        'locales_selected': locales_selected,
        'locales_available': Locale.objects.exclude(pk__in=locales_selected),
        'subtitle': subtitle,
        'pk': pk,
        'project': project,
        'projects': projects,
    }

    # Set locale in Translate link
    if hasattr(project, 'locales') and locales_selected:
        locale = utils.get_project_locale_from_request(
            request, project.locales) or locales_selected[0].code
        if locale:
            data['translate_locale'] = locale

    if Resource.objects.filter(project=project).exists():
        data['ready'] = True

    return render(request, template, data)