Skip to content

Commit

Permalink
Merge pull request #291 from bcgov/feat1
Browse files Browse the repository at this point in the history
Added submission version
  • Loading branch information
jadmsaadaot authored Feb 14, 2025
2 parents 0c54723 + fac78a7 commit 611c724
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 8 deletions.
8 changes: 8 additions & 0 deletions submit-api/src/submit_api/models/submission.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ class Submission(BaseModel):
minor_version = Column(db.Integer, nullable=False, default=1)
active = Column(db.Boolean, nullable=False, default=True)
status = Column(Enum(SubmissionStatus), nullable=True, default=SubmissionStatus.PENDING)
root_submission_id = Column(db.Integer, ForeignKey('submissions.id'),
nullable=True) # the base or root id of submisison

Index('idx_submissions_type_item_id', type, item_id)

Expand All @@ -59,3 +61,9 @@ def version(self):
def find_latest_by_type_and_item_id(cls, item_id: int, submission_type: SubmissionType):
"""Return model by item id."""
return cls.query.filter_by(item_id=item_id, type=submission_type).order_by(cls.created_date.asc()).first()

@classmethod
def find_all_versions(cls, root_submission_id: int):
"""Fetch all versions of a submission given its root submission ID."""
return cls.query.filter_by(root_submission_id=root_submission_id).order_by(cls.major_version,
cls.minor_version).all()
24 changes: 23 additions & 1 deletion submit-api/src/submit_api/resources/proponent/submission.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
from submit_api.services.submission import SubmissionService
from submit_api.utils.util import cors_preflight


API = Namespace("submissions", description="Endpoints for Submission Management")
"""Custom exception messages
"""
Expand Down Expand Up @@ -78,6 +77,29 @@ def patch(submission_id):
return SubmissionSchema().dump(edited_submission), HTTPStatus.OK


@cors_preflight("GET, OPTIONS")
@API.route("/<int:submission_id>/versions", methods=["GET", "OPTIONS"])
class SubmissionVersions(Resource):
"""Resource for retrieving all versions of a submission."""

@staticmethod
@ApiHelper.swagger_decorators(API, endpoint_description="Get all versions of a submission")
@API.response(
code=HTTPStatus.OK,
model=[submission_model],
description="List of submission versions"
)
@API.response(HTTPStatus.NOT_FOUND, "Submission not found")
@cors.crossdomain(origin="*")
@auth.require
def get(submission_id):
"""Fetch all versions of a submission based on its root submission ID."""
submissions = SubmissionService.get_all_versions(submission_id)
if not submissions:
return {"message": "No versions found for the given submission."}, HTTPStatus.NOT_FOUND
return SubmissionSchema(many=True).dump(submissions), HTTPStatus.OK


@cors_preflight("OPTIONS, POST, DELETE")
@API.route("/<int:submission_id>/document", methods=["POST", "OPTIONS", "DELETE"])
class DocumentSubmission(Resource):
Expand Down
11 changes: 11 additions & 0 deletions submit-api/src/submit_api/services/submission/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,3 +93,14 @@ def delete_submission(cls, submission_id):
raise ValueError("Submission not found.")
submission.delete()
return submission

@classmethod
def get_all_versions(cls, submission_id):
"""Fetch all versions of a submission by its root submission ID."""
with session_scope():
submission: SubmissionModel = SubmissionModel.find_by_id(submission_id)
if not submission:
return None

root_submission_id = submission.root_submission_id or submission.id
return SubmissionModel.find_all_versions(root_submission_id)
Original file line number Diff line number Diff line change
Expand Up @@ -86,13 +86,14 @@ def create(self, item_id, request_data, _session=None):
def _create(self, item_id, request_data, session):
"""Create a new document submission."""
submitted_document = self._create_submitted_document(session, request_data)
submission = self._create_submission(session, item_id, submitted_document.id)
submission: SubmissionModel = self._create_submission(session, item_id, submitted_document.id)

return submission

def replace(self, submission_id, request_data):
"""Replace a document submission."""
with session_scope() as session:
submission = SubmissionModel.find_by_id(submission_id)
submission: SubmissionModel = SubmissionModel.find_by_id(submission_id)
if status := submission.status not in [SubmissionStatus.SUBMITTED,
SubmissionStatus.REJECTED, SubmissionStatus.PENDING]:
raise BadRequestError(f"Cannot replace a document with status {status}.")
Expand All @@ -101,7 +102,8 @@ def replace(self, submission_id, request_data):
session=session,
item_id=submission.item_id,
submitted_document_id=submitted_document.id,
original_submission_id=submission.id
original_submission_id=submission.id, # original is the immediate parent id
root_submission_id=submission.root_submission_id # root id is the first submission id in the chain
)
submission.active = False
session.add(submission)
Expand Down Expand Up @@ -141,7 +143,8 @@ def _create_submitted_document(session, request_data):
return submitted_document

@staticmethod
def _create_submission(session, item_id, submitted_document_id, original_submission_id=None):
def _create_submission(session, item_id, submitted_document_id, original_submission_id=None,
root_submission_id=None):
"""Create a new submission."""
major_version, minor_version = DocumentSubmissionCreator.get_document_version(item_id, original_submission_id)
submission = SubmissionModel(
Expand All @@ -150,8 +153,13 @@ def _create_submission(session, item_id, submitted_document_id, original_submiss
submitted_document_id=submitted_document_id,
major_version=major_version,
minor_version=minor_version,
created_by=TokenInfo.get_id()

created_by=TokenInfo.get_id(),
root_submission_id=root_submission_id
)
session.add(submission)
submission.flush()
# Set `root_submission_id` to its own ID if not provided
if submission.root_submission_id is None:
submission.root_submission_id = submission.id
submission.flush()

return submission

0 comments on commit 611c724

Please sign in to comment.