You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.3 KiB
Python

from django.contrib.auth.mixins import LoginRequiredMixin
from django.http import HttpResponseBadRequest
from django.shortcuts import render
from django.views import View
from mixins.views import (
ObjectCreate,
ObjectDelete,
ObjectList,
ObjectNameMixin,
ObjectRead,
ObjectUpdate,
)
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
log = logs.get_logger(__name__)
class TradeAction(LoginRequiredMixin, OTPRequiredMixin, ObjectRead):
context_object_name_singular = "trade"
context_object_name = "trades"
detail_url_name = "trade_action"
detail_url_args = ["type", "account_id", "trade_id"]
def get_object(self, **kwargs):
trade_id = kwargs.get("trade_id")
account_id = kwargs.get("account_id")
db_info = Trade.get_by_id_or_order(trade_id, account_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
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
submit_url_name = "trade_update"
class TradeDelete(LoginRequiredMixin, OTPRequiredMixin, ObjectDelete):
model = Trade
class TradeDeleteAll(LoginRequiredMixin, OTPRequiredMixin, ObjectNameMixin, View):
template_name = "mixins/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