Files
market/trading/views.py
Alek Ratzloff c320f81181 Remove Tx model
There was a split between a transaction request and an actual
transaction. This was kind of annoying because transactions were one-way
only, while transaction requests were two-way - which is what I believe
most transactions will be using. Tx model has been removed and the
responsibilities of it are covered by TxRequest. It simplifies
everything surrounding transactions, since we have only one model to
deal with instead of two.

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
2020-03-26 12:49:46 -04:00

126 lines
4.0 KiB
Python

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 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
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(DetailView):
template_name = "trading/t/detail.html"
model = 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