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(), })
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))
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)
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, })
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, })
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)
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(), })
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, })
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()} )
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))
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, })
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)
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)
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), })
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)
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), })
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(), })
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)
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(), })
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)
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)
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)
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 ), }, )
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'
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)
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 }, )
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)