Skip to content

Commit ef1ffe7

Browse files
authored
Merge pull request #100 from ioet/feature/Autogenerate-start_date#96
Close #96 Autogenerate start_date if not present
2 parents 4a7062d + 53613df commit ef1ffe7

File tree

5 files changed

+41
-21
lines changed

5 files changed

+41
-21
lines changed

commons/data_access_layer/cosmos_db.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ def create(self, data: dict, mapper: Callable = None):
139139
function_mapper = self.get_mapper_or_dict(mapper)
140140
return function_mapper(self.container.create_item(body=data))
141141

142-
def find(self, id: str, partition_key_value, peeker: 'function' = None, visible_only=True, mapper: Callable = None):
142+
def find(self, id: str, partition_key_value, peeker: 'function' = None,
143+
visible_only=True, mapper: Callable = None):
143144
found_item = self.container.read_item(id, partition_key_value)
144145
if peeker:
145146
peeker(found_item)
@@ -201,7 +202,7 @@ def get_page_size_or(self, custom_page_size: int) -> int:
201202

202203
def on_create(self, new_item_data: dict):
203204
if new_item_data.get('id') is None:
204-
new_item_data['id'] = str(uuid.uuid4())
205+
new_item_data['id'] = generate_uuid4()
205206

206207
def on_update(self, update_item_data: dict):
207208
pass
@@ -245,17 +246,25 @@ def __init__(self, status_code: int, description: str = None):
245246
self.description = description
246247

247248

248-
def current_datetime():
249+
def current_datetime() -> datetime:
249250
return datetime.utcnow()
250251

251252

252-
def datetime_str(value: datetime):
253+
def datetime_str(value: datetime) -> str:
253254
if value is not None:
254255
return value.isoformat()
255256
else:
256257
return None
257258

258259

260+
def current_datetime_str() -> str:
261+
return datetime_str(current_datetime())
262+
263+
264+
def generate_uuid4() -> str:
265+
return str(uuid.uuid4())
266+
267+
259268
def init_app(app: Flask) -> None:
260269
global cosmos_helper
261270
cosmos_helper = CosmosDBFacade.from_flask_config(app)

tests/conftest.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,13 @@ def another_item(cosmos_db_repository: CosmosDBRepository, tenant_id: str) -> di
137137

138138

139139
@pytest.fixture(scope="module")
140-
def time_entry_repository() -> TimeEntryCosmosDBRepository:
140+
def time_entry_repository(app: Flask) -> TimeEntryCosmosDBRepository:
141+
with app.app_context():
142+
from commons.data_access_layer.cosmos_db import init_app, cosmos_helper
143+
144+
if cosmos_helper is None:
145+
init_app(app)
146+
141147
return TimeEntryCosmosDBRepository()
142148

143149

@@ -147,7 +153,6 @@ def running_time_entry(time_entry_repository: TimeEntryCosmosDBRepository,
147153
tenant_id: str):
148154
created_time_entry = time_entry_repository.create({
149155
"project_id": fake.uuid4(),
150-
"start_date": datetime_str(current_datetime()),
151156
"owner_id": owner_id,
152157
"tenant_id": tenant_id
153158
})

tests/time_tracker_api/time_entries/time_entries_model_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def test_find_interception_with_date_range_should_find(start_date: datetime,
4848
partition_key_value=tenant_id)
4949

5050
assert result is not None
51-
assert len(result) >= 0
51+
assert len(result) > 0
5252
assert any([existing_item.id == item.id for item in result])
5353
finally:
5454
time_entry_repository.delete_permanently(existing_item.id, partition_key_value=existing_item.tenant_id)

time_tracker_api/time_entries/time_entries_model.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
from azure.cosmos import PartitionKey
66
from flask_restplus._http import HTTPStatus
77

8-
from commons.data_access_layer.cosmos_db import CosmosDBDao, CosmosDBRepository, CustomError, CosmosDBModel, \
9-
current_datetime, datetime_str
8+
from commons.data_access_layer.cosmos_db import CosmosDBDao, CosmosDBRepository, CustomError, current_datetime_str, \
9+
CosmosDBModel
1010
from commons.data_access_layer.database import CRUDDao
1111
from time_tracker_api.security import current_user_id
1212

