/SARequest

Simple Request Parser for django views

Primary LanguagePython

Django-SARequest

Simple, compact and useful library to read request parameters in django framework.

Install

There are 2 methods to install this:

1- Install with pip (Recommended and the easiest way)

pip install django-sa-request

2- Install from source code:

git clone https://github.com/sauditore/SARequest.git
python setup.py install

Usage:

To use this library just create a class and inherit from sa_request main class

from sa_request.helper import SARequest
from sa_request.exceptions import ParamNotFoundError, AuthNeedError


class ViewName(SARequest):
    
    def get(self, request):
        # Get int_name from query string
        user_int = self.get_int("int_name", False, 100)
        
        # Get str_name from query string. If data was not found then "default_data" will return
        user_str = self.get_string("str_name", False, "default_data")
        
        # Get float_name from query string. If data was not found then 1.1 will return
        user_float = self.get_float("float_name", False, 1.1)
        
        try:
            # If raise_error is set True, then default value ignored
            # and and exception will raise.
            str_data = self.get_string("parameter_name", True)
            
            # Checks for user permission. If permission not granted then
            # AuthError will raise
            self.validate_request(perm="user.add_user")
        except ParamNotFoundError as e:
            # A response will return to user
            return e.get_response()
        except AuthNeedError as e:
            # redirect user to auth_login view
            return e.get_response()
        # and other logics

Basic Structure:

Most of the methods have a similar signature:

method(name, raise_error, default)

  • name: Name of the parameter to read from query string or post data
  • raise_error: If data is not provided, then raise ParamNotFoundError error.
  • default: If raise_error is set to False, then this value will return as result.

Methods:

get_int:

Get "name" as int from request:

def get_int(name: str, 
            raise_error: bool = False,
            default: int = 0,
            min_value: int = None,
            max_value: int = None
            ) -> int:

get_string:

Get "name" from request as str with min / max length validation

def get_string(name: str,
               raise_error: bool = False,
               default: str = '',
               min_len: int = 0,
               max_len: int = 0) -> str:

paginate:

Paginate query set or list and returns it to use in a template. Queryset or data key name in a dictionary is the same data_name provided. Per Page parameter is read from pp querystring. Current Page is also read from cp querystring. Result contains these keys:

1- data_name: Contains paginated data

2- next: Next number to pass to cp parameter to view next page.

3- back: Back number to pass to cp parameter in querystring to view previous page

4- current_page: Current page number

5- pages: Total number of pages

6- last_page: Number of last page to pass to cp parameter to view

7- request: request object to build URL

8- is_last_page: True if reached last page

9- is_first_page: True if cp is on the first page

10- total_result: Number of records to view

11- next_pages: List of pages to view for the next pages. Each item must pass to cp param to view the page.

12- back_pages: List of pages to view for previous pages. Each item must pass to cp param to view the pate.

def paginate(query_set: Union[List, QuerySet],
             data_name: str,
             extra: Dict = None,
             default_per_page: int = 10)

get_decrypted_list:

Process request and find objects by name, decrypt and return in a list

def get_decrypted_list(name: str,
                       raise_error: bool = False,
                       default: List = None
                       ) -> List

get_int_list:

Process the request and get a list of int

def get_int_list(name: str, 
                 raise_error: bool = False, 
                 default: List = ()
                 ) -> List

get_file_size:

Convert user input data to file size. e.g. User enters : 1024 MB, you will receive : 1024 * 1024 bytes

def get_file_size(name: str,
                 raise_error: bool = False, 
                 default: float = 0
                 ) -> float

get_float:

Get "name" as float

def get_float(name: str,
             raise_error: bool = False,
             default: float = 0.0
              ) -> float

Contribute:

You're always welcome to contribute to the project! Please file an issue and send your great PR.

TODO:

Add more useful functions