Skip to content

Commit

Permalink
Merge pull request #86 from jadmsaadaot/SUBMIT-TASK#74
Browse files Browse the repository at this point in the history
Display documents in sub package table and download on click
  • Loading branch information
jadmsaadaot authored Sep 24, 2024
2 parents 1b80e35 + 3eb1b4c commit 7215ba5
Show file tree
Hide file tree
Showing 24 changed files with 381 additions and 30 deletions.
2 changes: 1 addition & 1 deletion submit-api/migrations/versions/3eb2f30b742e_.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
Create Date: 2024-09-20 08:58:43.292848
"""
from alembic import op
import sqlalchemy as sa
from alembic import op


# revision identifiers, used by Alembic.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
""" Add version column to submissions
Revision ID: d8ac6fff4ec6
Revises: 3eb2f30b742e
Create Date: 2024-09-24 10:17:56.906370
"""
import sqlalchemy as sa
from alembic import op


# revision identifiers, used by Alembic.
revision = 'd8ac6fff4ec6'
down_revision = '3eb2f30b742e'
branch_labels = None
depends_on = None


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('submissions', schema=None) as batch_op:
batch_op.add_column(sa.Column('version', sa.Integer(), nullable=False, server_default='1'))

# ### end Alembic commands ###


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table('submissions', schema=None) as batch_op:
batch_op.drop_column('version')

# ### end Alembic commands ###
12 changes: 11 additions & 1 deletion submit-api/src/submit_api/models/base_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
from sqlalchemy import Column
from sqlalchemy.ext.declarative import declared_attr

from submit_api.utils.token_info import TokenInfo

from .db import db


Expand All @@ -34,13 +36,21 @@ class BaseModel(db.Model):
@declared_attr
def created_by(cls): # pylint:disable=no-self-argument, no-self-use, # noqa: N805
"""Return foreign key for created by."""
return Column(db.String(50))
return Column(db.String(50), default=cls._get_current_user)

@declared_attr
def updated_by(cls): # pylint:disable=no-self-argument, no-self-use, # noqa: N805
"""Return foreign key for modified by."""
return Column(db.String(50))

@staticmethod
def _get_current_user():
"""Return the current user.
Used to populate the created_by and modified_by relationships on all models.
"""
return TokenInfo.get_id()

@classmethod
def find_by_id(cls, identifier: int):
"""Return model by id."""
Expand Down
6 changes: 6 additions & 0 deletions submit-api/src/submit_api/models/submission.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,12 @@ class Submission(BaseModel):
submitted_document_id = Column(db.Integer, ForeignKey('submitted_documents.id'), nullable=True)
submitted_form = db.relationship('SubmittedForm', foreign_keys=[submitted_form_id], lazy='joined')
submitted_document = db.relationship('SubmittedDocument', foreign_keys=[submitted_document_id], lazy='joined')
version = Column(db.Integer, nullable=False, default=1)
account_user = db.relationship(
'AccountUser',
primaryjoin="foreign(Submission.created_by) == AccountUser.auth_guid",
lazy='joined'
)

Index('idx_submissions_type_item_id', type, item_id)

Expand Down
4 changes: 4 additions & 0 deletions submit-api/src/submit_api/resources/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from submit_api.services.account_service import AccountService
from submit_api.utils.util import cors_preflight

from ..auth import auth
from .apihelper import Api as ApiHelper


Expand All @@ -45,6 +46,7 @@ class Accounts(Resource):
@staticmethod
@API.response(code=HTTPStatus.OK, description="Success", model=[account_list_model])
@ApiHelper.swagger_decorators(API, endpoint_description="Fetch all accounts")
@auth.require
@cors.crossdomain(origin="*")
def get():
"""Fetch all accounts."""
Expand All @@ -57,6 +59,7 @@ def get():
@API.expect(account_create_model)
@API.response(code=HTTPStatus.CREATED, model=account_list_model, description="Account Created")
@API.response(HTTPStatus.BAD_REQUEST, "Bad Request")
@auth.require
@cors.crossdomain(origin="*")
def post():
"""Create an account."""
Expand All @@ -75,6 +78,7 @@ class User(Resource):
@ApiHelper.swagger_decorators(API, endpoint_description="Fetch a account by proponent id")
@API.response(code=200, model=account_list_model, description="Success")
@API.response(404, "Not Found")
@auth.require
@cors.crossdomain(origin="*")
def get(proponent_id):
"""Fetch an account by proponent id."""
Expand Down
2 changes: 2 additions & 0 deletions submit-api/src/submit_api/resources/item.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from submit_api.services.item import ItemService
from submit_api.utils.util import cors_preflight

from ..auth import auth
from .apihelper import Api as ApiHelper


Expand All @@ -47,6 +48,7 @@ class Item(Resource):
)
@API.response(HTTPStatus.BAD_REQUEST, "Bad Request")
@cors.crossdomain(origin="*")
@auth.require
def get(item_id):
"""Get item by id."""
projects = ItemService.get_item_by_id(item_id)
Expand Down
3 changes: 3 additions & 0 deletions submit-api/src/submit_api/resources/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from submit_api.services.package import PackageService
from submit_api.utils.util import cors_preflight

from ..auth import auth
from .apihelper import Api as ApiHelper


Expand Down Expand Up @@ -50,6 +51,7 @@ class Package(Resource):
)
@API.response(HTTPStatus.BAD_REQUEST, "Bad Request")
@cors.crossdomain(origin="*")
@auth.require
def get(package_id):
"""Get package by id."""
projects = PackageService.get_package_by_id(package_id)
Expand All @@ -68,6 +70,7 @@ class PackageByAccountProject(Resource):
code=HTTPStatus.CREATED, model=package_model, description="Submission Package"
)
@API.response(HTTPStatus.BAD_REQUEST, "Bad Request")
@auth.require
@cors.crossdomain(origin="*")
def post(account_project_id):
"""Create a submission package."""
Expand Down
3 changes: 3 additions & 0 deletions submit-api/src/submit_api/resources/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from submit_api.services.project_service import ProjectService
from submit_api.utils.util import cors_preflight

from ..auth import auth
from .apihelper import Api as ApiHelper


Expand Down Expand Up @@ -50,6 +51,7 @@ class ProjectsByAccount(Resource):
code=HTTPStatus.CREATED, model=project_list_model, description="Get projects"
)
@API.response(HTTPStatus.BAD_REQUEST, "Bad Request")
@auth.require
@cors.crossdomain(origin="*")
def get(account_id):
"""Get projects by account id."""
Expand All @@ -63,6 +65,7 @@ def get(account_id):
code=HTTPStatus.CREATED, model=project_list_model, description="Added projects"
)
@API.response(HTTPStatus.BAD_REQUEST, "Bad Request")
@auth.require
@cors.crossdomain(origin="*")
def post(account_id):
"""Add projects in bulk."""
Expand Down
2 changes: 2 additions & 0 deletions submit-api/src/submit_api/resources/submission.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from submit_api.services.submission import SubmissionService
from submit_api.utils.util import cors_preflight

from ..auth import auth
from .apihelper import Api as ApiHelper


Expand Down Expand Up @@ -49,6 +50,7 @@ class SubmissionByItem(Resource):
)
@API.response(HTTPStatus.BAD_REQUEST, "Bad Request")
@cors.crossdomain(origin="*")
@auth.require
def post(submission_item_id):
"""Create a submission."""
create_submission_data = CreateSubmissionRequestSchema().load(API.payload)
Expand Down
2 changes: 2 additions & 0 deletions submit-api/src/submit_api/resources/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from submit_api.exceptions import ResourceNotFoundError
from submit_api.utils.util import cors_preflight

from ..auth import auth
from ..schemas.user import UserSchema
from ..services.user_service import UserService
from .apihelper import Api as ApiHelper
Expand All @@ -44,6 +45,7 @@ class User(Resource):
@ApiHelper.swagger_decorators(API, endpoint_description="Fetch a user by guid")
@API.response(code=200, model=user_model, description="Success")
@API.response(404, "Not Found")
@auth.require
@cors.crossdomain(origin="*")
def get(guid):
"""Fetch an account by id."""
Expand Down
25 changes: 25 additions & 0 deletions submit-api/src/submit_api/schemas/account_user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
"""Item schema class.
Manages the item schema
"""

from marshmallow import EXCLUDE, Schema, fields


class AccountUserSchema(Schema):
"""item schema."""

class Meta: # pylint: disable=too-few-public-methods
"""Exclude unknown fields in the deserialized output."""

unknown = EXCLUDE

id = fields.Int(data_key="id")
account_id = fields.Int(data_key="account_id")
first_name = fields.Str(data_key="first_name")
last_name = fields.Str(data_key="last_name")
full_name = fields.Str(data_key="full_name")
position = fields.Str(data_key="position")
work_email_address = fields.Str(data_key="work_email_address")
work_contact_number = fields.Str(data_key="work_contact_number")
auth_guid = fields.Str(data_key="auth_guid")
7 changes: 6 additions & 1 deletion submit-api/src/submit_api/schemas/item.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@

from submit_api.models.item import ItemStatus
from submit_api.models.submission import SubmissionTypeStatus
from submit_api.schemas.account_user import AccountUserSchema
from submit_api.schemas.item_type import ItemTypeSchema
from submit_api.schemas.submission import SubmittedFormSchema, SubmittedDocumentSchema
from submit_api.schemas.submission import SubmittedDocumentSchema, SubmittedFormSchema


class ItemSubmissionSchema(Schema):
Expand All @@ -26,6 +27,10 @@ class Meta: # pylint: disable=too-few-public-methods
submitted_form_id = fields.Int(data_key="submitted_form_id")
submitted_form = fields.Nested(SubmittedFormSchema, data_key="submitted_form")
submitted_document = fields.Nested(SubmittedDocumentSchema, data_key="submitted_document")
created_date = fields.DateTime(data_key="created_date")
created_by = fields.Str(data_key="created_by")
account_user = fields.Nested(AccountUserSchema, data_key="account_user")
version = fields.Int(data_key="version")


class ItemSchema(Schema):
Expand Down
7 changes: 7 additions & 0 deletions submit-api/src/submit_api/schemas/submission.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

from marshmallow import EXCLUDE, Schema, fields

from submit_api.schemas.account_user import AccountUserSchema


class SubmittedFormSchema(Schema):
"""submitted form schema."""
Expand All @@ -30,6 +32,8 @@ class Meta: # pylint: disable=too-few-public-methods
id = fields.Int(data_key="id")
name = fields.Str(data_key="name")
url = fields.Str(data_key="url")
created_date = fields.DateTime(data_key="created_date")
created_by = fields.Str(data_key="created_by")


class SubmissionSchema(Schema):
Expand All @@ -48,6 +52,9 @@ class Meta: # pylint: disable=too-few-public-methods
submitted_form = fields.Nested(SubmittedFormSchema, data_key="submitted_form")
submitted_document = fields.Nested(SubmittedDocumentSchema, data_key="submitted_document")
created_date = fields.DateTime(data_key="created_date")
created_by = fields.Str(data_key="created_by")
account_user = fields.Nested(AccountUserSchema, data_key="account_user")
version = fields.Int(data_key="version")


class CreateSubmissionRequestSchema(Schema):
Expand Down
4 changes: 2 additions & 2 deletions submit-api/src/submit_api/services/submission/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

from submit_api.models.submission import Submission as SubmissionModel
from submit_api.models.submission import SubmissionTypeStatus
from submit_api.services.submission.submission_creator_factory import FormSubmissionCreator, SubmissionCreatorFactory, \
DocumentSubmissionCreator
from submit_api.services.submission.submission_creator_factory import (
DocumentSubmissionCreator, FormSubmissionCreator, SubmissionCreatorFactory)


class SubmissionService:
Expand Down
32 changes: 32 additions & 0 deletions submit-api/src/submit_api/utils/token_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""Helper for token decoding."""
from flask import g

from submit_api.utils.user_context import UserContext, user_context


class TokenInfo:
"""Token info."""

@staticmethod
@user_context
def get_id(**kwargs):
"""Get the user identifier."""
try:
user_from_context: UserContext = kwargs['user_context']
return user_from_context.sub
except AttributeError:
return None

@staticmethod
def get_user_data():
"""Get the user data."""
token_info = g.jwt_oidc_token_info
user_data = {
'external_id': token_info.get('sub', None),
'first_name': token_info.get('given_name', None),
'last_name': token_info.get('family_name', None),
'email_address': token_info.get('email', None),
'username': token_info.get('preferred_username', None),
'identity_provider': token_info.get('identity_provider', ''),
}
return user_data
Loading

0 comments on commit 7215ba5

Please sign in to comment.