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