refactor: move get_alias_infos_with_pagination, get_alias_info to alias.py

This commit is contained in:
Son NK 2020-04-05 16:21:13 +02:00
parent f3244eb274
commit f15488f96b
4 changed files with 55 additions and 59 deletions

View File

@ -1,9 +1,9 @@
from email.utils import parseaddr
from flask import g from flask import g
from flask import jsonify from flask import jsonify
from flask import request from flask import request
from flask_cors import cross_origin from flask_cors import cross_origin
from sqlalchemy import or_
from sqlalchemy.orm import joinedload
from app.api.base import api_bp, verify_api_key from app.api.base import api_bp, verify_api_key
from app.config import EMAIL_DOMAIN from app.config import EMAIL_DOMAIN
@ -11,8 +11,6 @@ from app.config import PAGE_LIMIT
from app.dashboard.views.alias_log import get_alias_log from app.dashboard.views.alias_log import get_alias_log
from app.dashboard.views.index import ( from app.dashboard.views.index import (
AliasInfo, AliasInfo,
get_alias_infos_with_pagination,
get_alias_info,
) )
from app.email_utils import parseaddr_unicode from app.email_utils import parseaddr_unicode
from app.extensions import db from app.extensions import db
@ -384,3 +382,53 @@ def delete_contact(contact_id):
db.session.commit() db.session.commit()
return jsonify(deleted=True), 200 return jsonify(deleted=True), 200
def get_alias_infos_with_pagination(user, page_id=0, query=None) -> [AliasInfo]:
ret = []
q = (
db.session.query(Alias)
.options(joinedload(Alias.mailbox))
.filter(Alias.user_id == user.id)
.order_by(Alias.created_at.desc())
)
if query:
q = q.filter(
or_(Alias.email.ilike(f"%{query}%"), Alias.note.ilike(f"%{query}%"))
)
q = q.limit(PAGE_LIMIT).offset(page_id * PAGE_LIMIT)
for alias in q:
ret.append(get_alias_info(alias))
return ret
def get_alias_info(alias: Alias) -> AliasInfo:
q = (
db.session.query(Contact, EmailLog)
.filter(Contact.alias_id == alias.id)
.filter(EmailLog.contact_id == Contact.id)
)
alias_info = AliasInfo(
id=alias.id,
alias=alias,
mailbox=alias.mailbox,
note=alias.note,
nb_blocked=0,
nb_forward=0,
nb_reply=0,
)
for _, el in q:
if el.is_reply:
alias_info.nb_reply += 1
elif el.blocked:
alias_info.nb_blocked += 1
else:
alias_info.nb_forward += 1
return alias_info

View File

@ -3,10 +3,9 @@ from flask import jsonify, request
from flask_cors import cross_origin from flask_cors import cross_origin
from app.api.base import api_bp, verify_api_key from app.api.base import api_bp, verify_api_key
from app.api.views.alias import serialize_alias_info from app.api.views.alias import serialize_alias_info, get_alias_info
from app.config import MAX_NB_EMAIL_FREE_PLAN, ALIAS_DOMAINS from app.config import MAX_NB_EMAIL_FREE_PLAN, ALIAS_DOMAINS
from app.dashboard.views.custom_alias import verify_prefix_suffix from app.dashboard.views.custom_alias import verify_prefix_suffix
from app.dashboard.views.index import get_alias_info
from app.extensions import db from app.extensions import db
from app.log import LOG from app.log import LOG
from app.models import Alias, AliasUsedOn, User, CustomDomain from app.models import Alias, AliasUsedOn, User, CustomDomain

View File

@ -3,9 +3,8 @@ from flask import jsonify, request
from flask_cors import cross_origin from flask_cors import cross_origin
from app.api.base import api_bp, verify_api_key from app.api.base import api_bp, verify_api_key
from app.api.views.alias import serialize_alias_info from app.api.views.alias import serialize_alias_info, get_alias_info
from app.config import MAX_NB_EMAIL_FREE_PLAN from app.config import MAX_NB_EMAIL_FREE_PLAN
from app.dashboard.views.index import get_alias_info
from app.extensions import db from app.extensions import db
from app.log import LOG from app.log import LOG
from app.models import Alias, AliasUsedOn, AliasGeneratorEnum from app.models import Alias, AliasUsedOn, AliasGeneratorEnum

View File

@ -184,61 +184,11 @@ def index():
) )
def get_alias_info(alias: Alias) -> AliasInfo:
q = (
db.session.query(Contact, EmailLog)
.filter(Contact.alias_id == alias.id)
.filter(EmailLog.contact_id == Contact.id)
)
alias_info = AliasInfo(
id=alias.id,
alias=alias,
mailbox=alias.mailbox,
note=alias.note,
nb_blocked=0,
nb_forward=0,
nb_reply=0,
)
for _, el in q:
if el.is_reply:
alias_info.nb_reply += 1
elif el.blocked:
alias_info.nb_blocked += 1
else:
alias_info.nb_forward += 1
return alias_info
def get_alias_infos_with_pagination(user, page_id=0, query=None) -> [AliasInfo]:
ret = []
q = (
db.session.query(Alias)
.options(joinedload(Alias.mailbox))
.filter(Alias.user_id == user.id)
.order_by(Alias.created_at.desc())
)
if query:
q = q.filter(
or_(Alias.email.ilike(f"%{query}%"), Alias.note.ilike(f"%{query}%"))
)
q = q.limit(PAGE_LIMIT).offset(page_id * PAGE_LIMIT)
for alias in q:
ret.append(get_alias_info(alias))
return ret
def get_alias_infos(user, query=None, highlight_alias_id=None) -> [AliasInfo]: def get_alias_infos(user, query=None, highlight_alias_id=None) -> [AliasInfo]:
if query: if query:
query = query.strip().lower() query = query.strip().lower()
aliases = {} # dict of alias and AliasInfo aliases = {} # dict of alias email and AliasInfo
q = ( q = (
db.session.query(Alias, Contact, EmailLog, Mailbox) db.session.query(Alias, Contact, EmailLog, Mailbox)