Metadata-Version: 2.1
Name: django-trips
Version: 0.2.10
Summary: A Django Rest API for fetching and creating trips and their schedules.
Home-page: https://github.com/awaisdar001/django-trips
Author: Awais Jibran
Author-email: awaisdar001@gmail.com
License: MIT License
Keywords: Django trips
Platform: UNKNOWN
Classifier: Environment :: Web Environment
Classifier: Framework :: Django
Classifier: Framework :: Django :: 2.2
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Description-Content-Type: text/markdown
Requires-Dist: setuptools

# Django Trips API

This is a Django Rest API for fetching and creating trips and schedules.
## Installation
Simply do:
```bash
pip install django-trips
```

## Usage
Add the app into your installed apps in your project's settings file. 
```
INSTALLED_APPS = [
    ...
    'django_trips',
]
```
## Migrate
```
python manage.py migrate 
```
Add the following to your root `urls.py` or to your desired file location.   
```
urlpatterns = [
    ...
    path('trips/', include(('django_trips.api.urls', 'trips-api'), namespace='trips-api')),
]
```
You can replace `trips/` to any namespace you like for the api.

## Generate random trips.
Before you generate random scripts, make sure you have the required settings available in your project. If you want to use the default settings set `USE_DEFAULT_TRIPS=True`. 
The script depends upon these variables, if you don't want to use the default settings set the 
following settings. 
1. `TRIP_DESTINATIONS`
2. `TRIP_DEPARTURE_LOCATION`
3. `TRIP_LOCATIONS = TRIP_DEPARTURE_LOCATION + TRIP_DESTINATIONS`
4. `TRIP_HOSTS`
5. `TRIP_FACILITIES`
6. `TRIP_CATEGORIES`
7. `TRIP_GEARS`

```
python manage.py generate_trips --batch_size=100
``` 
Change the `batch_size` variable to create as much of trips you want. 

## API Endpoints
The following pages are served in the development:

| Page                 |  Method          | URL                                                        |
|----------------------|------------------|-----------------------------------------------             |
| Scheduled Trips List | GET              | http://localhost:8000/api/trips/                           |
| Available Trips List | GET              | http://localhost:8000/api/trips/by/availability/           |
| Search Trip          | GET              | http://localhost:8000/api/trips?name=Boston/            |
| Single Trip          | GET              | http://localhost:8000/api/trip/trip-id-or-slug/            |
| Update Trip          | PUT              | http://localhost:8000/api/trip/trip-id-or-slug/            |
| Update Trip          | PATCH            | http://localhost:8000/api/trip/trip-id-or-slug/            |
| Delete Trip          | DELETE           | http://localhost:8000/api/trip/trip-id-or-slug/            |
| Destination          | GET              | http://localhost:8000/api/destinations/                    |
| Destination Detail   | GET              | http://localhost:8000/api/destination/location-slug        |
| All Trip Bookings    | GET              | http://localhost:8000/api/trip/bookings                    |
| Single Bookings      | GET              | http://localhost:8000/api/trip/booking/id                  |
| Single Trip Bookings | GET              | http://localhost:8000/api/trip/<trip-slug>/bookings        |       |


### API permissions
| Authentication            
|-------------------------- |
| `SessionAuthentication`   |
| `BasicAuthentication`     |

| Permissions               |
|-------------------------  |
|   `IsAuthenticated`       | 


### Trip List
`http://localhost:8000/api/trips/`

This endpoint is used to list all the trips by schedule using the **GET** request type. These trips have specified 
(fixed) schedule. These trips use django model `TripSchedule` for creating their schedule. Once the schedule is expired,
these trips do not renew automatically. 
These are the trip with "**static**" schedule data.

### Trip List by Availability
`http://localhost:8000/api/trips/by/availability/`

There is another mechanism which would like you to define dynamic trips schedule. Which is using `TripAvailability` 
model. In this model you can define the recurrence of any trip, weekly, daily, or monthly and these trip may
auto-renew themselves. They come handy when you have dynamic trips schedule.    

