from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpResponseBadRequest from django.shortcuts import render from django.views import View from two_factor.views.mixins import OTPRequiredMixin from core.exchanges import GenericAPIError from core.forms import TradeForm from core.models import Trade from core.util import logs from core.views import ( ObjectCreate, ObjectDelete, ObjectList, ObjectNameMixin, ObjectRead, ObjectUpdate, ) log = logs.get_logger(__name__) class TradeAction(LoginRequiredMixin, OTPRequiredMixin, ObjectRead): context_object_name_singular = "position" context_object_name = "positions" detail_url_name = "trade_action" detail_url_args = ["type", "trade_id"] def get_object(self, **kwargs): trade_id = kwargs.get("trade_id") db_info = Trade.get_by_id_or_order(trade_id, self.request.user) if db_info is None: return HttpResponseBadRequest("Trade not found.") if db_info.order_id is not None: try: # Fix old data if "id" in db_info.order_id: db_response_id = db_info.order_id["id"] if db_info.order_id == db_response_id: db_info.order_id = str(int(db_info.order_id) + 1) db_info.save() live_info = db_info.account.client.get_trade(db_info.order_id) except GenericAPIError as e: live_info = {"error": e} else: live_info = {} db_info = db_info.__dict__ del db_info["_state"] del db_info["_original"] self.extra_context = {"live": live_info, "pretty": ["response"]} return db_info class TradeList(LoginRequiredMixin, OTPRequiredMixin, ObjectList): list_template = "partials/trade-list.html" model = Trade page_title = ( "List of bot and manual trades. This may not reflect actual live trades." ) page_subtitle = "Trades deleted here will not be closed on the exchange." list_url_name = "trades" list_url_args = ["type"] submit_url_name = "trade_create" delete_all_url_name = "trade_delete_all" class TradeCreate(LoginRequiredMixin, OTPRequiredMixin, ObjectCreate): model = Trade form_class = TradeForm list_url_name = "trades" list_url_args = ["type"] submit_url_name = "trade_create" def post_save(self, obj): obj.post() log.debug(f"Posting trade {obj}") class TradeUpdate(LoginRequiredMixin, OTPRequiredMixin, ObjectUpdate): model = Trade form_class = TradeForm list_url_name = "trades" list_url_args = ["type"] submit_url_name = "trade_update" class TradeDelete(LoginRequiredMixin, OTPRequiredMixin, ObjectDelete): model = Trade list_url_name = "trades" list_url_args = ["type"] class TradeDeleteAll(LoginRequiredMixin, OTPRequiredMixin, ObjectNameMixin, View): template_name = "partials/notify.html" model = Trade def delete(self, request): """ Delete all trades by the current user """ Trade.objects.filter(user=request.user).delete() context = {"message": "All trades deleted", "class": "success"} response = render(request, self.template_name, context) response["HX-Trigger"] = f"{self.context_object_name_singular}Event" return response