Box CRUD API With Python

Overview

Box CRUD API:

Consider a store which has an inventory of boxes which are all cuboid(which have length breadth and height). Each Cuboid has been added by a store employee who is associated as the creator of the box even if it is updated by any user later on.

Setup Project

  1. Fork and clone this repository and navigate into the project folder by running the following commands in your terminal:

    git clone [email protected]:
         
          /boxes_inventory.git
    cd boxes_inventory
    
         

    NOTE: This cloning is done via SSH.

  2. Create a Python virtual environment in the project folder and activate it.

    pip install virtualenv
    virtualenv venv
    source venv/bin/activate
    

    NOTE: This commands can differ can based on operating systems.

  3. Create a .env file in the project folder, and add your secret key in the SECRET_KEY variable in .env file.

    SECRET_KEY=
         
    
         

    SECRET_KEY is 128 bit long string containing alphnumeric chars and symbols.

  4. Install the dependencies, by running the following command:

    pip install -r requirements.txt
    

    Make sure your virtual environment is activated.

  5. Run the migrations.

    python manage.py makemigrations
    python manage.py migrate
    

    As our default database is sqlite3, you will notice after the migrations a db file is created in project folder.

  6. Create a superuser.

    python manage.py createsuperuser
    
  7. Run the server.

    python manage.py runserver
    


POSTMAN Collection click here

Open this postman collection in Postman, to check all the API endpoints.


Authentication Details

I have implemented default token authetication available in the Django Rest Framework.

When the user logs in through http://127.0.0.1:8000/accounts/api/v1/login/, the token is generated and stored in the database.

So, Inorder to access the API, you need to send a valid token in the Authorization header as follows:

Authorization: Token 
   

   

Token


Task 0: Data Modelling

I have created a boxes model with one to many relationship with the users model, where user model is the parent and boxes model is the child.

drawSQL


Task 1: Add a Box

API Endpoint: POST http://127.0.0.1:8000/boxes/api/v1/create-box

Only the Staff user is able to create a box and following is the required payload for the request.

{
    "height": 4,
    "length": 3,
    "breadth": 4
}

Below is the example of the API:

Add API

If the request is invalid or provided with invalid body, the API will return error messages.

Conditions fulfilled:

  1. The user should be a staff and logged in to create a box.
  2. Average area of all added boxes should not exceed 100.
  3. Average volume of all boxes added by the current user shall not exceed 1000.
  4. Total Boxes added in a week cannot be more than 100.
  5. Total Boxes added in a week by a user cannot be more than 50.

Task 2: Update API for a Box

API Endpoint: PUT/PATCH http://127.0.0.1:8000/boxes/api/v1/update-box/uuid

You need to add the UUID of the box at the end of the URL to update the box.

UUID is the unique identifier of the box


  1. Below is the example of the Update API through PUT method:

Update PUT API

  1. Below is the example of the Update API through PATCH method:

Update PATCH API

Conditions fulfilled:

  1. User should be logged in and should be a staff user to access the API.
  2. Any staff user is able to update any box.
  3. Editor cannot edit the creator, created_date or last_updated date of the box.

Task 3: List all Boxes

API Endpoint: GET http://127.0.0.1:8000/boxes/api/v1/list-all-boxes

This API returns all the boxes in the database but the response is divided into 2 types:

  1. If User is staff, they can see the creator and last_updated date of each box. Staff Boxes Response

  2. But in case of the non staff user they cannot see the creator and last_updated date of each box.Non Staff Boxes Response


In this API you can also apply below filters:

  1. length_more_than or length_less_than
  2. height_more_than or height_less_than
  3. breadth_more_than or breadth_less_than
  4. volume_more_than or volume_less_than
  5. area_more_than or area_less_than
  6. created_after or created_before
  7. username

Conditions fulfilled:

  1. User should be logged-in and authenticated to access this API.

Task 4: List my boxes

API Endpoint: GET http://127.0.0.1:8000/boxes/api/v1/list-my-boxes

This API returns all the boxes created by the logged-in staff user.

ListMyBoxesStaffUser

In this API you can also apply below filters:

  1. length_more_than or length_less_than
  2. height_more_than or height_less_than
  3. breadth_more_than or breadth_less_than
  4. volume_more_than or volume_less_than
  5. area_more_than or area_less_than

Conditions fulfilled:

  1. User should be staff, logged-in and authenticated to access this API.

Task 5: Delete a Box

API Endpoint: DELETE http://127.0.0.1:8000/boxes/api/v1/delete-box/uuid

You need to add the UUID of the box to be deleted at the end of the URL, and only the creator of the box can delete it.

DeleteAPI

Conditions fulfilled:

  1. User should be staff, logged-in and authenticated to access the API.
  2. The box to delete should be created by the logged-in staff user.

Scope of Improvement:

  1. In utils/filters.py file, code resuability can be improved.
  2. In place of Token Authentication, JWT Authentication can be used to authenticate the users.

Things I Learned:

  1. How to apply filters in the API.
  2. How to use and modify the serializer data according to the use case.
  3. Write more clean code and add comments wherever necessary.
  4. Read documentation more thoroughly.

