expephalon/core/views/backend/profiles.py
2020-06-22 06:36:24 +02:00

290 lines
No EOL
11 KiB
Python

from django.conf import settings
from django.urls import reverse_lazy
from django.contrib.auth import get_user_model
from django.contrib import messages
from django.utils import timezone
from core.models import AdminProfile, ClientProfile, ClientGroup
from core.forms.profiles import AdminEditForm, AdminCreateForm, ClientEditForm, ClientCreateForm
from core.views.backend.generic import BackendFormView, BackendListView, BackendDeleteView, BackendUpdateView, BackendCreateView
from core.helpers.auth import request_password
### AdminProfiles
class AdminListView(BackendListView):
template_name = f"{settings.EXPEPHALON_BACKEND}/profiles/index.html"
model = AdminProfile
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Administrator Users"
return context
class AdminEditView(BackendFormView):
template_name = f"{settings.EXPEPHALON_BACKEND}/profiles/update.html"
form_class = AdminEditForm
success_url = reverse_lazy("admins")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Edit Administrator"
return context
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs.update({'current_email': AdminProfile.objects.get(id=self.kwargs["pk"]).user.username})
return kwargs
def get_initial(self):
initial = super().get_initial()
admin = get_user_model().objects.get(id=self.kwargs["pk"])
assert type(admin.profile) == AdminProfile
initial["first_name"] = admin.first_name
initial["last_name"] = admin.last_name
initial["email"] = admin.username
initial["mobile"] = admin.profile.mobile
initial["role"] = admin.profile.role
initial["display_name"] = admin.profile.display_name
return initial
def form_valid(self, form):
admin = get_user_model().objects.get(id=self.kwargs["pk"])
admin.first_name = form.cleaned_data["first_name"]
admin.last_name = form.cleaned_data["last_name"]
admin.username = form.cleaned_data["email"]
admin.email = form.cleaned_data["email"]
admin.profile.mobile = form.cleaned_data["mobile"]
admin.profile.role = form.cleaned_data["role"]
admin.profile.display_name = form.cleaned_data["display_name"]
if form.cleaned_data["image"] or form.cleaned_data["remove_image"]:
admin.profile.image = form.cleaned_data["image"]
admin.profile.save()
admin.save()
return super().form_valid(form)
class AdminDeleteView(BackendDeleteView):
template_name = f"{settings.EXPEPHALON_BACKEND}/profiles/delete.html"
model = get_user_model()
success_url = reverse_lazy("admins")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Delete Administrator"
return context
def get_object(self, queryset=None):
admin = super().get_object(queryset=queryset)
assert type(admin.profile) == AdminProfile
return admin
class AdminCreateView(BackendFormView):
template_name = f"{settings.EXPEPHALON_BACKEND}/profiles/create.html"
form_class = AdminCreateForm
success_url = reverse_lazy("admins")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Create Administrator"
return context
def form_valid(self, form):
admin = get_user_model()()
admin.first_name = form.cleaned_data["first_name"]
admin.last_name = form.cleaned_data["last_name"]
admin.username = form.cleaned_data["email"]
admin.email = form.cleaned_data["email"]
profile = AdminProfile()
profile.user = admin
profile.mobile = form.cleaned_data["mobile"]
profile.role = form.cleaned_data["role"]
profile.display_name = form.cleaned_data["display_name"]
profile.image = form.cleaned_data["image"]
admin.save()
profile.save()
request_password(admin)
messages.success(self.request, f"User {admin.get_full_name} was successfully created. They should receive an email to set their password shortly.")
return super().form_valid(form)
### ClientProfiles
class ClientListView(BackendListView):
template_name = f"{settings.EXPEPHALON_BACKEND}/clients/index.html"
model = ClientProfile
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Clients"
return context
class ClientEditView(BackendFormView):
template_name = f"{settings.EXPEPHALON_BACKEND}/clients/update.html"
form_class = ClientEditForm
success_url = reverse_lazy("clients")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Edit Client"
return context
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs.update({'current_email': ClientProfile.objects.get(id=self.kwargs["pk"]).user.username})
return kwargs
def get_initial(self):
initial = super().get_initial()
client = ClientProfile.objects.get(id=self.kwargs["pk"]).user
initial["first_name"] = client.first_name
initial["last_name"] = client.last_name
initial["email"] = client.username
initial["mobile"] = client.profile.mobile
initial["address1"] = client.profile.address1
initial["address2"] = client.profile.address2
initial["zip"] = client.profile.zip
initial["city"] = client.profile.city
initial["state"] = client.profile.state
initial["country"] = client.profile.country
initial["vat_id"] = client.profile.vat_id
initial["company_id"] = client.profile.company_id
initial["default_currency"] = client.profile.default_currency
initial["brands"] = client.profile.brands.all()
initial["client_groups"] = client.profile.client_groups.all()
initial["marketing_opt_in"] = bool(client.profile.marketing_opt_in)
initial["pgp_key"] = client.profile.pgp_key
return initial
def form_valid(self, form):
client = ClientProfile.objects.get(id=self.kwargs["pk"]).user
client.first_name = form.cleaned_data["first_name"]
client.last_name = form.cleaned_data["last_name"]
client.username = form.cleaned_data["email"]
client.email = form.cleaned_data["email"]
client.profile.mobile = form.cleaned_data["mobile"]
client.profile.address1 = form.cleaned_data["address1"]
client.profile.address2 = form.cleaned_data["address2"]
client.profile.zip = form.cleaned_data["zip"]
client.profile.city = form.cleaned_data["city"]
client.profile.state = form.cleaned_data["state"]
client.profile.country = form.cleaned_data["country"]
client.profile.vat_id = form.cleaned_data["vat_id"]
client.profile.company_id = form.cleaned_data["company_id"]
client.profile.default_currency = form.cleaned_data["default_currency"]
client.profile.brands.set(form.cleaned_data["brands"])
client.profile.client_groups.set(form.cleaned_data["client_groups"])
client.profile.marketing_opt_in = timezone.now() if form.cleaned_data["marketing_opt_in"] and not client.profile.marketing_opt_in else None
client.profile.pgp_key = form.cleaned_data["pgp_key"]
client.profile.save()
client.save()
return super().form_valid(form)
class ClientDeleteView(BackendDeleteView):
template_name = f"{settings.EXPEPHALON_BACKEND}/clients/delete.html"
model = get_user_model()
success_url = reverse_lazy("clients")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Delete Client"
return context
def get_object(self, queryset=None):
admin = super().get_object(queryset=queryset)
assert type(admin.profile) == ClientProfile
return admin
class ClientCreateView(BackendFormView):
template_name = f"{settings.EXPEPHALON_BACKEND}/clients/create.html"
form_class = ClientCreateForm
success_url = reverse_lazy("admins")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Create Client"
return context
def form_valid(self, form):
client = get_user_model()()
client.first_name = form.cleaned_data["first_name"]
client.last_name = form.cleaned_data["last_name"]
client.username = form.cleaned_data["email"]
client.email = form.cleaned_data["email"]
profile = ClientProfile()
profile.user = client
profile.mobile = form.cleaned_data["mobile"]
profile.address1 = form.cleaned_data["address1"]
profile.address2 = form.cleaned_data["address2"]
profile.zip = form.cleaned_data["zip"]
profile.city = form.cleaned_data["city"]
profile.state = form.cleaned_data["state"]
profile.country = form.cleaned_data["country"]
profile.vat_id = form.cleaned_data["vat_id"]
profile.company_id = form.cleaned_data["company_id"]
profile.default_currency = form.cleaned_data["default_currency"]
profile.marketing_opt_in = timezone.now() if form.cleaned_data["marketing_opt_in"] else None
profile.pgp_key = form.cleaned_data["pgp_key"]
client.save()
profile.save()
profile.brands.set(form.cleaned_data["brands"])
profile.client_groups.set(form.cleaned_data["client_groups"])
profile.save()
if form.cleaned_data["send_password"]:
request_password(client)
messages.success(self.request, f"Client {client.get_full_name} was successfully created. They should receive an email to set their password shortly.")
return super().form_valid(form)
### ClientGroups
class ClientGroupListView(BackendListView):
template_name = f"{settings.EXPEPHALON_BACKEND}/clientgroups/index.html"
model = ClientGroup
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Client Group Settings"
return context
class ClientGroupEditView(BackendUpdateView):
template_name = f"{settings.EXPEPHALON_BACKEND}/clientgroups/update.html"
model = ClientGroup
success_url = reverse_lazy("clientgroups")
fields = ["name", "color"]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Edit Client Group"
return context
class ClientGroupDeleteView(BackendDeleteView):
template_name = f"{settings.EXPEPHALON_BACKEND}/clientgroups/delete.html"
model = ClientGroup
success_url = reverse_lazy("clientgroups")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Delete Client Group"
return context
class ClientGroupCreateView(BackendCreateView):
template_name = f"{settings.EXPEPHALON_BACKEND}/clientgroups/create.html"
model = ClientGroup
success_url = reverse_lazy("clientgroups")
fields = ["name", "color"]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = "Create Client Group"
return context