generated from westfarn/web_django_template
CI / test (pull_request) Successful in 35s
Shoppers can register, save shipping details, and view order history while cards stay on Stripe. EasyPost tracker updates (including numbers from Pirate Ship) and 1–5 star reviews are limited to buyers. The contact form now only asks for email and a message.
120 lines
4.0 KiB
Python
120 lines
4.0 KiB
Python
from django.contrib import messages
|
|
from django.contrib.auth import login, logout
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.contrib.auth.views import LoginView
|
|
from django.shortcuts import redirect, render
|
|
from django.urls import reverse
|
|
from django.views.decorators.http import require_http_methods
|
|
|
|
from accounts.forms import (
|
|
CustomerAuthenticationForm,
|
|
CustomerProfileForm,
|
|
CustomerRegisterForm,
|
|
)
|
|
from accounts.services import claim_orders_for_user, get_customer_profile
|
|
|
|
|
|
class PortalLoginView(LoginView):
|
|
template_name = "accounts/login.html"
|
|
|
|
def get_success_url(self):
|
|
url = self.get_redirect_url()
|
|
if url:
|
|
return url
|
|
if self.request.user.is_staff:
|
|
return reverse("dashboard:home")
|
|
return reverse("account:home")
|
|
|
|
|
|
class CustomerLoginView(LoginView):
|
|
template_name = "accounts/customer_login.html"
|
|
authentication_form = CustomerAuthenticationForm
|
|
redirect_authenticated_user = True
|
|
|
|
def get_success_url(self):
|
|
url = self.get_redirect_url()
|
|
if url:
|
|
return url
|
|
if self.request.user.is_staff:
|
|
return reverse("dashboard:home")
|
|
return reverse("account:home")
|
|
|
|
|
|
@require_http_methods(["GET", "POST"])
|
|
def customer_register(request):
|
|
if request.user.is_authenticated:
|
|
return redirect("account:home")
|
|
if request.method == "POST":
|
|
form = CustomerRegisterForm(request.POST)
|
|
if form.is_valid():
|
|
user = form.save()
|
|
get_customer_profile(user)
|
|
claimed = claim_orders_for_user(user)
|
|
login(request, user)
|
|
if claimed:
|
|
messages.success(
|
|
request,
|
|
f"Account created. {claimed} existing order(s) are now in your history.",
|
|
)
|
|
else:
|
|
messages.success(request, "Account created. Welcome.")
|
|
return redirect("account:home")
|
|
else:
|
|
initial = {}
|
|
email = (request.GET.get("email") or "").strip()
|
|
if email:
|
|
initial["email"] = email
|
|
form = CustomerRegisterForm(initial=initial)
|
|
return render(request, "accounts/register.html", {"form": form})
|
|
|
|
|
|
@require_http_methods(["GET", "POST"])
|
|
def customer_logout(request):
|
|
logout(request)
|
|
messages.success(request, "Signed out.")
|
|
return redirect("public:home")
|
|
|
|
|
|
@login_required(login_url="account:login")
|
|
def customer_home(request):
|
|
from django.apps import apps
|
|
|
|
if apps.is_installed("shop"):
|
|
return redirect("account:orders")
|
|
return redirect("account:profile")
|
|
|
|
|
|
@login_required(login_url="account:login")
|
|
@require_http_methods(["GET", "POST"])
|
|
def customer_profile(request):
|
|
profile = get_customer_profile(request.user)
|
|
addr = profile.shipping_address or {}
|
|
initial = {
|
|
"first_name": request.user.first_name,
|
|
"last_name": request.user.last_name,
|
|
"phone": profile.phone,
|
|
"address_line1": addr.get("line1") or "",
|
|
"address_line2": addr.get("line2") or "",
|
|
"address_city": addr.get("city") or "",
|
|
"address_state": addr.get("state") or "",
|
|
"address_zip": addr.get("zip") or "",
|
|
}
|
|
if request.method == "POST":
|
|
form = CustomerProfileForm(request.POST)
|
|
if form.is_valid():
|
|
request.user.first_name = form.cleaned_data.get("first_name") or ""
|
|
request.user.last_name = form.cleaned_data.get("last_name") or ""
|
|
request.user.save(update_fields=["first_name", "last_name"])
|
|
profile.phone = form.cleaned_data.get("phone") or ""
|
|
profile.shipping_address = form.shipping_address()
|
|
profile.save(update_fields=["phone", "shipping_address", "updated_at"])
|
|
messages.success(request, "Profile saved.")
|
|
return redirect("account:profile")
|
|
else:
|
|
form = CustomerProfileForm(initial=initial)
|
|
return render(
|
|
request,
|
|
"accounts/profile.html",
|
|
{"form": form, "profile": profile},
|
|
)
|