Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Next Next commit
feat: Create end point last entries #215
  • Loading branch information
PaulRC-ioet committed Nov 16, 2020
commit 4dfbe7c2ae60982e1ce03d8205fd7d623a894c0c
20 changes: 20 additions & 0 deletions tests/time_tracker_api/time_entries/time_entries_namespace_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,26 @@ def test_list_all_time_entries(
dao_get_all_mock.assert_called_once()


def test_list_last_time_entries(
client: FlaskClient, mocker: MockFixture, valid_header: dict
):
from time_tracker_api.time_entries.time_entries_namespace import (
time_entries_dao,
)

dao_get_all_mock = mocker.patch.object(
time_entries_dao, 'get_last_projects_worked', return_value=[]
)

response = client.get(
"/time-entries/latest", headers=valid_header, follow_redirects=True
)

assert HTTPStatus.OK == response.status_code
assert [] == json.loads(response.data)
dao_get_all_mock.assert_called_once()


def test_get_time_entry_should_succeed_with_valid_id(
client: FlaskClient, mocker: MockFixture, valid_header: dict
):
Expand Down
70 changes: 63 additions & 7 deletions time_tracker_api/time_entries/time_entries_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,8 @@ def find_all_entries(
conditions=conditions,
custom_sql_conditions=custom_sql_conditions,
custom_params=custom_params,
max_count=kwargs.get("max_count", None),
offset=kwargs.get("offset", 0),
)
return time_entries

Expand All @@ -173,6 +175,7 @@ def count(
conditions: dict = None,
custom_sql_conditions: List[str] = None,
date_range: dict = None,
**kwargs,
):
conditions = conditions if conditions else {}
custom_sql_conditions = (
Expand Down Expand Up @@ -424,7 +427,8 @@ def get_all(self, conditions: dict = None, **kwargs) -> list:
conditions.update({"owner_id": event_ctx.user_id})

custom_query = self.build_custom_query(
is_admin=event_ctx.is_admin, conditions=conditions,
is_admin=event_ctx.is_admin,
conditions=conditions,
)
date_range = self.handle_date_filter_args(args=conditions)
limit = conditions.get("limit", None)
Expand All @@ -437,14 +441,56 @@ def get_all(self, conditions: dict = None, **kwargs) -> list:
max_count=limit,
)

def get_last_projects_worked(
self, conditions: dict = None, **kwargs
) -> list:
event_ctx = self.create_event_context("read-many")
conditions.update({"owner_id": event_ctx.user_id})
custom_query = self.build_custom_query(
is_admin=event_ctx.is_admin,
conditions=conditions,
)
date_range = self.handle_date_filter_args(args=conditions)

project_dao = projects_model.create_dao()
projects = project_dao.get_all()
projects_ids = [project.id for project in projects]

activity_dao = activities_model.create_dao()
activities = activity_dao.get_all(
visible_only=False,
)

result = []
for id_project in projects_ids:
conditions.update({"project_id": id_project})

limit = 2
latest = self.repository.find_all_entries(
event_ctx,
conditions=conditions,
custom_sql_conditions=custom_query,
date_range=date_range,
max_count=limit,
)

if len(latest) >= 1:
result.append(latest[0])

add_activity_name_to_time_entries(result, activities)
add_project_info_to_time_entries(result, projects)

return result

def get_all_paginated(self, conditions: dict = None, **kwargs) -> list:
get_all_conditions = dict(conditions)
get_all_conditions.pop("length")
get_all_conditions.pop("start")
event_ctx = self.create_event_context("read-many")
get_all_conditions.update({"owner_id": event_ctx.user_id})
custom_query = self.build_custom_query(
is_admin=event_ctx.is_admin, conditions=get_all_conditions,
is_admin=event_ctx.is_admin,
conditions=get_all_conditions,
)
date_range = self.handle_date_filter_args(args=get_all_conditions)
records_total = self.repository.count(
Expand All @@ -455,7 +501,8 @@ def get_all_paginated(self, conditions: dict = None, **kwargs) -> list:
)
conditions.update({"owner_id": event_ctx.user_id})
custom_query = self.build_custom_query(
is_admin=event_ctx.is_admin, conditions=conditions,
is_admin=event_ctx.is_admin,
conditions=conditions,
)
date_range = self.handle_date_filter_args(args=conditions)
length = conditions.get("length", None)
Expand Down Expand Up @@ -499,7 +546,11 @@ def update(self, id, data: dict, description=None):
time_entry = self.repository.find(id, event_ctx)
self.check_whether_current_user_owns_item(time_entry)

return self.repository.partial_update(id, data, event_ctx,)
return self.repository.partial_update(
id,
data,
event_ctx,
)

def stop(self, id):
event_ctx = self.create_event_context("update", "Stop time entry")
Expand All @@ -509,7 +560,9 @@ def stop(self, id):
self.check_time_entry_is_not_stopped(time_entry)

return self.repository.partial_update(
id, {'end_date': current_datetime_str()}, event_ctx,
id,
{'end_date': current_datetime_str()},
event_ctx,
)

def restart(self, id):
Expand All @@ -520,15 +573,18 @@ def restart(self, id):
self.check_time_entry_is_not_started(time_entry)

return self.repository.partial_update(
id, {'end_date': None}, event_ctx,
id,
{'end_date': None},
event_ctx,
)

def delete(self, id):
event_ctx = self.create_event_context("delete")
time_entry = self.repository.find(id, event_ctx)
self.check_whether_current_user_owns_item(time_entry)
self.repository.delete(
id, event_ctx,
id,
event_ctx,
)

def find_running(self):
Expand Down
12 changes: 12 additions & 0 deletions time_tracker_api/time_entries/time_entries_namespace.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,18 @@ def post(self):
return time_entries_dao.create(ns.payload), HTTPStatus.CREATED


@ns.route('/latest')
class TimeEntries(Resource):
@ns.doc('list_latest_time_entries')
@ns.expect(attributes_filter)
@ns.marshal_list_with(time_entry)
@ns.response(HTTPStatus.NOT_FOUND, 'Time entry not found')
def get(self):
"""List the latest time entries"""
conditions = attributes_filter.parse_args()
return time_entries_dao.get_last_projects_worked(conditions=conditions)


@ns.route('/<string:id>')
@ns.response(HTTPStatus.NOT_FOUND, 'This time entry does not exist')
@ns.response(HTTPStatus.UNPROCESSABLE_ENTITY, 'The id has an invalid format')
Expand Down