Get storage paths working
This commit is contained in:
parent
3e5886584f
commit
1c042d4aaf
@ -1,7 +1,7 @@
|
|||||||
import { SettingsService } from './services/settings.service'
|
import { SettingsService } from './services/settings.service'
|
||||||
import { SETTINGS_KEYS } from './data/paperless-uisettings'
|
import { SETTINGS_KEYS } from './data/paperless-uisettings'
|
||||||
import { Component, OnDestroy, OnInit, Renderer2 } from '@angular/core'
|
import { Component, OnDestroy, OnInit, Renderer2 } from '@angular/core'
|
||||||
import { Router } from '@angular/router'
|
import { ActivatedRoute, Router } from '@angular/router'
|
||||||
import { Subscription } from 'rxjs'
|
import { Subscription } from 'rxjs'
|
||||||
import { ConsumerStatusService } from './services/consumer-status.service'
|
import { ConsumerStatusService } from './services/consumer-status.service'
|
||||||
import { ToastService } from './services/toast.service'
|
import { ToastService } from './services/toast.service'
|
||||||
@ -34,6 +34,7 @@ export class AppComponent implements OnInit, OnDestroy {
|
|||||||
private consumerStatusService: ConsumerStatusService,
|
private consumerStatusService: ConsumerStatusService,
|
||||||
private toastService: ToastService,
|
private toastService: ToastService,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
|
private route: ActivatedRoute,
|
||||||
private uploadDocumentsService: UploadDocumentsService,
|
private uploadDocumentsService: UploadDocumentsService,
|
||||||
private tasksService: TasksService,
|
private tasksService: TasksService,
|
||||||
public tourService: TourService,
|
public tourService: TourService,
|
||||||
@ -265,7 +266,9 @@ export class AppComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
public dropped(files: NgxFileDropEntry[]) {
|
public dropped(files: NgxFileDropEntry[]) {
|
||||||
this.fileLeave(true)
|
this.fileLeave(true)
|
||||||
this.uploadDocumentsService.uploadFiles(files)
|
let storagePathId = parseInt(this.route.snapshot.queryParams['spid'])
|
||||||
|
storagePathId = !isNaN(storagePathId) ? storagePathId : undefined
|
||||||
|
this.uploadDocumentsService.uploadFiles(files, storagePathId)
|
||||||
this.toastService.showInfo($localize`Initiating upload...`, 3000)
|
this.toastService.showInfo($localize`Initiating upload...`, 3000)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -157,7 +157,6 @@ export class ExplorerComponent
|
|||||||
this.route.queryParamMap
|
this.route.queryParamMap
|
||||||
.pipe(takeUntil(this.unsubscribeNotifier))
|
.pipe(takeUntil(this.unsubscribeNotifier))
|
||||||
.subscribe((queryParams) => {
|
.subscribe((queryParams) => {
|
||||||
console.log('query params updated:', queryParams)
|
|
||||||
this.list.loadFromQueryParams(queryParams)
|
this.list.loadFromQueryParams(queryParams)
|
||||||
this.unmodifiedFilterRules = []
|
this.unmodifiedFilterRules = []
|
||||||
})
|
})
|
||||||
|
@ -181,7 +181,6 @@ export class StoragePathListViewService {
|
|||||||
)
|
)
|
||||||
.subscribe({
|
.subscribe({
|
||||||
next: (result) => {
|
next: (result) => {
|
||||||
console.log('result:', result)
|
|
||||||
this.initialized = true
|
this.initialized = true
|
||||||
this.isReloading = false
|
this.isReloading = false
|
||||||
activeListViewState.collectionSize = result.count
|
activeListViewState.collectionSize = result.count
|
||||||
|
@ -21,13 +21,18 @@ export class UploadDocumentsService {
|
|||||||
private settings: SettingsService
|
private settings: SettingsService
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
uploadFiles(files: NgxFileDropEntry[]) {
|
uploadFiles(files: NgxFileDropEntry[], storagePathId?: number) {
|
||||||
for (const droppedFile of files) {
|
for (const droppedFile of files) {
|
||||||
if (droppedFile.fileEntry.isFile) {
|
if (droppedFile.fileEntry.isFile) {
|
||||||
const fileEntry = droppedFile.fileEntry as FileSystemFileEntry
|
const fileEntry = droppedFile.fileEntry as FileSystemFileEntry
|
||||||
fileEntry.file((file: File) => {
|
fileEntry.file((file: File) => {
|
||||||
let formData = new FormData()
|
let formData = new FormData()
|
||||||
formData.append('document', file, file.name)
|
formData.append('document', file, file.name)
|
||||||
|
|
||||||
|
if (storagePathId) {
|
||||||
|
formData.append('storage_path_id', storagePathId.toString())
|
||||||
|
}
|
||||||
|
|
||||||
let status = this.consumerStatusService.newFileUpload(file.name)
|
let status = this.consumerStatusService.newFileUpload(file.name)
|
||||||
|
|
||||||
status.message = $localize`Connecting...`
|
status.message = $localize`Connecting...`
|
||||||
|
@ -25,7 +25,7 @@ from .classifier import load_classifier
|
|||||||
from .file_handling import create_source_path_directory
|
from .file_handling import create_source_path_directory
|
||||||
from .file_handling import generate_unique_filename
|
from .file_handling import generate_unique_filename
|
||||||
from .loggers import LoggingMixin
|
from .loggers import LoggingMixin
|
||||||
from .models import Correspondent
|
from .models import Correspondent, StoragePath
|
||||||
from .models import Document
|
from .models import Document
|
||||||
from .models import DocumentType
|
from .models import DocumentType
|
||||||
from .models import FileInfo
|
from .models import FileInfo
|
||||||
@ -294,6 +294,7 @@ class Consumer(LoggingMixin):
|
|||||||
override_created=None,
|
override_created=None,
|
||||||
override_asn=None,
|
override_asn=None,
|
||||||
override_owner_id=None,
|
override_owner_id=None,
|
||||||
|
override_storage_path_id=None,
|
||||||
) -> Document:
|
) -> Document:
|
||||||
"""
|
"""
|
||||||
Return the document object if it was successfully created.
|
Return the document object if it was successfully created.
|
||||||
@ -309,6 +310,7 @@ class Consumer(LoggingMixin):
|
|||||||
self.override_created = override_created
|
self.override_created = override_created
|
||||||
self.override_asn = override_asn
|
self.override_asn = override_asn
|
||||||
self.override_owner_id = override_owner_id
|
self.override_owner_id = override_owner_id
|
||||||
|
self.override_storage_path_id = override_storage_path_id
|
||||||
|
|
||||||
self._send_progress(0, 100, "STARTING", MESSAGE_NEW_FILE)
|
self._send_progress(0, 100, "STARTING", MESSAGE_NEW_FILE)
|
||||||
|
|
||||||
@ -566,7 +568,7 @@ class Consumer(LoggingMixin):
|
|||||||
|
|
||||||
return document
|
return document
|
||||||
|
|
||||||
def apply_overrides(self, document):
|
def apply_overrides(self, document: Document):
|
||||||
if self.override_correspondent_id:
|
if self.override_correspondent_id:
|
||||||
document.correspondent = Correspondent.objects.get(
|
document.correspondent = Correspondent.objects.get(
|
||||||
pk=self.override_correspondent_id,
|
pk=self.override_correspondent_id,
|
||||||
@ -589,6 +591,11 @@ class Consumer(LoggingMixin):
|
|||||||
pk=self.override_owner_id,
|
pk=self.override_owner_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if self.override_storage_path_id:
|
||||||
|
document.storage_path = StoragePath.objects.get(
|
||||||
|
id=self.override_storage_path_id,
|
||||||
|
)
|
||||||
|
|
||||||
def _write(self, storage_type, source, target):
|
def _write(self, storage_type, source, target):
|
||||||
with open(source, "rb") as read_file, open(target, "wb") as write_file:
|
with open(source, "rb") as read_file, open(target, "wb") as write_file:
|
||||||
write_file.write(read_file.read())
|
write_file.write(read_file.read())
|
||||||
|
@ -24,6 +24,7 @@ class DocumentMetadataOverrides:
|
|||||||
created: Optional[datetime.datetime] = None
|
created: Optional[datetime.datetime] = None
|
||||||
asn: Optional[int] = None
|
asn: Optional[int] = None
|
||||||
owner_id: Optional[int] = None
|
owner_id: Optional[int] = None
|
||||||
|
storage_path_id: Optional[int] = None
|
||||||
|
|
||||||
|
|
||||||
class DocumentSource(enum.IntEnum):
|
class DocumentSource(enum.IntEnum):
|
||||||
|
@ -725,6 +725,13 @@ class PostDocumentSerializer(serializers.Serializer):
|
|||||||
max_value=Document.ARCHIVE_SERIAL_NUMBER_MAX,
|
max_value=Document.ARCHIVE_SERIAL_NUMBER_MAX,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
storage_path_id = serializers.IntegerField(
|
||||||
|
label="Storage path ID",
|
||||||
|
allow_null=True,
|
||||||
|
write_only=True,
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
|
||||||
def validate_document(self, document):
|
def validate_document(self, document):
|
||||||
document_data = document.file.read()
|
document_data = document.file.read()
|
||||||
mime_type = magic.from_buffer(document_data, mime=True)
|
mime_type = magic.from_buffer(document_data, mime=True)
|
||||||
|
@ -200,6 +200,7 @@ def consume_file(
|
|||||||
override_created=overrides.created,
|
override_created=overrides.created,
|
||||||
override_asn=overrides.asn,
|
override_asn=overrides.asn,
|
||||||
override_owner_id=overrides.owner_id,
|
override_owner_id=overrides.owner_id,
|
||||||
|
override_storage_path_id=overrides.storage_path_id
|
||||||
)
|
)
|
||||||
|
|
||||||
if document:
|
if document:
|
||||||
|
@ -678,6 +678,9 @@ class PostDocumentView(GenericAPIView):
|
|||||||
title = serializer.validated_data.get("title")
|
title = serializer.validated_data.get("title")
|
||||||
created = serializer.validated_data.get("created")
|
created = serializer.validated_data.get("created")
|
||||||
archive_serial_number = serializer.validated_data.get("archive_serial_number")
|
archive_serial_number = serializer.validated_data.get("archive_serial_number")
|
||||||
|
storage_path_id = serializer.validated_data.get("storage_path_id")
|
||||||
|
|
||||||
|
logger.debug(f"storage_path_id: {storage_path_id}")
|
||||||
|
|
||||||
t = int(mktime(datetime.now().timetuple()))
|
t = int(mktime(datetime.now().timetuple()))
|
||||||
|
|
||||||
@ -704,6 +707,7 @@ class PostDocumentView(GenericAPIView):
|
|||||||
created=created,
|
created=created,
|
||||||
asn=archive_serial_number,
|
asn=archive_serial_number,
|
||||||
owner_id=request.user.id,
|
owner_id=request.user.id,
|
||||||
|
storage_path_id=storage_path_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
async_task = consume_file.delay(
|
async_task = consume_file.delay(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user