Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions commons/data_access_layer/cosmos_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def delete_container(self, container_id: str):
cosmos_helper: CosmosDBFacade = None


class CosmosDBModel():
class CosmosDBModel:
def __init__(self, data):
names = set([f.name for f in dataclasses.fields(self)])
for k, v in data.items():
Expand Down Expand Up @@ -124,7 +124,7 @@ def create_custom_sql_conditions(custom_sql_conditions: List[str]) -> str:
return ''

@staticmethod
def generate_params(conditions: dict) -> dict:
def generate_params(conditions: dict) -> list:
result = []
for k, v in conditions.items():
result.append({
Expand Down Expand Up @@ -255,9 +255,10 @@ class CosmosDBDao(CRUDDao):
def __init__(self, repository: CosmosDBRepository):
self.repository = repository

def get_all(self, conditions: dict = {}) -> list:
def get_all(self, conditions: dict = None, **kwargs) -> list:
conditions = conditions if conditions else {}
event_ctx = self.create_event_context("read-many")
return self.repository.find_all(event_ctx, conditions=conditions)
return self.repository.find_all(event_ctx, conditions=conditions, **kwargs)

def get(self, id):
event_ctx = self.create_event_context("read")
Expand Down
2 changes: 1 addition & 1 deletion time_tracker_api/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

class CRUDDao(abc.ABC):
@abc.abstractmethod
def get_all(self, conditions: dict):
def get_all(self, conditions: dict = None, **kwargs):
raise NotImplementedError # pragma: no cover

@abc.abstractmethod
Expand Down
47 changes: 38 additions & 9 deletions time_tracker_api/projects/projects_model.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from dataclasses import dataclass

from azure.cosmos import PartitionKey

from commons.data_access_layer.cosmos_db import CosmosDBModel, CosmosDBDao, CosmosDBRepository
from time_tracker_api.database import CRUDDao, APICosmosDBDao
from time_tracker_api.customers.customers_model import create_dao as customers_create_dao
from time_tracker_api.customers.customers_model import CustomerCosmosDBModel


class ProjectDao(CRUDDao):
Expand Down Expand Up @@ -34,19 +34,48 @@ class ProjectCosmosDBModel(CosmosDBModel):
def __init__(self, data):
super(ProjectCosmosDBModel, self).__init__(data) # pragma: no cover

def __contains__(self, item):
if type(item) is CustomerCosmosDBModel:
return True if item.id == self.customer_id else False
else:
raise NotImplementedError

def __repr__(self):
return '<Project %r>' % self.name # pragma: no cover

def __str___(self):
return "the project \"%s\"" % self.name # pragma: no cover


def create_dao() -> ProjectDao:
repository = CosmosDBRepository.from_definition(container_definition,
mapper=ProjectCosmosDBModel)
class ProjectCosmosDBRepository(CosmosDBRepository):
def __init__(self):
CosmosDBRepository.__init__(self, container_id=container_definition['id'],
partition_key_attribute='tenant_id',
mapper=ProjectCosmosDBModel)


class ProjectCosmosDBDao(APICosmosDBDao, ProjectDao):
def __init__(self):
CosmosDBDao.__init__(self, repository)
class ProjectCosmosDBDao(APICosmosDBDao, ProjectDao):
def __init__(self, repository):
CosmosDBDao.__init__(self, repository)

def get_all(self, conditions: dict = None, **kwargs) -> list:
"""
Get all the projects an active client has
:param (dict) conditions: Conditions for querying the database
:param (dict) kwargs: Pass arguments
:return (list): ProjectCosmosDBModel object list
"""
event_ctx = self.create_event_context("read-many")
customer_dao = customers_create_dao()
customers = customer_dao.get_all()

customers_id = [customer.id for customer in customers]
conditions = conditions if conditions else {}
custom_condition = "c.customer_id IN {}".format(str(tuple(customers_id)))
return self.repository.find_all(event_ctx, conditions, custom_sql_conditions=[custom_condition], **kwargs)


def create_dao() -> ProjectDao:
repository = ProjectCosmosDBRepository()

return ProjectCosmosDBDao()
return ProjectCosmosDBDao(repository)