Add upload.py
This commit is contained in:
parent
6c5b66b61e
commit
9bcf4a6b51
169
upload.py
Normal file
169
upload.py
Normal file
@ -0,0 +1,169 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import requests
|
||||
import os
|
||||
|
||||
# Optional: caches for tag name -> ID and correspondent name -> ID
|
||||
TAG_CACHE = {}
|
||||
CORRESPONDENT_CACHE = {}
|
||||
|
||||
BASE_URL = "http://10.1.135.227:8777" # Adjust if needed
|
||||
|
||||
def get_or_create_tag_id(tag_name, token):
|
||||
"""
|
||||
Check if a tag named `tag_name` exists in Paperless.
|
||||
If not found, create it.
|
||||
Return the tag ID as an integer.
|
||||
"""
|
||||
# If we already resolved this tag, return from cache
|
||||
if tag_name in TAG_CACHE:
|
||||
return TAG_CACHE[tag_name]
|
||||
|
||||
headers = {"Authorization": f"Token {token}"}
|
||||
|
||||
# 1) Check if tag already exists by exact name
|
||||
response = requests.get(
|
||||
f"{BASE_URL}/api/tags/",
|
||||
headers=headers,
|
||||
params={"name": tag_name}
|
||||
)
|
||||
response.raise_for_status()
|
||||
|
||||
results = response.json().get("results", [])
|
||||
found_id = None
|
||||
for item in results:
|
||||
if "name" in item and item["name"].lower() == tag_name.lower():
|
||||
found_id = item["id"]
|
||||
break
|
||||
|
||||
if found_id is not None:
|
||||
# We have an existing tag
|
||||
TAG_CACHE[tag_name] = found_id
|
||||
return found_id
|
||||
else:
|
||||
# 2) Create a new tag via POST /api/tags/
|
||||
create_resp = requests.post(
|
||||
f"{BASE_URL}/api/tags/",
|
||||
headers=headers,
|
||||
json={"name": tag_name}
|
||||
)
|
||||
create_resp.raise_for_status()
|
||||
new_tag_data = create_resp.json()
|
||||
new_id = new_tag_data["id"]
|
||||
|
||||
# Cache it
|
||||
TAG_CACHE[tag_name] = new_id
|
||||
return new_id
|
||||
|
||||
def get_or_create_correspondent_id(corr_name, token):
|
||||
"""
|
||||
Check if a Correspondent named `corr_name` exists in Paperless.
|
||||
If not found, create it.
|
||||
Return the Correspondent ID as an integer.
|
||||
"""
|
||||
# If we already resolved this correspondent, return from cache
|
||||
if corr_name in CORRESPONDENT_CACHE:
|
||||
return CORRESPONDENT_CACHE[corr_name]
|
||||
|
||||
headers = {"Authorization": f"Token {token}"}
|
||||
|
||||
# 1) Check if correspondent already exists by exact name
|
||||
response = requests.get(
|
||||
f"{BASE_URL}/api/correspondents/",
|
||||
headers=headers,
|
||||
params={"name": corr_name}
|
||||
)
|
||||
response.raise_for_status()
|
||||
|
||||
results = response.json().get("results", [])
|
||||
found_id = None
|
||||
for item in results:
|
||||
if "name" in item and item["name"].lower() == corr_name.lower():
|
||||
found_id = item["id"]
|
||||
break
|
||||
|
||||
if found_id is not None:
|
||||
# We have an existing correspondent
|
||||
CORRESPONDENT_CACHE[corr_name] = found_id
|
||||
return found_id
|
||||
else:
|
||||
# 2) Create a new correspondent via POST /api/correspondents/
|
||||
create_resp = requests.post(
|
||||
f"{BASE_URL}/api/correspondents/",
|
||||
headers=headers,
|
||||
json={"name": corr_name}
|
||||
)
|
||||
create_resp.raise_for_status()
|
||||
new_corr_data = create_resp.json()
|
||||
new_id = new_corr_data["id"]
|
||||
|
||||
# Cache it
|
||||
CORRESPONDENT_CACHE[corr_name] = new_id
|
||||
return new_id
|
||||
|
||||
def upload_file_to_paperless(file_path, token, doc_title, devon_tags):
|
||||
"""
|
||||
1) Resolve each DEVONthink tag to a Paperless tag ID (creating if necessary).
|
||||
2) Get/create the Correspondent = "KHCN".
|
||||
3) Upload the file to Paperless, including the final list of tag IDs, the doc_title,
|
||||
and the corresponding correspondent ID.
|
||||
"""
|
||||
headers = {"Authorization": f"Token {token}"}
|
||||
|
||||
# Convert each DEVONthink tag to a tag ID in Paperless
|
||||
paperless_tag_ids = []
|
||||
for t in devon_tags:
|
||||
if t.strip():
|
||||
tag_id = get_or_create_tag_id(t.strip(), token)
|
||||
paperless_tag_ids.append(str(tag_id))
|
||||
|
||||
# Always set this document's Correspondent to "KHCN"
|
||||
correspondent_id = get_or_create_correspondent_id("KHCN", token)
|
||||
|
||||
# Build the form data
|
||||
form_data = []
|
||||
form_data.append(("title", doc_title))
|
||||
form_data.append(("correspondent", str(correspondent_id))) # The key part
|
||||
for tid in paperless_tag_ids:
|
||||
form_data.append(("tags", tid))
|
||||
|
||||
# Prepare the file for multipart/form-data
|
||||
with open(file_path, "rb") as f:
|
||||
files = {"document": (os.path.basename(file_path), f)}
|
||||
resp = requests.post(
|
||||
f"{BASE_URL}/api/documents/post_document/",
|
||||
headers=headers,
|
||||
files=files,
|
||||
data=form_data
|
||||
)
|
||||
|
||||
resp.raise_for_status()
|
||||
return resp.json()
|
||||
|
||||
def main():
|
||||
"""
|
||||
Usage:
|
||||
python3 upload.py /path/to/file PAPERLESS_TOKEN "TITLE" "TAG1||TAG2||TAG3"
|
||||
"""
|
||||
if len(sys.argv) < 5:
|
||||
print("Usage: python3 upload.py /path/to/file TOKEN \"TITLE\" \"TAG1||TAG2||...\"")
|
||||
sys.exit(1)
|
||||
|
||||
file_path = sys.argv[1]
|
||||
token = sys.argv[2]
|
||||
doc_title = sys.argv[3]
|
||||
raw_tags = sys.argv[4]
|
||||
|
||||
# Split the passed tag string on '||' to get list of tags
|
||||
devon_tags = raw_tags.split("||") if raw_tags else []
|
||||
|
||||
try:
|
||||
result = upload_file_to_paperless(file_path, token, doc_title, devon_tags)
|
||||
print("Upload started. Paperless returned:\n", result)
|
||||
except Exception as e:
|
||||
print("Error uploading document:", e)
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
x
Reference in New Issue
Block a user