예제 #1
0
class LoanList(PaginatedListAPI):
    serializer = LoanSerializer()

    open = BoolParam("Open filter")
    approved = BoolParam("Approved filter")
    cosigner = StringParam("Cosigner filter")
    cosigner__ne = StringParam("Cosigner not filter")
    model = StringParam("Model filter")
    model__ne = StringParam("Model not filter")
    creator = StringParam("Creator filter")
    creator__ne = StringParam("Creator not filter")
    oracle = StringParam("Oracle filter")
    oracle__ne = StringParam("Oracle not filter")
    borrower = StringParam("Borrower filter")
    borrower__ne = StringParam("Borrower not filter")
    callback = StringParam("Callback filter")
    canceled = BoolParam("Canceled filter")
    status = StringParam("Status Filter")
    lender = StringParam("Lender filter")
    lender__ne = StringParam("Lender not filter")
    currency = StringParam("Currency filter")
    currency__ne = StringParam("Currency not filter")

    expiration__lt = StringParam("Expiration lt")
    expiration__lte = StringParam("Expiration lte")
    expiration__gt = StringParam("Expiration gt")
    expiration__gte = StringParam("Expiration gte")

    amount__lt = StringParam("Amount lt")
    amount__lte = StringParam("Amount lte")
    amount__gt = StringParam("Amount gt")
    amount__gte = StringParam("Amount gte")

    created__lt = StringParam("Created lt")
    created__lte = StringParam("Created lte")
    created__gt = StringParam("Created gt")
    created__gte = StringParam("Created gte")


    def list(self, params, meta, **kwargs):
        # Filtering -> Ordering -> Limiting
        filter_params = params.copy()
        filter_params.pop("indent")

        page_size = filter_params.pop("page_size")
        page = filter_params.pop("page")

        offset = page * page_size

        all_objects = Loan.objects.filter(**filter_params)
        count_objects = all_objects.count()
        meta["resource_count"] = count_objects

        return all_objects.skip(offset).limit(page_size)
예제 #2
0
class DebtList(PaginatedListAPI):
    serializer = DebtSerializer()

    error = BoolParam("Error filter")
    model = StringParam("Model filter")
    model__ne = StringParam("Model not filter")
    creator = StringParam("Creator filter")
    creator__ne = StringParam("Creator not filter")
    oracle = StringParam("Oracle filter")
    oracle__ne = StringParam("Oracle not filter")

    balance__lt = StringParam("Balance lt")
    balance__lte = StringParam("Balance lte")
    balance__gt = StringParam("Balance gt")
    balance__gte = StringParam("Balance gte")

    created__lt = StringParam("Created lt")
    created__lte = StringParam("Created lt")
    created__gt = StringParam("Created gt")
    created__gte = StringParam("Created gte")

    def list(self, params, meta, **kwargs):
        # Filtering -> Ordering -> Limiting

        filter_params = params.copy()
        filter_params.pop("indent")

        page_size = filter_params.pop("page_size")
        page = filter_params.pop("page")

        offset = page * page_size

        all_objects = Debt.objects.filter(**filter_params)
        count_objects = all_objects.count()
        meta["resource_count"] = count_objects

        return all_objects.skip(offset).limit(page_size)
