add filter by mailbox

This commit is contained in:
Son Nguyen Kim 2021-08-20 12:21:27 +02:00
parent 00b3d716b7
commit 51578ce934
5 changed files with 35 additions and 27 deletions

View File

@ -129,7 +129,7 @@ def get_alias_infos_with_pagination(user, page_id=0, query=None) -> [AliasInfo]:
def get_alias_infos_with_pagination_v3(
user, page_id=0, query=None, sort=None, alias_filter=None
user, page_id=0, query=None, sort=None, alias_filter=None, mailbox_id=None
) -> [AliasInfo]:
# subquery on alias annotated with nb_reply, nb_blocked, nb_forward, max_created_at, latest_email_log_created_at
alias_activity_subquery = (
@ -214,29 +214,24 @@ def get_alias_infos_with_pagination_v3(
)
if query:
q = (
# to find mailbox whose email match the query
q.join(AliasMailbox, Alias.id == AliasMailbox.alias_id, isouter=True)
.join(
Mailbox,
or_(
Mailbox.id == Alias.mailbox_id,
Mailbox.id == AliasMailbox.mailbox_id,
),
)
.filter(
or_(
Alias.email.ilike(f"%{query}%"),
Alias.note.ilike(f"%{query}%"),
# can't use match() here as it uses to_tsquery that expected a tsquery input
# Alias.ts_vector.match(query),
Alias.ts_vector.op("@@")(func.plainto_tsquery("english", query)),
Alias.name.ilike(f"%{query}%"),
Mailbox.email.ilike(f"%{query}%"),
)
q = q.filter(
or_(
Alias.email.ilike(f"%{query}%"),
Alias.note.ilike(f"%{query}%"),
# can't use match() here as it uses to_tsquery that expected a tsquery input
# Alias.ts_vector.match(query),
Alias.ts_vector.op("@@")(func.plainto_tsquery("english", query)),
Alias.name.ilike(f"%{query}%"),
)
)
if mailbox_id:
q = q.join(
AliasMailbox, Alias.id == AliasMailbox.alias_id, isouter=True
).filter(
or_(Alias.mailbox_id == mailbox_id, AliasMailbox.mailbox_id == mailbox_id)
)
if alias_filter == "enabled":
q = q.filter(Alias.enabled)
elif alias_filter == "disabled":

View File

@ -177,6 +177,12 @@
<option value="hibp" {% if filter == "hibp" %} selected {% endif %}>
Only Aliases Found In Data Breaches
</option>
{% for mailbox in current_user.mailboxes() %}
<option value="mailbox:{{ mailbox.id }}" {% if filter == "mailbox:" ~ mailbox.id %}
selected {% endif %}>
{{ mailbox.email }}'s aliases
</option>
{% endfor %}
</select>
<input type="search" name="query" placeholder="Enter to search for alias"

View File

@ -150,8 +150,12 @@ def index():
stats = get_stats(current_user)
mailbox_id = None
if alias_filter and alias_filter.startswith("mailbox:"):
mailbox_id = int(alias_filter[len("mailbox:") :])
alias_infos = get_alias_infos_with_pagination_v3(
current_user, page, query, sort, alias_filter
current_user, page, query, sort, alias_filter, mailbox_id
)
last_page = len(alias_infos) < PAGE_LIMIT

View File

@ -1137,9 +1137,12 @@ class Alias(db.Model, ModelMixin):
__table_args__ = (
Index("ix_video___ts_vector__", ts_vector, postgresql_using="gin"),
# index on note column using pg_trgm
Index('note_pg_trgm_index', "note",
postgresql_ops={"note": "gin_trgm_ops"},
postgresql_using='gin'),
Index(
"note_pg_trgm_index",
"note",
postgresql_ops={"note": "gin_trgm_ops"},
postgresql_using="gin",
),
)
user = db.relationship(User, foreign_keys=[user_id])

View File

@ -59,7 +59,7 @@ def test_get_alias_infos_with_pagination_v3_query_alias_mailbox(flask_client):
commit=True,
)
alias = Alias.first()
alias_infos = get_alias_infos_with_pagination_v3(user, query=alias.mailbox.email)
alias_infos = get_alias_infos_with_pagination_v3(user, mailbox_id=alias.mailbox_id)
assert len(alias_infos) == 1
@ -77,7 +77,7 @@ def test_get_alias_infos_with_pagination_v3_query_alias_mailboxes(flask_client):
alias._mailboxes.append(mb)
db.session.commit()
alias_infos = get_alias_infos_with_pagination_v3(user, query=mb.email)
alias_infos = get_alias_infos_with_pagination_v3(user, mailbox_id=mb.id)
assert len(alias_infos) == 1
alias_infos = get_alias_infos_with_pagination_v3(user, query=alias.email)