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.

114 lines
3.8 KiB
Python

from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import render
from django.views import View
from mixins.views import (
ObjectCreate,
ObjectDelete,
ObjectList,
ObjectNameMixin,
ObjectUpdate,
)
from core.forms import TradingTimeForm
from core.models import Strategy, TradingTime
from core.util import logs
log = logs.get_logger(__name__)
# Trend directions
class TrendDirectionList(LoginRequiredMixin, ObjectList):
list_template = "partials/trend-direction-list.html"
page_title = "List of trend directions for a strategy"
page_subtitle = None
context_object_name_singular = "trend direction"
context_object_name = "trend directions"
list_url_name = "trenddirections"
list_url_args = ["type", "strategy_id"]
def get_queryset(self, **kwargs):
strategy_id = kwargs.get("strategy_id", None)
self.extra_context = {"strategy_id": strategy_id}
try:
strategy = Strategy.objects.get(id=strategy_id, user=self.request.user)
except Strategy.DoesNotExist:
context = {"message": "Strategy does not exist", "class": "danger"}
return self.render_to_response(context)
return strategy.trends
class TrendDirectionFlip(LoginRequiredMixin, ObjectNameMixin, View):
template_name = "mixins/partials/notify.html"
model = Strategy
def get(self, request, strategy_id, symbol):
try:
strategy = Strategy.objects.get(id=strategy_id, user=request.user)
except Strategy.DoesNotExist:
context = {"message": "Strategy does not exist", "class": "danger"}
return render(request, self.template_name, context)
if symbol not in strategy.trends:
context = {"message": "Trend direction does not exist", "class": "danger"}
return render(request, self.template_name, context)
if strategy.trends[symbol] == "buy":
strategy.trends[symbol] = "sell"
elif strategy.trends[symbol] == "sell":
strategy.trends[symbol] = "buy"
strategy.save()
context = {"message": "Trend direction updated", "class": "success"}
return render(request, self.template_name, context)
class TrendDirectionDelete(LoginRequiredMixin, ObjectNameMixin, View):
template_name = "mixins/partials/notify.html"
model = Strategy
def delete(self, request, strategy_id, symbol):
try:
strategy = Strategy.objects.get(id=strategy_id, user=request.user)
except Strategy.DoesNotExist:
context = {"message": "Strategy does not exist", "class": "danger"}
return render(request, self.template_name, context)
if symbol not in strategy.trends:
context = {"message": "Trend direction does not exist", "class": "danger"}
return render(request, self.template_name, context)
del strategy.trends[symbol]
strategy.save()
context = {"message": "Trend direction deleted", "class": "success"}
return render(request, self.template_name, context)
# Trading times
class TradingTimeList(LoginRequiredMixin, ObjectList):
list_template = "partials/trading-time-list.html"
model = TradingTime
page_title = "List of allowed trading times, used as options for a strategy"
page_subtitle = "Add times here in order to permit trading."
list_url_name = "tradingtimes"
list_url_args = ["type"]
submit_url_name = "tradingtime_create"
class TradingTimeCreate(LoginRequiredMixin, ObjectCreate):
model = TradingTime
form_class = TradingTimeForm
submit_url_name = "tradingtime_create"
class TradingTimeUpdate(LoginRequiredMixin, ObjectUpdate):
model = TradingTime
form_class = TradingTimeForm
submit_url_name = "tradingtime_update"
class TradingTimeDelete(LoginRequiredMixin, ObjectDelete):
model = TradingTime