예제 #3
0
class CompleteLoanList(PaginatedListAPI):
    serializer = CompleteLoanSerializer()

    open = BoolParam("Open filter")
    approved = BoolParam("Approved filter")
    cosigner = StringParam("Cosigner filter")
    cosigner__ne = StringParam("Cosigner not filter")
    model = StringParam("Model filter")
    model__ne = StringParam("Model not filter")
    creator = StringParam("Creator filter")
    creator__ne = StringParam("Creator not filter")
    oracle = StringParam("Oracle filter")
    oracle__ne = StringParam("Oracle not filter")
    borrower = StringParam("Borrower filter")
    borrower__ne = StringParam("Borrower not filter")
    callback = StringParam("Callback filter")
    canceled = BoolParam("Canceled filter")
    status = StringParam("Status Filter")
    lender = StringParam("Lender filter")
    lender__ne = StringParam("Lender not filter")
    currency = StringParam("Currency filter")
    currency__ne = StringParam("Currency not filter")

    expiration__lt = StringParam("Expiration lt")
    expiration__lte = StringParam("Expiration lte")
    expiration__gt = StringParam("Expiration gt")
    expiration__gte = StringParam("Expiration gte")

    amount__lt = StringParam("Amount lt")
    amount__lte = StringParam("Amount lte")
    amount__gt = StringParam("Amount gt")
    amount__gte = StringParam("Amount gte")

    created__lt = StringParam("Created lt")
    created__lte = StringParam("Created lte")
    created__gt = StringParam("Created gt")
    created__gte = StringParam("Created gte")

    def list(self, params, meta, **kwargs):
        # Filtering -> Ordering -> Limiting
        filter_params = params.copy()
        filter_params.pop("indent")

        page_size = filter_params.pop("page_size")
        page = filter_params.pop("page")

        offset = page * page_size

        all_objects = Loan.objects.filter(**filter_params)
        count_objects = all_objects.count()
        meta["resource_count"] = count_objects

        loan_filtered = all_objects.skip(offset).limit(page_size)

        complete_loans = loan_filtered.aggregate(
            [
                {"$lookup": {"from": "debt", "localField": "_id", "foreignField": "_id", "as": "debt"}},
                {"$lookup": {"from": "config", "localField": "_id", "foreignField": "_id", "as": "config"}},
                {"$lookup": {"from": "state", "localField": "_id", "foreignField": "_id", "as": "state"}},
                {"$lookup": {"from": "collateral", "localField": "_id", "foreignField": "debt_id", "as": "collaterals"}},
                { "$unwind": { "path": "$debt", "preserveNullAndEmptyArrays": True }},
                { "$unwind": { "path": "$state", "preserveNullAndEmptyArrays": True }},
                { "$unwind": { "path": "$config", "preserveNullAndEmptyArrays": True }},
                { "$project": {
                    "id": 1,
                    "open": 1,
                    "approved": 1,
                    "position": 1,
                    "expiration": 1,
                    "amount": 1,
                    "cosigner": 1,
                    "model": 1,
                    "creator": 1,
                    "oracle": 1,
                    "borrower": 1,
                    "callback": 1,
                    "salt": 1,
                    "loanData": 1,
                    "created": 1,
                    "descriptor": 1,
                    "currency": 1,
                    "lender": 1,
                    "status": 1,
                    "canceled": 1,
                    "debt": 1,
                    "state": 1,
                    "collaterals": 1,
                    "config": "$config.data", "id": 1, "open": 1
                    }
                }
            ]
        )

        return list(complete_loans)
예제 #4
0
def test_bool_param_invalid(raw_value):
    param = BoolParam(details="some bool field")

    with pytest.raises(ValueError):
        assert param.value(raw_value)
