Table of Contents
This small web application helps collecting and analysing data about applications for funding to identify trends and patterns.
This is a dummy project and not intended to be used in production. It exclusively serves the purpose to develop my FastAPI and Python skills further
The system providing the data via an API accepts form submissions from our grants system, each application has a set of fields which describe the research the application is intended for.
-
Written in Python3+
-
Accepts a GET request over HTTP
-
Does not require authentication (it will be deployed internally)
-
Returns a JSON (i.e. application/json) response containing a sumulative report about the grant applications
-
The report that the service returns should contain the following information
-
The total number of submitted, approved and rejected applications per research area
-
For each of the past 12 months, the total submitted, approved, and rejected applications in each month
-
For each of the past 12 months, the sum of funding we approved in each month based on the applications data.
-
The average time in (days) between an application being received (submitted) and an outcome (approved or rejected)
-
A list of application ids which have not been actioned in more than 60 days from their submitted date (i.e. they are still in the submitted state).
This code is developed and tested to be deployed on macOS or Linux. It is not tested on Windows. I recommend using the Installation with Docker for Windows users.
- Python Version 3.10
- SQLAlchemy Version 2.0.8
- FastAPI 0.95.0
- Python-dateutil 2.8.2
To install all dependencies navigate into the project folder and run:
pip install -r requirements.txt
-
Clone the repo
git clone git@github.com:Slange-Mhath/reporting-service.git
-
Navigate into the project directory
cd reporting-service
-
Set the API_TOKEN as environment variable
export API_TOKEN=your_api_token
-
Run uvicorn to start the server
uvicorn main:app --reload
If you want to run this service in a Docker Container, no problem at all!
- Clone the repo
git clone git@github.com:Slange-Mhath/reporting-service.git
- Navigate into the project directory
cd reporting-service
- Build the Docker image
docker build -t reporting-service .
- Run the Docker container providing the API_TOKEN as environment
variable and
docker run -e API_TOKEN=YOUR-API-TOKEN -d --name my-reporting-service -p 8000:8000 reporting-service
- After a couple of minutes you should be able to access your container at http://127.0.0.1:8000/
To start up the server and get ready to request the report simply run:
./start_service.sh
This might take a couple of minutes if you run the command for the first time, as the DB needs to be filled by the requested data. You will then see the message:
"110000 applications successfully loaded into database."
Now you can access the endpoint in your browser http://127.0.0.1:8000/report/
You can of course also start the server and load the data manually by running the following commands:
uvicorn main:app --reload
and accessing:
[GET] http://127.0.0.1:8000/report/
Again, be aware that, if you access the endpoint for the first time, it might take a couple of minutes until you get a response.
If you want to update the data (e.g. when the data provided by the application changes) you can access the endpoint:
[POST] http://127.0.0.1:8000/load_applications/
If you are curious about the available endpoints have a look at the:
Swagger UI http://127.0.0.1:8000/docs
or
ReDoc UI at http://127.0.0.1:8000/redoc