Coverage for portality / api / current / bulk / applications.py: 98%
43 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-04 09:41 +0100
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-04 09:41 +0100
1# ~~APIBulkApplications:Feature->APIBulk:Feature~~
2from portality.api.current.crud.common import CrudApi
3from portality.api.common import Api404Error, Api400Error, Api403Error
4from portality.api.current.crud import ApplicationsCrudApi
5from copy import deepcopy
7class ApplicationsBulkApi(CrudApi):
9 API_KEY_OPTIONAL = False
11 # ~~->Swagger:Feature~~
12 # ~~->API:Documentation~~
13 SWAG_TAG = 'Bulk API'
14 SWAG_DELETE_PARAM = {
15 "description": "<div class=\"search-query-docs\">List of DOAJ application IDs to be deleted. You must own all the IDs, and none of them should have entered the DOAJ workflow yet. Otherwise, processing will stop. e.g. [4cf8b72139a749c88d043129f00e1b07, 8e896b60-35f1-4cd3-b3f9-07f7f29d8a98].</div>",
16 "required": True,
17 "schema": {"type" : "string"},
18 "name": "application_ids",
19 "in": "body"
20 }
21 SWAG_APPLICATION_BODY_PARAM = {
22 "description": "<div class=\"search-query-docs\">List of Application JSON objects that you would like to create. Each element of the list should comply with the schema displayed in the 'GET (Retrieve) an application route' below.</div>",
23 "required": True,
24 "schema": {"type" : "string"},
25 "name": "application_json",
26 "in": "body"
27 }
29 @classmethod
30 def create_swag(cls):
31 template = deepcopy(cls.SWAG_TEMPLATE)
32 template['parameters'].append(cls.SWAG_APPLICATION_BODY_PARAM)
33 template['responses']['201'] = cls.R201_BULK
34 template['responses']['400'] = cls.R400
35 return cls._build_swag_response(template)
37 @classmethod
38 def create(cls, applications, account):
39 # we run through create twice, once as a dry-run and the second time
40 # as the real deal
41 # ~~->APICrudApplications:Feature~~
42 for a in applications:
43 ApplicationsCrudApi.create(a, account, dry_run=True)
45 ids = []
46 for a in applications:
47 n = ApplicationsCrudApi.create(a, account)
48 ids.append(n.id)
50 return ids
52 @classmethod
53 def delete_swag(cls):
54 template = deepcopy(cls.SWAG_TEMPLATE)
55 template['parameters'].append(cls.SWAG_DELETE_PARAM)
56 template['responses']['204'] = cls.R204
57 template['responses']['400'] = cls.R400
58 return cls._build_swag_response(template)
60 @classmethod
61 def delete(cls, application_ids, account):
62 # we run through delete twice, once as a dry-run and the second time
63 # as the real deal
64 # ~~->APICrudApplications:Feature~~
65 for id in application_ids:
66 try:
67 ApplicationsCrudApi.delete(id, account, dry_run=True)
68 except Api404Error as e:
69 raise Api400Error("Id {x} does not exist or does not belong to this user account".format(x=id))
70 except Api403Error as e:
71 raise Api400Error("Id {x} is not in a state which allows it to be deleted".format(x=id))
73 for id in application_ids:
74 ApplicationsCrudApi.delete(id, account)