예제 #5
0
class LogoutResource(SaasBase, RetrieveUpdateDeleteAPI):
    """
    Logout resource.
    User logout and used token invalidated.(token is disposable)
    If "others" parameters is true then users all token deleted except that used this request

    #### Code Example:

    #### DELETE
    Logout User Account and Invalidate user token.
    #### Request:

        ```bash
            #bash
            curl \\
                 --request DELETE                                                        \\
                 --header "Content-Type: application/json"                               \\
                 --header "AUTHORIZATION: 0sOEQfyptM0ZG7kJYkNxmswp_p5y9iX5t61KI1qH83w"   \\
                 https://api_baseurl/api/v1/session/logout
        ```

        ```python
            #python
            import requests
            import json

            header = {
                        "Content-Type": "application/json",
                        "AUTHORIZATION": "0sOEQfyptM0ZG7kJYkNxmswp_p5y9iX5t61KI1qH83w"
                      }
            req = requests.GET("https://api_baseurl/api/v1/session/logout,
                                            header=header)
        ```
        ##### Response:
        202 OK.
        ```json
            {
              "meta": {
                "params": {
                  "indent": 0
                }
              },
              "content": null
            }
        ```
    #### DELETE
    If "others" parameters is true then users all token deleted except that used this request
    #### Request:

        ```bash
            #bash
            curl \\
                 --request DELETE                                                       \\
                 --header "Content-Type: application/json"                              \\
                 --header "AUTHORIZATION: 0sOEQfyptM0ZG7kJYkNxmswp_p5y9iX5t61KI1qH83w"  \\
                 https://api_baseurl/api/v1/session/logout?others=True
        ```

        ```python
            #python
            import requests
            import json

            header = {
                        "Content-Type": "application/json",
                        "AUTHORIZATION": "0sOEQfyptM0ZG7kJYkNxmswp_p5y9iX5t61KI1qH83w"
                      }
            req = requests.GET("https://api_baseurl/api/v1/session/logout?others=True,
                                            header=header)
        ```
        ##### Response:
        202 OK.
        ```json
            {
              "meta": {
                "params": {
                  "indent": 0
                }
              },
              "content": null
            }
        ```

    """
    serializer = LogoutSerializer()

    others = BoolParam(
        "This parameter is user delete token parameter. If it is true users all token deleted",
        default="False")

    def __repr__(self):
        return "User Logout and Invalidate All Tokens"

    def resource_name(self):
        return "LogoutResource"

    @require_roles(roles=[ERoles.admin, ERoles.developer, ERoles.billing])
    def delete(self, params, meta, **kwargs):
        others = params.get('others')
        payload = kwargs['token']
        user_id = payload['sub']

        token = encode_jwt_token(payload)
        remove_user_token(user_id, token)

        if others:
            remove_user_tokens(user_id)
            add_user_token(user_id, token)

    def retrieve(self, params, meta, **kwargs):
        """Not Implemented"""
        raise HTTPMethodNotAllowed(self.allowed_methods())

    def update(self, params, meta, **kwargs):
        """Not Implemented"""
        raise HTTPMethodNotAllowed(self.allowed_methods())
예제 #6
0
def test_bool_param(encoded, desired):
    param = BoolParam(details="some bool field")

    assert param.value(encoded) == desired
예제 #7
0
def test_bool_param_invalid(raw_value):
    param = BoolParam(details="some bool field")

    with pytest.raises(ValueError):
        assert param.value(raw_value)
예제 #8
0
def test_bool_param(encoded, desired):
    param = BoolParam(details="some bool field")

    assert param.value(encoded) == desired
