mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Support bulk edit owner
This commit is contained in:
		| @@ -5,24 +5,10 @@ | |||||||
|   </div> |   </div> | ||||||
|   <div class="modal-body"> |   <div class="modal-body"> | ||||||
|  |  | ||||||
|     <p class="mb-0" *ngIf="message" [innerHTML]="message | safeHtml"></p> |     <p class="mb-3" *ngIf="message" [innerHTML]="message | safeHtml"></p> | ||||||
|  |  | ||||||
|     <form [formGroup]="form"> |     <form [formGroup]="form"> | ||||||
|       <div formGroupName="set_permissions"> |       <app-permissions-form [users]="users" formControlName="permissions_form"></app-permissions-form> | ||||||
|         <app-input-select [items]="users" i18n-title title="Owner" bindLabel="username" formControlName="owner" [allowNull]="true"></app-input-select> |  | ||||||
|         <small class="form-text text-muted" i18n>Objects without an owner can be viewed and edited by all users</small> |  | ||||||
|         <h6 i18n>View</h6> |  | ||||||
|         <div formGroupName="view"> |  | ||||||
|           <app-permissions-user type="view" formControlName="users"></app-permissions-user> |  | ||||||
|           <app-permissions-group type="view" formControlName="groups"></app-permissions-group> |  | ||||||
|         </div> |  | ||||||
|         <h6 i18n>Edit</h6> |  | ||||||
|         <small class="form-text text-muted" i18n>Edit permissions also grant viewing permissions</small> |  | ||||||
|         <div formGroupName="change"> |  | ||||||
|           <app-permissions-user type="change" formControlName="users"></app-permissions-user> |  | ||||||
|           <app-permissions-group type="change" formControlName="groups"></app-permissions-group> |  | ||||||
|         </div> |  | ||||||
|       </div> |  | ||||||
|     </form> |     </form> | ||||||
|  |  | ||||||
|   </div> |   </div> | ||||||
|   | |||||||
| @@ -27,20 +27,17 @@ export class PermissionsDialogComponent implements OnInit { | |||||||
|   title = $localize`Set Permissions` |   title = $localize`Set Permissions` | ||||||
|  |  | ||||||
|   form = new FormGroup({ |   form = new FormGroup({ | ||||||
|     set_permissions: new FormGroup({ |     permissions_form: new FormControl(), | ||||||
|       view: new FormGroup({ |  | ||||||
|         users: new FormControl([]), |  | ||||||
|         groups: new FormControl([]), |  | ||||||
|       }), |  | ||||||
|       change: new FormGroup({ |  | ||||||
|         users: new FormControl([]), |  | ||||||
|         groups: new FormControl([]), |  | ||||||
|       }), |  | ||||||
|     }), |  | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   get permissions() { |   get permissions() { | ||||||
|     return this.form.value['set_permissions'] |     console.log(this.form.get('permissions_form')) | ||||||
|  |  | ||||||
|  |     return { | ||||||
|  |       owner: this.form.get('permissions_form')?.value['owner'], | ||||||
|  |       set_permissions: | ||||||
|  |         this.form.get('permissions_form')?.value['set_permissions'], | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   @Input() |   @Input() | ||||||
|   | |||||||
| @@ -181,7 +181,9 @@ | |||||||
|                 <li [ngbNavItem]="6" *ifOwner="document"> |                 <li [ngbNavItem]="6" *ifOwner="document"> | ||||||
|                     <a ngbNavLink i18n>Permissions</a> |                     <a ngbNavLink i18n>Permissions</a> | ||||||
|                     <ng-template ngbNavContent> |                     <ng-template ngbNavContent> | ||||||
|  |                         <div class="mb-3"> | ||||||
|                             <app-permissions-form [users]="users" formControlName="permissions_form"></app-permissions-form> |                             <app-permissions-form [users]="users" formControlName="permissions_form"></app-permissions-form> | ||||||
|  |                         </div> | ||||||
|                     </ng-template> |                     </ng-template> | ||||||
|                 </li> |                 </li> | ||||||
|             </ul> |             </ul> | ||||||
|   | |||||||
| @@ -209,7 +209,7 @@ export class DocumentDetailComponent | |||||||
|               this.openDocumentService.getOpenDocument(this.documentId) |               this.openDocumentService.getOpenDocument(this.documentId) | ||||||
|             ) |             ) | ||||||
|           } else { |           } else { | ||||||
|             this.openDocumentService.openDocument(doc, false) |             this.openDocumentService.openDocument(doc) | ||||||
|             this.updateComponent(doc) |             this.updateComponent(doc) | ||||||
|           } |           } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -69,7 +69,7 @@ | |||||||
|     </div> |     </div> | ||||||
|   </div> |   </div> | ||||||
|   <div class="col-auto ms-auto mb-2 mb-xl-0 d-flex"> |   <div class="col-auto ms-auto mb-2 mb-xl-0 d-flex"> | ||||||
|     <div class="btn-group btn-group-sm me-2"> |     <div class="btn-toolbar me-2"> | ||||||
|  |  | ||||||
|       <button type="button" class="btn btn-sm btn-outline-primary me-2" (click)="setPermissions()" [disabled]="!userOwnsAll"> |       <button type="button" class="btn btn-sm btn-outline-primary me-2" (click)="setPermissions()" [disabled]="!userOwnsAll"> | ||||||
|         <svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor"> |         <svg width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor"> | ||||||
|   | |||||||
| @@ -494,10 +494,10 @@ export class BulkEditorComponent extends ComponentWithPermissions { | |||||||
|       backdrop: 'static', |       backdrop: 'static', | ||||||
|     }) |     }) | ||||||
|     modal.componentInstance.confirmClicked.subscribe((permissions) => { |     modal.componentInstance.confirmClicked.subscribe((permissions) => { | ||||||
|  |       console.log(permissions) | ||||||
|  |  | ||||||
|       modal.componentInstance.buttonsEnabled = false |       modal.componentInstance.buttonsEnabled = false | ||||||
|       this.executeBulkOperation(modal, 'set_permissions', { |       this.executeBulkOperation(modal, 'set_permissions', permissions) | ||||||
|         permissions, |  | ||||||
|       }) |  | ||||||
|     }) |     }) | ||||||
|   } |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ from documents.models import StoragePath | |||||||
| from documents.permissions import set_permissions_for_object | from documents.permissions import set_permissions_for_object | ||||||
| from documents.tasks import bulk_update_documents | from documents.tasks import bulk_update_documents | ||||||
| from documents.tasks import update_document_archive_file | from documents.tasks import update_document_archive_file | ||||||
|  | from documents.tasks import update_owner_for_object | ||||||
|  |  | ||||||
|  |  | ||||||
| def set_correspondent(doc_ids, correspondent): | def set_correspondent(doc_ids, correspondent): | ||||||
| @@ -131,11 +132,17 @@ def redo_ocr(doc_ids): | |||||||
|     return "OK" |     return "OK" | ||||||
|  |  | ||||||
|  |  | ||||||
| def set_permissions(doc_ids, permissions): | def set_permissions(doc_ids, set_permissions, owner=None): | ||||||
|  |  | ||||||
|     qs = Document.objects.filter(id__in=doc_ids) |     qs = Document.objects.filter(id__in=doc_ids) | ||||||
|  |  | ||||||
|  |     if owner is not None: | ||||||
|  |         update_owner_for_object.delay(document_ids=doc_ids, owner=owner) | ||||||
|  |  | ||||||
|     for doc in qs: |     for doc in qs: | ||||||
|         set_permissions_for_object(permissions, doc) |         if set_permissions is not None: | ||||||
|  |             set_permissions_for_object(set_permissions, doc) | ||||||
|  |  | ||||||
|     affected_docs = [doc.id for doc in qs] |     affected_docs = [doc.id for doc in qs] | ||||||
|  |  | ||||||
|     bulk_update_documents.delay(document_ids=affected_docs) |     bulk_update_documents.delay(document_ids=affected_docs) | ||||||
|   | |||||||
| @@ -591,10 +591,18 @@ class BulkEditSerializer(DocumentListSerializer, SetPermissionsMixin): | |||||||
|         else: |         else: | ||||||
|             raise serializers.ValidationError("remove_tags not specified") |             raise serializers.ValidationError("remove_tags not specified") | ||||||
|  |  | ||||||
|  |     def _validate_owner(self, owner): | ||||||
|  |         ownerUser = User.objects.get(pk=owner) | ||||||
|  |         if ownerUser is None: | ||||||
|  |             raise serializers.ValidationError("Specified owner cannot be found") | ||||||
|  |         return ownerUser | ||||||
|  |  | ||||||
|     def _validate_parameters_set_permissions(self, parameters): |     def _validate_parameters_set_permissions(self, parameters): | ||||||
|         if "permissions" in parameters: |         if "permissions" in parameters: | ||||||
|             self.validate_set_permissions(parameters["permissions"]) |             self.validate_set_permissions(parameters["permissions"]) | ||||||
|         else: |         if "owner" in parameters: | ||||||
|  |             self._validate_owner(parameters["owner"]) | ||||||
|  |         if "permissions" not in parameters and "owner" not in parameters: | ||||||
|             raise serializers.ValidationError("permissions not specified") |             raise serializers.ValidationError("permissions not specified") | ||||||
|  |  | ||||||
|     def validate(self, attrs): |     def validate(self, attrs): | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ from asgiref.sync import async_to_sync | |||||||
| from celery import shared_task | from celery import shared_task | ||||||
| from channels.layers import get_channel_layer | from channels.layers import get_channel_layer | ||||||
| from django.conf import settings | from django.conf import settings | ||||||
|  | from django.contrib.auth.models import User | ||||||
| from django.db import transaction | from django.db import transaction | ||||||
| from django.db.models.signals import post_save | from django.db.models.signals import post_save | ||||||
| from documents import barcodes | from documents import barcodes | ||||||
| @@ -284,3 +285,12 @@ def update_document_archive_file(document_id): | |||||||
|         ) |         ) | ||||||
|     finally: |     finally: | ||||||
|         parser.cleanup() |         parser.cleanup() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | @shared_task | ||||||
|  | def update_owner_for_object(document_ids, owner): | ||||||
|  |     documents = Document.objects.filter(id__in=document_ids) | ||||||
|  |     ownerUser = User.objects.get(pk=owner) | ||||||
|  |     for document in documents: | ||||||
|  |         document.owner = ownerUser | ||||||
|  |         document.save() | ||||||
|   | |||||||
| @@ -2347,7 +2347,7 @@ class TestBulkEdit(DirectoriesMixin, APITestCase): | |||||||
|  |  | ||||||
|         bulk_edit.set_permissions( |         bulk_edit.set_permissions( | ||||||
|             [self.doc2.id, self.doc3.id], |             [self.doc2.id, self.doc3.id], | ||||||
|             permissions=permissions, |             set_permissions=permissions, | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         self.assertEqual(get_users_with_perms(self.doc2).count(), 2) |         self.assertEqual(get_users_with_perms(self.doc2).count(), 2) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Michael Shamoon
					Michael Shamoon