diff --git a/app/admin_model.py b/app/admin_model.py index 17f28133..3351641e 100644 --- a/app/admin_model.py +++ b/app/admin_model.py @@ -21,9 +21,9 @@ from app.models import ( AppleSubscription, AdminAuditLog, AuditLogActionEnum, - TransactionalComplaintState, + ProviderComplaintState, Phase, - TransactionalComplaint, + ProviderComplaint, ) @@ -376,7 +376,7 @@ class AdminAuditLogAdmin(SLModelView): def _transactionalcomplaint_state_formatter(view, context, model, name): - return "{} ({})".format(TransactionalComplaintState(model.state).name, model.state) + return "{} ({})".format(ProviderComplaintState(model.state).name, model.state) def _transactionalcomplaint_phase_formatter(view, context, model, name): @@ -390,7 +390,7 @@ def _transactionalcomplaint_refused_email_id_formatter(view, context, model, nam return Markup(markupstring) -class TransactionalComplaintAdmin(SLModelView): +class ProviderComplaintAdmin(SLModelView): column_searchable_list = ["id", "user.id", "created_at"] column_filters = ["user.id", "state"] column_hide_backrefs = False @@ -410,12 +410,12 @@ class TransactionalComplaintAdmin(SLModelView): EndpointLinkRowAction("fa fa-check-square", ".mark_ok"), ] - def _get_complaint(self) -> Optional[TransactionalComplaint]: + def _get_complaint(self) -> Optional[ProviderComplaint]: complain_id = request.args.get("id") if complain_id is None: flash("Missing id", "error") return None - complaint = TransactionalComplaint.get_by(id=complain_id) + complaint = ProviderComplaint.get_by(id=complain_id) if not complaint: flash("Could not find complaint", "error") return None @@ -426,7 +426,7 @@ class TransactionalComplaintAdmin(SLModelView): complaint = self._get_complaint() if not complaint: return redirect("/admin/transactionalcomplaint/") - complaint.state = TransactionalComplaintState.reviewed.value + complaint.state = ProviderComplaintState.reviewed.value Session.commit() return redirect("/admin/transactionalcomplaint/") @@ -437,7 +437,7 @@ class TransactionalComplaintAdmin(SLModelView): return redirect("/admin/transactionalcomplaint/") eml_path = complaint.refused_email.full_report_path eml_data = s3.download_email(eml_path) - AdminAuditLog.downloaded_transactional_complaint(current_user.id, complaint.id) + AdminAuditLog.downloaded_provider_complaint(current_user.id, complaint.id) Session.commit() return Response( eml_data, diff --git a/app/handler/transactional_complaint.py b/app/handler/provider_complaint.py similarity index 81% rename from app/handler/transactional_complaint.py rename to app/handler/provider_complaint.py index f103bb4b..86d25b45 100644 --- a/app/handler/transactional_complaint.py +++ b/app/handler/provider_complaint.py @@ -26,14 +26,14 @@ from app.models import ( DeletedAlias, DomainDeletedAlias, Contact, - TransactionalComplaint, + ProviderComplaint, Phase, - TransactionalComplaintState, + ProviderComplaintState, RefusedEmail, ) -class TransactionalComplaintOrigin(ABC): +class ProviderComplaintOrigin(ABC): @classmethod @abstractmethod def get_original_message(cls, message: Message) -> Optional[Message]: @@ -45,7 +45,7 @@ class TransactionalComplaintOrigin(ABC): pass -class TransactionalYahooOrigin(TransactionalComplaintOrigin): +class TransactionalYahooOrigin(ProviderComplaintOrigin): @classmethod def get_original_message(cls, message: Message) -> Optional[Message]: # 1st part is the container @@ -63,7 +63,7 @@ class TransactionalYahooOrigin(TransactionalComplaintOrigin): return "yahoo" -class TransactionalHotmailOrigin(TransactionalComplaintOrigin): +class TransactionalHotmailOrigin(ProviderComplaintOrigin): @classmethod def get_original_message(cls, message: Message) -> Optional[Message]: # 1st part is the container @@ -97,7 +97,7 @@ def find_alias_with_address(address: str) -> Optional[Alias]: ) -def handle_complaint(message: Message, origin: TransactionalComplaintOrigin) -> bool: +def handle_complaint(message: Message, origin: ProviderComplaintOrigin) -> bool: original_message = origin.get_original_message(message) try: @@ -114,7 +114,7 @@ def handle_complaint(message: Message, origin: TransactionalComplaintOrigin) -> user = User.get_by(email=to_address) if user: - LOG.d(f"Handle transactional {origin.name()} complaint for {user}") + LOG.d(f"Handle provider {origin.name()} complaint for {user}") report_complaint_to_user(user, origin) return True @@ -125,7 +125,7 @@ def handle_complaint(message: Message, origin: TransactionalComplaintOrigin) -> f"Complaint from {origin.name} during reply phase {alias} -> {to_address}, {user}" ) report_complaint_to_user_in_reply_phase(alias, to_address, origin) - store_transactional_complaint(alias, message) + store_provider_complaint(alias, message) return True contact = Contact.get_by(reply_email=from_address) @@ -145,7 +145,7 @@ def handle_complaint(message: Message, origin: TransactionalComplaintOrigin) -> def report_complaint_to_user_in_reply_phase( - alias: Alias, to_address: str, origin: TransactionalComplaintOrigin + alias: Alias, to_address: str, origin: ProviderComplaintOrigin ): capitalized_name = origin.name().capitalize() send_email_with_rate_control( @@ -154,7 +154,7 @@ def report_complaint_to_user_in_reply_phase( alias.user.email, f"Abuse report from {capitalized_name}", render( - "transactional/transactional-complaint-reply-phase.txt.jinja2", + "transactional/provider-complaint-reply-phase.txt.jinja2", user=alias.user, alias=alias, destination=to_address, @@ -165,7 +165,7 @@ def report_complaint_to_user_in_reply_phase( ) -def report_complaint_to_user(user: User, origin: TransactionalComplaintOrigin): +def report_complaint_to_user(user: User, origin: ProviderComplaintOrigin): capitalized_name = origin.name().capitalize() send_email_with_rate_control( user, @@ -173,12 +173,12 @@ def report_complaint_to_user(user: User, origin: TransactionalComplaintOrigin): user.email, f"Abuse report from {capitalized_name}", render( - "transactional/transactional-complaint-to-user.txt.jinja2", + "transactional/provider-complaint-to-user.txt.jinja2", user=user, provider=capitalized_name, ), render( - "transactional/transactional-complaint-to-user.html", + "transactional/provider-complaint-to-user.html", user=user, provider=capitalized_name, ), @@ -188,7 +188,7 @@ def report_complaint_to_user(user: User, origin: TransactionalComplaintOrigin): def report_complaint_to_user_in_forward_phase( - alias: Alias, origin: TransactionalComplaintOrigin + alias: Alias, origin: ProviderComplaintOrigin ): capitalized_name = origin.name().capitalize() user = alias.user @@ -198,12 +198,12 @@ def report_complaint_to_user_in_forward_phase( user.email, f"Abuse report from {capitalized_name}", render( - "transactional/transactional-complaint-forward-phase.txt.jinja2", + "transactional/provider-complaint-forward-phase.txt.jinja2", user=user, provider=capitalized_name, ), render( - "transactional/transactional-complaint-forward-phase.html", + "transactional/provider-complaint-forward-phase.html", user=user, provider=capitalized_name, ), @@ -212,9 +212,9 @@ def report_complaint_to_user_in_forward_phase( ) -def store_transactional_complaint(alias, message): +def store_provider_complaint(alias, message): email_name = f"reply-{uuid.uuid4().hex}.eml" - full_report_path = f"transactional_complaint/{email_name}" + full_report_path = f"provider_complaint/{email_name}" s3.upload_email_from_bytesio( full_report_path, BytesIO(to_bytes(message)), email_name ) @@ -224,9 +224,9 @@ def store_transactional_complaint(alias, message): path=email_name, commit=True, ) - TransactionalComplaint.create( + ProviderComplaint.create( user_id=alias.user_id, - state=TransactionalComplaintState.new.value, + state=ProviderComplaintState.new.value, phase=Phase.reply.value, refused_email_id=refused_email.id, commit=True, diff --git a/app/models.py b/app/models.py index 445cdb82..1331c233 100644 --- a/app/models.py +++ b/app/models.py @@ -235,7 +235,7 @@ class AuditLogActionEnum(EnumE): disable_2fa = 5 logged_as_user = 6 extend_subscription = 7 - download_transactional_complaint = 8 + download_provider_complaint = 8 class Phase(EnumE): @@ -2997,23 +2997,23 @@ class AdminAuditLog(Base): ) @classmethod - def downloaded_transactional_complaint(cls, admin_user_id: int, complaint_id: int): + def downloaded_provider_complaint(cls, admin_user_id: int, complaint_id: int): cls.create( admin_user_id=admin_user_id, - action=AuditLogActionEnum.download_transactional_complaint.value, - model="TransactionalComplaint", + action=AuditLogActionEnum.download_provider_complaint.value, + model="ProviderComplaint", model_id=complaint_id, data={}, ) -class TransactionalComplaintState(EnumE): +class ProviderComplaintState(EnumE): new = 0 reviewed = 1 -class TransactionalComplaint(Base, ModelMixin): - __tablename__ = "transactional_complaint" +class ProviderComplaint(Base, ModelMixin): + __tablename__ = "provider_complaint" user_id = sa.Column(sa.ForeignKey("users.id"), nullable=False) state = sa.Column(sa.Integer, nullable=False) diff --git a/email_handler.py b/email_handler.py index d64dce45..e90bef9a 100644 --- a/email_handler.py +++ b/email_handler.py @@ -140,7 +140,7 @@ from app.handler.spamd_result import ( SpamdResult, SPFCheckResult, ) -from app.handler.transactional_complaint import ( +from app.handler.provider_complaint import ( handle_hotmail_complaint, handle_yahoo_complaint, ) diff --git a/migrations/versions/2022_041916_45588d9bb475_store_transactional_complaints_for_.py b/migrations/versions/2022_041916_45588d9bb475_store_provider_complaints.py similarity index 93% rename from migrations/versions/2022_041916_45588d9bb475_store_transactional_complaints_for_.py rename to migrations/versions/2022_041916_45588d9bb475_store_provider_complaints.py index 5c6a9a61..e5b7e2e9 100644 --- a/migrations/versions/2022_041916_45588d9bb475_store_transactional_complaints_for_.py +++ b/migrations/versions/2022_041916_45588d9bb475_store_provider_complaints.py @@ -18,7 +18,7 @@ depends_on = None def upgrade(): op.create_table( - "transactional_complaint", + "provider_complaint", sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), sa.Column("created_at", sqlalchemy_utils.types.arrow.ArrowType(), nullable=False), sa.Column("updated_at", sqlalchemy_utils.types.arrow.ArrowType(), nullable=True), @@ -33,4 +33,4 @@ def upgrade(): def downgrade(): - op.drop_table("transactional_complaint") + op.drop_table("provider_complaint") diff --git a/server.py b/server.py index 8b7106af..c09127e7 100644 --- a/server.py +++ b/server.py @@ -37,7 +37,7 @@ from app.admin_model import ( CouponAdmin, CustomDomainAdmin, AdminAuditLogAdmin, - TransactionalComplaintAdmin, + ProviderComplaintAdmin, ) from app.api.base import api_bp from app.auth.base import auth_bp @@ -91,7 +91,7 @@ from app.models import ( ManualSubscription, Coupon, AdminAuditLog, - TransactionalComplaint, + ProviderComplaint, ) from app.monitor.base import monitor_bp from app.oauth.base import oauth_bp @@ -693,7 +693,7 @@ def init_admin(app): admin.add_view(ManualSubscriptionAdmin(ManualSubscription, Session)) admin.add_view(CustomDomainAdmin(CustomDomain, Session)) admin.add_view(AdminAuditLogAdmin(AdminAuditLog, Session)) - admin.add_view(TransactionalComplaintAdmin(TransactionalComplaint, Session)) + admin.add_view(ProviderComplaintAdmin(ProviderComplaint, Session)) def register_custom_commands(app): diff --git a/templates/emails/transactional/transactional-complaint-forward-phase.html b/templates/emails/transactional/provider-complaint-forward-phase.html similarity index 100% rename from templates/emails/transactional/transactional-complaint-forward-phase.html rename to templates/emails/transactional/provider-complaint-forward-phase.html diff --git a/templates/emails/transactional/transactional-complaint-forward-phase.txt.jinja2 b/templates/emails/transactional/provider-complaint-forward-phase.txt.jinja2 similarity index 100% rename from templates/emails/transactional/transactional-complaint-forward-phase.txt.jinja2 rename to templates/emails/transactional/provider-complaint-forward-phase.txt.jinja2 diff --git a/templates/emails/transactional/transactional-complaint-reply-phase.txt.jinja2 b/templates/emails/transactional/provider-complaint-reply-phase.txt.jinja2 similarity index 100% rename from templates/emails/transactional/transactional-complaint-reply-phase.txt.jinja2 rename to templates/emails/transactional/provider-complaint-reply-phase.txt.jinja2 diff --git a/templates/emails/transactional/transactional-complaint-to-user.html b/templates/emails/transactional/provider-complaint-to-user.html similarity index 100% rename from templates/emails/transactional/transactional-complaint-to-user.html rename to templates/emails/transactional/provider-complaint-to-user.html diff --git a/templates/emails/transactional/transactional-complaint-to-user.txt.jinja2 b/templates/emails/transactional/provider-complaint-to-user.txt.jinja2 similarity index 100% rename from templates/emails/transactional/transactional-complaint-to-user.txt.jinja2 rename to templates/emails/transactional/provider-complaint-to-user.txt.jinja2 diff --git a/tests/handler/test_transactional_complaints.py b/tests/handler/test_provider_complaints.py similarity index 83% rename from tests/handler/test_transactional_complaints.py rename to tests/handler/test_provider_complaints.py index 49dd5004..b6994e3d 100644 --- a/tests/handler/test_transactional_complaints.py +++ b/tests/handler/test_provider_complaints.py @@ -12,11 +12,11 @@ from app.config import ( ) from app.db import Session from app.email import headers -from app.handler.transactional_complaint import ( +from app.handler.provider_complaint import ( handle_hotmail_complaint, handle_yahoo_complaint, ) -from app.models import Alias, TransactionalComplaint, SentAlert +from app.models import Alias, ProviderComplaint, SentAlert from tests.utils import create_new_user origins = [ @@ -38,7 +38,7 @@ def prepare_complaint(message: Message, part_num: int) -> Message: @pytest.mark.parametrize("handle_ftor,provider,part_num", origins) -def test_transactional_to_user(flask_client, handle_ftor, provider, part_num): +def test_provider_to_user(flask_client, handle_ftor, provider, part_num): user = create_new_user() original_message = Message() original_message[headers.TO] = user.email @@ -47,7 +47,7 @@ def test_transactional_to_user(flask_client, handle_ftor, provider, part_num): complaint = prepare_complaint(original_message, part_num) assert handle_ftor(complaint) - found = TransactionalComplaint.filter_by(user_id=user.id).all() + found = ProviderComplaint.filter_by(user_id=user.id).all() assert len(found) == 0 alerts = SentAlert.filter_by(user_id=user.id).all() assert len(alerts) == 1 @@ -55,7 +55,7 @@ def test_transactional_to_user(flask_client, handle_ftor, provider, part_num): @pytest.mark.parametrize("handle_ftor,provider,part_num", origins) -def test_transactional_forward_phase(flask_client, handle_ftor, provider, part_num): +def test_provider_forward_phase(flask_client, handle_ftor, provider, part_num): user = create_new_user() alias = Alias.create_new_random(user) Session.commit() @@ -66,7 +66,7 @@ def test_transactional_forward_phase(flask_client, handle_ftor, provider, part_n complaint = prepare_complaint(original_message, part_num) assert handle_ftor(complaint) - found = TransactionalComplaint.filter_by(user_id=user.id).all() + found = ProviderComplaint.filter_by(user_id=user.id).all() assert len(found) == 1 alerts = SentAlert.filter_by(user_id=user.id).all() assert len(alerts) == 1 @@ -74,7 +74,7 @@ def test_transactional_forward_phase(flask_client, handle_ftor, provider, part_n @pytest.mark.parametrize("handle_ftor,provider,part_num", origins) -def test_transactional_reply_phase(flask_client, handle_ftor, provider, part_num): +def test_provider_reply_phase(flask_client, handle_ftor, provider, part_num): user = create_new_user() alias = Alias.create_new_random(user) Session.commit() @@ -85,7 +85,7 @@ def test_transactional_reply_phase(flask_client, handle_ftor, provider, part_num complaint = prepare_complaint(original_message, part_num) assert handle_ftor(complaint) - found = TransactionalComplaint.filter_by(user_id=user.id).all() + found = ProviderComplaint.filter_by(user_id=user.id).all() assert len(found) == 0 alerts = SentAlert.filter_by(user_id=user.id).all() assert len(alerts) == 1