def test_acl_project(self): """Basic sanity check for project-level actions. When a Group ACL is set for a project, and only for a project, it should apply to project-level actions on that project. """ acl = GroupACL.objects.get(project=self.project) acl.groups.add(self.group) permission = Permission.objects.get(codename='author_translation', content_type__app_label='trans') acl.permissions.add(permission) self.group.permissions.add(permission) self.assertFalse(can_author_translation(self.user, self.project)) self.assertTrue(can_author_translation(self.privileged, self.project))
def test_acl_project(self): """Basic sanity check for project-level actions. When a Group ACL is set for a project, and only for a project, it should apply to project-level actions on that project. """ acl = GroupACL.objects.get(project=self.project) acl.groups.add(self.group) permission = Permission.objects.get( codename='author_translation', content_type__app_label='trans' ) acl.permissions.add(permission) self.group.permissions.add(permission) self.assertFalse( can_author_translation(self.user, self.project) ) self.assertTrue( can_author_translation(self.privileged, self.project) )
def get_upload_form(user, translation, *args): """Return correct upload form based on user permissions.""" project = translation.subproject.project if can_author_translation(user, project): form = ExtraUploadForm elif can_overwrite_translation(user, project): form = UploadForm else: form = SimpleUploadForm result = form(*args) if not can_translate(user, translation): result.remove_translation_choice('translate') result.remove_translation_choice('fuzzy') if not can_suggest(user, translation): result.remove_translation_choice('suggest') return result
def upload_translation(request, project, component, lang): """Handling of translation uploads.""" obj = get_translation(request, project, component, lang) if not can_upload_translation(request.user, obj): raise PermissionDenied() # Check method and lock if obj.component.locked: messages.error(request, _('Access denied.')) return redirect(obj) # Get correct form handler based on permissions form = get_upload_form(request.user, obj, request.POST, request.FILES) # Check form validity if not form.is_valid(): messages.error(request, _('Please fix errors in the form.')) show_form_errors(request, form) return redirect(obj) # Create author name author = None if (can_author_translation(request.user, obj.component.project) and form.cleaned_data['author_name'] != '' and form.cleaned_data['author_email'] != ''): author = '{0} <{1}>'.format(form.cleaned_data['author_name'], form.cleaned_data['author_email']) # Check for overwriting overwrite = False if can_overwrite_translation(request.user, obj.component.project): overwrite = form.cleaned_data['upload_overwrite'] # Do actual import try: not_found, skipped, accepted, total = obj.merge_upload( request, request.FILES['file'], overwrite, author, merge_header=form.cleaned_data['merge_header'], method=form.cleaned_data['method'], fuzzy=form.cleaned_data['fuzzy'], ) if total == 0: message = _('No strings were imported from the uploaded file.') else: message = ungettext( 'Processed {0} string from the uploaded files ' '(skipped: {1}, not found: {2}, updated: {3}).', 'Processed {0} strings from the uploaded files ' '(skipped: {1}, not found: {2}, updated: {3}).', total).format(total, skipped, not_found, accepted) if accepted == 0: messages.warning(request, message) else: messages.success(request, message) except Exception as error: messages.error(request, _('File content merge failed: %s') % force_text(error)) report_error(error, sys.exc_info(), request) return redirect(obj)
def upload_translation(request, project, subproject, lang): """Handling of translation uploads.""" obj = get_translation(request, project, subproject, lang) if not can_upload_translation(request.user, obj): raise PermissionDenied() # Check method and lock if obj.is_locked(request.user): messages.error(request, _('Access denied.')) return redirect(obj) # Get correct form handler based on permissions form = get_upload_form( request.user, obj, request.POST, request.FILES ) # Check form validity if not form.is_valid(): messages.error(request, _('Please fix errors in the form.')) show_form_errors(request, form) return redirect(obj) # Create author name author = None if (can_author_translation(request.user, obj.subproject.project) and form.cleaned_data['author_name'] != '' and form.cleaned_data['author_email'] != ''): author = '{0} <{1}>'.format( form.cleaned_data['author_name'], form.cleaned_data['author_email'] ) # Check for overwriting overwrite = False if can_overwrite_translation(request.user, obj.subproject.project): overwrite = form.cleaned_data['upload_overwrite'] # Do actual import try: not_found, skipped, accepted, total = obj.merge_upload( request, request.FILES['file'], overwrite, author, merge_header=form.cleaned_data['merge_header'], method=form.cleaned_data['method'], fuzzy=form.cleaned_data['fuzzy'], ) if total == 0: message = _('No strings were imported from the uploaded file.') else: message = ungettext( 'Processed {0} string from the uploaded files ' '(skipped: {1}, not found: {2}, updated: {3}).', 'Processed {0} strings from the uploaded files ' '(skipped: {1}, not found: {2}, updated: {3}).', total ).format(total, skipped, not_found, accepted) if accepted == 0: messages.warning(request, message) else: messages.success(request, message) except Exception as error: messages.error( request, _('File content merge failed: %s') % force_text(error) ) report_error(error, sys.exc_info(), request) return redirect(obj)