@@ -34,15 +34,15 @@ def find_running(self):
3434

3535
@dataclass()
3636
class TimeEntryCosmosDBModel(CosmosDBModel):
37-
id: str
38-
description: str
3937
project_id: str
40-
activity_id: str
38+
start_date: str
4139
owner_id: str
40+
id: str
4241
tenant_id: str
42+
description: str = field(default=None)
43+
activity_id: str = field(default=None)
4344
uri: str = field(default=None)
4445
technologies: List[str] = field(default_factory=list)
45-
start_date: str = field(default_factory=current_datetime)
4646
end_date: str = field(default=None)
4747
deleted: str = field(default=None)
4848

@@ -76,6 +76,10 @@ def create_sql_ignore_id_condition(id: str):
7676

7777
def on_create(self, new_item_data: dict):
7878
CosmosDBRepository.on_create(self, new_item_data)
79+
80+
if new_item_data.get("start_date") is None:
81+
new_item_data['start_date'] = current_datetime_str()
82+
7983
self.validate_data(new_item_data)
8084

8185
def on_update(self, updated_item_data: dict):
@@ -88,7 +92,7 @@ def find_interception_with_date_range(self, start_date, end_date, owner_id, part
8892
params = self.append_conditions_values([
8993
{"name": "@partition_key_value", "value": partition_key_value},
9094
{"name": "@start_date", "value": start_date},
91-
{"name": "@end_date", "value": end_date or datetime_str(current_datetime())},
95+
{"name": "@end_date", "value": end_date or current_datetime_str()},
9296
{"name": "@ignore_id", "value": ignore_id},
9397
], conditions)
9498
result = self.container.query_items(
@@ -123,15 +127,17 @@ def find_running(self, partition_key_value: str, mapper: Callable = None):
123127
return function_mapper(next(result))
124128

125129
def validate_data(self, data):
130+
start_date = data.get('start_date')
131+
126132
if data.get('end_date') is not None:
127-
if data['end_date'] <= data.get('start_date'):
133+
if data['end_date'] <= start_date:
128134
raise CustomError(HTTPStatus.BAD_REQUEST,
129135
description="You must end the time entry after it started")
130-
if data['end_date'] >= datetime_str(current_datetime()):
136+
if data['end_date'] >= current_datetime_str():
131137
raise CustomError(HTTPStatus.BAD_REQUEST,
132138
description="You cannot end a time entry in the future")
133139

134-
collision = self.find_interception_with_date_range(start_date=data.get('start_date'),
140+
collision = self.find_interception_with_date_range(start_date=start_date,
135141
end_date=data.get('end_date'),
136142
owner_id=data.get('owner_id'),
137143
partition_key_value=data.get('tenant_id'),

time_tracker_api/time_entries/time_entries_namespace.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from flask_restplus import fields, Resource, Namespace
55
from flask_restplus._http import HTTPStatus
66

7-
from commons.data_access_layer.cosmos_db import current_datetime, datetime_str
7+
from commons.data_access_layer.cosmos_db import current_datetime, datetime_str, current_datetime_str
88
from commons.data_access_layer.database import COMMENTS_MAX_LENGTH
99
from time_tracker_api.api import common_fields, UUID_REGEX
1010
from time_tracker_api.time_entries.time_entries_model import create_dao
@@ -25,7 +25,7 @@
2525
'start_date': fields.DateTime(
2626
dt_format='iso8601',
2727
title='Start date',
28-
required=True,
28+
required=False,
2929
description='When the user started doing this activity',
3030
example=datetime_str(current_datetime() - timedelta(days=1)),
3131
),
@@ -48,7 +48,7 @@
4848
title='End date',
4949
required=False,
5050
description='When the user ended doing this activity',
51-
example=datetime_str(current_datetime()),
51+
example=current_datetime_str(),
5252
),
5353
'uri': fields.String(
5454
title='Uniform Resource identifier',
@@ -165,7 +165,7 @@ class StopTimeEntry(Resource):
165165
def post(self, id):
166166
"""Stop a running time entry"""
167167
return time_entries_dao.update(id, {
168-
'end_date': datetime_str(current_datetime())
168+
'end_date': current_datetime_str()
169169
})
170170

171171

0 commit comments

Comments
 (0)