class WalletAPI(viewsets.ViewSet): """Handles wallets and all the operations the can be performed on them. Wallets are retrieved only using the owner_id. The actual pk is for the internal use. """ permission_classes = (HasTokenScope('wallets'),) def retrieve(self, request, pk): """Retrieves wallet details.""" wallet_obj = wallet_api.get_wallet(pk) serializer = WalletSerializer(wallet_obj) return Response( data=serializer.data, status=status.HTTP_200_OK ) @detail_route(methods=['POST']) def deposit(self, request, pk): """Deposits money into a wallet. amount_ """ owner_serializer = WalletTrxParamsSerializer(data={'owner_id': pk}) if not owner_serializer.is_valid(): return Response(owner_serializer.errors, status=status.HTTP_400_BAD_REQUEST) deposit_serializer = WalletDepositSerializer(data=request.POST) if not deposit_serializer.is_valid(): return Response(deposit_serializer.errors, status=status.HTTP_400_BAD_REQUEST) wallet_api.deposit( owner_serializer.validated_data['owner_id'], deposit_serializer.validated_data['amount'], deposit_serializer.validated_data['reference'] ) return Response(status=status.HTTP_204_NO_CONTENT) @detail_route(methods=['POST']) def withdraw(self, request, pk): """Withdraws money from a wallet.""" owner_serializer = WalletTrxParamsSerializer(data={'owner_id': pk}) if not owner_serializer.is_valid(): return Response(owner_serializer.errors, status=status.HTTP_400_BAD_REQUEST) withdrawal_serializer = WalletWithdrawalSerializer(data=request.POST) if not withdrawal_serializer.is_valid(): return Response(withdrawal_serializer.errors, status=status.HTTP_400_BAD_REQUEST) try: wallet_api.withdraw( owner_serializer.validated_data['owner_id'], withdrawal_serializer.validated_data['amount'], withdrawal_serializer.validated_data['reference'] ) except InsufficientFunds: # TODO: move this to serializer? think about possible # race conditions return Response(status=status.HTTP_400_BAD_REQUEST) return Response(status=status.HTTP_204_NO_CONTENT)
class ProductCategoryAPI(viewsets.ViewSet): permission_classes = (HasTokenScope('categories'), ) def list(self, request): category_objs = shop.api.list_categories() serializer = ProductCategorySerializer(category_objs, many=True) return Response(serializer.data)
class WalletTrxAPI(viewsets.ViewSet): permission_classes = (HasTokenScope('wallet_trxs'),) def list(self, request): """Retrieves all the transactions for given wallet.""" serializer = WalletTrxParamsSerializer(data=request.GET) serializer.is_valid(raise_exception=True) owner_id = serializer.validated_data['owner_id'] trxs = wallet_api.list_transactions(owner_id) serializer = WalletTrxSerializer(trxs, many=True) return Response(serializer.data)
class AccountAPI(viewsets.ViewSet): permission_classes = (HasTokenScope('accounts'), ) def retrieve(self, request, pk): serializer = AccountQuerySerializer(data={'card_id': pk}) serializer.is_valid(raise_exception=True) account_obj = foobar.api.get_account(card_id=pk) if account_obj is None: return Response(status=status.HTTP_404_NOT_FOUND) serializer = AccountSerializer(account_obj) return Response(data=serializer.data, status=status.HTTP_200_OK)
class WalletTrxAPI(viewsets.ViewSet): permission_classes = (HasTokenScope('wallet_trxs'),) def list(self, request): """Retrieves all the transactions for given wallet.""" serializer = WalletTrxParamsSerializer(data=request.GET) if not serializer.is_valid(): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) owner_id = serializer.validated_data['owner_id'] trxs = wallet_api.list_transactions(owner_id) serializer = WalletTrxSerializer(trxs, many=True) return Response(serializer.data)
class PurchaseAPI(viewsets.ViewSet): permission_classes = (HasTokenScope('purchases'), ) def create(self, request): serializer = PurchaseRequestSerializer(data=request.data) serializer.is_valid(raise_exception=True) try: purchase_obj = api.purchase(**serializer.as_purchase_kwargs()) except InsufficientFunds: return Response('Insufficient funds', status=status.HTTP_400_BAD_REQUEST) serializer = PurchaseSerializer(purchase_obj) return Response(serializer.data, status=status.HTTP_200_OK)
class ProductAPI(viewsets.ViewSet): permission_classes = (HasTokenScope('products'), ) def retrieve(self, request, pk): product_obj = shop.api.get_product(pk) if product_obj is None: return Response(status=status.HTTP_404_NOT_FOUND) serializer = ProductSerializer(product_obj) return Response(data=serializer.data, status=status.HTTP_200_OK) def list(self, request): serializer = ProductParamSerializer(data=request.GET) serializer.is_valid(raise_exception=True) product_objs = shop.api.list_products(**serializer.validated_data) serializer = ProductSerializer(product_objs, many=True) return Response(serializer.data)