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>
126 lines
4.0 KiB
Python
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
|
|
|