feat(admin): alias improvements

This commit is contained in:
Carlos Quintana
2026-03-25 14:59:12 +01:00
committed by Adrià Casajús
parent aa049463c8
commit b4ec6f109c
2 changed files with 43 additions and 32 deletions
+32 -26
View File
@@ -72,13 +72,19 @@ class EmailSearchResult:
@staticmethod
def search_aliases(query: str) -> EmailSearchResult:
"""Search for aliases by exact match or POSIX regex."""
"""Search for aliases by exact email match or alias ID."""
output = EmailSearchResult()
output.query = query
output.search_type = EmailSearchResult.SEARCH_TYPE_ALIAS
# Exact match only for alias search (no regex support)
alias = Alias.get_by(email=query)
# Search by alias ID if query is numeric, otherwise by exact email match
alias = None
try:
alias_id = int(query)
alias = Alias.get(alias_id)
except ValueError:
alias = Alias.get_by(email=query)
if alias:
output.aliases = [alias]
output.aliases_found_by_regex = False
@@ -88,30 +94,30 @@ class EmailSearchResult:
.all()
)
output.no_match = False
else:
# Search deleted aliases (exact match only)
deleted_alias = DeletedAlias.get_by(email=query)
if deleted_alias:
output.deleted_aliases = [deleted_alias]
output.deleted_aliases_found_by_regex = False
output.deleted_alias_audit_log = (
AliasAuditLog.filter_by(alias_email=deleted_alias.email)
.order_by(AliasAuditLog.created_at.desc())
.all()
)
output.no_match = False
# Search deleted aliases (exact match only)
deleted_alias = DeletedAlias.get_by(email=query)
if deleted_alias:
output.deleted_aliases = [deleted_alias]
output.deleted_aliases_found_by_regex = False
output.deleted_alias_audit_log = (
AliasAuditLog.filter_by(alias_email=deleted_alias.email)
.order_by(AliasAuditLog.created_at.desc())
.all()
)
output.no_match = False
# Search domain deleted aliases (exact match only)
domain_deleted_alias = DomainDeletedAlias.get_by(email=query)
if domain_deleted_alias:
output.domain_deleted_aliases = [domain_deleted_alias]
output.domain_deleted_aliases_found_by_regex = False
output.domain_deleted_alias_audit_log = (
AliasAuditLog.filter_by(alias_email=domain_deleted_alias.email)
.order_by(AliasAuditLog.created_at.desc())
.all()
)
output.no_match = False
# Search domain deleted aliases (exact match only)
domain_deleted_alias = DomainDeletedAlias.get_by(email=query)
if domain_deleted_alias:
output.domain_deleted_aliases = [domain_deleted_alias]
output.domain_deleted_aliases_found_by_regex = False
output.domain_deleted_alias_audit_log = (
AliasAuditLog.filter_by(alias_email=domain_deleted_alias.email)
.order_by(AliasAuditLog.created_at.desc())
.all()
)
output.no_match = False
return output
+11 -6
View File
@@ -948,7 +948,12 @@
{% endif %}
<tr>
<td class="text-muted text-nowrap py-1">Status:</td>
<td class="py-1">{{ badge_status(alias.enabled, 'Enabled', 'Disabled', 'success', 'danger') }}</td>
<td class="py-1">
{{ badge_status(alias.enabled, 'Enabled', 'Disabled', 'success', 'danger') }}
{% if alias.is_trashed() %}
<span class="badge badge-warning ml-1"><i class="fa fa-trash mr-1"></i>Trashed</span>
{% endif %}
</td>
</tr>
<tr>
<td class="text-muted text-nowrap py-1">User:</td>
@@ -2889,7 +2894,7 @@
<div class="btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-outline-primary {{ 'active' if search_type == 'email' else '' }}">
<input type="radio" name="search_type" value="email" {{ 'checked' if search_type == 'email' else '' }}>
<i class="fa fa-envelope mr-1"></i>Email
<i class="fa fa-user mr-1"></i>User
</label>
<label class="btn btn-outline-primary {{ 'active' if search_type == 'alias' else '' }}">
<input type="radio" name="search_type" value="alias" {{ 'checked' if search_type == 'alias' else '' }}>
@@ -2910,7 +2915,7 @@
name="query"
id="query"
value="{{ query or '' }}"
placeholder="{{ 'alias@example.com (exact match only)' if search_type == 'alias' else ('partner email or external user ID' if search_type == 'partner' else ('POSIX regex pattern' if search_type == 'regex' else 'email@example.com or user ID (exact match only)')) }}">
placeholder="{{ 'alias@example.com or alias ID' if search_type == 'alias' else ('partner email or external user ID' if search_type == 'partner' else ('POSIX regex pattern' if search_type == 'regex' else 'email@example.com or user ID (exact match only)')) }}">
<div class="input-group-append">
<button type="submit" class="btn btn-primary-modern" id="searchBtn">
<span class="search-icon"><i class="fa fa-search mr-1"></i>Search</span>
@@ -2921,7 +2926,7 @@
<small class="form-text text-muted" id="search-help">
{% if search_type == 'alias' %}
<i class="fa fa-info-circle mr-1"></i>Enter the full alias email address. Only exact matches are supported.
<i class="fa fa-info-circle mr-1"></i>Enter the full alias email address or alias ID. Only exact matches are returned.
{% elif search_type == 'partner' %}
<i class="fa fa-info-circle mr-1"></i>Search by partner email (contains @) or external user ID.
{% elif search_type == 'regex' %}
@@ -3220,8 +3225,8 @@
function updateSearchHelp(searchType) {
if (searchType === 'alias') {
queryInput.placeholder = 'alias@example.com (exact match only)';
searchHelp.innerHTML = '<i class="fa fa-info-circle mr-1"></i>Enter the full alias email address. Only exact matches are supported.';
queryInput.placeholder = 'alias@example.com or alias ID';
searchHelp.innerHTML = '<i class="fa fa-info-circle mr-1"></i>Enter the full alias email address or alias ID. Only exact matches are returned.';
} else if (searchType === 'partner') {
queryInput.placeholder = 'partner email or external user ID';
searchHelp.innerHTML = '<i class="fa fa-info-circle mr-1"></i>Search by partner email (contains @) or external user ID.';