diff --git a/tests/activities/activities_namespace_test.py b/tests/activities/activities_namespace_test.py index fd1e2f2e..fb1045d3 100644 --- a/tests/activities/activities_namespace_test.py +++ b/tests/activities/activities_namespace_test.py @@ -8,7 +8,8 @@ valid_activity_data = { "name": fake.company(), - "description": fake.paragraph() + "description": fake.paragraph(), + "tenant_id": fake.uuid4() } fake_activity = ({ diff --git a/tests/projects/projects_namespace_test.py b/tests/projects/projects_namespace_test.py index 4d800b25..2e077640 100644 --- a/tests/projects/projects_namespace_test.py +++ b/tests/projects/projects_namespace_test.py @@ -11,8 +11,11 @@ valid_project_data = { "name": fake.company(), "description": fake.paragraph(), - "type": fake.word(PROJECT_TYPE.valid_type_values()), + 'customer_id': fake.uuid4(), + 'tenant_id': fake.uuid4(), + 'project_type_id': fake.uuid4() } + fake_project = ({ "id": fake.random_int(1, 9999) }).update(valid_project_data) diff --git a/tests/resources.py b/tests/resources.py index 7d7f64d4..662f3215 100644 --- a/tests/resources.py +++ b/tests/resources.py @@ -1,9 +1,12 @@ from time_tracker_api.sql_repository import db, AuditedSQLModel +from sqlalchemy_utils import UUIDType +import uuid + class PersonSQLModel(db.Model, AuditedSQLModel): __tablename__ = 'test' - id = db.Column(db.Integer, primary_key=True) + id = db.Column(UUIDType(binary=False), primary_key=True, default=uuid.uuid4) name = db.Column(db.String(80), unique=False, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) age = db.Column(db.Integer, nullable=False) diff --git a/tests/time_entries/time_entries_namespace_test.py b/tests/time_entries/time_entries_namespace_test.py index 7d1f931e..09be8af9 100644 --- a/tests/time_entries/time_entries_namespace_test.py +++ b/tests/time_entries/time_entries_namespace_test.py @@ -7,12 +7,13 @@ fake = Faker() valid_time_entry_input = { - "project_id": fake.random_int(1, 9999), - "activity_id": fake.random_int(1, 9999), - "technologies": fake.words(3, ['java', 'javascript', 'python', 'azure'], unique=True), + "project_id": fake.uuid4(), + "activity_id": fake.uuid4(), "description": fake.paragraph(nb_sentences=2), "start_date": fake.iso8601(end_datetime=None), "end_date": fake.iso8601(end_datetime=None), + "owner_id": fake.uuid4(), + "tenant_id": fake.uuid4() } fake_time_entry = ({ "id": fake.random_int(1, 9999), diff --git a/time_tracker_api/activities/activities_model.py b/time_tracker_api/activities/activities_model.py index 8a6c5997..86d91754 100644 --- a/time_tracker_api/activities/activities_model.py +++ b/time_tracker_api/activities/activities_model.py @@ -7,13 +7,17 @@ class ActivityDao(CRUDDao): def create_dao() -> ActivityDao: from time_tracker_api.sql_repository import db - from time_tracker_api.sql_repository import SQLCRUDDao, AuditedSQLModel + from time_tracker_api.sql_repository import SQLCRUDDao + from sqlalchemy_utils import UUIDType + import uuid - class ActivitySQLModel(db.Model, AuditedSQLModel): + class ActivitySQLModel(db.Model): __tablename__ = 'activity' - id = db.Column(db.Integer, primary_key=True) + id = db.Column(UUIDType(binary=False), primary_key=True, default=uuid.uuid4) name = db.Column(db.String(50), unique=True, nullable=False) description = db.Column(db.String(250), unique=False, nullable=False) + deleted = db.Column(UUIDType(binary=False), default=uuid.uuid4) + tenant_id = db.Column(UUIDType(binary=False), default=uuid.uuid4) def __repr__(self): return '' % self.name diff --git a/time_tracker_api/activities/activities_namespace.py b/time_tracker_api/activities/activities_namespace.py index 8d399659..c63b5f56 100644 --- a/time_tracker_api/activities/activities_namespace.py +++ b/time_tracker_api/activities/activities_namespace.py @@ -24,6 +24,12 @@ description='Comments about the activity', example=faker.paragraph(), ), + 'tenant_id': fields.String( + required=True, + title='Identifier of Tenant', + description='Tenant this activity belongs to', + example=faker.uuid4(), + ) }) activity_response_fields = { @@ -32,8 +38,8 @@ required=True, title='Identifier', description='The unique identifier', - example=faker.random_int(1, 9999), - ) + example=faker.uuid4(), + ), } activity_response_fields.update(audit_fields) diff --git a/time_tracker_api/api.py b/time_tracker_api/api.py index 5a0156cd..cb1a6afa 100644 --- a/time_tracker_api/api.py +++ b/time_tracker_api/api.py @@ -14,31 +14,12 @@ # Common models structure audit_fields = { - 'created_at': fields.Date( + 'deleted': fields.String( readOnly=True, - title='Created', - description='Date of creation', - example=faker.iso8601(end_datetime=None), - ), - 'updated_at': fields.Date( - readOnly=True, - title='Updated', - description='Date of update', - example=faker.iso8601(end_datetime=None), - ), - 'created_by': fields.String( - readOnly=True, - title='Creator', - max_length=64, - description='User that created it', - example='anonymous', - ), - 'updated_by': fields.String( - readOnly=True, - title='Updater', - max_length=64, - description='User that updated it', - example='anonymous', + required=True, + title='Last event Identifier', + description='Last event over this resource', + example=faker.uuid4(), ), } diff --git a/time_tracker_api/projects/projects_model.py b/time_tracker_api/projects/projects_model.py index f0968885..fbf1630f 100644 --- a/time_tracker_api/projects/projects_model.py +++ b/time_tracker_api/projects/projects_model.py @@ -19,15 +19,19 @@ class ProjectDao(CRUDDao): def create_dao() -> ProjectDao: from time_tracker_api.sql_repository import db from time_tracker_api.database import COMMENTS_MAX_LENGTH - from time_tracker_api.sql_repository import SQLCRUDDao, AuditedSQLModel + from time_tracker_api.sql_repository import SQLCRUDDao + from sqlalchemy_utils import UUIDType + import uuid - class ProjectSQLModel(db.Model, AuditedSQLModel): + class ProjectSQLModel(db.Model): __tablename__ = 'project' - id = db.Column(db.Integer, primary_key=True) + id = db.Column(UUIDType(binary=False), primary_key=True, default=uuid.uuid4) name = db.Column(db.String(50), unique=True, nullable=False) description = db.Column(db.String(COMMENTS_MAX_LENGTH), unique=False, nullable=False) - type = db.Column(db.String(10), nullable=False) - active = db.Column(db.Boolean, default=True) + project_type_id = db.Column(UUIDType(binary=False), default=uuid.uuid4) + customer_id = db.Column(UUIDType(binary=False), default=uuid.uuid4) + deleted = db.Column(UUIDType(binary=False), default=uuid.uuid4) + tenant_id = db.Column(UUIDType(binary=False), default=uuid.uuid4) def __repr__(self): return '' % self.name diff --git a/time_tracker_api/projects/projects_namespace.py b/time_tracker_api/projects/projects_namespace.py index 51c20e51..5e236a3f 100644 --- a/time_tracker_api/projects/projects_namespace.py +++ b/time_tracker_api/projects/projects_namespace.py @@ -24,20 +24,23 @@ description='Description about the project', example=faker.paragraph(), ), - 'type': fields.String( - required=False, - title='Type', - max_length=10, - description='If it is `Costumer`, `Training` or other type', - enum=PROJECT_TYPE.valid_type_values(), - example=faker.word(PROJECT_TYPE.valid_type_values()), + 'customer_id': fields.String( + required=True, + title='Identifier of the Customer', + description='Customer this project belongs to', + example=faker.uuid4(), ), - 'active': fields.Boolean( - title='Is active?', - description='Whether the project is active or not', - default=True, - example=faker.boolean(), + 'tenant_id': fields.String( + required=True, + title='Identifier of Tenant', + description='Tenant this project belongs to', + example=faker.uuid4(), ), + 'project_type_id': fields.String( + title='Identifier of Project type', + description='Type of the project. Used for grouping', + example=faker.uuid4(), + ) }) project_response_fields = { @@ -46,7 +49,7 @@ required=True, title='Identifier', description='The unique identifier', - example=faker.random_int(1, 9999), + example=faker.uuid4(), ) } project_response_fields.update(audit_fields) diff --git a/time_tracker_api/time_entries/time_entries_model.py b/time_tracker_api/time_entries/time_entries_model.py index 7e216557..1460685b 100644 --- a/time_tracker_api/time_entries/time_entries_model.py +++ b/time_tracker_api/time_entries/time_entries_model.py @@ -10,21 +10,27 @@ class TimeEntriesDao(CRUDDao): def create_dao() -> TimeEntriesDao: from time_tracker_api.sql_repository import db from time_tracker_api.database import COMMENTS_MAX_LENGTH - from time_tracker_api.sql_repository import SQLCRUDDao, AuditedSQLModel + from time_tracker_api.sql_repository import SQLCRUDDao + from sqlalchemy_utils import UUIDType + import uuid - class TimeEntrySQLModel(db.Model, AuditedSQLModel): + class TimeEntrySQLModel(db.Model): __tablename__ = 'time_entry' - id = db.Column(db.Integer, primary_key=True) + id = db.Column(UUIDType(binary=False), primary_key=True, default=uuid.uuid4) description = db.Column(db.String(COMMENTS_MAX_LENGTH)) start_date = db.Column(db.DateTime, server_default=db.func.now()) end_date = db.Column(db.DateTime) - project_id = db.Column(db.Integer, + project_id = db.Column(UUIDType(binary=False), db.ForeignKey('project.id'), nullable=False) - activity_id = db.Column(db.Integer, + activity_id = db.Column(UUIDType(binary=False), db.ForeignKey('activity.id'), nullable=False) technologies = db.Column(ScalarListType()) + uri = db.Column(db.String(500)) + owner_id = db.Column(UUIDType(binary=False), default=uuid.uuid4) + deleted = db.Column(UUIDType(binary=False), default=uuid.uuid4) + tenant_id = db.Column(UUIDType(binary=False), default=uuid.uuid4) @property def running(self): diff --git a/time_tracker_api/time_entries/time_entries_namespace.py b/time_tracker_api/time_entries/time_entries_namespace.py index 936347b8..a5d71ca5 100644 --- a/time_tracker_api/time_entries/time_entries_namespace.py +++ b/time_tracker_api/time_entries/time_entries_namespace.py @@ -14,28 +14,17 @@ # TimeEntry Model time_entry_input = ns.model('TimeEntryInput', { - 'project_id': fields.Integer( + 'project_id': fields.String( required=True, title='Project', description='The id of the selected project', - example=faker.random_int(1, 9999), + example=faker.uuid4(), ), - 'activity_id': fields.Integer( + 'activity_id': fields.String( + required=True, title='Activity', description='The id of the selected activity', - example=faker.random_int(1, 9999), - ), - 'technologies': fields.List( - fields.String( - required=True, - title='Technologies', - description='Technology names used in this time-entry', - ), - example=faker.words( - 3, - ['java', 'elixir', 'python', 'docker'], - unique=True - ) + example=faker.uuid4(), ), 'description': fields.String( title='Comments', @@ -54,6 +43,30 @@ description='When the user ended doing this activity', example=faker.iso8601(end_datetime=None), ), + 'uri': fields.String( + title='Uniform Resource identifier', + description='Either identifier or locator', + example=faker.words( + 1, + [ + 'https://github.com/ioet/time-tracker-backend/issues/51', + '#54', + 'TT-54' + ] + ), + ), + 'owner_id': fields.String( + required=True, + title='Owner of time entry', + description='User who owns the time entry', + example=faker.uuid4(), + ), + 'tenant_id': fields.String( + required=True, + title='Identifier of Tenant', + description='Tenant this project belongs to', + example=faker.uuid4(), + ), }) time_entry_response_fields = { @@ -61,7 +74,7 @@ readOnly=True, title='Identifier', description='The unique identifier', - example=faker.random_int(1, 9999), + example=faker.uuid4(), ), 'running': fields.Boolean( readOnly=True,