
9 changed files with 477 additions and 47 deletions
@ -0,0 +1,196 @@ |
|||
# Autogestionale (work in progress) |
|||
|
|||
Autogestionale e' parte della suite **autogestionale+scassa** e si occupa di tenere il bilancio generale delle serate e dei gruppi che le organizzano. |
|||
|
|||
Dal momento che il progetto parte da una copia di [macao-pos](https://git.unit.macaomilano.org/crudo/macao-pos/) di seguito si trova una copia quasi invariata del suo readme. |
|||
|
|||
## Installation |
|||
|
|||
The only requirements are Python 3 and virtualenv as you're going to install all |
|||
the modules through pip. |
|||
|
|||
If you're using MySQL or PostgreSQL create now a new user and database. You can |
|||
also use SQLite for testing purposes. |
|||
|
|||
``` |
|||
cd /var/www |
|||
git clone ... |
|||
cd autogestionale |
|||
virtualenv -p python3 env |
|||
source env/bin/activate |
|||
pip install -r requirements.txt |
|||
``` |
|||
|
|||
Now you need to configure this software. Inside `doc/` you'll find some |
|||
examples. The default path for configurations in `conf/` but you can also use |
|||
`~/.config/autogestionale`, `/usr/local/etc/autogestionale` and `/etc/autogestionale` that will be checked in |
|||
this order. |
|||
|
|||
For a testing environment you can just do: |
|||
|
|||
``` |
|||
mkdir conf |
|||
cp docs/config_core/core_debug_sqlite.ini conf/core.ini |
|||
cp docs/config_logging/logging_debug.yaml conf/logging.yaml |
|||
``` |
|||
|
|||
and you're ready to go. |
|||
|
|||
For a production environment: |
|||
``` |
|||
cd /var/www/autogestionale |
|||
mkdir conf |
|||
cp docs/config_core/core_production_mysql.ini conf/core.ini |
|||
cp docs/config_logging/logging_production.yaml conf/logging.yaml |
|||
``` |
|||
|
|||
and then edit the conf/core.ini file to adjust the database params. Don't forget |
|||
to change the SECRET_KEY value (`openssl rand -hex 32` will help you). |
|||
|
|||
If you want to change the log file path open your `conf/logging.yaml` and |
|||
change the `filename` field of the `file` entry inside the `handlers` category. |
|||
|
|||
### Building the database |
|||
|
|||
You also need to add some entries to the database. |
|||
|
|||
First of all add a new user. Get inside the virtualenv and then just do: |
|||
|
|||
``` |
|||
python3 cli.py user add username password |
|||
``` |
|||
|
|||
Add some categories with: |
|||
|
|||
``` |
|||
python3 cli.py category add "Birra" |
|||
python3 cli.py category add "Super" |
|||
python3 cli.py category add "Altro" |
|||
``` |
|||
|
|||
Add some products with: |
|||
|
|||
``` |
|||
python3 cli.py product add -c 1 "Birra media" 3 |
|||
python3 cli.py product add -c 1 "Birra grande" 4 |
|||
python3 cli.py product add -c 2 "Vino" 4 |
|||
python3 cli.py product add -c 2 "Cocktail" 5 |
|||
python3 cli.py product add -c 2 "Amaro" 2 |
|||
python3 cli.py product add -c 3 "Acqua" 0.5 |
|||
``` |
|||
|
|||
And finally add and event you can play with: |
|||
|
|||
``` |
|||
python3 cli.py event add "My party" "2017-03-19 22:00" "2017-03-22 07:00" |
|||
``` |
|||
|
|||
## Running |
|||
|
|||
You can run this software within the virtualenv with: |
|||
|
|||
``` |
|||
python3 web.py |
|||
``` |
|||
|
|||
## REST API |
|||
|
|||
### Authentication |
|||
|
|||
* **URL**: `/api/token` |
|||
* **Method**: `POST` |
|||
* **Success response**: |
|||
* **Code**: 200 |
|||
* **Content**: |
|||
``` |
|||
{ |
|||
"token": "3ea90c63-4b92-465e-bee8-018a4c569252", |
|||
"created_at": "2017-09-25T18:50:38.620881", |
|||
"expires_at": "2017-09-25T18:50:38.620881" |
|||
} |
|||
``` |
|||
* **Error response**: |
|||
* ***Malformed request*** |
|||
* **Code**: 400 |
|||
* **Content**: |
|||
``` |
|||
{ |
|||
"err": "malformed_request", |
|||
"msg": "Missing username and/or password keys." |
|||
} |
|||
``` |
|||
* ***Invalid credentials*** |
|||
* **Code**: 400 |
|||
* **Content**: |
|||
``` |
|||
{ |
|||
"err": "invalid_credentials" |
|||
} |
|||
``` |
|||
* **Sample call**: |
|||
``` |
|||
curl -X POST \ |
|||
-H "Accept: application/json" \ |
|||
-d '{"username": "gino", "password": "paoli"}' \ |
|||
"http://127.0.0.1:8009/api/token" |
|||
``` |
|||
|
|||
### Logout |
|||
|
|||
* **URL**: `/api/token` |
|||
* **Method**: `DELETE` |
|||
* **Success response**: |
|||
* **Code**: 200 |
|||
* **Content**: |
|||
``` |
|||
{} |
|||
``` |
|||
* **Error response**: |
|||
* ***Malformed request*** |
|||
* **Code**: 400 |
|||
* **Content**: |
|||
``` |
|||
{ |
|||
"err": "malformed_request", |
|||
"msg": "Missing Authorization header." |
|||
} |
|||
``` |
|||
* ***Unauthorizred*** |
|||
* **Code**: 401 |
|||
* **Content**: |
|||
``` |
|||
{ |
|||
"err": "unauthorized", |
|||
"msg": "The token is not valid." |
|||
} |
|||
``` |
|||
* ***Forbidden*** |
|||
* **Code**: 403 |
|||
* **Content**: |
|||
``` |
|||
{ |
|||
"err": "forbidden", |
|||
"msg": "The token has expired." |
|||
} |
|||
``` |
|||
* **Sample call**: |
|||
``` |
|||
curl -X DELETE \ |
|||
-H "Authorization: 3ea90c63-4b92-465e-bee8-018a4c569252" \ |
|||
"http://127.0.0.1:8009/api/token" |
|||
``` |
|||
|
|||
## Contributing |
|||
|
|||
Before pushing any commit make sure flake8 doesn't complain running: |
|||
|
|||
``` |
|||
flake8 web.py cli.py autogestionale/*.py |
|||
``` |
|||
|
|||
1. Clone this repository |
|||
2. Create a new branch |
|||
3. Make your patch. Split it in different commits if it's huge |
|||
4. Fork this repo |
|||
5. Push your branch to your fork |
|||
6. Issue a pull request |
@ -0,0 +1,104 @@ |
|||
{ |
|||
"variables": [], |
|||
"info": { |
|||
"name": "autogestionale", |
|||
"_postman_id": "d070bf6b-87c1-b2f1-430c-eba72e87c043", |
|||
"description": "", |
|||
"schema": "https://schema.getpostman.com/json/collection/v2.0.0/collection.json" |
|||
}, |
|||
"item": [ |
|||
{ |
|||
"name": "localhost:8009/groups", |
|||
"request": { |
|||
"url": "localhost:8009/groups", |
|||
"method": "GET", |
|||
"header": [], |
|||
"body": {}, |
|||
"description": "" |
|||
}, |
|||
"response": [] |
|||
}, |
|||
{ |
|||
"name": "localhost:8009/groups", |
|||
"request": { |
|||
"url": "localhost:8009/groups", |
|||
"method": "POST", |
|||
"header": [ |
|||
{ |
|||
"key": "Content-Type", |
|||
"value": "application/json", |
|||
"description": "" |
|||
} |
|||
], |
|||
"body": { |
|||
"mode": "raw", |
|||
"raw": "{\"name\":\"unit\",\"description\":\"facciamo tante cose\"}" |
|||
}, |
|||
"description": "" |
|||
}, |
|||
"response": [] |
|||
}, |
|||
{ |
|||
"name": "localhost:8009/events", |
|||
"request": { |
|||
"url": "localhost:8009/events", |
|||
"method": "GET", |
|||
"header": [], |
|||
"body": {}, |
|||
"description": "" |
|||
}, |
|||
"response": [] |
|||
}, |
|||
{ |
|||
"name": "localhost:8009/events", |
|||
"request": { |
|||
"url": "localhost:8009/events", |
|||
"method": "POST", |
|||
"header": [ |
|||
{ |
|||
"key": "Content-Type", |
|||
"value": "application/json", |
|||
"description": "" |
|||
} |
|||
], |
|||
"body": { |
|||
"mode": "raw", |
|||
"raw": "{\"group_uid\":1,\"name\":\"unit\",\"description\":\"facciamo tante cose\"}" |
|||
}, |
|||
"description": "" |
|||
}, |
|||
"response": [] |
|||
}, |
|||
{ |
|||
"name": "localhost:8009/entries", |
|||
"request": { |
|||
"url": "localhost:8009/entries", |
|||
"method": "GET", |
|||
"header": [], |
|||
"body": {}, |
|||
"description": "" |
|||
}, |
|||
"response": [] |
|||
}, |
|||
{ |
|||
"name": "localhost:8009/entries", |
|||
"request": { |
|||
"url": "localhost:8009/entries", |
|||
"method": "POST", |
|||
"header": [ |
|||
{ |
|||
"key": "Content-Type", |
|||
"value": "application/json", |
|||
"description": "" |
|||
} |
|||
], |
|||
"body": { |
|||
"mode": "raw", |
|||
"raw": "{\"event_uid\":1,\"description\":\"birra\",\"amount\":-254.99}" |
|||
}, |
|||
"description": "" |
|||
}, |
|||
"response": [] |
|||
} |
|||
] |
|||
} |
Loading…
Reference in new issue