Assumptions from the problem statement given:

  1. At the time of updating the box, the avg_area and avg_volume condition is not checked because, the problem statement says added and not updated/edited word.

  2. Adding user should be automatically associated with the box and shall not be overridden - This line was unclear in the problem statement, so I gathered that whenever a box is being created we have to connect it to the staff user who created it by default (one-to-many relationship).

Owner
Akhil Bhalerao
I am a tech enthusiast and proficient in Python and C++. In my free time, I enjoy capturing the macro world through my lens.
Akhil Bhalerao
1 May 12, 2022
Black-Scholes library implemented as a Cairo smart contract

Cairo Black-Scholes Library Black-Scholes library implemented as a Cairo smart contract. All inputs, outputs, and internal calculations use 27-digit f

Aditya Raghavan 47 Dec 19, 2022
Stop ask your soraka to ult you, just ult yourself

Lollo's auto-ultimate script Are you tired of your low elo friend who can't ult you with soraka when you ask for it? Use Useless Support and just ult

9 Oct 20, 2022
The FLARE team's open-source library to disassemble Common Intermediate Language (CIL) instructions.

dncil is a Common Intermediate Language (CIL) disassembly library written in Python that supports parsing the header, instructions, and exception hand

MANDIANT 95 Jan 08, 2023
Collapse a set of redundant kmers to use IUPAC degenerate bases

kmer-collapse Collapse a set of redundant kmers to use IUPAC degenerate bases Overview Given an input set of kmers, find the smallest set of kmers tha

Alex Reynolds 3 Jan 06, 2022
Backend/API for the Mumble.dev, an open source social media application.

Welcome to the Mumble Api Repository Getting Started If you are trying to use this project for the first time, you can get up and running by following

Dennis Ivy 189 Dec 27, 2022
Dotfiles for my configurations!

Dotfiles Repo Welcome! Over here, you can find my dotfiles for various applications, including QTile, Alacritty, Kitty, LunarVim, and more! Make sure

class PythonAddict 3 Jan 10, 2022
Supercharge your NFTs with new behaviours and superpowers!

WrapX Supercharge your NFTs with new behaviours and superpowers! WrapX is a collection of Wrappers (currently one - WrapXSet) to decorate your NTFs ad

Emiliano Bonassi 9 Jun 13, 2022
A compilation of useful scripts to automate common tasks

Scripts-To-Automate-This A compilation of useful scripts for common tasks Name What it does Type Add file extensions Adds ".png" to a list of file nam

0 Nov 05, 2021
EFB Docker image with efb-telegram-master and efb-wechat-slave

efb-wechat-docker EFB Docker image with efb-telegram-master and efb-wechat-slave Features Container run by non-root user. Support add environment vari

Haukeng 1 Nov 10, 2022
Palestra sobre desenvolvimento seguro de imagens e containers para a DockerCon 2021 sala Brasil

Segurança de imagens e containers direto na pipeline Palestra sobre desenvolvimento seguro de imagens e containers para a DockerCon 2021 sala Brasil.

Fernando Guisso 10 May 19, 2022
Programming in Bioinformatics, Block 3

Programming in Bioinformatics - Block 3 I. Setting up Environment and Running the Code Create the environment using the pibi_block3.yml file with the

2 Dec 10, 2021
How did Covid affect businesses?

NYC_Business_Analysis How did Covid affect businesses? COVID's effect on NYC businesses We all know that businesses in NYC have been affected by COVID

AK 1 Jan 15, 2022
Runtime Type Checking in Python 3

typo This package intends to provide run-time type checking for functions annotated with argument type hints (standard library typing module in Python

Ivan Smirnov 26 Dec 13, 2022
Covid-19-Trends - A project that me and my friends created as the CSC110 Final Project at UofT

Covid-19-Trends Introduction The COVID-19 pandemic has caused severe financial s

1 Jan 07, 2022
Python script which allows for automatic registration in Golfbox

Python script which allows for automatic registration in Golfbox

Guðni Þór Björnsson 8 Dec 04, 2021
用于导出墨墨背单词的词库,并生成适用于 List 背单词,不背单词,欧陆词典等的自定义词库

maimemo-export 用于导出墨墨背单词的词库,并生成适用于 List 背单词,欧陆词典,不背单词等的自定义词库。 仓库内已经导出墨墨背单词所有自带词库(暂不包括云词库),多达 900 种词库,可以在仓库中选择需要的词库下载(下载单个文件的方法),也可以去 蓝奏云(密码:666) 下载打包好

ourongxing 293 Dec 29, 2022
Find your desired product in Digikala using this app.

Digikala Search Find your desired product in Digikala using this app. با این برنامه محصول مورد نظر خود را در دیجیکالا پیدا کنید. About me Full name: M

Matin Ardestani 17 Sep 15, 2022
p5 is a Python package based on the core ideas of Processing.

p5 p5 is a Python library that provides high level drawing functionality to help you quickly create simulations and interactive art using Python. It c

p5py 645 Jan 04, 2023
A python script to turn tabs into spaces the right way.

detab A python script to turn tabs into spaces the right way. detab turns all tabs into spaces, not just leading tabs. Not all tabs have the same leng

1 Jan 26, 2022