UserCreate and AliasCreate used BackToUsersMixin and BackToAliasesMixin, which access self.user or self.alias for ?return=detail. Neither exists on the create pages, so the request failed with an AttributeError. Both views now define their own back link with the target they already used without the parameter: the user list and the user's detail page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
106 lines
3.5 KiB
Python
106 lines
3.5 KiB
Python
from flask import flash, url_for
|
|
|
|
from max.db import EmailAlreadyExists, create_alias, get_domains
|
|
from max.permissions import AllowAdminOrSelf
|
|
from max.translations import t
|
|
|
|
from ..base_user_views import FetchUserTemplateGetView
|
|
from ..check_email_mixin import CheckEmailMixin
|
|
|
|
|
|
class AliasCreate(AllowAdminOrSelf, CheckEmailMixin, FetchUserTemplateGetView):
|
|
template_name = "alias/create.html"
|
|
|
|
def get_webpagetitle(self):
|
|
return f"Create new alias for {self.user.email}"
|
|
|
|
def get_back_text_and_url(self):
|
|
return self.user.email, url_for("user-detail", user_id=self.user.id)
|
|
|
|
def post(self):
|
|
error = False
|
|
email = self.request.form.get("email")
|
|
if not isinstance(email, str) or not email:
|
|
flash(t("Email must be given"), category="error")
|
|
error = True
|
|
else:
|
|
self.email = email
|
|
|
|
if self.user.can_use_different_alias_domain:
|
|
domain = self.request.form.get("domain")
|
|
if not isinstance(domain, str) or not domain:
|
|
flash(t("Domain must be given"), category="error")
|
|
error = True
|
|
elif domain not in get_domains():
|
|
flash(t("Invalid domain"), category="error")
|
|
error = True
|
|
else:
|
|
self.domain = domain
|
|
else:
|
|
self.domain = self.get_user_domain()
|
|
|
|
if not error:
|
|
full_email = f"{self.email}@{self.domain}"
|
|
if not self.is_email_valid(full_email):
|
|
error = True
|
|
elif not self.auth_user.is_admin and self.is_reserved_email(full_email):
|
|
flash(
|
|
t("This address is reserved and can only be created by an admin."),
|
|
category="error",
|
|
)
|
|
error = True
|
|
|
|
enabled = self.request.form.get("enabled")
|
|
if enabled == "on":
|
|
self.enabled = True
|
|
elif enabled is None:
|
|
self.enabled = False
|
|
else:
|
|
flash(t("Enabled is not set"), category="error")
|
|
error = True
|
|
|
|
note = self.request.form.get("note", "")
|
|
if not isinstance(note, str):
|
|
flash(t("Note must be a string"), category="error")
|
|
error = True
|
|
else:
|
|
self.note = note
|
|
|
|
if error:
|
|
return # force re-rendering
|
|
|
|
try:
|
|
create_alias(full_email, self.user, self.enabled, self.note)
|
|
except EmailAlreadyExists as e:
|
|
if self.auth_user.is_admin:
|
|
flash(
|
|
t("Email already exists: {msg}", msg=t(e.msg, **e.arguments)),
|
|
category="error",
|
|
)
|
|
else:
|
|
flash(t("Email already exists."))
|
|
return
|
|
|
|
flash(
|
|
t("Creation of alias {email} was successful!", email=full_email),
|
|
category="success",
|
|
)
|
|
return self.redirect()
|
|
|
|
def get_context(self):
|
|
context = super().get_context()
|
|
for key in ("email", "domain", "enabled", "note"):
|
|
if hasattr(self, key):
|
|
context[key] = getattr(self, key)
|
|
context["can_use_different_alias_domain"] = (
|
|
self.user.can_use_different_alias_domain
|
|
)
|
|
if self.user.can_use_different_alias_domain:
|
|
context["domains"] = get_domains()
|
|
else:
|
|
context["domain"] = self.get_user_domain()
|
|
return context
|
|
|
|
def get_user_domain(self):
|
|
return self.user.email.split("@")[1]
|