def test_get_alias_infos_pinned_alias(flask_client): """Different scenarios with pinned alias""" user = User.create( email="[email protected]", password="******", name="Test User", activated=True, commit=True, ) # to have 3 pages: 2*PAGE_LIMIT + the alias automatically created for a new account for _ in range(2 * PAGE_LIMIT): Alias.create_new_random(user) first_alias = Alias.order_by(Alias.id).first() # should return PAGE_LIMIT alias alias_infos = get_alias_infos_with_pagination_v3(user) assert len(alias_infos) == PAGE_LIMIT # make sure first_alias is not returned as the default order is alias creation date assert first_alias not in [ai.alias for ai in alias_infos] # pin the first alias first_alias.pinned = True Session.commit() alias_infos = get_alias_infos_with_pagination_v3(user) # now first_alias is the first result assert first_alias == alias_infos[0].alias # and the page size is still the same assert len(alias_infos) == PAGE_LIMIT # pinned alias isn't included in the search alias_infos = get_alias_infos_with_pagination_v3(user, query="no match") assert len(alias_infos) == 0
def test_get_alias_infos_with_pagination_v3_no_duplicate_when_empty_contact( flask_client, ): """ Make sure an alias is returned once when it has 2 contacts that have no email log activity """ user = create_user(flask_client) alias = Alias.first() Contact.create( user_id=user.id, alias_id=alias.id, website_email="*****@*****.**", reply_email="*****@*****.**", ) Contact.create( user_id=user.id, alias_id=alias.id, website_email="*****@*****.**", reply_email="*****@*****.**", ) alias_infos = get_alias_infos_with_pagination_v3(user) assert len(alias_infos) == 1
def test_get_alias_infos_with_pagination_v3_query_alias_email(flask_client): """test the query on the alias email""" user = User.create( email="[email protected]", password="******", name="Test User", activated=True, commit=True, ) alias = Alias.first() alias_infos = get_alias_infos_with_pagination_v3(user, query=alias.email) assert len(alias_infos) == 1 alias_infos = get_alias_infos_with_pagination_v3(user, query="no match") assert len(alias_infos) == 0
def test_get_alias_infos_with_pagination_v3_query_alias_mailboxes(flask_client): """test the query on the alias additional mailboxes""" user = User.create( email="[email protected]", password="******", name="Test User", activated=True, commit=True, ) alias = Alias.first() mb = Mailbox.create(user_id=user.id, email="*****@*****.**") alias._mailboxes.append(mb) Session.commit() 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) assert len(alias_infos) == 1
def get_aliases_v2(): """ Get aliases Input: page_id: in query pinned: in query Output: - aliases: list of alias: - id - email - creation_date - creation_timestamp - nb_forward - nb_block - nb_reply - note - mailbox - mailboxes - support_pgp - disable_pgp - latest_activity: null if no activity. - timestamp - action: forward|reply|block|bounced - contact: - email - name - reverse_alias """ user = g.user try: page_id = int(request.args.get("page_id")) except (ValueError, TypeError): return jsonify(error="page_id must be provided in request query"), 400 pinned = "pinned" in request.args query = None data = request.get_json(silent=True) if data: query = data.get("query") alias_infos: [AliasInfo] = get_alias_infos_with_pagination_v3( user, page_id=page_id, query=query, alias_filter="pinned" if pinned else None) return ( jsonify(aliases=[ serialize_alias_info_v2(alias_info) for alias_info in alias_infos ]), 200, )
def test_get_alias_infos_with_pagination_v3_query_alias_mailbox(flask_client): """test the query on the alias mailbox email""" user = User.create( email="[email protected]", password="******", name="Test User", activated=True, commit=True, ) alias = Alias.first() alias_infos = get_alias_infos_with_pagination_v3(user, mailbox_id=alias.mailbox_id) assert len(alias_infos) == 1
def test_get_alias_infos_with_pagination_v3_query_alias_note(flask_client): """test the query on the alias note""" user = User.create( email="[email protected]", password="******", name="Test User", activated=True, commit=True, ) alias = Alias.first() alias.note = "test note" Session.commit() alias_infos = get_alias_infos_with_pagination_v3(user, query="test note") assert len(alias_infos) == 1
def test_get_alias_infos_with_pagination_v3_no_duplicate(flask_client): """When an alias belongs to multiple mailboxes, make sure get_alias_infos_with_pagination_v3 returns no duplicates """ user = User.create( email="[email protected]", password="******", name="Test User", activated=True, commit=True, ) alias = Alias.first() mb = Mailbox.create(user_id=user.id, email="*****@*****.**") alias._mailboxes.append(mb) Session.commit() alias_infos = get_alias_infos_with_pagination_v3(user) assert len(alias_infos) == 1
def test_get_alias_infos_with_pagination_v3(flask_client): user = User.create( email="[email protected]", password="******", name="Test User", activated=True, commit=True, ) # user has 1 alias that's automatically created when the account is created alias_infos = get_alias_infos_with_pagination_v3(user) assert len(alias_infos) == 1 alias_info = alias_infos[0] alias = Alias.first() assert alias_info.alias == alias assert alias_info.mailbox == user.default_mailbox assert alias_info.mailboxes == [user.default_mailbox] assert alias_info.nb_forward == 0 assert alias_info.nb_blocked == 0 assert alias_info.nb_reply == 0 assert alias_info.latest_email_log is None assert alias_info.latest_contact is None
def index(): query = request.args.get("query") or "" sort = request.args.get("sort") or "" alias_filter = request.args.get("filter") or "" page = 0 if request.args.get("page"): page = int(request.args.get("page")) highlight_alias_id = None if request.args.get("highlight_alias_id"): try: highlight_alias_id = int(request.args.get("highlight_alias_id")) except ValueError: LOG.warning( "highlight_alias_id must be a number, received %s", request.args.get("highlight_alias_id"), ) if request.method == "POST": if request.form.get("form-name") == "create-custom-email": if current_user.can_create_new_alias(): return redirect(url_for("dashboard.custom_alias")) else: flash("You need to upgrade your plan to create new alias.", "warning") elif request.form.get("form-name") == "create-random-email": if current_user.can_create_new_alias(): scheme = int( request.form.get("generator_scheme") or current_user.alias_generator) if not scheme or not AliasGeneratorEnum.has_value(scheme): scheme = current_user.alias_generator alias = Alias.create_new_random(user=current_user, scheme=scheme) alias.mailbox_id = current_user.default_mailbox_id db.session.commit() LOG.d("create new random alias %s for user %s", alias, current_user) flash(f"Alias {alias.email} has been created", "success") return redirect( url_for( "dashboard.index", highlight_alias_id=alias.id, query=query, sort=sort, filter=alias_filter, )) else: flash("You need to upgrade your plan to create new alias.", "warning") elif request.form.get("form-name") in ("delete-alias", "disable-alias"): alias_id = request.form.get("alias-id") alias: Alias = Alias.get(alias_id) if not alias or alias.user_id != current_user.id: flash("Unknown error, sorry for the inconvenience", "error") return redirect( url_for( "dashboard.index", query=query, sort=sort, filter=alias_filter, )) if request.form.get("form-name") == "delete-alias": LOG.d("delete alias %s", alias) email = alias.email alias_utils.delete_alias(alias, current_user) flash(f"Alias {email} has been deleted", "success") elif request.form.get("form-name") == "disable-alias": alias.enabled = False db.session.commit() flash(f"Alias {alias.email} has been disabled", "success") return redirect( url_for("dashboard.index", query=query, sort=sort, filter=alias_filter)) mailboxes = current_user.mailboxes() show_intro = False if not current_user.intro_shown: LOG.d("Show intro to %s", current_user) show_intro = True # to make sure not showing intro to user again current_user.intro_shown = True db.session.commit() stats = get_stats(current_user) alias_infos = get_alias_infos_with_pagination_v3(current_user, page, query, sort, alias_filter) last_page = len(alias_infos) < PAGE_LIMIT return render_template( "dashboard/index.html", alias_infos=alias_infos, highlight_alias_id=highlight_alias_id, query=query, AliasGeneratorEnum=AliasGeneratorEnum, mailboxes=mailboxes, show_intro=show_intro, page=page, last_page=last_page, sort=sort, filter=alias_filter, stats=stats, )
def index(): query = request.args.get("query") or "" sort = request.args.get("sort") or "" alias_filter = request.args.get("filter") or "" page = 0 if request.args.get("page"): page = int(request.args.get("page")) highlight_alias_id = None if request.args.get("highlight_alias_id"): highlight_alias_id = int(request.args.get("highlight_alias_id")) # User generates a new email if request.method == "POST": if request.form.get("form-name") == "create-custom-email": if current_user.can_create_new_alias(): return redirect(url_for("dashboard.custom_alias")) else: flash(f"You need to upgrade your plan to create new alias.", "warning") elif request.form.get("form-name") == "create-random-email": if current_user.can_create_new_alias(): scheme = int( request.form.get("generator_scheme") or current_user.alias_generator) if not scheme or not AliasGeneratorEnum.has_value(scheme): scheme = current_user.alias_generator alias = Alias.create_new_random(user=current_user, scheme=scheme) alias.mailbox_id = current_user.default_mailbox_id db.session.commit() LOG.d("generate new email %s for user %s", alias, current_user) flash(f"Alias {alias.email} has been created", "success") return redirect( url_for( "dashboard.index", highlight_alias_id=alias.id, query=query, sort=sort, filter=alias_filter, )) else: flash(f"You need to upgrade your plan to create new alias.", "warning") elif request.form.get("form-name") == "delete-email": alias_id = request.form.get("alias-id") alias: Alias = Alias.get(alias_id) if not alias: flash("Unknown error, sorry for the inconvenience", "error") return redirect( url_for( "dashboard.index", query=query, sort=sort, filter=alias_filter, )) LOG.d("delete gen email %s", alias) email = alias.email alias_utils.delete_alias(alias, current_user) flash(f"Alias {email} has been deleted", "success") return redirect( url_for("dashboard.index", query=query, sort=sort, filter=alias_filter)) client_users = (ClientUser.filter_by(user_id=current_user.id).options( joinedload(ClientUser.client)).options(joinedload( ClientUser.alias)).all()) sorted(client_users, key=lambda cu: cu.client.name) mailboxes = current_user.mailboxes() show_intro = False if not current_user.intro_shown: LOG.d("Show intro to %s", current_user) show_intro = True # to make sure not showing intro to user again current_user.intro_shown = True db.session.commit() stats = get_stats(current_user) alias_infos = get_alias_infos_with_pagination_v3(current_user, page, query, sort, alias_filter) last_page = len(alias_infos) < PAGE_LIMIT return render_template( "dashboard/index.html", client_users=client_users, alias_infos=alias_infos, highlight_alias_id=highlight_alias_id, query=query, AliasGeneratorEnum=AliasGeneratorEnum, mailboxes=mailboxes, show_intro=show_intro, page=page, last_page=last_page, sort=sort, filter=alias_filter, stats=stats, )