# SCF_FSM_PACKAGE

A resuable python django package that can handle state transition and workflow's in your django application .
## Description
- The finflo package is designed to handle the workflow management cycle .
- Your state transition's are made easy with finflo
- customizable Actions and states with on_flow interchangable
- Pre installed signature levels for each action
## TECHNOLOGY STACK
[](https://www.python.org/)
[](https://www.djangoproject.com/)
[](https://www.django-rest-framework.org/)
## IMPORTANT LINKS
1. [Documentation](https://documenter.getpostman.com/view/11858287/2s8YmUJyvy)
2. [Postman collection](https://api.postman.com/collections/11858287-f9ff5270-991d-4782-9fab-c034597f3f43?access_key=PMAT-01GJCW5ZKHZM68NWKCNW7KDJP2)
## Authors
- [@anandrajB](https://github.com/anandrajB)
## Prerequisite
- python
- Django
- Django-rest-framework
## 1. Installation
### 1.1 Initial setup
- Install finflo using [pip](https://pypi.org/project/finflo/)
```bash
pip install finflo
```
- In your django application , browse to installed_apps section in settings.py and add this ,
```bash
INSTALLED_APPS = [
'finflo',
'rest_framework'
]
```
- Add this in your settings.py
```bash
FINFLO = {
'WORK_MODEL' : ['MyApp.Model','MyApp2.Model2'],
'PARTY_TYPE' : [] #optional
}
```
- The PARTY_TYPE is optional , if it is not needed you can leave it as blank like this []
- Navigate to the middleware section in your settings.py and add the finflo middleware
```
MIDDLEWARE = [
'finflo.middleware.TransitionUserMiddleware',
]
```
- Now add this peice of code in your urls.py
```
urlpatterns = [
path('', include('finflo.urls'))
]
```
### 1.2 Migrations
- once all the steps done from the above section 1.1 .
- now we can apply the migrations for the database using ,
```
- python manage.py makemigrations
```
```
- python manage.py migrate
```
### 1.3 Re-migrate
- ***scenario 1*** : if any new values is added to the **WORK_MODEL**
- ***example for scenario 1 :***
```
# see 1.1
FINFLO = {
'WORK_MODEL' : ['MyApp.Model','MyApp2.Model2','MyApp3.Model3'],
'PARTY_MODEL' : ['MyApp1.Model1']
}
```
- In the above 1.1 , you can see *MyApp3.Model3* is newly addded
- Now you can remigrate the database without droping it simply by the below command .
```
- python manage.py migrate --fake finflo 0001
- python manage.py migrate finflo 0002
```
## Usage
1. Once your setup is completed , whenever the objects in **WORK_MODEL** is created , the finflo automatically creates :
- Transition manager
- workflowitems
- workevents
2. The transition for each model can be carried out with 2 methods:
1. Navigate to the url : *localhost/transition/*
- in the content section use the format as below and POST
- {"type" : "MyApp.Model" , "action" : "MyAction" , "t_id" : "1"}
2. In Postman , pass the following key in body as follows
- t_id (transition_id)
- type (model_type)
- action
- Example <br /> 
3. Some important information for transition are as follows :
| Arguments | Data_Type |
| ------------- | ------------- |
| type | str |
| action | str |
| t_id | int |
| source | str |
| interim | str |
| target | str |
| from_party | str |
| to_party | str |
## API URLS
1. List of all Url's
| Api URL's | METHOD | FORM DATA | QUERY_PARAMS |
| ------------- | ------------- | ------------- | ------------- |
| *localhost/model/* | GET | NONE | *?type=Model&t_id=1* ***or*** <br/> ***or*** *t_id=1* |
| *localhost/*transition*/* | POST | action , type , t_id , <br /> ***optional :*** from_party , to_party , <br /> source , interim , target| NONE |
| *localhost/*transition*/reset/* | POST | type , t_id | NONE |
| *localhost/*action*/* | GET , POST | description , model , <br/> from_state ,to_state ,<br /> from_party , to_party , stage_required | *?action=MYACTION* ***or*** <br/> *?action=MYACTION&?model=Model*|
| *localhost/*signatures*/* | GET , POST | name , sub_action_name | NONE |
| *localhost/*party-type*/* | GET , POST | description | NONE |
| *localhost/*states*/* | GET , POST | description | NONE |
| *localhost/*workflowitems*/* | GET | NONE | NONE |
| *localhost/workevents/* | GET | NONE | NONE |
## Support
For support, contact
1. support@venzo.com
2. anandrajb@venzotechnologies.com