Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 32 additions & 26 deletions app/admin/email_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,19 @@ def __init__(self):

@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
Expand All @@ -88,30 +94,30 @@ def search_aliases(query: str) -> 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

Expand Down
17 changes: 11 additions & 6 deletions templates/admin/email_search.html
Original file line number Diff line number Diff line change
Expand Up @@ -948,7 +948,12 @@ <h6 class="section-title">Identity</h6>
{% 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>
Expand Down Expand Up @@ -2889,7 +2894,7 @@ <h5 class="mb-0">
<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 '' }}>
Expand All @@ -2910,7 +2915,7 @@ <h5 class="mb-0">
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>
Expand All @@ -2921,7 +2926,7 @@ <h5 class="mb-0">
<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' %}
Expand Down Expand Up @@ -3220,8 +3225,8 @@ <h5 class="mb-0">

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.';
Expand Down
Loading