Files
market/trading/views.py

148 lines
4.8 KiB
Python
Raw Permalink Normal View History

from django import forms
from django.contrib.auth import views as auth_views, password_validation
from django.contrib.auth.forms import UsernameField
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.contrib import messages
from django.core.exceptions import PermissionDenied
from django.db.models import Q
from django.http import HttpResponseForbidden, HttpResponseRedirect
from django.views.generic import TemplateView
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView
from django.views.generic.list import ListView
from django.urls import reverse, reverse_lazy
from django.utils.translation import gettext_lazy as _
from guardian.mixins import PermissionRequiredMixin
from trading.models import User, Commodity, MaxCommodityError, TxRequest
class IndexView(LoginRequiredMixin, TemplateView):
template_name = "trading/index.html"
################################################################################
# Commodity views
################################################################################
class CommodityDetailView(DetailView):
template_name = "trading/c/detail.html"
model = Commodity
def get_context_data(self, **kwargs):
from django import utils
from datetime import timedelta
DAY = timedelta(days=1)
HOUR = timedelta(hours=1)
context = super().get_context_data(**kwargs)
now = utils.timezone.now()
obj = context["object"]
context["trading_volume_all"] = obj.trading_volume()
context["trading_volume_day"] = obj.trading_volume(now - DAY)
context["trading_volume_hour"] = obj.trading_volume(now - HOUR)
context["market_spread_ratio"] = f"{obj.market_spread_ratio*100:.2f}"
return context
class CommodityListView(ListView):
template_name = "trading/c/list.html"
model = Commodity
paginate_by = 100
class CommodityCreateView(LoginRequiredMixin, CreateView):
template_name = "trading/c/create.html"
model = Commodity
fields = (
"name",
"in_circulation",
)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["object"] = self.request.user
return context
def form_valid(self, form):
user = self.request.user
if not user.can_create_commodity():
raise MaxCommodityError(user)
form.instance.created_by = user
return super(CreateView, self).form_valid(form)
################################################################################
# Tx views
################################################################################
class TxRequestDetailView(PermissionRequiredMixin, DetailView):
template_name = "trading/t/detail.html"
model = TxRequest
permission_required = "view_txrequest"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
tx = context["object"]
if self.request.user == tx.source:
context["sent"] = tx.source_sends
context["sent_amount"] = tx.source_amount
context["received"] = tx.dest_sends
context["received_amount"] = tx.dest_amount
else:
context["sent"] = tx.dest_sends
context["sent_amount"] = tx.dest_amount
context["received"] = tx.source_sends
context["received_amount"] = tx.source_amount
return context
class TxRequestListView(LoginRequiredMixin, ListView):
template_name = "trading/t/list.html"
model = TxRequest
paginate_by = 100
def get_queryset(self):
user = self.request.user
return TxRequest.objects.filter(Q(source=user) | Q(dest=user)).order_by("-pk")
################################################################################
# User views
################################################################################
class UserProfileView(DetailView):
template_name = "trading/u/profile.html"
model = User
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if self.object.is_active:
status = "Active"
else:
status = "Inactive"
context["object_status"] = status
return context
class UserUpdateSettingsForm(forms.ModelForm):
class Meta:
model = User
fields = (
"username",
"email",
)
field_classes = {"username": UsernameField}
def __init__(self, user, *args, **kwargs):
super().__init__(*args, **kwargs)
class UserSettingsView(LoginRequiredMixin, UpdateView):
template_name = "trading/account/settings.html"
model = User
fields = ("username", "email")
success_url = reverse_lazy("trading:settings")
def get_object(self, queryset=None):
return self.request.user