def change_project(request, project): obj = get_project(request, project) if not request.user.has_perm('project.edit', obj): raise Http404() if request.method == 'POST': settings_form = ProjectSettingsForm(request, request.POST, instance=obj) if settings_form.is_valid(): settings_form.save() messages.success(request, _('Settings saved')) return redirect('settings', project=obj.slug) else: messages.error( request, _('Invalid settings, please check the form for errors!') ) else: settings_form = ProjectSettingsForm(request, instance=obj) return render( request, 'project-settings.html', { 'object': obj, 'settings_form': settings_form, } )
def unwatch(request, project): obj = get_project(request, project) request.user.profile.watched.remove(obj) request.user.subscription_set.filter( Q(project=obj) | Q(component__project=obj) ).delete() return redirect(obj)
def show_engage(request, project, lang=None): # Get project object, skipping ACL obj = get_project(request, project, skip_acl=True) # Handle language parameter if lang is not None: language = Language.objects.try_get(code=lang) else: language = None if language: try_set_language(lang) stats_obj = obj.stats.get_single_language_stats(language) else: stats_obj = obj.stats return render( request, 'engage.html', { 'allow_index': True, 'object': obj, 'project': obj, 'languages': stats_obj.languages, 'total': obj.stats.source_strings, 'percent': stats_obj.translated_percent, 'language': language, 'title': _('Get involved in {0}!').format(obj), } )
def push_project(request, project): obj = get_project(request, project) if not request.user.has_perm('vcs.push', obj): raise PermissionDenied() return perform_push(request, obj)
def cleanup_project(request, project): obj = get_project(request, project) if not request.user.has_perm('vcs.reset', obj): raise PermissionDenied() return perform_cleanup(request, obj)
def update_project(request, project): obj = get_project(request, project) if not request.user.has_perm('vcs.update', obj): raise PermissionDenied() return perform_update(request, obj)
def commit_project(request, project): obj = get_project(request, project) if not request.user.has_perm('vcs.commit', obj): raise PermissionDenied() return perform_commit(request, obj)
def show_engage(request, project, lang=None): # Get project object, skipping ACL obj = get_project(request, project, skip_acl=True) # Handle language parameter if lang is not None: language = get_object_or_404(Language, code=lang) else: language = None full_stats = obj.stats if language: try_set_language(lang) stats_obj = full_stats.get_single_language_stats(language) else: stats_obj = full_stats return render( request, 'engage.html', { 'allow_index': True, 'object': obj, 'project': obj, 'full_stats': full_stats, 'languages': stats_obj.languages, 'total': obj.stats.source_strings, 'percent': stats_obj.translated_percent, 'language': language, 'project_link': mark_safe('<a href="{}">{}</a>'.format( escape(obj.get_absolute_url()), escape(obj.name) )), 'title': _('Get involved in {0}!').format(obj), } )
def delete_dictionary(request, project, lang, pk): prj = get_project(request, project) if not request.user.has_perm('glossary.delete', prj): raise PermissionDenied() lang = get_object_or_404(Language, code=lang) word = get_object_or_404( Dictionary, project=prj, language=lang, id=pk ) word.delete() params = {} for param in ('letter', 'limit', 'page'): if param in request.POST: params[param] = request.POST[param] if params: param = '?' + urlencode(params) else: param = '' return redirect_param( 'show_dictionary', param, project=prj.slug, lang=lang.code )
def change_access(request, project): obj = get_project(request, project) if not request.user.has_perm('billing:project.permissions', obj): raise PermissionDenied() form = ProjectAccessForm(request.POST, instance=obj) if not form.is_valid(): for error in form.errors: for message in form.errors[error]: messages.error(request, message) else: form.save() Change.objects.create( project=obj, action=Change.ACTION_ACCESS_EDIT, user=request.user, details={'access_control': obj.access_control}, ) messages.success( request, _('Project access control has been changed.') ) return redirect( 'manage-access', project=obj.slug, )
def show_project(request, project): obj = get_project(request, project) user = request.user dict_langs = Language.objects.filter( dictionary__project=obj ).annotate(Count('dictionary')) last_changes = Change.objects.prefetch().filter(project=obj)[:10] language_stats = sort_unicode( obj.stats.get_language_stats(), lambda x: force_text(x.language.name) ) # Paginate components of project. all_components = obj.component_set.select_related() components = prefetch_stats(get_paginator( request, all_components )) return render( request, 'project.html', { 'allow_index': True, 'object': obj, 'project': obj, 'dicts': dict_langs, 'last_changes': last_changes, 'last_changes_url': urlencode( {'project': obj.slug} ), 'language_stats': language_stats, 'language_count': Language.objects.filter( translation__component__project=obj ).distinct().count(), 'search_form': SearchForm(), 'whiteboard_form': optional_form( WhiteboardForm, user, 'project.edit', obj ), 'delete_form': optional_form( DeleteForm, user, 'project.edit', obj, obj=obj ), 'rename_form': optional_form( ProjectRenameForm, user, 'project.edit', obj, request=request, instance=obj ), 'replace_form': optional_form(ReplaceForm, user, 'unit.edit', obj), 'bulk_state_form': optional_form( BulkStateForm, user, 'translation.auto', obj, user=user, obj=obj ), 'components': components, 'licenses': ', '.join( sorted({x.license for x in all_components if x.license}) ), } )
def data_project(request, project): obj = get_project(request, project) return render( request, 'data.html', { 'object': obj, 'project': obj, } )
def edit_dictionary(request, project, lang, pk): prj = get_project(request, project) if not request.user.has_perm('glossary.edit', prj): raise PermissionDenied() lang = get_object_or_404(Language, code=lang) word = get_object_or_404( Dictionary, project=prj, language=lang, id=pk, ) if request.method == 'POST': form = WordForm(request.POST) if form.is_valid(): word.edit( request, form.cleaned_data['source'], form.cleaned_data['target'] ) return redirect( 'show_dictionary', project=prj.slug, lang=lang.code ) else: form = WordForm( initial={'source': word.source, 'target': word.target} ) last_changes = Change.objects.last_changes(request.user).filter( dictionary=word, )[:10] return render( request, 'edit_dictionary.html', { 'title': dict_title(prj, lang), 'project': prj, 'language': lang, 'form': form, 'last_changes': last_changes, 'last_changes_url': urlencode({ 'project': prj.slug, 'lang': lang.code, 'glossary': 1 }), } )
def render_widget(request, project, widget='287x66', color=None, lang=None, component=None, extension='png'): # We intentionally skip ACL here to allow widget sharing if component is None: obj = get_project(request, project, skip_acl=True) else: obj = get_component(request, project, component, skip_acl=True) # Handle language parameter if lang is not None: if 'native' not in request.GET: try_set_language(lang) lang = Language.objects.try_get(code=lang) else: try_set_language('en') # Get widget class try: widget_class = WIDGETS[widget] except KeyError: raise Http404() # Construct object widget_obj = widget_class(obj, color, lang) # Redirect widget if hasattr(widget_obj, 'redirect'): return redirect(widget_obj.redirect(), permanent=True) # Invalid extension if extension != widget_obj.extension or color != widget_obj.color: kwargs = { 'project': project, 'widget': widget, 'color': widget_obj.color, 'extension': widget_obj.extension, } if lang: kwargs['lang'] = lang.code return redirect('widget-image', permanent=True, **kwargs) return redirect('widget-image', permanent=True, **kwargs) # Render widget widget_obj.render() return HttpResponse( content_type=widget_obj.content_type, content=widget_obj.get_content() )
def lock_project(request, project): obj = get_project(request, project) if not request.user.has_perm('component.lock', obj): raise PermissionDenied() for component in obj.component_set.all(): component.do_lock(request.user) messages.success( request, _('All components are now locked for translation updates!') ) return redirect_param(obj, '#repository')
def show_dictionaries(request, project): obj = get_project(request, project) dicts = Translation.objects.filter( component__project=obj ).values_list('language', flat=True).distinct() return render( request, 'dictionaries.html', { 'title': _('Dictionaries'), 'dicts': Language.objects.filter(id__in=dicts), 'project': obj, } )
def unlock_project(request, project): obj = get_project(request, project) if not request.user.has_perm('component.lock', obj): raise PermissionDenied() for component in obj.component_set.all(): component.do_lock(request.user, False) messages.success( request, _('Project is now open for translation updates.') ) return redirect_param(obj, '#repository')
def whiteboard_project(request, project): obj = get_project(request, project) if not request.user.has_perm('project.edit', obj): raise PermissionDenied() form = WhiteboardForm(request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj, '#whiteboard') WhiteboardMessage.objects.create( project=obj, **form.cleaned_data ) return redirect(obj)
def show_project(request, lang, project): try: obj = Language.objects.get(code=lang) except Language.DoesNotExist: obj = Language.objects.fuzzy_get(lang) if isinstance(obj, Language): return redirect(obj) raise Http404('No Language matches the given query.') pobj = get_project(request, project) last_changes = Change.objects.last_changes(request.user).filter( translation__language=obj, component__project=pobj )[:10] # Paginate translations. translation_list = obj.translation_set.prefetch().filter( component__project=pobj ).order_by( 'component__project__slug', 'component__slug' ) translations = get_paginator(request, translation_list) return render( request, 'language-project.html', { 'allow_index': True, 'language': obj, 'project': pobj, 'last_changes': last_changes, 'last_changes_url': urlencode( {'lang': obj.code, 'project': pobj.slug} ), 'translations': translations, 'title': '{0} - {1}'.format(pobj, obj), 'show_only_component': True, 'search_form': SiteSearchForm(), } )
def remove_project(request, project): obj = get_project(request, project) if not request.user.has_perm('project.edit', obj): raise PermissionDenied() form = DeleteForm(obj, request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj, '#delete') project_removal.delay(obj.pk) messages.success(request, _('Project was scheduled for removal.')) Change.objects.create( action=Change.ACTION_REMOVE_PROJECT, target=obj.slug, user=request.user, author=request.user ) return redirect('home')
def check_user_form(request, project, verbose=False): """Check project permission and UserManageForm. This is simple helper to perform needed validation for all user management views. """ obj = get_project(request, project) if (not request.user.has_perm('project.permissions', obj) or obj.access_control == obj.ACCESS_CUSTOM): raise PermissionDenied() form = UserManageForm(request.POST) if form.is_valid(): return obj, form if verbose: for error in form.errors: for message in form.errors[error]: messages.error(request, message) return obj, None
def parse_url(request, project, component=None, lang=None): context = {} if component is None: obj = get_project(request, project) unit_set = Unit.objects.filter(translation__component__project=obj) context['project'] = obj elif lang is None: obj = get_component(request, project, component) unit_set = Unit.objects.filter(translation__component=obj) context['component'] = obj context['project'] = obj.project else: obj = get_translation(request, project, component, lang) unit_set = obj.unit_set context['translation'] = obj context['component'] = obj.component context['project'] = obj.component.project if not request.user.has_perm('unit.edit', obj): raise PermissionDenied() return obj, unit_set, context
def upload_dictionary(request, project, lang): prj = get_project(request, project) if not request.user.has_perm('glossary.upload', prj): raise PermissionDenied() lang = get_object_or_404(Language, code=lang) form = DictUploadForm(request.POST, request.FILES) if form.is_valid(): try: count = Dictionary.objects.upload( request, prj, lang, request.FILES['file'], form.cleaned_data['method'] ) import_message( request, count, _('No words to import found in file.'), ungettext( 'Imported %d word from the uploaded file.', 'Imported %d words from the uploaded file.', count ) ) except Exception as error: report_error(error, request) messages.error( request, _('File upload has failed: %s') % force_text(error) ) else: messages.error(request, _('Failed to process form!')) return redirect( 'show_dictionary', project=prj.slug, lang=lang.code )
def manage_access(request, project): """User management view.""" obj = get_project(request, project) if not request.user.has_perm('project.permissions', obj): raise PermissionDenied() if request.user.has_perm('billing:project.permissions', obj): access_form = ProjectAccessForm(instance=obj) else: access_form = DisabledProjectAccessForm(instance=obj) return render( request, 'manage-access.html', { 'object': obj, 'project': obj, 'groups': Group.objects.for_project(obj), 'all_users': User.objects.for_project(obj), 'add_user_form': UserManageForm(), 'access_form': access_form, } )
def download_dictionary(request, project, lang): """Export dictionary into various formats.""" prj = get_project(request, project) lang = get_object_or_404(Language, code=lang) # Parse parameters export_format = None if 'format' in request.GET: export_format = request.GET['format'] if export_format not in ('csv', 'po', 'tbx', 'xliff'): export_format = 'csv' # Grab all words words = Dictionary.objects.filter( project=prj, language=lang ).order_by(Lower('source')) # Translate toolkit based export exporter = get_exporter(export_format)( prj, lang, get_site_url(reverse( 'show_dictionary', kwargs={'project': prj.slug, 'lang': lang.code} )), fieldnames=('source', 'target'), ) # Add words for word in words.iterator(): exporter.add_dictionary(word) # Save to response return exporter.get_response( 'glossary-{project}-{language}.{extension}' )
def git_status_project(request, project): obj = get_project(request, project) if not request.user.has_perm('meta:vcs.status', obj): raise PermissionDenied() statuses = [ (force_text(component), component.repository.status) for component in obj.all_repo_components() ] return render( request, 'js/git-status.html', { 'object': obj, 'project': obj, 'changes': Change.objects.filter( component__project=obj, action__in=Change.ACTIONS_REPOSITORY, )[:10], 'statuses': statuses, } )
def push_project(request, project): obj = get_project(request, project) return perform_push(request, obj)
def cleanup_project(request, project): obj = get_project(request, project) return perform_cleanup(request, obj)
def get_objects(request, kwargs): if 'project' in kwargs: return {'project': get_project(request, kwargs['project'])} if 'manage' in kwargs: return {'use_file': True} return {'user': request.user}
def show_project(request, project): obj = get_project(request, project) user = request.user last_changes = Change.objects.prefetch().order().filter(project=obj)[:10] language_stats = sort_unicode(obj.stats.get_language_stats(), lambda x: force_str(x.language)) # Paginate components of project. all_components = obj.component_set.prefetch().order() components = prefetch_stats(get_paginator(request, all_components)) return render( request, "project.html", { "allow_index": True, "object": obj, "project": obj, "last_changes": last_changes, "reports_form": ReportsForm(), "last_changes_url": urlencode({"project": obj.slug}), "language_stats": language_stats, "search_form": SearchForm(request.user), "announcement_form": optional_form(AnnouncementForm, user, "project.edit", obj), "delete_form": optional_form( ProjectDeleteForm, user, "project.edit", obj, obj=obj), "rename_form": optional_form( ProjectRenameForm, user, "project.edit", obj, request=request, instance=obj, ), "replace_form": optional_form(ReplaceForm, user, "unit.edit", obj), "bulk_state_form": optional_form( BulkEditForm, user, "translation.auto", obj, user=user, obj=obj, project=obj, auto_id="id_bulk_%s", ), "components": components, "licenses": obj.component_set.exclude(license="").order_by("license"), }, )
def show_glossary(request, project, lang): prj = get_project(request, project) lang = get_object_or_404(Language, code=lang) if request.method == "POST" and request.user.has_perm("glossary.add", prj): form = TermForm(prj, request.POST) if form.is_valid(): Term.objects.create( request.user, language=lang, source=form.cleaned_data["source"], target=form.cleaned_data["target"], glossary=form.cleaned_data["glossary"], ) return redirect_next(request.POST.get("next"), request.get_full_path()) form = TermForm(prj) uploadform = GlossaryUploadForm(prj) terms = Term.objects.for_project(prj).filter(language=lang).order() letterform = LetterForm(request.GET) searchform = OneTermForm(request.GET) if searchform.is_valid() and searchform.cleaned_data["term"] != "": terms = terms.filter(source__substring=searchform.cleaned_data["term"]) search = searchform.cleaned_data["term"] else: search = "" if letterform.is_valid() and letterform.cleaned_data["letter"] != "": terms = terms.filter( source__istartswith=letterform.cleaned_data["letter"]) letter = letterform.cleaned_data["letter"] else: letter = "" terms = get_paginator(request, terms) last_changes = (Change.objects.last_changes(request.user).filter( project=prj, language=lang).exclude(glossary_term=None)[:10]) exporters = EXPORTERS.list_exporters_filter(EXPORT_TYPES) return render( request, "glossary.html", { "title": dict_title(prj, lang), "project": prj, "language": lang, "page_obj": terms, "exporters": exporters, "form": form, "query_string": urlencode({ "term": search, "letter": letter }), "uploadform": uploadform, "letterform": letterform, "searchform": searchform, "letter": letter, "last_changes": last_changes, "last_changes_url": urlencode(( ("project", prj.slug), ("lang", lang.code), ("action", Change.ACTION_DICTIONARY_NEW), ("action", Change.ACTION_DICTIONARY_EDIT), ("action", Change.ACTION_DICTIONARY_UPLOAD), )), }, )
def get_counts(request, project=None, component=None): """View for work counts.""" if project is None: obj = None kwargs = {} elif component is None: obj = get_project(request, project) kwargs = {"project": obj} else: obj = get_component(request, project, component) kwargs = {"component": obj} form = ReportsForm(request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj or "home", "#reports") data = generate_counts( None if request.user.has_perm("reports.view", obj) else request.user, form.cleaned_data["start_date"], form.cleaned_data["end_date"], **kwargs, ) if form.cleaned_data["style"] == "json": return JsonResponse(data=data, safe=False) headers = ( "Name", "Email", "Count total", "Edits total", "Source words total", "Source chars total", "Target words total", "Target chars total", "Count new", "Edits new", "Source words new", "Source chars new", "Target words new", "Target chars new", "Count approved", "Edits approved", "Source words approved", "Source chars approved", "Target words approved", "Target chars approved", "Count edited", "Edits edited", "Source words edited", "Source chars edited", "Target words edited", "Target chars edited", ) if form.cleaned_data["style"] == "html": start = HTML_HEADING.format("".join(f"<th>{h}</th>" for h in headers)) row_start = "<tr>" cell_name = cell_count = "<td>{0}</td>\n" row_end = "</tr>" mime = "text/html" end = "</table>" else: start = "{0}\n{1} {2}\n{0}".format( RST_HEADING, " ".join(f"{h:40}" for h in headers[:2]), " ".join(f"{h:24}" for h in headers[2:]), ) row_start = "" cell_name = "{0:40} " cell_count = "{0:24} " row_end = "" mime = "text/plain" end = RST_HEADING result = [] result.append(start) for item in data: if row_start: result.append(row_start) result.append("".join(( cell_name.format(item["name"] or "Anonymous"), cell_name.format(item["email"] or ""), cell_count.format(item["count"]), cell_count.format(item["edits"]), cell_count.format(item["words"]), cell_count.format(item["chars"]), cell_count.format(item["t_words"]), cell_count.format(item["t_chars"]), cell_count.format(item["count_new"]), cell_count.format(item["edits_new"]), cell_count.format(item["words_new"]), cell_count.format(item["chars_new"]), cell_count.format(item["t_words_new"]), cell_count.format(item["t_chars_new"]), cell_count.format(item["count_approve"]), cell_count.format(item["edits_approve"]), cell_count.format(item["words_approve"]), cell_count.format(item["chars_approve"]), cell_count.format(item["t_words_approve"]), cell_count.format(item["t_chars_approve"]), cell_count.format(item["count_edit"]), cell_count.format(item["edits_edit"]), cell_count.format(item["words_edit"]), cell_count.format(item["chars_edit"]), cell_count.format(item["t_words_edit"]), cell_count.format(item["t_chars_edit"]), ))) if row_end: result.append(row_end) result.append(end) return HttpResponse("\n".join(result), content_type=f"{mime}; charset=utf-8")
def get_object(self, request, project): return get_project(request, project)
def get_credits(request, project=None, component=None): """View for credits""" if project is None: obj = None kwargs = {'translation__pk__gt': 0} elif component is None: obj = get_project(request, project) kwargs = {'translation__component__project': obj} else: obj = get_component(request, project, component) kwargs = {'translation__component': obj} if not request.user.has_perm('reports.view', obj): raise PermissionDenied() form = ReportsForm(request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj or 'home', '#reports') data = generate_credits(form.cleaned_data['start_date'], form.cleaned_data['end_date'], **kwargs) if form.cleaned_data['style'] == 'json': return JsonResponse(data=data, safe=False) if form.cleaned_data['style'] == 'html': start = '<table>' row_start = '<tr>' language_format = '<th>{0}</th>' translator_start = '<td><ul>' translator_format = '<li><a href="mailto:{0}">{1}</a></li>' translator_end = '</ul></td>' row_end = '</tr>' mime = 'text/html' end = '</table>' else: start = '' row_start = '' language_format = '* {0}\n' translator_start = '' translator_format = ' * {1} <{0}>' translator_end = '' row_end = '' mime = 'text/plain' end = '' result = [] result.append(start) for language in data: name, translators = language.popitem() result.append(row_start) result.append(language_format.format(name)) result.append(''.join(( translator_start, '\n'.join([translator_format.format(*t) for t in translators]), translator_end, ))) result.append(row_end) result.append(end) return HttpResponse( '\n'.join(result), content_type='{0}; charset=utf-8'.format(mime), )
def watch(request, project): obj = get_project(request, project) request.user.profile.watched.add(obj) return redirect(obj)
def unwatch(request, project): obj = get_project(request, project) request.user.profile.subscriptions.remove(obj) return redirect(obj)
def get_objects(request, kwargs): if "project" in kwargs: return {"project": get_project(request, kwargs["project"])} if "manage" in kwargs: return {"from_file": True} return {"user": request.user}
def show_dictionary(request, project, lang): prj = get_project(request, project) lang = get_object_or_404(Language, code=lang) if request.method == 'POST' and request.user.has_perm('glossary.add', prj): form = WordForm(request.POST) if form.is_valid(): Dictionary.objects.create(request.user, project=prj, language=lang, source=form.cleaned_data['source'], target=form.cleaned_data['target']) return redirect_next(request.POST.get('next'), request.get_full_path()) form = WordForm() uploadform = DictUploadForm() words = Dictionary.objects.filter(project=prj, language=lang).order() letterform = LetterForm(request.GET) searchform = OneWordForm(request.GET) if searchform.is_valid() and searchform.cleaned_data['term'] != '': words = words.filter(source__icontains=searchform.cleaned_data['term']) search = searchform.cleaned_data['term'] else: search = '' if letterform.is_valid() and letterform.cleaned_data['letter'] != '': words = words.filter( source__istartswith=letterform.cleaned_data['letter']) letter = letterform.cleaned_data['letter'] else: letter = '' words = get_paginator(request, words) last_changes = Change.objects.last_changes(request.user).filter( dictionary__project=prj, dictionary__language=lang)[:10] return render( request, 'dictionary.html', { 'title': dict_title(prj, lang), 'project': prj, 'language': lang, 'page_obj': words, 'form': form, 'query_string': urlencode({ 'term': search, 'letter': letter }), 'uploadform': uploadform, 'letterform': letterform, 'searchform': searchform, 'letter': letter, 'last_changes': last_changes, 'last_changes_url': urlencode(( ('project', prj.slug), ('lang', lang.code), ('action', Change.ACTION_DICTIONARY_NEW), ('action', Change.ACTION_DICTIONARY_EDIT), ('action', Change.ACTION_DICTIONARY_UPLOAD), )), })
def search(request, project=None, component=None, lang=None): """Perform site-wide search on units.""" is_ratelimited = not check_rate_limit('search', request) search_form = SearchForm(request.user, request.GET) context = { 'search_form': search_form, } if component: obj = get_component(request, project, component) context['component'] = obj context['project'] = obj.project context['back_url'] = obj.get_absolute_url() elif project: obj = get_project(request, project) context['project'] = obj context['back_url'] = obj.get_absolute_url() else: obj = None context['back_url'] = None if lang: s_language = get_object_or_404(Language, code=lang) context['language'] = s_language if obj: if component: context['back_url'] = obj.translation_set.get( language=s_language).get_absolute_url() else: context['back_url'] = reverse('project-language', kwargs={ 'project': project, 'lang': lang, }) else: context['back_url'] = s_language.get_absolute_url() if not is_ratelimited and request.GET and search_form.is_valid(): # Filter results by ACL if component: units = Unit.objects.filter(translation__component=obj) elif project: units = Unit.objects.filter(translation__component__project=obj) else: allowed_projects = request.user.allowed_projects units = Unit.objects.filter( translation__component__project__in=allowed_projects) units = units.search(search_form.cleaned_data.get("q", "")) if lang: units = units.filter(translation__language=context['language']) units = get_paginator(request, units.order()) context['show_results'] = True context['page_obj'] = units context['title'] = _('Search for %s') % (search_form.cleaned_data['q']) context['query_string'] = search_form.urlencode() context['search_query'] = search_form.cleaned_data['q'] elif is_ratelimited: messages.error(request, _('Too many search queries, please try again later.')) elif request.GET: messages.error(request, _('Invalid search query!')) show_form_errors(request, search_form) return render(request, 'search.html', context)
def data_project(request, project): obj = get_project(request, project) return render(request, 'data.html', { 'object': obj, 'project': obj, })
def mute_project(request, project): obj = get_project(request, project) mute_real(request.user, scope=SCOPE_PROJECT, component=None, project=obj) return redirect( "{}?notify_project={}#notifications".format(reverse("profile"), obj.pk) )
def download_project(request, project): obj = get_project(request, project) obj.commit_pending("download", None) return download_multi(Translation.objects.filter(component__project=obj), request.GET.get("format"))
def get_credits(request, project=None, component=None): """View for credits.""" if project is None: obj = None kwargs = {"translation__isnull": False} elif component is None: obj = get_project(request, project) kwargs = {"translation__component__project": obj} else: obj = get_component(request, project, component) kwargs = {"translation__component": obj} form = ReportsForm(request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj or "home", "#reports") data = generate_credits( None if request.user.has_perm("reports.view", obj) else request.user, form.cleaned_data["start_date"], form.cleaned_data["end_date"], **kwargs, ) if form.cleaned_data["style"] == "json": return JsonResponse(data=data, safe=False) if form.cleaned_data["style"] == "html": start = "<table>" row_start = "<tr>" language_format = "<th>{0}</th>" translator_start = "<td><ul>" translator_format = '<li><a href="mailto:{0}">{1}</a> ({2})</li>' translator_end = "</ul></td>" row_end = "</tr>" mime = "text/html" end = "</table>" else: start = "" row_start = "" language_format = "* {0}\n" translator_start = "" translator_format = " * {1} <{0}> ({2})" translator_end = "" row_end = "" mime = "text/plain" end = "" result = [] result.append(start) for language in data: name, translators = language.popitem() result.append(row_start) result.append(language_format.format(name)) result.append(translator_start + "\n".join( translator_format.format(*t) for t in translators) + translator_end) result.append(row_end) result.append(end) return HttpResponse("\n".join(result), content_type=f"{mime}; charset=utf-8")
def show_check_project(request, name, project): """Show checks failing in a project.""" prj = get_project(request, project) try: check = CHECKS[name] except KeyError: raise Http404('No check matches the given query.') ignore = ('ignored' in request.GET) url_params = {} allchecks = acl_checks(request.user).filter( check=name, project=prj, ignore=ignore, ) if ignore: url_params['ignored'] = 'true' if request.GET.get('language'): allchecks = allchecks.filter(language__code=request.GET['language']) url_params['language'] = request.GET['language'] units = Unit.objects.none() if check.target: langs = allchecks.values_list('language', flat=True).distinct() for lang in langs: checks = allchecks.filter(language=lang, ).values_list( 'content_hash', flat=True) res = Unit.objects.filter( content_hash__in=checks, translation__language=lang, translation__component__project=prj, ).values('translation__component__slug', 'translation__component__project__slug').annotate( count=Count('id')) units |= res if check.source: checks = allchecks.filter(language=None, ).values_list('content_hash', flat=True) for component in prj.component_set.iterator(): try: lang_id = component.translation_set.values_list('language_id', flat=True)[0] except IndexError: continue res = Unit.objects.filter( content_hash__in=checks, translation__language_id=lang_id, translation__component=component).values( 'translation__component__slug', 'translation__component__project__slug').annotate( count=Count('id')) units |= res counts = {} for unit in units: key = '/'.join((unit['translation__component__project__slug'], unit['translation__component__slug'])) if key in counts: counts[key] += unit['count'] else: counts[key] = unit['count'] units = [{ 'translation__component__slug': item.split('/')[1], 'translation__component__project__slug': item.split('/')[0], 'count': counts[item] } for item in counts] return render( request, 'check_project.html', { 'checks': units, 'title': '{0}/{1}'.format(force_text(prj), check.name), 'check': check, 'project': prj, 'url_params': encode_optional(url_params), })
def rename_project(request, project): obj = get_project(request, project) return perform_rename(ProjectRenameForm, request, obj, "project.edit")
def show_project(request, project): obj = get_project(request, project) user = request.user last_changes = Change.objects.prefetch().order().filter(project=obj)[:10] language_stats = sort_unicode(obj.stats.get_language_stats(), lambda x: force_text(x.language)) # Paginate components of project. all_components = obj.component_set.prefetch().order() components = prefetch_stats(get_paginator(request, all_components)) return render( request, 'project.html', { 'allow_index': True, 'object': obj, 'project': obj, 'last_changes': last_changes, 'reports_form': ReportsForm(), 'last_changes_url': urlencode({'project': obj.slug}), 'language_stats': language_stats, 'search_form': SearchForm(request.user), 'whiteboard_form': optional_form(WhiteboardForm, user, 'project.edit', obj), 'delete_form': optional_form(DeleteForm, user, 'project.edit', obj, obj=obj), 'rename_form': optional_form( ProjectRenameForm, user, 'project.edit', obj, request=request, instance=obj, ), 'replace_form': optional_form(ReplaceForm, user, 'unit.edit', obj), 'bulk_state_form': optional_form( BulkEditForm, user, 'translation.auto', obj, user=user, obj=obj, project=obj, auto_id="id_bulk_%s", ), 'components': components, 'licenses': obj.component_set.exclude(license='').order_by('license'), }, )
def show_dictionary(request, project, lang): prj = get_project(request, project) lang = get_object_or_404(Language, code=lang) if request.method == 'POST' and request.user.has_perm('glossary.add', prj): form = WordForm(request.POST) if form.is_valid(): Dictionary.objects.create(request.user, project=prj, language=lang, source=form.cleaned_data['source'], target=form.cleaned_data['target']) return redirect_next(request.POST.get('next'), request.get_full_path()) else: form = WordForm() uploadform = DictUploadForm() words = Dictionary.objects.filter(project=prj, language=lang).order_by(Lower('source')) letterform = LetterForm(request.GET) if letterform.is_valid() and letterform.cleaned_data['letter'] != '': words = words.filter( source__istartswith=letterform.cleaned_data['letter']) letter = letterform.cleaned_data['letter'] else: letter = '' words = get_paginator(request, words) last_changes = Change.objects.last_changes(request.user).filter( dictionary__project=prj, dictionary__language=lang)[:10] return render( request, 'dictionary.html', { 'title': dict_title(prj, lang), 'project': prj, 'language': lang, 'page_obj': words, 'form': form, 'query_string': 'letter={}'.format(letter) if letter else '', 'uploadform': uploadform, 'letterform': letterform, 'letter': letter, 'last_changes': last_changes, 'last_changes_url': urlencode({ 'project': prj.slug, 'lang': lang.code, 'glossary': 1 }), })
def file_sync_project(request, project): obj = get_project(request, project) return perform_file_sync(request, obj)
def unwatch(request, project): obj = get_project(request, project) request.user.profile.watched.remove(obj) request.user.subscription_set.filter( Q(project=obj) | Q(component__project=obj)).delete() return redirect(obj)
def show_dictionary(request, project, lang): prj = get_project(request, project) lang = get_object_or_404(Language, code=lang) if request.method == 'POST' and request.user.has_perm('glossary.add', prj): form = WordForm(request.POST) if form.is_valid(): Dictionary.objects.create( request.user, project=prj, language=lang, source=form.cleaned_data['source'], target=form.cleaned_data['target'] ) return redirect_next( request.POST.get('next'), request.get_full_path() ) else: form = WordForm() uploadform = DictUploadForm() words = Dictionary.objects.filter( project=prj, language=lang ).order_by(Lower('source')) letterform = LetterForm(request.GET) searchform = OneWordForm(request.GET) if searchform.is_valid() and searchform.cleaned_data['term'] != '': words = words.filter( source__icontains=searchform.cleaned_data['term'] ) search = searchform.cleaned_data['term'] else: search = '' if letterform.is_valid() and letterform.cleaned_data['letter'] != '': words = words.filter( source__istartswith=letterform.cleaned_data['letter'] ) letter = letterform.cleaned_data['letter'] else: letter = '' words = get_paginator(request, words) last_changes = Change.objects.last_changes(request.user).filter( dictionary__project=prj, dictionary__language=lang )[:10] return render( request, 'dictionary.html', { 'title': dict_title(prj, lang), 'project': prj, 'language': lang, 'page_obj': words, 'form': form, 'query_string': urlencode({ 'term': search, 'letter': letter }), 'uploadform': uploadform, 'letterform': letterform, 'searchform': searchform, 'letter': letter, 'last_changes': last_changes, 'last_changes_url': urlencode({ 'project': prj.slug, 'lang': lang.code, 'glossary': 1 }), } )
def widgets(request, project): obj = get_project(request, project) # Parse possible language selection form = EngageForm(request.user, obj, request.GET) lang = None component = None if form.is_valid(): if form.cleaned_data["lang"]: lang = Language.objects.get(code=form.cleaned_data["lang"]).code if form.cleaned_data["component"]: component = Component.objects.get( slug=form.cleaned_data["component"], project=obj ).slug kwargs = {"project": obj.slug} if lang is not None: kwargs["lang"] = lang engage_url = get_site_url(reverse("engage", kwargs=kwargs)) engage_url_track = "{0}?utm_source=widget".format(engage_url) engage_link = mark_safe( '<a href="{0}" id="engage-link">{0}</a>'.format(escape(engage_url)) ) widget_base_url = get_site_url(reverse("widgets", kwargs={"project": obj.slug})) widget_list = [] for widget_name in sorted(WIDGETS, key=widgets_sorter): widget_class = WIDGETS[widget_name] if not widget_class.show: continue color_list = [] for color in widget_class.colors: kwargs = { "project": obj.slug, "widget": widget_name, "color": color, "extension": widget_class.extension, } if lang is not None: kwargs["lang"] = lang if component is not None: kwargs["component"] = component color_url = reverse("widget-image", kwargs=kwargs) color_list.append({"name": color, "url": get_site_url(color_url)}) widget_list.append( {"name": widget_name, "colors": color_list, "verbose": widget_class.verbose} ) return render( request, "widgets.html", { "engage_url": engage_url, "engage_link": engage_link, "engage_url_track": engage_url_track, "widget_list": widget_list, "widget_base_url": widget_base_url, "object": obj, "project": obj, "image_src": widget_list[0]["colors"][0]["url"], "form": form, }, )
def reset_project(request, project): obj = get_project(request, project) return perform_reset(request, obj)
def show_project(request, project): obj = get_project(request, project) obj.stats.ensure_basic() user = request.user last_changes = Change.objects.prefetch().order().filter(project=obj)[:10] last_announcements = (Change.objects.prefetch().order().filter( project=obj, action=Change.ACTION_ANNOUNCEMENT)[:10]) language_stats = obj.stats.get_language_stats() # Show ghost translations for user languages component = None for component in obj.component_set.filter_access(user).all(): if component.can_add_new_language(user): break if component: add_ghost_translations(component, user, language_stats, GhostProjectLanguageStats) language_stats = sort_unicode( language_stats, lambda x: "{}-{}".format(user.profile.get_language_order(x.language), x .language), ) all_components = obj.component_set.filter_access(user).prefetch().order() components = prefetch_tasks(prefetch_stats(all_components)) return render( request, "project.html", { "allow_index": True, "object": obj, "project": obj, "last_changes": last_changes, "last_announcements": last_announcements, "reports_form": ReportsForm(), "last_changes_url": urlencode({"project": obj.slug}), "language_stats": [stat.obj or stat for stat in language_stats], "search_form": SearchForm(request.user), "announcement_form": optional_form(AnnouncementForm, user, "project.edit", obj), "delete_form": optional_form( ProjectDeleteForm, user, "project.edit", obj, obj=obj), "rename_form": optional_form( ProjectRenameForm, user, "project.edit", obj, request=request, instance=obj, ), "replace_form": optional_form(ReplaceForm, user, "unit.edit", obj), "bulk_state_form": optional_form( BulkEditForm, user, "translation.auto", obj, user=user, obj=obj, project=obj, auto_id="id_bulk_%s", ), "components": components, "licenses": obj.component_set.exclude(license="").order_by("license"), }, )
def show_project(request, project): obj = get_project(request, project) user = request.user dict_langs = Language.objects.filter(dictionary__project=obj).annotate( Count('dictionary')).order() last_changes = Change.objects.prefetch().order().filter(project=obj)[:10] language_stats = sort_unicode(obj.stats.get_language_stats(), lambda x: force_text(x.language.name)) # Paginate components of project. all_components = obj.component_set.prefetch().order() components = prefetch_stats(get_paginator(request, all_components)) return render( request, 'project.html', { 'allow_index': True, 'object': obj, 'project': obj, 'dicts': dict_langs, 'last_changes': last_changes, 'last_changes_url': urlencode({'project': obj.slug}), 'language_stats': language_stats, 'search_form': SearchForm(), 'whiteboard_form': optional_form(WhiteboardForm, user, 'project.edit', obj), 'delete_form': optional_form(DeleteForm, user, 'project.edit', obj, obj=obj), 'rename_form': optional_form(ProjectRenameForm, user, 'project.edit', obj, request=request, instance=obj), 'replace_form': optional_form(ReplaceForm, user, 'unit.edit', obj), 'bulk_state_form': optional_form(BulkStateForm, user, 'translation.auto', obj, user=user, obj=obj), 'components': components, 'licenses': ', '.join( sorted( all_components.exclude(license='').values_list( 'license', flat=True))), })
def show_project(request, project): obj = get_project(request, project) user = request.user dict_langs = Language.objects.filter(dictionary__project=obj).annotate( Count('dictionary')) last_changes = Change.objects.prefetch().filter(project=obj)[:10] language_stats = sort_unicode(obj.stats.get_language_stats(), lambda x: force_text(x.language.name)) # Paginate components of project. all_components = obj.component_set.select_related() components = prefetch_stats(get_paginator(request, all_components)) return render( request, 'project.html', { 'allow_index': True, 'object': obj, 'project': obj, 'dicts': dict_langs, 'last_changes': last_changes, 'last_changes_url': urlencode({'project': obj.slug}), 'language_stats': language_stats, 'language_count': Language.objects.filter( translation__component__project=obj).distinct().count(), 'search_form': SearchForm(), 'delete_form': optional_form(DeleteForm, user, 'project.edit', obj, obj=obj), 'rename_form': optional_form(ProjectRenameForm, user, 'project.edit', obj, request=request, instance=obj), # ProjectRenameForm, ComponentRenameForm, ComponentMoveForm, 'replace_form': optional_form(ReplaceForm, user, 'unit.edit', obj), 'mass_state_form': optional_form(BulkStateForm, user, 'translation.auto', obj, user=user, obj=obj), 'components': components, 'licenses': ', '.join( sorted(set([x.license for x in all_components if x.license]))), })
def show_check_project(request, name, project): """Show checks failing in a project.""" prj = get_project(request, project) try: check = CHECKS[name] except KeyError: raise Http404('No check matches the given query.') ignore = ('ignored' in request.GET) url_params = {} allchecks = acl_checks(request.user).filter( check=name, project=prj, ignore=ignore, ) if ignore: url_params['ignored'] = 'true' if request.GET.get('language'): allchecks = allchecks.filter(language__code=request.GET['language']) url_params['language'] = request.GET['language'] units = Unit.objects.none() if check.target: langs = allchecks.values_list('language', flat=True).distinct() for lang in langs: checks = allchecks.filter( language=lang, ).values_list('content_hash', flat=True) res = Unit.objects.filter( content_hash__in=checks, translation__language=lang, translation__component__project=prj, ).values( 'translation__component__slug', 'translation__component__project__slug' ).annotate(count=Count('id')) units |= res if check.source: checks = allchecks.filter( language=None, ).values_list( 'content_hash', flat=True ) for component in prj.component_set.all(): try: lang_id = component.translation_set.values_list( 'language_id', flat=True )[0] except IndexError: continue res = Unit.objects.filter( content_hash__in=checks, translation__language_id=lang_id, translation__component=component ).values( 'translation__component__slug', 'translation__component__project__slug' ).annotate(count=Count('id')) units |= res counts = {} for unit in units: key = '/'.join(( unit['translation__component__project__slug'], unit['translation__component__slug'] )) if key in counts: counts[key] += unit['count'] else: counts[key] = unit['count'] units = [ { 'translation__component__slug': item.split('/')[1], 'translation__component__project__slug': item.split('/')[0], 'count': counts[item] } for item in counts ] return render( request, 'check_project.html', { 'checks': units, 'title': '{0}/{1}'.format(force_text(prj), check.name), 'check': check, 'project': prj, 'url_params': encode_optional(url_params), } )
def widgets(request, project): obj = get_project(request, project) # Parse possible language selection form = EngageForm(obj, request.GET) lang = None component = None if form.is_valid(): if form.cleaned_data['lang']: lang = Language.objects.get(code=form.cleaned_data['lang']).code if form.cleaned_data['component']: component = Component.objects.get( slug=form.cleaned_data['component'], project=obj).slug kwargs = {'project': obj.slug} if lang is not None: kwargs['lang'] = lang engage_url = get_site_url(reverse('engage', kwargs=kwargs)) engage_url_track = '{0}?utm_source=widget'.format(engage_url) engage_link = mark_safe('<a href="{0}" id="engage-link">{0}</a>'.format( escape(engage_url))) widget_base_url = get_site_url( reverse('widgets', kwargs={'project': obj.slug})) widget_list = [] for widget_name in sorted(WIDGETS, key=widgets_sorter): widget_class = WIDGETS[widget_name] if not widget_class.show: continue color_list = [] for color in widget_class.colors: kwargs = { 'project': obj.slug, 'widget': widget_name, 'color': color, 'extension': widget_class.extension, } if lang is not None: kwargs['lang'] = lang if component is not None: kwargs['component'] = component color_url = reverse('widget-image', kwargs=kwargs) color_list.append({ 'name': color, 'url': get_site_url(color_url), }) widget_list.append({ 'name': widget_name, 'colors': color_list, 'verbose': widget_class.verbose, }) return render( request, 'widgets.html', { 'engage_url': engage_url, 'engage_link': engage_link, 'engage_url_track': engage_url_track, 'widget_list': widget_list, 'widget_base_url': widget_base_url, 'object': obj, 'project': obj, 'image_src': widget_list[0]['colors'][0]['url'], 'form': form, })
def get_objects(request, kwargs): if 'project' in kwargs: return {'project': get_project(request, kwargs['project'])} return {'user': request.user}
def get_counts(request, project=None, component=None): """View for work counts""" if project is None: obj = None kwargs = {} elif component is None: obj = get_project(request, project) kwargs = {'project': obj} else: obj = get_component(request, project, component) kwargs = {'component': obj} if not request.user.has_perm('reports.view', obj): raise PermissionDenied() form = ReportsForm(request.POST) if not form.is_valid(): show_form_errors(request, form) return redirect_param(obj or 'home', '#reports') data = generate_counts(form.cleaned_data['start_date'], form.cleaned_data['end_date'], **kwargs) if form.cleaned_data['style'] == 'json': return JsonResponse(data=data, safe=False) headers = ( 'Name', 'Email', 'Count total', 'Source words total', 'Source chars total', 'Target words total', 'Target chars total', 'Count new', 'Source words new', 'Source chars new', 'Target words new', 'Target chars new', 'Count approved', 'Source words approved', 'Source chars approved', 'Target words approved', 'Target chars approved', 'Count edited', 'Source words edited', 'Source chars edited', 'Target words edited', 'Target chars edited', ) if form.cleaned_data['style'] == 'html': start = HTML_HEADING.format(''.join( ['<th>{0}</th>'.format(h) for h in headers])) row_start = '<tr>' cell_name = cell_count = '<td>{0}</td>\n' row_end = '</tr>' mime = 'text/html' end = '</table>' else: start = '{0}\n{1} {2}\n{0}'.format( RST_HEADING, ' '.join(['{0:40}'.format(h) for h in headers[:2]]), ' '.join(['{0:24}'.format(h) for h in headers[2:]]), ) row_start = '' cell_name = '{0:40} ' cell_count = '{0:24} ' row_end = '' mime = 'text/plain' end = RST_HEADING result = [] result.append(start) for item in data: if row_start: result.append(row_start) result.append(''.join(( cell_name.format(item['name']), cell_name.format(item['email']), cell_count.format(item['count']), cell_count.format(item['words']), cell_count.format(item['chars']), cell_count.format(item['t_words']), cell_count.format(item['t_chars']), cell_count.format(item['count_new']), cell_count.format(item['words_new']), cell_count.format(item['chars_new']), cell_count.format(item['t_words_new']), cell_count.format(item['t_chars_new']), cell_count.format(item['count_approve']), cell_count.format(item['words_approve']), cell_count.format(item['chars_approve']), cell_count.format(item['t_words_approve']), cell_count.format(item['t_chars_approve']), cell_count.format(item['count_edit']), cell_count.format(item['words_edit']), cell_count.format(item['chars_edit']), cell_count.format(item['t_words_edit']), cell_count.format(item['t_chars_edit']), ))) if row_end: result.append(row_end) result.append(end) return HttpResponse( '\n'.join(result), content_type='{0}; charset=utf-8'.format(mime), )