Skip to content

Commit

Permalink
add
Browse files Browse the repository at this point in the history
  • Loading branch information
farfun committed Dec 5, 2024
1 parent 97c143d commit 4e504cc
Show file tree
Hide file tree
Showing 7 changed files with 120 additions and 121 deletions.
2 changes: 1 addition & 1 deletion extbuild/fundrive-lanzou/pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "fundrive-lanzou"
version = "1.2.46"
version = "1.2.47"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.8"
Expand Down
3 changes: 3 additions & 0 deletions logs/all.log
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@
2024-12-05 20:59:36.386 |INFO | funbuild.core.core : core: 77 | funbuild | - fundrive build
2024-12-05 20:59:36.387 |INFO | funbuild.core.core : core: 65 | funbuild | - fundrive pull
2024-12-05 20:59:46.128 |INFO | funbuild.core.core : core: 69 | funbuild | - fundrive push
2024-12-05 21:14:53.014 |INFO | funbuild.core.core : core: 77 | funbuild | - fundrive build
2024-12-05 21:14:53.014 |INFO | funbuild.core.core : core: 65 | funbuild | - fundrive pull
2024-12-05 21:15:04.908 |INFO | funbuild.core.core : core: 69 | funbuild | - fundrive push
3 changes: 3 additions & 0 deletions logs/funbuild.log
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@
2024-12-05 20:59:36.386 |INFO | funbuild.core.core : core: 77 | funbuild | - fundrive build
2024-12-05 20:59:36.387 |INFO | funbuild.core.core : core: 65 | funbuild | - fundrive pull
2024-12-05 20:59:46.128 |INFO | funbuild.core.core : core: 69 | funbuild | - fundrive push
2024-12-05 21:14:53.014 |INFO | funbuild.core.core : core: 77 | funbuild | - fundrive build
2024-12-05 21:14:53.014 |INFO | funbuild.core.core : core: 65 | funbuild | - fundrive pull
2024-12-05 21:15:04.908 |INFO | funbuild.core.core : core: 69 | funbuild | - fundrive push
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "fundrive"
version = "1.2.46"
version = "1.2.47"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.8"
Expand Down
215 changes: 104 additions & 111 deletions src/fundrive/drives/zenodo/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,80 +7,80 @@

logger = getLogger("fundrive")

code_list = {
200: {
"code": 200,
"name": "OK",
"desc": "Request succeeded. Response included. Usually sent for GET/PUT/PATCH requests.",
},
201: {
"code": 201,
"name": "Created",
"desc": "Request succeeded. Response included. Usually sent for POST requests.",
},
202: {
"code": 202,
"name": "Accepted",
"desc": "Request succeeded. Response included. Usually sent for POST requests, where background processing is needed to fulfill the request.",
},
204: {
"code": 204,
"name": "No Content",
"desc": "Request succeeded. No response included. Usually sent for DELETE requests.",
},
400: {
"code": 400,
"name": "Bad Request",
"desc": "Request failed. Error response included.",
},
401: {
"code": 401,
"name": "Unauthorized",
"desc": "Request failed, due to an invalid access token. Error response included.",
},
403: {
"code": 403,
"name": "Forbidden",
"desc": "Request failed, due to missing authorization (e.g. deleting an already submitted upload or missing scopes for your access token). Error response included.",
},
404: {
"code": 404,
"name": "Not Found",
"desc": "Request failed, due to the resource not being found. Error response included.",
},
405: {
"code": 405,
"name": "Method Not Allowed",
"desc": "Request failed, due to unsupported HTTP method. Error response included.",
},
409: {
"code": 409,
"name": "Conflict",
"desc": "Request failed, due to the current state of the resource (e.g. edit a deopsition which is not fully integrated). Error response included.",
},
415: {
"code": 415,
"name": "Unsupported Media Type",
"desc": "Request failed, due to missing or invalid request header Content-Type. Error response included.",
},
429: {
"code": 429,
"name": "Too Many Requests",
"desc": "Request failed, due to rate limiting. Error response included.",
},
500: {
"code": 500,
"name": "Internal Server Error",
"desc": "Request failed, due to an internal server error. Error response NOT included. Don’t worry, Zenodo admins have been notified and will be dealing with the problem ASAP.",
},
}