예제 #9
0
class RegisterResource(SaasBase, ListCreateAPI):
    """
    Allows to Post Register New Account

    ####### Code Example:

    ### POST:
    Create a new account
    ### Request:

    ```bash
        #bash
        curl \\
             --request POST                             \\
             --header "Content-Type: application/json"  \\
             --body "{                                                          \\
                  \"organizationName\": \"Example Organization\",               \\
                  \"email\": \"[email protected]\"                \\
             }"                                                                 \\
             https://api_baseurl/api/v1/register
    ```

    ```python
        #python
        import requests
        import json

        header = {'Content-Type': 'application/json'}

        body = {
                "organizationName": "Example Organization",
                "email": "*****@*****.**"
        }

        req = requests.post("https://api_baseurl/api/v1/register",
                                        header=header, data=json.dumps(body))
    ```

    #### Response:
    201 Created.
    ```json
        {
        "meta":{
                "params": {
                        "indent": 0
                        }
               },
        "content": {
                     "organizationName": "Example Organization",
                     "email": "*****@*****.**",
                     "registrationId": "f200baccded4413a81f9a381063c435c",
                     }
        }
    ```
    #### Possible Errors
    - __Conflict__: Email address already used
    - __Failed Dependency__ :An Error occur on 3rd part service. Please retry after a few minutes.

    """

    serializer = RegisterSerializer()

    testing = BoolParam("Testing mode parameter.", default="False")

    def __repr__(self):
        return "Account Create"

    def resource_name(self):
        return "RegisterResource"

    @require_roles(roles=[ERoles.anonym])
    def create(self, params, meta, **kwargs):
        """
        default account type is "trial". you can see account types in zopsm.lib.setting file
        """
        validated = kwargs.get('validated')
        account = self.db.exists(Account, email=validated['email'])
        if not account:
            approve_code = generate_token()
            testing = params.get('testing')
            saas_logger.debug(testing)

            project_limit = ACCOUNT_LIMIT['project_limit']
            account = Account(approve_code=approve_code,
                              organization_name=validated['organization_name'],
                              email=validated['email'],
                              project_limit=project_limit)
            self.db.session.add(account)
            self.db.session.flush()

            mail_response = send_account_approve_mail(approve_code,
                                                      validated['email'],
                                                      account.id, testing)
            email = Email(provider_mail_id=mail_response['id'],
                          account_id=account.id,
                          text=mail_response['text'],
                          subject=mail_response['subject'],
                          receiver=validated['email'],
                          provider="MAILGUN",
                          category="approve")
            self.db.session.add(email)
        else:
            raise HTTPConflict(description="These email address already used")

        return account

    def list(self, params, meta, **kwargs):
        """Not Implemented"""
        raise HTTPMethodNotAllowed(self.allowed_methods())

    def create_bulk(self, params, meta, **kwargs):
        """Not Implemented"""
        raise HTTPMethodNotAllowed(self.allowed_methods())
예제 #10
0
class ApproveCodeResource(SaasBase, ListCreateAPI):
    """

    Allows to resend approve code

    ####### Code Example:

    #### POST
    Resend account approve code
    ### Request:

    ```bash
        #bash
        curl \\
             --request POST                             \\
             --header "Content-Type: application/json" \\
             --body "{                                                                                      \\
                   \"email\": \"[email protected]\",                                          \\
             }"                                                                                             \\
             https://api_baseurl/api/v1/register/approve-code

    ```

    ```python
        #python
        import requests
        import json

        header = {'Content-Type': 'application/json'}

        body = {
                   "email": "*****@*****.**",
        }

        req = requests.post("https://api_baseurl/api/v1/register/approve-code",
                                        header=header, data=json.dumps(body))
    ```
    #### Response:
    202 Accepted:
    ```json

        {
        "meta": {
                "params": {
                            "indent": 0
                            }
                }
        }
    ```

    #### Possible Errors
    - __Not Found__: These email address does not exist
    - __Failed Dependency__ :An Error occur on 3rd part service. Please retry after a few minutes.

    """

    serializer = ApproveCodeSerializer()
    testing = BoolParam("Testing mode parameter.", default="False")

    def __repr__(self):
        return "Approve Code Resend"

    def resource_name(self):
        return "ApproveCodeResource"

    @require_roles(roles=[ERoles.anonym])
    def create(self, params, meta, **kwargs):
        email = kwargs['validated']['email']
        testing = params.get('testing')
        account = self.db.get_account_with_email(email)
        if account:
            new_approve_code = generate_token()
            account.approve_code = new_approve_code
            mail_response = send_account_approve_mail(new_approve_code, email,
                                                      account.id, testing)
            email_object = Email(provider_mail_id=mail_response['id'],
                                 account_id=account.id,
                                 text=mail_response['text'],
                                 subject=mail_response['subject'],
                                 receiver=email,
                                 provider="MAILGUN",
                                 category="approve")
            self.db.session.add(email_object)
        else:
            raise HTTPNotFound(
                description="These email address does not exist")

    def list(self, params, meta, **kwargs):
        """Not Implemented"""
        raise HTTPMethodNotAllowed(self.allowed_methods())

    def create_bulk(self, params, meta, **kwargs):
        """Not Implemented"""
        raise HTTPMethodNotAllowed(self.allowed_methods())