import uuid import orjson from alpaca.trading.client import TradingClient from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpResponse, HttpResponseBadRequest from django.shortcuts import render from django.views import View from rest_framework.parsers import FormParser, JSONParser from rest_framework.views import APIView from serde import ValidationError from core.forms import HookForm from core.lib.serde import drakdoo_s from core.models import Account, Callback, Hook from core.util import logs log = logs.get_logger(__name__) def get_positions(user, account_id=None): items = [] accounts = Account.objects.filter(user=user) for account in accounts: if account.exchange == "alpaca": trading_client = TradingClient( account.api_key, account.api_secret, paper=account.sandbox ) positions = trading_client.get_all_positions() print("POSITIONS", positions) for item in positions: item = dict(item) item["account_id"] = account.id item["unrealized_pl"] = float(item["unrealized_pl"]) items.append(item) # try: # parsed = ccxt_s.CCXTRoot.from_dict(order) # except ValidationError as e: # log.error(f"Error creating trade: {e}") # return False # self.status = parsed.status # self.response = order return items class Positions(LoginRequiredMixin, View): allowed_types = ["modal", "widget", "window", "page"] window_content = "window-content/positions.html" async def get(self, request, type, account_id=None): if type not in self.allowed_types: return HttpResponseBadRequest template_name = f"wm/{type}.html" unique = str(uuid.uuid4())[:8] items = get_positions(request.user, account_id) if type == "page": type = "modal" context = { "title": f"Hooks ({type})", "unique": unique, "window_content": self.window_content, "items": items, "type": type, } return render(request, template_name, context)