import { PaperlessCorrespondent } from 'src/app/data/paperless-correspondent'
import { CorrespondentService } from 'src/app/services/rest/correspondent.service'
import { UserService } from 'src/app/services/rest/user.service'
+import { SettingsService } from 'src/app/services/settings.service'
@Component({
selector: 'app-correspondent-edit-dialog',
constructor(
service: CorrespondentService,
activeModal: NgbActiveModal,
- userService: UserService
+ userService: UserService,
+ settingsService: SettingsService
) {
- super(service, activeModal, userService)
+ super(service, activeModal, userService, settingsService)
}
getCreateTitle() {
import { PaperlessDocumentType } from 'src/app/data/paperless-document-type'
import { DocumentTypeService } from 'src/app/services/rest/document-type.service'
import { UserService } from 'src/app/services/rest/user.service'
+import { SettingsService } from 'src/app/services/settings.service'
@Component({
selector: 'app-document-type-edit-dialog',
constructor(
service: DocumentTypeService,
activeModal: NgbActiveModal,
- userService: UserService
+ userService: UserService,
+ settingsService: SettingsService
) {
- super(service, activeModal, userService)
+ super(service, activeModal, userService, settingsService)
}
getCreateTitle() {
import { AbstractPaperlessService } from 'src/app/services/rest/abstract-paperless-service'
import { UserService } from 'src/app/services/rest/user.service'
import { PermissionsFormObject } from '../input/permissions/permissions-form/permissions-form.component'
+import { SettingsService } from 'src/app/services/settings.service'
@Directive()
export abstract class EditDialogComponent<
constructor(
protected service: AbstractPaperlessService<T>,
private activeModal: NgbActiveModal,
- private userService: UserService
+ private userService: UserService,
+ private settingsService: SettingsService
) {}
users: PaperlessUser[]
this.closeEnabled = true
})
- this.userService.listAll().subscribe((r) => (this.users = r.results))
+ this.userService.listAll().subscribe((r) => {
+ this.users = r.results
+ if (this.dialogMode === 'create') {
+ this.objectForm.get('permissions_form').setValue({
+ owner: this.settingsService.currentUser.id,
+ })
+ }
+ })
}
getCreateTitle() {
import { PaperlessGroup } from 'src/app/data/paperless-group'
import { GroupService } from 'src/app/services/rest/group.service'
import { UserService } from 'src/app/services/rest/user.service'
+import { SettingsService } from 'src/app/services/settings.service'
@Component({
selector: 'app-group-edit-dialog',
constructor(
service: GroupService,
activeModal: NgbActiveModal,
- userService: UserService
+ userService: UserService,
+ settingsService: SettingsService
) {
- super(service, activeModal, userService)
+ super(service, activeModal, userService, settingsService)
}
getCreateTitle() {
} from 'src/app/data/paperless-mail-account'
import { MailAccountService } from 'src/app/services/rest/mail-account.service'
import { UserService } from 'src/app/services/rest/user.service'
+import { SettingsService } from 'src/app/services/settings.service'
const IMAP_SECURITY_OPTIONS = [
{ id: IMAPSecurity.None, name: $localize`No encryption` },
constructor(
service: MailAccountService,
activeModal: NgbActiveModal,
- userService: UserService
+ userService: UserService,
+ settingsService: SettingsService
) {
- super(service, activeModal, userService)
+ super(service, activeModal, userService, settingsService)
}
getCreateTitle() {
import { MailAccountService } from 'src/app/services/rest/mail-account.service'
import { MailRuleService } from 'src/app/services/rest/mail-rule.service'
import { UserService } from 'src/app/services/rest/user.service'
+import { SettingsService } from 'src/app/services/settings.service'
const ATTACHMENT_TYPE_OPTIONS = [
{
accountService: MailAccountService,
correspondentService: CorrespondentService,
documentTypeService: DocumentTypeService,
- userService: UserService
+ userService: UserService,
+ settingsService: SettingsService
) {
- super(service, activeModal, userService)
+ super(service, activeModal, userService, settingsService)
accountService
.listAll()
import { PaperlessStoragePath } from 'src/app/data/paperless-storage-path'
import { StoragePathService } from 'src/app/services/rest/storage-path.service'
import { UserService } from 'src/app/services/rest/user.service'
+import { SettingsService } from 'src/app/services/settings.service'
@Component({
selector: 'app-storage-path-edit-dialog',
constructor(
service: StoragePathService,
activeModal: NgbActiveModal,
- userService: UserService
+ userService: UserService,
+ settingsService: SettingsService
) {
- super(service, activeModal, userService)
+ super(service, activeModal, userService, settingsService)
}
get pathHint() {
import { randomColor } from 'src/app/utils/color'
import { DEFAULT_MATCHING_ALGORITHM } from 'src/app/data/matching-model'
import { UserService } from 'src/app/services/rest/user.service'
+import { SettingsService } from 'src/app/services/settings.service'
@Component({
selector: 'app-tag-edit-dialog',
constructor(
service: TagService,
activeModal: NgbActiveModal,
- userService: UserService
+ userService: UserService,
+ settingsService: SettingsService
) {
- super(service, activeModal, userService)
+ super(service, activeModal, userService, settingsService)
}
getCreateTitle() {
import { PaperlessUser } from 'src/app/data/paperless-user'
import { GroupService } from 'src/app/services/rest/group.service'
import { UserService } from 'src/app/services/rest/user.service'
+import { SettingsService } from 'src/app/services/settings.service'
@Component({
selector: 'app-user-edit-dialog',
constructor(
service: UserService,
activeModal: NgbActiveModal,
- groupsService: GroupService
+ groupsService: GroupService,
+ settingsService: SettingsService
) {
- super(service, activeModal, service)
+ super(service, activeModal, service, settingsService)
groupsService
.listAll()
permissions = None
if "set_permissions" in validated_data:
permissions = validated_data.pop("set_permissions")
+ if "user" not in permissions or permissions["user"] is None:
+ validated_data["owner"] = None
instance = super().create(validated_data)
if permissions is not None:
self._set_permissions(permissions, instance)
status.HTTP_404_NOT_FOUND,
)
+ def test_api_set_permissions(self):
+ """
+ GIVEN:
+ - API request to create an object (Tag) that supplies set_permissions object
+ WHEN:
+ - owner is passed as null or as a user id
+ - view > users is set
+ THEN:
+ - Object permissions are set appropriately
+ """
+ user1 = User.objects.create_superuser(username="user1")
+ user2 = User.objects.create(username="user2")
+
+ self.client.force_authenticate(user1)
+
+ response = self.client.post(
+ "/api/tags/",
+ json.dumps(
+ {
+ "name": "test1",
+ "matching_algorithm": MatchingModel.MATCH_AUTO,
+ "set_permissions": {
+ "owner": None,
+ "view": {
+ "users": None,
+ "groups": None,
+ },
+ "change": {
+ "users": None,
+ "groups": None,
+ },
+ },
+ },
+ ),
+ content_type="application/json",
+ )
+
+ self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+
+ tag1 = Tag.objects.filter(name="test1").first()
+ self.assertEqual(tag1.owner, None)
+
+ response = self.client.post(
+ "/api/tags/",
+ json.dumps(
+ {
+ "name": "test2",
+ "matching_algorithm": MatchingModel.MATCH_AUTO,
+ "set_permissions": {
+ "owner": user1.id,
+ "view": {
+ "users": [user2.id],
+ "groups": None,
+ },
+ "change": {
+ "users": None,
+ "groups": None,
+ },
+ },
+ },
+ ),
+ content_type="application/json",
+ )
+
+ tag2 = Tag.objects.filter(name="test2").first()
+
+ from guardian.core import ObjectPermissionChecker
+
+ checker = ObjectPermissionChecker(user2)
+ self.assertEqual(checker.has_perm("view_tag", tag2), True)
+
def test_dynamic_permissions_fields(self):
Document.objects.create(title="Test", content="content 1", checksum="1")