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)
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)
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)
def test_bool_param_invalid(raw_value): param = BoolParam(details="some bool field") with pytest.raises(ValueError): assert param.value(raw_value)
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())
def test_bool_param(encoded, desired): param = BoolParam(details="some bool field") assert param.value(encoded) == desired
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())
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())