### Search Trip
`http://localhost:8000/api/trip/id-or-slug?destination=<destination name, destination name 2,>`

Search specific trips. Here are the params that can be passed while searching. You can also mix the params together to
narrow down the search. 

| param                 | description                                                           | example                           |
| ---                   | ---                                                                   |---                                |
| name (str)               | Find trips that contains specific name.                               | `/api/trips/?name=Boston`
| destination[]         | Filter trips with specific destinations.                              | `destination=Boston,London`
| price_from (str)      | Find trips that has price greater than or equal to the given amount   | `/api/trips/?price_from=200`
| price_to (str)        | Find trips that has price less than or equal to the given amount      | `/api/trips/?price_to=200`
| duration_from (int)   | Find trips having duration greater than or equal to the given number  | `/api/trips/?duration_from=2`
| duration_to (int)     | Find trips having duration less  than or equal to the given number    | `/api/trips/?duration_to=10`
| date_from (date)      | Find trips that are scheduled greater than or specified date `<yyyy-mm-dd>`          | `/api/trips/?date_from=2020-01-02`
| date_to (date)        | Find trips that are scheduled less than or equal to specified date`<yyyy-mm-dd>`    | `/api/trips/?date_from=2020-01-02`



### Single Trip
`http://localhost:8000/api/trip/id-or-slug`

This endpoint is used to fetch a single trip using GET request type.

### Update Trip (using PUT)
`http://localhost:8000/api/trip/trip-id-or-slug/`

This endpoint is used to update a single trip using PUT request type. You would need to pass the complete trip object. 
```python
reset_of_params = {}
data = {
    'age_limit': 39,
    **reset_of_params,
}
```
### Update Trip (using PATCH)
`http://localhost:8000/api/trip/trip-id-or-slug/`
```python
data = {
    'age_limit': 39,
}
```
### Update Trip (using PUT)
`http://localhost:8000/api/trip/trip-id-or-slug/`

This endpoint is used to delete a single trip using DELETE request type. 

### Get Destinations List
`http://localhost:8000/api/destinations/`

This endpoint is used to fetch all destinations available.  

### Get Destination Detail
`http://localhost:8000/api/destination/destination-slug`

Given a slug, this endpoint provides detail about a single trip.

### Create Trip booking
`http://localhost:8000/api/trip/bookings`

#### GET:
Get all the trips list using the `GET` request method. 
#### POST:
Create trip booking by giving the following "example" data in the `POST` request.
```
{
    "name": "tom latham",
    "trip": "5-days-trip-to-city-center",
    "phone_number": "tom",
    "cnic_number": "1234234-23423",
    "email": "a@gmail.com",
    "target_date": "2021-09-01",
    "message": "Tom booking# 1"
}
```

### Single Trip booking Operations 
`http://localhost:8000/api/trip/booking/<booking-id>/`

Retrieve, Update & Delete a single trip booking. 

### All Trip Bookings
`http://localhost:8000/api/trip/<trip-slug>bookings/`

Retrieve all bookings of a single trip.

## Develop Django Trips
Kick the docker build using the following command. 
```
make build
``` 
This task may take few minutes. 


Once the build has been completed, spin up the docker and migrate the database. 
```bash
> make run
> make shell 
> make update_db
```
Create a superuser with username `admin`.

``` bash
> make shell
> python manage.py createsuperuser
```

Create batch of trips. Run the following command inside docker shell.
```bash
> python manage.py  generate_trips --batch_size=100
OR
> make random_trips
```

## Test
Run tests using the following command.
```
make tests
```
## Docker Commands

| Action                            |  Command          |
|-----------------------------------|-------------------|
| Run Server                        | `make run`        |
| Trail Logs                        | `make logs`       |
| Attach sever                      | `make attach`     |
| Stop server                       | `make stop`       |
| * Destroy docker container.       | `make destory`    |

_* caution, this will remove all your data._

## How to Contribute
Contributions are welcome!

