From 6106970cbc38217045ca1dc8c892bd992cef37be Mon Sep 17 00:00:00 2001 From: EliuX Date: Tue, 10 Mar 2020 16:01:45 -0500 Subject: [PATCH] Fixes #4 Create API for activities --- README.md | 13 ++++- time_tracker_api/__init__.py | 4 +- time_tracker_api/activities/activities_api.py | 57 +++++++++++++++++++ time_tracker_api/api.py | 7 ++- ...{projects_endpoints.py => projects_api.py} | 2 +- 5 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 time_tracker_api/activities/activities_api.py rename time_tracker_api/projects/{projects_endpoints.py => projects_api.py} (96%) diff --git a/README.md b/README.md index 87c1760f..bea76b18 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,15 @@ # time-tracker-api +## Getting started +Follow the following instructions to get the project ready to use ASAP: + +### Requirements +Be sure you have installed in your system + +- [Python version 3](https://www.python.org/download/releases/3.0/) in your path. It will install +automatically [pip](https://pip.pypa.io/en/stable/) as well. +- A virtual environment, namely [venv](https://docs.python.org/3/library/venv.html). + ## Setup - Create and activate the environment, @@ -36,4 +46,5 @@ flask run ``` -- Open `http://127.0.0.1:5000/` in a browser \ No newline at end of file +- Open `http://127.0.0.1:5000/` in a browser. You will find in the presented UI +a link to the swagger.json with the definition of the api. \ No newline at end of file diff --git a/time_tracker_api/__init__.py b/time_tracker_api/__init__.py index a47c82cb..61cec3f1 100644 --- a/time_tracker_api/__init__.py +++ b/time_tracker_api/__init__.py @@ -9,6 +9,6 @@ def create_app(): return flask_app -def init_app(app): +def init_app(app: Flask): from .api import api - api.init_app(app) \ No newline at end of file + api.init_app(app) diff --git a/time_tracker_api/activities/activities_api.py b/time_tracker_api/activities/activities_api.py new file mode 100644 index 00000000..324c3c58 --- /dev/null +++ b/time_tracker_api/activities/activities_api.py @@ -0,0 +1,57 @@ +from flask_restplus import fields, Resource, Namespace + +ns = Namespace('activities', description='API for activities') + +# Activity Model +activity = ns.model('Activity', { + 'uid': fields.String(readOnly=True, required=True, title='Identifier', + description='The unique id of the activity'), + 'name': fields.String(required=True, title='Name', max_length=50, + description='Canonical name of the activity'), + 'description': fields.String(title='Description', + description='Comments about the activity'), + 'tenant_id': fields.String(required=True, title='Tenant', max_length=64, + description='The tenant this belongs to') +}) + + +@ns.route('/') +class Activities(Resource): + @ns.doc('list_activities') + @ns.marshal_list_with(activity, code=200) + def get(self): + """List all available activities""" + return [] + + @ns.doc('create_activity') + @ns.expect(activity) + @ns.marshal_with(activity, code=201) + @ns.response(400, 'Invalid format of the attributes of the activity.') + def post(self): + """Create a single activity""" + return ns.payload, 201 + + +@ns.route('/') +@ns.response(404, 'Activity not found') +@ns.param('uid', 'The unique identifier of the activity') +class Activity(Resource): + @ns.doc('get_activity') + @ns.marshal_with(activity) + def get(self, uid): + """Retrieve all the data of a single activity""" + return {} + + @ns.doc('delete_activity') + @ns.response(204, 'The activity was deleted successfully (No content is returned)') + def delete(self, uid): + """Deletes a activity""" + return None, 204 + + @ns.doc('put_activity') + @ns.response(400, 'Invalid format of the attributes of the activity.') + @ns.expect(activity) + @ns.marshal_with(activity) + def put(self, uid): + """Updates an activity""" + return ns.payload diff --git a/time_tracker_api/api.py b/time_tracker_api/api.py index 53edb25d..4f2742fa 100644 --- a/time_tracker_api/api.py +++ b/time_tracker_api/api.py @@ -5,5 +5,8 @@ description="API for the TimeTracker project") # APIs -from time_tracker_api.projects import projects_endpoints -api.add_namespace(projects_endpoints.ns) \ No newline at end of file +from time_tracker_api.projects import projects_api +api.add_namespace(projects_api.ns) + +from time_tracker_api.activities import activities_api +api.add_namespace(activities_api.ns) diff --git a/time_tracker_api/projects/projects_endpoints.py b/time_tracker_api/projects/projects_api.py similarity index 96% rename from time_tracker_api/projects/projects_endpoints.py rename to time_tracker_api/projects/projects_api.py index eabc6fa8..5cbbd0f1 100644 --- a/time_tracker_api/projects/projects_endpoints.py +++ b/time_tracker_api/projects/projects_api.py @@ -2,7 +2,7 @@ from .projects_model import project_dao from time_tracker_api.errors import MissingResource -ns = Namespace('projects', description='Api for resource `Projects`') +ns = Namespace('projects', description='API for projects (clients)') @ns.route('/') class Projects(Resource):