Files
max/max/routes/alias/create.py
T
finnandClaude Opus 5.5 5b87d9ff03 Fix HTTP 500 on the create pages with ?return=detail
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>
2026-10-21 19:24:37 +00:00

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]