mirror of
https://github.com/simple-login/app.git
synced 2024-09-21 01:11:29 +02:00
Limit email search to only 10 aliases to avoid timing out (#2183)
This commit is contained in:
parent
80d1369bf9
commit
a8988cb8f6
@ -753,12 +753,37 @@ class EmailSearchAdmin(BaseView):
|
||||
if not alias and not user and not mailbox:
|
||||
no_match = True
|
||||
|
||||
def user_mailboxes(user_id: int) -> list[Mailbox]:
|
||||
return (
|
||||
Mailbox.filter_by(user_id=user_id)
|
||||
.order_by(Mailbox.id.asc())
|
||||
.limit(10)
|
||||
.all()
|
||||
)
|
||||
|
||||
def user_mailboxes_count(user_id: int) -> int:
|
||||
return Mailbox.filter_by(user_id=user_id).order_by(Mailbox.id.asc()).count()
|
||||
|
||||
def user_aliases(user_id: int) -> list[Alias]:
|
||||
return (
|
||||
Alias.filter_by(user_id=user_id)
|
||||
.order_by(Alias.id.asc())
|
||||
.limit(10)
|
||||
.all()
|
||||
)
|
||||
|
||||
def user_aliases_count(user_id: int) -> int:
|
||||
return Alias.filter_by(user_id=user_id).count()
|
||||
|
||||
return self.render(
|
||||
"admin/alias_search.html",
|
||||
"admin/email_search.html",
|
||||
email=email,
|
||||
no_match=no_match,
|
||||
alias=alias,
|
||||
mailbox=mailbox,
|
||||
user=user,
|
||||
user_aliases=lambda user_id: Alias.filter_by(user_id=user_id).all(),
|
||||
user_aliases=user_aliases,
|
||||
user_aliases_count=user_aliases_count,
|
||||
user_mailboxes=user_mailboxes,
|
||||
user_mailboxes_count=user_mailboxes_count,
|
||||
)
|
||||
|
@ -3,5 +3,5 @@
|
||||
export DB_URI=postgresql://myuser:mypassword@localhost:15432/simplelogin
|
||||
echo 'drop schema public cascade; create schema public;' | psql $DB_URI
|
||||
|
||||
rye run alembic upgrade head
|
||||
rye run flask dummy-data
|
||||
poetry run alembic upgrade head
|
||||
poetry run flask dummy-data
|
||||
|
@ -3,4 +3,4 @@
|
||||
export DB_URI=postgresql://myuser:mypassword@localhost:15432/test
|
||||
echo 'drop schema public cascade; create schema public;' | psql $DB_URI
|
||||
|
||||
rye run alembic upgrade head
|
||||
poetry run alembic upgrade head
|
||||
|
@ -1,300 +0,0 @@
|
||||
{% extends 'admin/master.html' %}
|
||||
|
||||
{% block body %}
|
||||
|
||||
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
||||
<form method="post">
|
||||
<div class="form-group">
|
||||
<label for="email">Email to search:</label>
|
||||
<input type="text"
|
||||
class="form-control"
|
||||
name="email"
|
||||
value="{{ email or '' }}"/>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">Submit</button>
|
||||
</form>
|
||||
</div>
|
||||
{% if no_match %}
|
||||
|
||||
<div class="border border-dark border-2 mt-1 mb-2 p-3 alert alert-warning"
|
||||
role="alert">
|
||||
No user, alias or mailbox found for {{ email }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if alias %}
|
||||
|
||||
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
||||
<h3>Alias {{ alias.email }} found</h3>
|
||||
<dl>
|
||||
<dt>
|
||||
Alias id
|
||||
</dt>
|
||||
<dd>
|
||||
{{ alias.id }}
|
||||
</dd>
|
||||
<dt>
|
||||
Email
|
||||
</dt>
|
||||
<dd>
|
||||
{{ alias.email }}
|
||||
</dd>
|
||||
<dt>
|
||||
Created at
|
||||
</dt>
|
||||
<dd>
|
||||
{{ alias.created_at }}
|
||||
</dd>
|
||||
<dt class="mb-2">
|
||||
User
|
||||
</dt>
|
||||
<dd class="ml-4 border-secondary border p-2">
|
||||
<dl>
|
||||
<dt>
|
||||
User id
|
||||
</dt>
|
||||
<dd>
|
||||
{{ alias.user.id }}
|
||||
</dd>
|
||||
<dt>
|
||||
Email
|
||||
</dt>
|
||||
<dd>
|
||||
{{ alias.user.email }}
|
||||
</dd>
|
||||
<dt>
|
||||
Premium
|
||||
</dt>
|
||||
<dd>
|
||||
{{ alias.user.is_premium() }}
|
||||
</dd>
|
||||
<dt>
|
||||
Disabled
|
||||
</dt>
|
||||
<dd>
|
||||
{{ alias.user.disabled }}
|
||||
</dd>
|
||||
<dt>
|
||||
Crated At
|
||||
</dt>
|
||||
<dd>
|
||||
{{ alias.user.created_at }}
|
||||
</dd>
|
||||
<dt class="border-dark border-top-2 mb-2">
|
||||
Mailboxes
|
||||
</dt>
|
||||
<dd>
|
||||
{% for mailbox in alias.mailboxes %}
|
||||
|
||||
<dl class="border border-grey border-2 ml-4 p-2">
|
||||
<dt>
|
||||
Mailbox id
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.id }}
|
||||
</dd>
|
||||
<dt>
|
||||
Email
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.email }}
|
||||
</dd>
|
||||
<dt>
|
||||
Verified
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.verified }}
|
||||
</dd>
|
||||
<dt>
|
||||
Created At
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.created_at }}
|
||||
</dd>
|
||||
</dl>
|
||||
{% endfor %}
|
||||
</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if user %}
|
||||
|
||||
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
||||
<h3>User {{ user.email }} found</h3>
|
||||
<dl>
|
||||
<dt>
|
||||
User id
|
||||
</dt>
|
||||
<dd>
|
||||
{{ user.id }}
|
||||
</dd>
|
||||
<dt>
|
||||
Email
|
||||
</dt>
|
||||
<dd>
|
||||
{{ user.email }}
|
||||
</dd>
|
||||
{% if user.is_paid() %}
|
||||
|
||||
<dt>
|
||||
Paid
|
||||
</dt>
|
||||
<dd>
|
||||
Yes
|
||||
</dd>
|
||||
<dt>
|
||||
Subscription
|
||||
</dt>
|
||||
<dd>
|
||||
{{ user.get_active_subscription() }}
|
||||
</dd>
|
||||
{% else %}
|
||||
<dt>
|
||||
Paid
|
||||
</dt>
|
||||
<dd>
|
||||
No
|
||||
</dd>
|
||||
{% endif %}
|
||||
<dt>
|
||||
Created at
|
||||
</dt>
|
||||
<dd>
|
||||
{{ user.created_at }}
|
||||
</dd>
|
||||
<dt class="mb-2">
|
||||
Mailboxes
|
||||
</dt>
|
||||
<dd>
|
||||
{% for mailbox in user.mailboxes() %}
|
||||
|
||||
<dl class="border border-dark p-2 ml-4">
|
||||
<dt>
|
||||
Mailbox id
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.id }}
|
||||
</dd>
|
||||
<dt>
|
||||
Email
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.email }}
|
||||
</dd>
|
||||
<dt>
|
||||
Verified
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.verified }}
|
||||
</dd>
|
||||
<dt>
|
||||
Created At
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.created_at }}
|
||||
</dd>
|
||||
</dl>
|
||||
{% endfor %}
|
||||
</dd>
|
||||
<dt class="mb-2">
|
||||
Aliases
|
||||
</dt>
|
||||
<dd>
|
||||
{% for mailbox in user_aliases(user.id) %}
|
||||
|
||||
<dl class="border border-dark p-2 ml-4">
|
||||
<dt>
|
||||
Mailbox id
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.id }}
|
||||
</dd>
|
||||
<dt>
|
||||
Email
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.email }}
|
||||
</dd>
|
||||
<dt>
|
||||
Verified
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.verified }}
|
||||
</dd>
|
||||
<dt>
|
||||
Created At
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.created_at }}
|
||||
</dd>
|
||||
</dl>
|
||||
{% endfor %}
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if mailbox %}
|
||||
|
||||
<div class="border border-dark mt-1 mb-2 p-3">
|
||||
<h3>Mailbox {{ mailbox.email }} found</h3>
|
||||
<dl>
|
||||
<dt>
|
||||
Mailbox id
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.id }}
|
||||
</dd>
|
||||
<dt>
|
||||
Email
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.email }}
|
||||
</dd>
|
||||
<dt>
|
||||
Created at
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.created_at }}
|
||||
</dd>
|
||||
<dt class="mb-2">
|
||||
User
|
||||
</dt>
|
||||
<dd class="ml-4">
|
||||
<dl class="border-dark border p-2">
|
||||
<dt>
|
||||
User id
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.user.id }}
|
||||
</dd>
|
||||
<dt>
|
||||
Email
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.user.email }}
|
||||
</dd>
|
||||
<dt>
|
||||
Premium
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.user.is_premium() }}
|
||||
</dd>
|
||||
<dt>
|
||||
Disabled
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.user.disabled }}
|
||||
</dd>
|
||||
<dt>
|
||||
Crated At
|
||||
</dt>
|
||||
<dd>
|
||||
{{ mailbox.user.created_at }}
|
||||
</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
139
templates/admin/email_search.html
Normal file
139
templates/admin/email_search.html
Normal file
@ -0,0 +1,139 @@
|
||||
{% extends 'admin/master.html' %}
|
||||
|
||||
{% macro show_user(user) -%}
|
||||
<h4>User {{ user.email }} with ID {{ user.id }}.</h4>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">User ID</th>
|
||||
<th scope="col">Email</th>
|
||||
<th scope="col">Paid</th>
|
||||
<th>Subscription</th>
|
||||
<th>Created At</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ user.id }}</td>
|
||||
<td>{{ user.email }}</td>
|
||||
<td>{{ "yes" if user.is_paid() else No }}</td>
|
||||
<td>{{ user.get_active_subscription() }}</td>
|
||||
<td>{{ user.created_at }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
{%- endmacro %}
|
||||
{% macro list_mailboxes(mbox_count, mboxes) %}
|
||||
<h4>
|
||||
{{ mbox_count }} Mailboxes found.
|
||||
{% if mbox_count>10 %}Showing only the first 10.{% endif %}
|
||||
</h4>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Mailbox ID</th>
|
||||
<th>Email</th>
|
||||
<th>Verified</th>
|
||||
<th>Created At</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for mailbox in mboxes %}
|
||||
|
||||
<tr>
|
||||
<td>{{ mailbox.id }}</td>
|
||||
<td>{{ mailbox.email }}</td>
|
||||
<td>{{ "Yes" if mailbox.verified else "No" }}</td>
|
||||
<td>{{ mailbox.created_at }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endmacro %}
|
||||
{% macro list_alias(alias_count, aliases) %}
|
||||
<h4>
|
||||
{{ alias_count }} Aliases found.
|
||||
{% if alias_count>10 %}Showing only the first 10.{% endif %}
|
||||
</h4>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Alias ID</th>
|
||||
<th>Email</th>
|
||||
<th>Verified</th>
|
||||
<th>Created At</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for alias in aliases %}
|
||||
|
||||
<tr>
|
||||
<td>{{ alias.id }}</td>
|
||||
<td>{{ alias.email }}</td>
|
||||
<td>{{ "Yes" if alias.verified else "No" }}</td>
|
||||
<td>
|
||||
{{ alias.created_at }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% endmacro %}
|
||||
{% block body %}
|
||||
|
||||
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
||||
<form method="post">
|
||||
<div class="form-group">
|
||||
<label for="email">
|
||||
Email to search:
|
||||
</label>
|
||||
<input type="text"
|
||||
class="form-control"
|
||||
name="email"
|
||||
value="{{ email or '' }}"/>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
Submit
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
{% if no_match %}
|
||||
|
||||
<div class="border border-dark border-2 mt-1 mb-2 p-3 alert alert-warning"
|
||||
role="alert">
|
||||
No user, alias or mailbox found for {{ email }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if alias %}
|
||||
|
||||
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
||||
<h3 class="mb-3">
|
||||
Found Alias {{ alias.email }}
|
||||
</h3>
|
||||
{{ list_alias(1,[alias]) }}
|
||||
{{ show_user(alias.user) }}
|
||||
{{ list_mailboxes(user_mailboxes_count(alias.user.id), user_mailboxes(alias.user.id) ) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if user %}
|
||||
|
||||
<div class="border border-dark border-2 mt-1 mb-2 p-3">
|
||||
<h3 class="mb-3">
|
||||
Found User {{ user.email }}
|
||||
</h3>
|
||||
{{ show_user(user) }}
|
||||
{{ list_mailboxes(user_mailboxes_count(user.id), user_mailboxes(user.id) ) }}
|
||||
{{ list_alias(user_aliases_count(user.id),user_aliases(user.id)) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if mailbox %}
|
||||
|
||||
<div class="border border-dark mt-1 mb-2 p-3">
|
||||
<h3 class="mb-3">
|
||||
Found Mailbox {{ mailbox.email }}
|
||||
</h3>
|
||||
{{ list_mailboxes(1, [mailbox] ) }}
|
||||
{{ show_user(mailbox.user) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
Loading…
Reference in New Issue
Block a user