mirror of
https://github.com/simple-login/app.git
synced 2024-11-18 06:31:27 +08:00
support sorting: Oldest Alias to Newest,
This commit is contained in:
parent
ca6350cc27
commit
36aee86590
3 changed files with 35 additions and 13 deletions
|
@ -109,7 +109,9 @@ def get_alias_infos_with_pagination(user, page_id=0, query=None) -> [AliasInfo]:
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def get_alias_infos_with_pagination_v2(user, page_id=0, query=None) -> [AliasInfo]:
|
def get_alias_infos_with_pagination_v2(
|
||||||
|
user, page_id=0, query=None, sort=None
|
||||||
|
) -> [AliasInfo]:
|
||||||
ret = []
|
ret = []
|
||||||
latest_activity = func.max(
|
latest_activity = func.max(
|
||||||
case(
|
case(
|
||||||
|
@ -122,13 +124,11 @@ def get_alias_infos_with_pagination_v2(user, page_id=0, query=None) -> [AliasInf
|
||||||
).label("latest")
|
).label("latest")
|
||||||
|
|
||||||
q = (
|
q = (
|
||||||
db.session.query(Alias, latest_activity)
|
db.session.query(Alias, Mailbox, latest_activity)
|
||||||
.options(joinedload(Alias.mailbox))
|
|
||||||
.join(Contact, Alias.id == Contact.alias_id, isouter=True)
|
.join(Contact, Alias.id == Contact.alias_id, isouter=True)
|
||||||
.join(EmailLog, Contact.id == EmailLog.contact_id, isouter=True)
|
.join(EmailLog, Contact.id == EmailLog.contact_id, isouter=True)
|
||||||
.filter(Alias.user_id == user.id)
|
.filter(Alias.user_id == user.id)
|
||||||
.group_by(Alias.id)
|
.filter(Alias.mailbox_id == Mailbox.id)
|
||||||
.order_by(latest_activity.desc())
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if query:
|
if query:
|
||||||
|
@ -136,10 +136,18 @@ def get_alias_infos_with_pagination_v2(user, page_id=0, query=None) -> [AliasInf
|
||||||
or_(Alias.email.ilike(f"%{query}%"), Alias.note.ilike(f"%{query}%"))
|
or_(Alias.email.ilike(f"%{query}%"), Alias.note.ilike(f"%{query}%"))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if sort == "old2new":
|
||||||
|
q = q.order_by(Alias.created_at)
|
||||||
|
else:
|
||||||
|
# default sorting
|
||||||
|
q = q.order_by(latest_activity.desc())
|
||||||
|
|
||||||
|
q = q.group_by(Alias.id, Mailbox.id)
|
||||||
|
|
||||||
q = q.limit(PAGE_LIMIT).offset(page_id * PAGE_LIMIT)
|
q = q.limit(PAGE_LIMIT).offset(page_id * PAGE_LIMIT)
|
||||||
|
|
||||||
for alias, latest_activity in q:
|
for alias, mailbox, latest_activity in q:
|
||||||
ret.append(get_alias_info_v2(alias))
|
ret.append(get_alias_info_v2(alias, mailbox))
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
@ -166,7 +174,7 @@ def get_alias_info(alias: Alias) -> AliasInfo:
|
||||||
return alias_info
|
return alias_info
|
||||||
|
|
||||||
|
|
||||||
def get_alias_info_v2(alias: Alias) -> AliasInfo:
|
def get_alias_info_v2(alias: Alias, mailbox) -> AliasInfo:
|
||||||
q = (
|
q = (
|
||||||
db.session.query(Contact, EmailLog)
|
db.session.query(Contact, EmailLog)
|
||||||
.filter(Contact.alias_id == alias.id)
|
.filter(Contact.alias_id == alias.id)
|
||||||
|
@ -178,7 +186,7 @@ def get_alias_info_v2(alias: Alias) -> AliasInfo:
|
||||||
latest_contact = None
|
latest_contact = None
|
||||||
|
|
||||||
alias_info = AliasInfo(
|
alias_info = AliasInfo(
|
||||||
alias=alias, nb_blocked=0, nb_forward=0, nb_reply=0, mailbox=alias.mailbox
|
alias=alias, nb_blocked=0, nb_forward=0, nb_reply=0, mailbox=mailbox
|
||||||
)
|
)
|
||||||
|
|
||||||
for contact, email_log in q:
|
for contact, email_log in q:
|
||||||
|
|
|
@ -63,8 +63,19 @@
|
||||||
<div class="col-lg-6 pt-1">
|
<div class="col-lg-6 pt-1">
|
||||||
<div class="float-right">
|
<div class="float-right">
|
||||||
<form method="get" class="form-inline">
|
<form method="get" class="form-inline">
|
||||||
|
<select name="sort"
|
||||||
|
onchange="this.form.submit()"
|
||||||
|
class="form-control custom-select mr-3">
|
||||||
|
<option value="" {% if sort == "" %} selected {% endif %}>
|
||||||
|
Sort by most recent activity
|
||||||
|
</option>
|
||||||
|
<option value="old2new" {% if sort == "old2new" %} selected {% endif %}>
|
||||||
|
Oldest Alias to Newest
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
|
||||||
<input type="search" name="query" placeholder="Enter to search for alias"
|
<input type="search" name="query" placeholder="Enter to search for alias"
|
||||||
class="form-control shadow text-right"
|
class="form-control shadow"
|
||||||
style="max-width: 15em"
|
style="max-width: 15em"
|
||||||
value="{{ query }}">
|
value="{{ query }}">
|
||||||
</form>
|
</form>
|
||||||
|
@ -286,11 +297,11 @@
|
||||||
<ul class="pagination">
|
<ul class="pagination">
|
||||||
<li class="page-item {% if page == 0 %}disabled{% endif %}">
|
<li class="page-item {% if page == 0 %}disabled{% endif %}">
|
||||||
<a class="page-link"
|
<a class="page-link"
|
||||||
href="{{ url_for('dashboard.index', page=page-1, query=query) }}">Previous</a>
|
href="{{ url_for('dashboard.index', page=page-1, query=query, sort=sort) }}">Previous</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="page-item {% if last_page %}disabled{% endif %}">
|
<li class="page-item {% if last_page %}disabled{% endif %}">
|
||||||
<a class="page-link"
|
<a class="page-link"
|
||||||
href="{{ url_for('dashboard.index', page=page+1, query=query) }}">Next</a>
|
href="{{ url_for('dashboard.index', page=page+1, query=query, sort=sort) }}">Next</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
|
@ -21,6 +21,8 @@ from app.models import (
|
||||||
@login_required
|
@login_required
|
||||||
def index():
|
def index():
|
||||||
query = request.args.get("query") or ""
|
query = request.args.get("query") or ""
|
||||||
|
sort = request.args.get("sort") or ""
|
||||||
|
|
||||||
page = 0
|
page = 0
|
||||||
if request.args.get("page"):
|
if request.args.get("page"):
|
||||||
page = int(request.args.get("page"))
|
page = int(request.args.get("page"))
|
||||||
|
@ -169,11 +171,12 @@ def index():
|
||||||
return render_template(
|
return render_template(
|
||||||
"dashboard/index.html",
|
"dashboard/index.html",
|
||||||
client_users=client_users,
|
client_users=client_users,
|
||||||
alias_infos=get_alias_infos_with_pagination_v2(current_user, page, query),
|
alias_infos=get_alias_infos_with_pagination_v2(current_user, page, query, sort),
|
||||||
highlight_alias_id=highlight_alias_id,
|
highlight_alias_id=highlight_alias_id,
|
||||||
query=query,
|
query=query,
|
||||||
AliasGeneratorEnum=AliasGeneratorEnum,
|
AliasGeneratorEnum=AliasGeneratorEnum,
|
||||||
mailboxes=mailboxes,
|
mailboxes=mailboxes,
|
||||||
show_intro=show_intro,
|
show_intro=show_intro,
|
||||||
page=page,
|
page=page,
|
||||||
|
sort=sort,
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in a new issue