class ZenodoClient(object):
"""
https://developers.zenodo.org/
"""

code_list = {
200: {
"code": 200,
"name": "OK",
"desc": "Request succeeded. Response included. Usually sent for GET/PUT/PATCH requests.",
},
201: {
"code": 201,
"name": "Created",
"desc": "Request succeeded. Response included. Usually sent for POST requests.",
},
202: {
"code": 202,
"name": "Accepted",
"desc": "Request succeeded. Response included. Usually sent for POST requests, where background processing is needed to fulfill the request.",
},
204: {
"code": 204,
"name": "No Content",
"desc": "Request succeeded. No response included. Usually sent for DELETE requests.",
},
400: {
"code": 400,
"name": "Bad Request",
"desc": "Request failed. Error response included.",
},
401: {
"code": 401,
"name": "Unauthorized",
"desc": "Request failed, due to an invalid access token. Error response included.",
},
403: {
"code": 403,
"name": "Forbidden",
"desc": "Request failed, due to missing authorization (e.g. deleting an already submitted upload or missing scopes for your access token). Error response included.",
},
404: {
"code": 404,
"name": "Not Found",
"desc": "Request failed, due to the resource not being found. Error response included.",
},
405: {
"code": 405,
"name": "Method Not Allowed",
"desc": "Request failed, due to unsupported HTTP method. Error response included.",
},
409: {
"code": 409,
"name": "Conflict",
"desc": "Request failed, due to the current state of the resource (e.g. edit a deopsition which is not fully integrated). Error response included.",
},
415: {
"code": 415,
"name": "Unsupported Media Type",
"desc": "Request failed, due to missing or invalid request header Content-Type. Error response included.",
},
429: {
"code": 429,
"name": "Too Many Requests",
"desc": "Request failed, due to rate limiting. Error response included.",
},
500: {
"code": 500,
"name": "Internal Server Error",
"desc": "Request failed, due to an internal server error. Error response NOT included. Don’t worry, Zenodo admins have been notified and will be dealing with the problem ASAP.",
},
}

