Skip to content

Commit

Permalink
Implement import of Software Requirements from json file exported fro…
Browse files Browse the repository at this point in the history
…m BASIL (#87)

* Implement import of Software Requirements from json file that are exported from BASIL in SPDX Model 3 format

Signed-off-by: Luigi Pellecchia <[email protected]>

* Fix npm build issue due access to lenght variable in an js dict

Signed-off-by: Luigi Pellecchia <[email protected]>

---------

Signed-off-by: Luigi Pellecchia <[email protected]>
Co-authored-by: Luigi Pellecchia <[email protected]>
  • Loading branch information
pellecchialuigi and Luigi Pellecchia authored Jan 30, 2025
1 parent 743acf5 commit 78fe6f4
Show file tree
Hide file tree
Showing 4 changed files with 688 additions and 197 deletions.
49 changes: 48 additions & 1 deletion api/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@
from db.models.test_specification_test_case import (TestSpecificationTestCaseHistoryModel,
TestSpecificationTestCaseModel)
from db.models.user import UserModel
from spdx_manager import SPDXManager
from spdx_manager import SPDXImport, SPDXManager

app = Flask("BASIL-API")
api = Api(app)
Expand Down Expand Up @@ -3606,6 +3606,49 @@ def delete(self):
return True


class SwRequirementImport(Resource):
def post(self):
request_data = request.get_json(force=True)

if "file_content" not in request_data:
return BAD_REQUEST_MESSAGE, BAD_REQUEST_STATUS

spdx_importer = SPDXImport()
return {_SRs: spdx_importer.getBasilSwRequirementsToSelect(request_data["file_content"])}

def put(self):
request_data = request.get_json(force=True)

if not check_fields_in_request(['file_content', 'filter_ids'], request_data):
return BAD_REQUEST_MESSAGE, BAD_REQUEST_STATUS

dbi = db_orm.DbInterface(get_db())

# User
user = get_active_user_from_request(request_data, dbi.session)
if not isinstance(user, UserModel):
return UNAUTHORIZED_MESSAGE, UNAUTHORIZED_STATUS

# Permissions
if user.role not in USER_ROLES_WRITE_PERMISSIONS:
return UNAUTHORIZED_MESSAGE, UNAUTHORIZED_STATUS

spdx_importer = SPDXImport()
filter_ids = [f.strip() for f in request_data["filter_ids"].split(",") if len(f.strip())]
sw_requirements = spdx_importer.getBasilSwRequirementsToImport(request_data["file_content"],
filter_ids,
user)

# Pay attention: we actually doesn't check if the requirement already exists
# (if already exists a requirement with same content)
if sw_requirements:
dbi.session.add_all(sw_requirements)
dbi.session.commit()
return {_SRs: [sr.as_dict() for sr in sw_requirements]}

return {_SRs: []}


class Justification(Resource):
fields = get_model_editable_fields(JustificationModel, False)
fields_hashes = [x.replace('_', '-') for x in fields]
Expand Down Expand Up @@ -6494,11 +6537,15 @@ def get(self):
api.add_resource(TestRunPluginPresets, '/mapping/api/test-run-plugins-presets')
api.add_resource(AdminTestRunPluginsPresets, '/admin/test-run-plugins-presets')

# - Import
api.add_resource(SwRequirementImport, '/import/sw-requirements')

# - Indirect
api.add_resource(SwRequirementSwRequirementsMapping, '/mapping/sw-requirement/sw-requirements')
api.add_resource(SwRequirementTestSpecificationsMapping, '/mapping/sw-requirement/test-specifications')
api.add_resource(SwRequirementTestCasesMapping, '/mapping/sw-requirement/test-cases')
api.add_resource(TestSpecificationTestCasesMapping, '/mapping/test-specification/test-cases')

# History
api.add_resource(MappingHistory, '/mapping/history')
api.add_resource(CheckSpecification, '/apis/check-specification')
Expand Down
Loading

0 comments on commit 78fe6f4

Please sign in to comment.