Skip to content

Instantly share code, notes, and snippets.

@shamoon
Created December 27, 2020 05:18
Show Gist options
  • Save shamoon/496dcf859f57353113a999305dc66248 to your computer and use it in GitHub Desktop.
Save shamoon/496dcf859f57353113a999305dc66248 to your computer and use it in GitHub Desktop.
Teedy to Paperless Migration Script
import math
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
USERNAME = "username"
PASSWORD = "password"
BASE_URL_TEEDY = "http://localhost:8080/api"
BASE_URL_PAPERLESS = "http://localhost:8000/api"
paperless_login_url = BASE_URL_PAPERLESS + "/token"
paperless_client = requests.session()
paperless_client.get(paperless_login_url) # sets cookie
paperless_csrftoken = paperless_client.cookies['csrftoken']
login_paperless = paperless_client.post(paperless_login_url + "/",
headers={
"Referrer": paperless_login_url
},
data={
"username": USERNAME,
"password": PASSWORD,
"csrfmiddlewaretoken": paperless_csrftoken,
"next": '/'
}
)
if 'token' in login_paperless.json():
cookie_paperless = login_paperless.json()['token']
headers_paperless = {"Authorization": "Token {}".format(cookie_paperless)}
print('Successfully logged into Paperless with token:', cookie_paperless)
else:
print('Failed to login to Paperless')
exit()
get_paperless_tags = paperless_client.get(BASE_URL_PAPERLESS + '/tags/',
headers=headers_paperless
)
paperless_tags = get_paperless_tags.json()['results']
n_pages = get_paperless_tags.json()['count'] / 25 # 25 is paging limit
if (n_pages > 1):
for page in range(1, math.ceil(n_pages)):
next_page = get_paperless_tags.json()['next']
get_paperless_tags = paperless_client.get(next_page, headers=headers_paperless)
paperless_tags = paperless_tags + get_paperless_tags.json()['results']
print('Found the following tags in Paperless:', ','.join(str(tag['name']) for tag in paperless_tags))
login_teedy = requests.post(BASE_URL_TEEDY + "/user/login",
headers={
"Content-Type": "application/x-www-form-urlencoded"
},
data={
"username": USERNAME,
"password": PASSWORD,
},
verify=False
)
cookie_teedy = login_teedy.headers['Set-Cookie']
headers_teedy = {"Cookie": cookie_teedy}
if cookie_teedy is None:
print('Failed to login to Paperless')
exit()
else:
print('Successfully logged into Teedy with auth:', cookie_teedy)
get_documents = requests.get(BASE_URL_TEEDY + "/document/list",
headers=headers_teedy,
params={
"limit": 1000
}
)
documents = get_documents.json()['documents']
count = 1
for document in documents:
document_id = document['id']
teedy_tags = document['tags']
get_teedy_files = requests.get(BASE_URL_TEEDY + "/file/list",
headers=headers_teedy,
params={
"id": document_id
}
)
files = get_teedy_files.json()['files']
for file in files:
print('{}. ----------------'.format(count))
file_id = file['id']
file_name = file['name']
get_teedy_file = requests.get(BASE_URL_TEEDY + "/file/" + file_id + "/data",
headers=headers_teedy,
params={
"id": file_id
}
)
file_data = get_teedy_file.content
tags_list = []
for teedy_tag in teedy_tags:
paperless_tag = next((tag for tag in paperless_tags if tag["name"] == teedy_tag["name"]), None)
if paperless_tag is not None:
print('Found Paperless tag {} (id: {}) for Teedy tag {}'.format(paperless_tag['name'], paperless_tag['id'], teedy_tag['name']))
else:
print("Teedy tag {} not found in Paperless, creating...".format(teedy_tag['name']))
create_paperless_tag = requests.post(BASE_URL_PAPERLESS + "/tags/",
headers=headers_paperless,
data={
'name': teedy_tag['name']
}
)
paperless_tag = create_paperless_tag.json()
if ('id' in paperless_tag):
print("Created Paperless tag with id: {}".format(paperless_tag['id']))
paperless_tags.append(paperless_tag)
else:
print("Error creating paperless tag, response was: Code {} - {}".format(create_paperless_tag.status_code, create_paperless_tag.text))
tags_list.append(paperless_tag['id'])
post_paperless_document = requests.post(BASE_URL_PAPERLESS + "/documents/post_document/",
headers=headers_paperless,
files={
'document': (file_name, file_data),
},
data={
'tags': tags_list
}
)
print(file_name, post_paperless_document.text)
count += 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment