import uuid from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpResponseBadRequest from django.shortcuts import render from django.urls import reverse from django.views import View from two_factor.views.mixins import OTPRequiredMixin from core.exchanges import GenericAPIError from core.models import Account from core.util import logs log = logs.get_logger(__name__) def get_profit(user): items = [] accounts = Account.objects.filter(user=user) for account in accounts: try: details = account.client.get_account() pl = details["pl"] item = { "account": account, "pl": float(pl), "balance": details["balance"], "currency": details["currency"], } items.append(item) except GenericAPIError: continue return items class Profit(LoginRequiredMixin, OTPRequiredMixin, View): allowed_types = ["modal", "widget", "window", "page"] window_content = "window-content/objects.html" list_template = "partials/profit-list.html" page_title = "Profit by account" page_subtitle = None context_object_name_singular = "profit" context_object_name = "profit" def get(self, request, type): if type not in self.allowed_types: return HttpResponseBadRequest self.template_name = f"wm/{type}.html" unique = str(uuid.uuid4())[:8] items = get_profit(request.user) orig_type = type if type == "page": type = "modal" cast = { "type": orig_type, } list_url = reverse("profit", kwargs={**cast}) context = { "title": f"Profit ({type})", "unique": unique, "window_content": self.window_content, "list_template": self.list_template, "object_list": items, "type": type, "page_title": self.page_title, "page_subtitle": self.page_subtitle, "list_url": list_url, "context_object_name_singular": self.context_object_name_singular, "context_object_name": self.context_object_name, } # Return partials for HTMX if self.request.htmx: if request.headers["HX-Target"] == self.context_object_name + "-table": self.template_name = self.list_template elif orig_type == "page": self.template_name = self.list_template else: context["window_content"] = self.list_template return render(request, self.template_name, context)