def __init__(self, access_token, sandbox=False):
self.access_token = access_token
self.base_url = (
Expand All @@ -92,6 +92,14 @@ def __request(self, method, uri, params=None, *args, **kwargs):
params = params or {"access_token": self.access_token}
return requests.request(method, url, params=params, *args, **kwargs)

def __check_status_code(self, r, status_code):
if r.status_code != status_code:
logger.error(
f"publish error,status code: {r.status_code}:{self.code_list.get(r.status_code)}: {r.json().get('message')}"
)
return False
return True

def representation_list(
self, q, status=None, sort=None, page=None, size=None, all_versions=None
):
Expand All @@ -114,7 +122,8 @@ def representation_list(
"all_versions": all_versions,
"access_token": self.access_token,
}
return self.__request("get", uri, params=params)
r = self.__request("get", uri, params=params)
return self.__check_status_code(r, 201), r.json()

def representation_create(
self,
Expand All @@ -123,20 +132,15 @@ def representation_create(
data = {}
headers = {"Content-Type": "application/json"}
r = self.__request("post", uri, data=json.dumps(data), headers=headers)
if r.status_code != 201:
logger.error(
f"Error in creation, status code: {r.status_code} {r.json()['message']}"
)

return r.json()
return self.__check_status_code(r, 201), r.json()

def representation_retrieve(self, record_id):
uri = f"/api/deposit/depositions/{record_id}"
r = self.__request(
"get",
uri,
)
return r.json()
return self.__check_status_code(r, 201), r.json()

def representation_update(
self,
Expand Down Expand Up @@ -166,29 +170,27 @@ def representation_update(
data=json.dumps(data),
headers={"Content-Type": "application/json"},
)
if r.status_code != 200:
logger.error(
f"update meta error,status code: {r.status_code}:{code_list.get(r.status_code)}"
)
return r.json()
return self.__check_status_code(r, 200), r.json()

def representation_delete(self, record_id):
uri = f"/api/deposit/depositions/{record_id}"
return self.__request(
r = self.__request(
"delete",
uri,
)
return self.__check_status_code(r, 201), r.json()

def deposition_files_list(self, record_id):
uri = f"api/deposit/depositions/{record_id}/files"
return self.__request(
r = self.__request(
"get",
uri=uri,
)
return self.__check_status_code(r, 201), r.json()

@cache
def __get_bucket_url_by_record_id(self, record_id, *args, **kwargs):
retrieve = self.representation_retrieve(record_id=record_id)
status, retrieve = self.representation_retrieve(record_id=record_id)
return retrieve["links"]["bucket"]

def deposition_files_upload(
Expand All @@ -199,10 +201,7 @@ def deposition_files_upload(
uri = f"{bucket_url}/{filename}"
with open(filepath, "rb") as fr:
r = self.__request("put", uri=uri, data=fr)
if r.status_code != 201:
logger.error(
f"Error in data upload, status code: {r.status_code}:{code_list.get(r.status_code)} {r.json()['message']}"
)
if self.__check_status_code(r, 201):
return False, r.json()
else:
logger.success(
Expand All @@ -215,70 +214,68 @@ def deposition_files_create(self, record_id, filepath, filename=None):
data = {"name": filename or os.path.basename(filepath)}
files = {"file": open(filepath, "rb")}
r = self.__request("post", uri=uri, data=data, files=files)
if r.status_code != 201:
logger.error(
f"Error in data upload, status code: {r.status_code}:{code_list.get(r.status_code)} {r.json()['message']}"
)
return r.json()
return self.__check_status_code(r, 201), r.json()

def deposition_files_sort(self, record_id, data):
uri = f"api/deposit/depositions/{record_id}/files"
headers = {"Content-Type": "application/json"}
return self.__request("put", uri=uri, data=json.dumps(data), headers=headers)
r = self.__request("put", uri=uri, data=json.dumps(data), headers=headers)
return self.__check_status_code(r, 200), r.json()

def deposition_files_retrieve(self, record_id, file_id):
uri = f"api/deposit/depositions/{record_id}/files/{file_id}"
r = self.__request(
"get",
uri=uri,
)
return r.json()
return self.__check_status_code(r, 201), r.json()

def deposition_files_update(self, record_id, filename=None):
uri = f"api/deposit/depositions/{record_id}/files"
data = {"name": filename}
headers = {"Content-Type": "application/json"}
return self.__request("put", uri=uri, data=data, headers=headers)
r = self.__request("put", uri=uri, data=data, headers=headers)
return self.__check_status_code(r, 201), r.json()

def deposition_files_delete(self, record_id, file_id):
uri = f"api/deposit/depositions/{record_id}/files/{file_id}"
return self.__request(
r = self.__request(
"delete",
uri=uri,
)
return self.__check_status_code(r, 201), r.json()

def deposition_actions_publish(self, record_id):
uri = f"api/deposit/depositions/{record_id}/actions/publish"
r = self.__request(
"post",
uri=uri,
)
if r.status_code != 202:
logger.error(
f"publish error,status code: {r.status_code}:{code_list.get(r.status_code)}"
)
return r.json()
return self.__check_status_code(r, 202), r.json()

def deposition_actions_edit(self, record_id):
uri = f"api/deposit/depositions/{record_id}/actions/edit"
return self.__request(
r = self.__request(
"post",
uri=uri,
)
return self.__check_status_code(r, 201), r.json()

def deposition_actions_discard(self, record_id):
uri = f"api/deposit/depositions/{record_id}/actions/discard"
return self.__request(
r = self.__request(
"post",
uri=uri,
)
return self.__check_status_code(r, 201), r.json()

def deposition_actions_new_version(self, record_id):
uri = f"api/deposit/depositions/{record_id}/actions/newversion"
return self.__request(
r = self.__request(
"post",
uri=uri,
)
return self.__check_status_code(r, 201), r.json()

def records_list(
self,
Expand Down Expand Up @@ -341,13 +338,9 @@ def records_list(
data=payload,
headers={"Content-Type": "application/json"},
)
if r.status_code != 200:
logger.error(
f"search error, status code: {r.status_code} {r.json()['message']}"
)
return r.json()
return self.__check_status_code(r, 200), r.json()

def records_retrieve(self, record_id):
uri = f"api/records/{record_id}"
r = self.__request("get", uri=uri, params={})
return r.json()
return self.__check_status_code(r, 201), r.json()
Loading

0 comments on commit 4e504cc

Please sign in to comment.