def update_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) if obj.do_update(request, method=request.GET.get('method', None)): messages.success(request, _('All repositories were updated.')) return redirect(obj)
def reset_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) if obj.do_reset(request): messages.success(request, _('All repositories have been reset.')) return redirect(obj)
def show_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) last_changes = Change.objects.prefetch().filter( translation__subproject=obj )[:10] new_lang_form = NewLanguageForm() return render( request, 'subproject.html', { 'object': obj, 'project': obj.project, 'translations': obj.translation_set.enabled(), 'show_language': 1, 'last_changes': last_changes, 'last_changes_rss': reverse( 'rss-subproject', kwargs={'subproject': obj.slug, 'project': obj.project.slug} ), 'last_changes_url': urlencode( {'subproject': obj.slug, 'project': obj.project.slug} ), 'new_lang_form': new_lang_form, } )
def push_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) if obj.do_push(request): messages.success(request, _('All repositories were pushed.')) return redirect(obj)
def show_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) last_changes = Change.objects.prefetch().filter( translation__subproject=obj )[:10] new_lang_form = get_new_language_form(request, obj)(obj) return render( request, 'subproject.html', { 'object': obj, 'project': obj.project, 'translations': sort_objects(obj.translation_set.enabled()), 'show_language': 1, 'reports_form': ReportsForm(), 'last_changes': last_changes, 'last_changes_url': urlencode( {'subproject': obj.slug, 'project': obj.project.slug} ), 'new_lang_form': new_lang_form, } )
def new_language(request, project, subproject): obj = get_subproject(request, project, subproject) form = NewLanguageForm(request.POST) if form.is_valid(): language = Language.objects.get(code=form.cleaned_data['lang']) same_lang = obj.translation_set.filter(language=language) if same_lang.exists(): messages.error( request, _('Chosen translation already exists in this project!') ) elif obj.new_lang == 'contact': notify_new_language(obj, language, request.user) messages.success( request, _( "A request for a new translation has been " "sent to the project's maintainers." ) ) elif obj.new_lang == 'add': obj.add_new_language(language, request) else: messages.error( request, _('Failed to process new translation request!') ) return redirect( 'subproject', subproject=obj.slug, project=obj.project.slug )
def push_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) if obj.do_push(request): messages.info(request, _("All repositories were pushed.")) return redirect(obj)
def get_detail(request, project, subproject, checksum): """ Returns source translation detail in all languages. """ subproject = get_subproject(request, project, subproject) units = Unit.objects.filter(checksum=checksum, translation__subproject=subproject) try: source = units[0].source_info except IndexError: raise Http404("Non existing unit!") check_flags = [(CHECKS[x].ignore_string, CHECKS[x].name) for x in CHECKS] extra_flags = [(x, EXTRA_FLAGS[x]) for x in EXTRA_FLAGS] return render( request, "js/detail.html", { "units": units, "source": source, "project": subproject.project, "next": request.GET.get("next", ""), "priority_form": PriorityForm(initial={"priority": source.priority}), "check_flags_form": CheckFlagsForm(initial={"flags": source.check_flags}), "extra_flags": extra_flags, "check_flags": check_flags, }, )
def update_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) if obj.do_update(request): messages.info(request, _("All repositories were updated.")) return redirect(obj)
def reset_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) if obj.do_reset(request): messages.info(request, _("All repositories have been reset.")) return redirect(obj)
def git_export(request, project, subproject, path): """Git HTTP server view. Wrapper around git-http-backend to provide Git repositories export over HTTP. Performs permission checks and hands over execution to the wrapper. """ # Probably browser access if path == '': return redirect( 'subproject', project=project, subproject=subproject, permanent=False ) # HTTP authentication auth = request.META.get('HTTP_AUTHORIZATION', b'') if auth and not authenticate(request, auth): return response_authenticate() # Permissions obj = get_subproject(request, project, subproject) if not can_access_vcs(request.user, obj.project): raise PermissionDenied('No VCS permissions') return run_git_http(request, obj, path)
def new_language(request, project, subproject): obj = get_subproject(request, project, subproject) if not can_add_translation(request.user, obj.project): raise PermissionDenied() form = get_new_language_form(request, obj)(obj, request.POST) if form.is_valid(): langs = form.cleaned_data['lang'] if isinstance(langs, string_types): langs = [langs] for language in Language.objects.filter(code__in=langs): if obj.new_lang == 'contact': notify_new_language(obj, language, request.user) messages.success( request, _( "A request for a new translation has been " "sent to the project's maintainers." ) ) elif obj.new_lang == 'add': obj.add_new_language(language, request) else: messages.error( request, _('Invalid language chosen!') ) return redirect(obj)
def matrix(request, project, subproject): """Matrix view of all strings""" obj = get_subproject(request, project, subproject) show = False languages = None language_codes = None if 'lang' in request.GET: form = MatrixLanguageForm(obj, request.GET) show = form.is_valid() else: form = MatrixLanguageForm(obj) if show: languages = Language.objects.filter( code__in=form.cleaned_data['lang'] ) language_codes = ','.join(languages.values_list('code', flat=True)) return render( request, 'matrix.html', { 'object': obj, 'project': obj.project, 'languages': languages, 'language_codes': language_codes, 'languages_form': form, } )
def export_stats(request, project, subproject): """Export stats in JSON format.""" subprj = get_subproject(request, project, subproject) data = [ trans.get_stats() for trans in subprj.translation_set.all() ] return export_response( request, 'stats-{0}-{1}.csv'.format(subprj.project.slug, subprj.slug), ( 'name', 'code', 'total', 'translated', 'translated_percent', 'total_words', 'translated_words', 'failing', 'failing_percent', 'fuzzy', 'fuzzy_percent', 'url_translate', 'url', 'last_change', 'last_author', ), data )
def get_detail(request, project, subproject, checksum): ''' Returns source translation detail in all languages. ''' subproject = get_subproject(request, project, subproject) units = Unit.objects.filter( checksum=checksum, translation__subproject=subproject ) source = units[0].source_info check_flags = [ (CHECKS[x].ignore_string, CHECKS[x].name) for x in CHECKS ] extra_flags = [(x, EXTRA_FLAGS[x]) for x in EXTRA_FLAGS] return render( request, 'js/detail.html', { 'units': units, 'source': source, 'next': request.GET.get('next', ''), 'priority_form': PriorityForm( initial={'priority': source.priority} ), 'check_flags_form': CheckFlagsForm( initial={'flags': source.check_flags} ), 'extra_flags': extra_flags, 'check_flags': check_flags, } )
def reset_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) if not can_reset_translation(request.user, obj.project): raise PermissionDenied() return perform_reset(request, obj)
def commit_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) obj.commit_pending(request) messages.info(request, _("All pending translations were committed.")) return redirect(obj)
def unlock_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) obj.locked = False obj.save() messages.info(request, _("Subproject is now open for translation updates.")) return redirect(obj)
def update_subproject(request, project, subproject): """API hook for updating git repos.""" if not settings.ENABLE_HOOKS: return HttpResponseNotAllowed([]) obj = get_subproject(request, project, subproject, True) if not obj.project.enable_hooks: return HttpResponseNotAllowed([]) perform_update(obj) return hook_response()
def update_subproject(request, project, subproject): ''' API hook for updating git repos. ''' if not appsettings.ENABLE_HOOKS: return HttpResponseNotAllowed([]) obj = get_subproject(request, project, subproject, True) perform_update(obj) return HttpResponse('update triggered')
def git_status_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) return render( request, 'js/git-status.html', { 'object': obj, } )
def get_source(request, project, subproject): """ Returns first translation in subproject (this assumes all have same source strings). """ obj = get_subproject(request, project, subproject) try: return obj, obj.translation_set.all()[0] except (Translation.DoesNotExist, IndexError): raise Http404('No translation exists in this component.')
def lock_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) obj.commit_pending(request) obj.locked = True obj.save() messages.info(request, _("Subproject is now locked for translation updates!")) return redirect(obj)
def unlock_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) obj.do_unlock(request.user) messages.success( request, _('Component is now open for translation updates.') ) return redirect(obj)
def commit_subproject(request, project, subproject): ''' API hook for updating git repos. ''' if not appsettings.ENABLE_HOOKS: return HttpResponseNotAllowed([]) obj = get_subproject(request, project, subproject, True) if not obj.project.enable_hooks: return HttpResponseNotAllowed([]) obj.commit_pending(request) return hook_response('Commit performed')
def unlock_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) obj.locked = False obj.save() messages.success( request, _('Component is now open for translation updates.') ) return redirect(obj)
def review_source(request, project, subproject): """ Listing of source strings to review. """ obj = get_subproject(request, project, subproject) # Grab first translation in subproject # (this assumes all have same source strings) try: source = obj.translation_set.all()[0] except Translation.DoesNotExist: raise Http404('No translation exists in this component.') # Grab search type and page number rqtype = request.GET.get('type', 'all') limit = request.GET.get('limit', 50) page = request.GET.get('page', 1) checksum = request.GET.get('checksum', '') ignored = 'ignored' in request.GET expand = False # Filter units: if checksum: sources = source.unit_set.filter(checksum=checksum) expand = True else: sources = source.unit_set.filter_type(rqtype, source, ignored) paginator = Paginator(sources, limit) try: sources = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. sources = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. sources = paginator.page(paginator.num_pages) return render( request, 'source-review.html', { 'object': obj, 'source': source, 'page_obj': sources, 'rqtype': rqtype, 'ignored': ignored, 'expand': expand, 'title': _('Review source strings in %s') % obj.__unicode__(), } )
def lock_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) obj.commit_pending(request) obj.do_lock(request.user) messages.success( request, _('Component is now locked for translation updates!') ) return redirect(obj)
def export_stats(request, project, subproject): ''' Exports stats in JSON format. ''' subprj = get_subproject(request, project, subproject) try: indent = int(request.GET['indent']) except (ValueError, KeyError): indent = None jsonp = None if 'jsonp' in request.GET and request.GET['jsonp']: jsonp = request.GET['jsonp'] response = [] for trans in subprj.translation_set.all(): response.append({ 'code': trans.language.code, 'name': trans.language.name, 'total': trans.total, 'total_words': trans.total_words, 'last_change': trans.last_change, 'last_author': trans.get_last_author(), 'translated': trans.translated, 'translated_words': trans.translated_words, 'translated_percent': trans.get_translated_percent(), 'fuzzy': trans.fuzzy, 'fuzzy_percent': trans.get_fuzzy_percent(), 'failing': trans.failing_checks, 'failing_percent': trans.get_failing_checks_percent(), 'url': trans.get_share_url(), 'url_translate': get_site_url(trans.get_absolute_url()), }) json_data = json.dumps( response, default=json_dt_handler, indent=indent, ) if jsonp: return HttpResponse( '{0}({1})'.format( jsonp, json_data, ), content_type='application/javascript' ) return HttpResponse( json_data, content_type='application/json' )
def unlock_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) if not can_lock_subproject(request.user, obj.project): raise PermissionDenied() obj.do_unlock(request.user) messages.success( request, _('Component is now open for translation updates.') ) return redirect(obj)
def show_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) last_changes = Change.objects.for_component(obj)[:10] try: sample = obj.translation_set.all()[0] source_words = sample.total_words total_strings = sample.total except IndexError: source_words = 0 total_strings = 0 if can_translate(request.user, project=obj.project): replace_form = ReplaceForm() else: replace_form = None return render( request, 'subproject.html', { 'allow_index': True, 'object': obj, 'project': obj.project, 'translations': sort_objects(obj.translation_set.all()), 'show_language': 1, 'reports_form': ReportsForm(), 'last_changes': last_changes, 'last_changes_url': urlencode( {'subproject': obj.slug, 'project': obj.project.slug} ), 'unit_count': Unit.objects.filter( translation__subproject=obj ).count(), 'words_count': obj.get_total_words(), 'language_count': Language.objects.filter( translation__subproject=obj ).distinct().count(), 'strings_count': total_strings, 'source_words_count': source_words, 'replace_form': replace_form, 'search_form': SearchForm(), } )
def search_replace(request, project, subproject=None, lang=None): if subproject is None: obj = get_project(request, project) perms = {'project': obj} unit_set = Unit.objects.filter(translation__subproject__project=obj) elif lang is None: obj = get_subproject(request, project, subproject) perms = {'project': obj.project} unit_set = Unit.objects.filter(translation__subproject=obj) else: obj = get_translation(request, project, subproject, lang) perms = {'translation': obj} unit_set = obj.unit_set if not can_translate(request.user, **perms): raise PermissionDenied() form = ReplaceForm(request.POST) if not form.is_valid(): messages.error(request, _('Failed to process form!')) return redirect(obj) search_text = form.cleaned_data['search'] replacement = form.cleaned_data['replacement'] matching = unit_set.filter(target__contains=search_text) updated = matching.count() for unit in matching.iterator(): unit.target = unit.target.replace(search_text, replacement) unit.save_backend(request, change_action=Change.ACTION_REPLACE) import_message( request, updated, _('Search and replace completed, no strings were updated.'), ungettext( 'Search and replace completed, %d string was updated.', 'Search and replace completed, %d strings were updated.', updated ) ) return redirect(obj)
def git_status_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) if not can_see_repository_status(request.user, obj.project): raise PermissionDenied() return render( request, 'js/git-status.html', { 'object': obj, 'project': obj.project, 'changes': Change.objects.filter( action__in=Change.ACTIONS_REPOSITORY, subproject=obj, )[:10], 'statuses': [(None, obj.repository.status)], })
def review_source(request, project, subproject): ''' Listing of source strings to review. ''' obj = get_subproject(request, project, subproject) # Grab first translation in subproject # (this assumes all have same source strings) try: source = obj.translation_set.all()[0] except Translation.DoesNotExist: raise Http404('No translation exists in this subproject.') # Grab search type and page number rqtype = request.GET.get('type', 'all') limit = request.GET.get('limit', 50) page = request.GET.get('page', 1) ignored = 'ignored' in request.GET # Fiter units sources = source.unit_set.filter_type(rqtype, source, ignored) paginator = Paginator(sources, limit) try: sources = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. sources = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. sources = paginator.page(paginator.num_pages) return render_to_response( 'source-review.html', RequestContext( request, { 'object': obj, 'source': source, 'sources': sources, 'rqtype': rqtype, 'title': _('Review source strings in %s') % obj.__unicode__(), }))
def show_source(request, project, subproject): """ Show source strings summary and checks. """ obj = get_subproject(request, project, subproject) # Grab first translation in subproject # (this assumes all have same source strings) try: source = obj.translation_set.all()[0] except Translation.DoesNotExist: raise Http404('No translation exists in this subproject.') return render( request, 'source.html', { 'object': obj, 'source': source, 'title': _('Source strings in %s') % obj.__unicode__(), })
def show_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) last_changes = Change.objects.for_component(obj)[:10] if can_translate(request.user, project=obj.project): replace_form = ReplaceForm() mass_state_form = MassStateForm(request.user, obj) else: replace_form = None mass_state_form = None return render( request, 'subproject.html', { 'allow_index': True, 'object': obj, 'project': obj.project, 'translations': sort_objects(prefetch_stats(obj.translation_set.all())), 'show_language': 1, 'reports_form': ReportsForm(), 'last_changes': last_changes, 'last_changes_url': urlencode({ 'subproject': obj.slug, 'project': obj.project.slug }), 'language_count': Language.objects.filter( translation__subproject=obj).distinct().count(), 'replace_form': replace_form, 'mass_state_form': mass_state_form, 'search_form': SearchForm(), })
def export_stats(request, project, subproject): ''' Exports stats in JSON format. ''' subprj = get_subproject(request, project, subproject) jsonp = None if 'jsonp' in request.GET and request.GET['jsonp']: jsonp = request.GET['jsonp'] response = [] for trans in subprj.translation_set.all(): response.append(trans.get_stats()) if jsonp: return HttpResponse('{0}({1})'.format( jsonp, json.dumps( response, cls=DjangoJSONEncoder, )), content_type='application/javascript') return JsonResponse(data=response, safe=False)
def new_language(request, project, subproject): obj = get_subproject(request, project, subproject) form_class = get_new_language_form(request, obj) if request.method == 'POST': form = form_class(obj, request.POST) if form.is_valid(): langs = form.cleaned_data['lang'] for language in Language.objects.filter(code__in=langs): if obj.new_lang == 'contact': notify_new_language(obj, language, request.user) messages.success( request, _( "A request for a new translation has been " "sent to the project's maintainers." ) ) elif obj.new_lang == 'add': obj.add_new_language(language, request) return redirect(obj) else: messages.error( request, _('Please fix errors in the form.') ) else: form = form_class(obj) return render( request, 'new-language.html', { 'object': obj, 'project': obj.project, 'form': form, } )
def get_detail(request, project, subproject, checksum): """Return source translation detail in all languages.""" subproject = get_subproject(request, project, subproject) try: units = Unit.objects.filter( id_hash=checksum_to_hash(checksum), translation__subproject=subproject ) except ValueError: raise Http404('Non existing unit!') try: source = units[0].source_info except IndexError: raise Http404('Non existing unit!') check_flags = [ (CHECKS[x].ignore_string, CHECKS[x].name) for x in CHECKS ] extra_flags = [(x, EXTRA_FLAGS[x]) for x in EXTRA_FLAGS] return render( request, 'js/detail.html', { 'units': units, 'source': source, 'project': subproject.project, 'next': request.GET.get('next', ''), 'priority_form': PriorityForm( initial={'priority': source.priority} ), 'check_flags_form': CheckFlagsForm( initial={'flags': source.check_flags} ), 'screenshot_form': ScreenshotForm(), 'extra_flags': extra_flags, 'check_flags': check_flags, } )
def matrix_load(request, project, subproject): """Backend for matrix view of all strings""" obj = get_subproject(request, project, subproject) try: offset = int(request.GET.get('offset')) except ValueError: return HttpResponseServerError('Missing offset') language_codes = request.GET.get('lang') if not language_codes or offset is None: return HttpResponseServerError('Missing lang') # Can not use filter to keep ordering translations = [ get_object_or_404(obj.translation_set, language__code=lang) for lang in language_codes.split(',') ] data = [] for unit in translations[0].unit_set.all()[offset:offset + 20]: units = [] for translation in translations: try: units.append(translation.unit_set.get(id_hash=unit.id_hash)) except Unit.DoesNotExist: units.append(None) data.append((unit, units)) return render( request, 'matrix-table.html', { 'object': obj, 'data': data, 'last': translations[0].unit_set.count() <= offset + 20 } )
def new_language(request, project, subproject): obj = get_subproject(request, project, subproject) form = get_new_language_form(request, obj)(obj, request.POST) if form.is_valid(): langs = form.cleaned_data['lang'] if isinstance(langs, string_types): langs = [langs] for language in Language.objects.filter(code__in=langs): if obj.new_lang == 'contact': notify_new_language(obj, language, request.user) messages.success( request, _("A request for a new translation has been " "sent to the project's maintainers.")) elif obj.new_lang == 'add': obj.add_new_language(language, request) else: messages.error(request, _('Invalid language chosen!')) return redirect(obj)
def new_language(request, project, subproject): obj = get_subproject(request, project, subproject) form = NewLanguageForm(request.POST) if form.is_valid(): language = Language.objects.get(code=form.cleaned_data['lang']) same_lang = obj.translation_set.filter(language=language) if same_lang.exists(): messages.error( request, _('Chosen translation already exists in this project!') ) elif obj.new_lang == 'contact': notify_new_language(obj, language, request.user) messages.success( request, _( "A request for a new translation has been " "sent to the project's maintainers." ) ) elif obj.new_lang == 'add': obj.add_new_language(language, request) else: messages.error( request, _( 'Please choose the language into which ' 'you would like to translate.' ) ) return redirect( 'subproject', subproject=obj.slug, project=obj.project.slug )
def export_stats(request, project, subproject): ''' Exports stats in JSON format. ''' subprj = get_subproject(request, project, subproject) try: indent = int(request.GET['indent']) except: indent = None response = [] for trans in subprj.translation_set.all(): response.append({ 'code': trans.language.code, 'name': trans.language.name, 'total': trans.total, 'total_words': trans.total_words, 'last_change': trans.get_last_change(), 'last_author': trans.get_last_author(), 'translated': trans.translated, 'translated_words': trans.translated_words, 'translated_percent': trans.get_translated_percent(), 'fuzzy': trans.fuzzy, 'fuzzy_percent': trans.get_fuzzy_percent(), 'failing': trans.failing_checks, 'failing_percent': trans.get_failing_checks_percent(), 'url': trans.get_share_url(), 'url_translate': get_site_url(trans.get_absolute_url()), }) return HttpResponse( json.dumps( response, default=json_dt_handler, indent=indent, ), content_type='application/json' )
def export_stats(request, project, subproject): ''' Exports stats in JSON format. ''' subprj = get_subproject(request, project, subproject) jsonp = None if 'jsonp' in request.GET and request.GET['jsonp']: jsonp = request.GET['jsonp'] response = [] for trans in subprj.translation_set.all(): response.append({ 'code': trans.language.code, 'name': trans.language.name, 'total': trans.total, 'total_words': trans.total_words, 'last_change': trans.last_change, 'last_author': trans.get_last_author(), 'translated': trans.translated, 'translated_words': trans.translated_words, 'translated_percent': trans.get_translated_percent(), 'fuzzy': trans.fuzzy, 'fuzzy_percent': trans.get_fuzzy_percent(), 'failing': trans.failing_checks, 'failing_percent': trans.get_failing_checks_percent(), 'url': trans.get_share_url(), 'url_translate': trans.get_absolute_url(), }) if jsonp: return HttpResponse('{0}({1})'.format( jsonp, json.dumps( response, cls=DjangoJSONEncoder, )), content_type='application/javascript') return JsonResponse(data=response, safe=False)
def show_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) last_changes = Change.objects.prefetch().filter( translation__subproject=obj )[:10] new_lang_form = NewLanguageForm() return render( request, 'subproject.html', { 'object': obj, 'project': obj.project, 'translations': obj.translation_set.enabled(), 'show_language': 1, 'last_changes': last_changes, 'last_changes_url': urlencode( {'subproject': obj.slug, 'project': obj.project.slug} ), 'new_lang_form': new_lang_form, } )
def export_stats(request, project, subproject): """Export stats in JSON format.""" subprj = get_subproject(request, project, subproject) data = [trans.get_stats() for trans in subprj.translation_set.all()] return export_response( request, 'stats-{0}-{1}.csv'.format(subprj.project.slug, subprj.slug), ( 'name', 'code', 'total', 'translated', 'translated_percent', 'total_words', 'translated_words', 'failing', 'failing_percent', 'fuzzy', 'fuzzy_percent', 'url_translate', 'url', 'last_change', 'last_author', ), data)
def get_object(self, request, project, subproject): return get_subproject(request, project, subproject)
def commit_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) return perform_commit(request, obj)
def reset_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) return perform_reset(request, obj)
def push_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) return perform_push(request, obj)
def update_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) return perform_update(request, obj)
def get_credits(request, project, subproject): """View for credits""" obj = get_subproject(request, project, subproject) if not can_view_reports(request.user, obj.project): raise PermissionDenied() form = ReportsForm(request.POST) if not form.is_valid(): return redirect(obj) data = generate_credits( obj, form.cleaned_data['start_date'], form.cleaned_data['end_date'], ) if form.cleaned_data['style'] == 'json': return JsonResponse(data=data, safe=False) if form.cleaned_data['style'] == 'html': start = '<table>' row_start = '<tr>' language_format = '<th>{0}</th>' translator_start = '<td><ul>' translator_format = '<li><a href="mailto:{0}">{1}</a></li>' translator_end = '</ul></td>' row_end = '</tr>' mime = 'text/html' end = '</table>' else: start = '' row_start = '' language_format = '* {0}\n' translator_start = '' translator_format = ' * {1} <{0}>' translator_end = '' row_end = '' mime = 'text/plain' end = '' result = [] result.append(start) for language in data: name, translators = language.popitem() result.append(row_start) result.append(language_format.format(name)) result.append(''.join(( translator_start, '\n'.join([translator_format.format(*t) for t in translators]), translator_end, ))) result.append(row_end) result.append(end) return HttpResponse( '\n'.join(result), content_type='{0}; charset=utf-8'.format(mime), )
def git_export(request, project, subproject, path): """ Wrapper around git-http-backend to provide Git repositories export over HTTP. """ # Probably browser access if path == '': return redirect('subproject', project=project, subproject=subproject, permanent=False) # HTTP authentication auth = request.META.get('HTTP_AUTHORIZATION', b'') if auth: if not authenticate(request, auth): return response_authenticate() # Permissions try: obj = get_subproject(request, project, subproject) except PermissionDenied: if not request.user.is_authenticated(): return response_authenticate() raise # Invoke Git HTTP backend process = subprocess.Popen( ['/usr/lib/git-core/git-http-backend'], env={ 'REQUEST_METHOD': request.method, 'PATH_TRANSLATED': os.path.join(obj.get_path(), path), 'GIT_HTTP_EXPORT_ALL': '1', 'CONTENT_TYPE': request.META.get('CONTENT_TYPE', ''), 'QUERY_STRING': request.META.get('QUERY_STRING', ''), }, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) output, output_err = process.communicate(request.body) retcode = process.poll() # Log error if output_err: obj.log_error('git: {0}'.format(output_err.decode('utf-8'))) # Handle failure if retcode: return HttpResponseServerError(output_err) headers, content = output.split(b'\r\n\r\n', 1) message = message_from_string(headers.decode('utf-8')) # Handle status in response if 'status' in message: return HttpResponse(status=int(message['status'].split()[0])) # Send content response = HttpResponse(content_type=message['content-type']) response.write(content) return response
def get_component(self, kwargs): return get_subproject( self.request, kwargs['project'], kwargs['subproject'] )
def search(request, project=None, subproject=None, lang=None): """Perform site-wide search on units.""" search_form = SiteSearchForm(request.GET) context = { 'search_form': search_form, } search_kwargs = {} if subproject: obj = get_subproject(request, project, subproject) context['subproject'] = obj context['project'] = obj.project search_kwargs = {'subproject': obj} elif project: obj = get_project(request, project) context['project'] = obj search_kwargs = {'project': obj} else: obj = None if lang: s_language = get_object_or_404(Language, code=lang) context['language'] = s_language search_kwargs = {'language': s_language} if search_form.is_valid(): # Filter results by ACL if subproject: units = Unit.objects.filter(translation__subproject=obj) elif project: units = Unit.objects.filter(translation__subproject__project=obj) else: projects = Project.objects.get_acl_ids(request.user) units = Unit.objects.filter( translation__subproject__project_id__in=projects ) units = units.search( search_form.cleaned_data, **search_kwargs ) if lang: units = units.filter( translation__language=context['language'] ) page, limit = get_page_limit(request, 50) paginator = Paginator(units, limit) try: units = paginator.page(page) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of # results. units = paginator.page(paginator.num_pages) context['page_obj'] = units context['title'] = _('Search for %s') % ( search_form.cleaned_data['q'] ) context['query_string'] = search_form.urlencode() context['search_query'] = search_form.cleaned_data['q'] else: messages.error(request, _('Invalid search query!')) return render( request, 'search.html', context )
def search_replace(request, project, subproject=None, lang=None): context = {} if subproject is None: obj = get_project(request, project) perms = {'project': obj} unit_set = Unit.objects.filter(translation__subproject__project=obj) context['project'] = obj elif lang is None: obj = get_subproject(request, project, subproject) perms = {'project': obj.project} unit_set = Unit.objects.filter(translation__subproject=obj) context['subproject'] = obj context['project'] = obj.project else: obj = get_translation(request, project, subproject, lang) perms = {'translation': obj} unit_set = obj.unit_set context['translation'] = obj context['subproject'] = obj.subproject context['project'] = obj.subproject.project if not can_translate(request.user, **perms): raise PermissionDenied() form = ReplaceForm(request.POST) if not form.is_valid(): messages.error(request, _('Failed to process form!')) return redirect(obj) search_text = form.cleaned_data['search'] replacement = form.cleaned_data['replacement'] matching = unit_set.filter(target__contains=search_text) if matching.count() == 0: updated = 0 else: confirm = ReplaceConfirmForm(matching, request.POST) if not confirm.is_valid(): for unit in matching: unit.replacement = unit.target.replace(search_text, replacement) context.update({ 'matching': matching, 'search_query': search_text, 'replacement': replacement, 'form': form, 'confirm': ReplaceConfirmForm(matching), }) return render(request, 'replace.html', context) matching = confirm.cleaned_data['units'] updated = matching.count() for unit in matching.iterator(): if not can_translate(request.user, unit): continue unit.target = unit.target.replace(search_text, replacement) unit.save_backend(request, change_action=Change.ACTION_REPLACE) import_message( request, updated, _('Search and replace completed, no strings were updated.'), ungettext('Search and replace completed, %d string was updated.', 'Search and replace completed, %d strings were updated.', updated)) return redirect(obj)
def show_subproject(request, project, subproject): obj = get_subproject(request, project, subproject) last_changes = Change.objects.for_component(obj)[:10] if (request.method == 'POST' and can_edit_subproject(request.user, obj.project)): settings_form = SubprojectSettingsForm(request.POST, instance=obj) if settings_form.is_valid(): settings_form.save() messages.success(request, _('Settings saved')) return redirect(obj) else: messages.error( request, _('Invalid settings, please check the form for errors!')) else: settings_form = SubprojectSettingsForm(instance=obj) try: sample = obj.translation_set.all()[0] source_words = sample.total_words total_strings = sample.total except IndexError: source_words = 0 total_strings = 0 if can_translate(request.user, project=obj.project): replace_form = ReplaceForm() else: replace_form = None return render( request, 'subproject.html', { 'object': obj, 'project': obj.project, 'translations': sort_objects(obj.translation_set.enabled()), 'show_language': 1, 'reports_form': ReportsForm(), 'last_changes': last_changes, 'last_changes_url': urlencode({ 'subproject': obj.slug, 'project': obj.project.slug }), 'settings_form': settings_form, 'unit_count': Unit.objects.filter(translation__subproject=obj).count(), 'words_count': obj.get_total_words(), 'language_count': Language.objects.filter( translation__subproject=obj).distinct().count(), 'strings_count': total_strings, 'source_words_count': source_words, 'replace_form': replace_form, 'search_form': SearchForm(), })
def export_stats(request, project, subproject): ''' Exports stats in JSON format. ''' subprj = get_subproject(request, project, subproject) try: indent = int(request.GET['indent']) except (ValueError, KeyError): indent = None jsonp = None if 'jsonp' in request.GET and request.GET['jsonp']: jsonp = request.GET['jsonp'] response = [] for trans in subprj.translation_set.all(): response.append({ 'code': trans.language.code, 'name': trans.language.name, 'total': trans.total, 'total_words': trans.total_words, 'last_change': trans.last_change, 'last_author': trans.get_last_author(), 'translated': trans.translated, 'translated_words': trans.translated_words, 'translated_percent': trans.get_translated_percent(), 'fuzzy': trans.fuzzy, 'fuzzy_percent': trans.get_fuzzy_percent(), 'failing': trans.failing_checks, 'failing_percent': trans.get_failing_checks_percent(), 'url': trans.get_share_url(), 'url_translate': get_site_url(trans.get_absolute_url()), }) json_data = json.dumps( response, default=json_dt_handler, indent=indent, ) if jsonp: return HttpResponse('{0}({1})'.format( jsonp, json_data, ), content_type='application/javascript') return HttpResponse(json_data, content_type='application/json')
def get_counts(request, project, subproject): """View for work counts""" obj = get_subproject(request, project, subproject) if not can_view_reports(request.user, obj.project): raise PermissionDenied() form = ReportsForm(request.POST) if not form.is_valid(): return redirect(obj) data = generate_counts( obj, form.cleaned_data['start_date'], form.cleaned_data['end_date'], ) if form.cleaned_data['style'] == 'json': return JsonResponse(data=data, safe=False) if form.cleaned_data['style'] == 'html': start = ('<table>\n<tr><th>Name</th><th>Email</th>' '<th>Words</th><th>Count</th></tr>') row_start = '<tr>' cell_name = cell_email = cell_words = cell_count = '<td>{0}</td>\n' row_end = '</tr>' mime = 'text/html' end = '</table>' else: heading = ' '.join([ '=' * 40, '=' * 40, '=' * 10, '=' * 10, ]) start = '{0}\n{1:40} {2:40} {3:10} {4:10}\n{0}'.format( heading, 'Name', 'Email', 'Words', 'Count') row_start = '' cell_name = cell_email = '{0:40} ' cell_words = cell_count = '{0:10} ' row_end = '' mime = 'text/plain' end = heading result = [] result.append(start) for item in data: if row_start: result.append(row_start) result.append('{0}{1}{2}{3}'.format( cell_name.format(item['name']), cell_email.format(item['email']), cell_words.format(item['words']), cell_count.format(item['count']), )) if row_end: result.append(row_end) result.append(end) return HttpResponse( '\n'.join(result), content_type='{0}; charset=utf-8'.format(mime), )
def show_check_subproject(request, name, project, subproject): """Show checks failing in a subproject.""" subprj = get_subproject(request, project, subproject) try: check = CHECKS[name] except KeyError: raise Http404('No check matches the given query.') ignore = ('ignored' in request.GET) url_params = {} allchecks = acl_checks(request.user).filter( check=name, project=subprj.project, ignore=ignore, ) if ignore: url_params['ignored'] = 'true' if check.source: url_params['type'] = check.url_id return redirect_param( 'review_source', encode_optional(url_params), project=subprj.project.slug, subproject=subprj.slug, ) if request.GET.get('language') and '/' not in request.GET['language']: url_params['type'] = check.url_id return redirect_param( 'translate', encode_optional(url_params), project=subprj.project.slug, subproject=subprj.slug, lang=request.GET['language'], ) units = Unit.objects.none() if check.target: langs = allchecks.values_list('language', flat=True).distinct() for lang in langs: checks = allchecks.filter(language=lang, ).values_list( 'content_hash', flat=True) res = Unit.objects.filter( translation__subproject=subprj, content_hash__in=checks, translation__language=lang, translated=True).values( 'translation__language__code').annotate(count=Count('id')) units |= res counts = {} for unit in units: key = unit['translation__language__code'] if key in counts: counts[key] += unit['count'] else: counts[key] = unit['count'] units = [{ 'translation__language__code': item, 'count': counts[item] } for item in counts] return render( request, 'check_subproject.html', { 'checks': units, 'title': '{0}/{1}'.format(force_text(subprj), check.name), 'check': check, 'subproject': subprj, 'url_params': encode_optional(url_params), })