Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adds logic to manage suppressions #214

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ Contents:
django
tornado
spamcheck
suppression
webhooks
testing
reference
Expand Down
47 changes: 47 additions & 0 deletions docs/supression.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
.. _supression:

Suppression API
==============

You can manage Postmark's Suppression lists with a few simple calls:

To view the current suppression list:
.. code-block:: python

>>> response = postmark.suppressions.get_suppression(stream_id="test")
>>> suppressions = (response['Suppressions'])
>>> for suppression in suppressions:
>>> print(suppression.email_address])
>>> print(" " + suppression.suppression_reason])
>>> print(" " + suppression.origin])
>>> print(" " + suppression.created_at])
[email protected]
ManualSuppression
Recipient
2019-12-17T08:58:33-05:00
[email protected]
HardBounce
Recipient
2019-12-17T08:58:33-05:00
[email protected]
SpamComplaint
Recipient
2019-12-17T08:58:33-05:00
You can search for a particular suppression with "SuppressionReason", "Origin", "todate", "fromdate", and "EmailAddress" like:
.. code-block:: python

>>> response = postmark.suppressions.get_suppression(stream_id="test", EmailAddress="[email protected]")
>>> print(response[0].email_address + " " + response[0].suppression_reason)
[email protected] ManualSuppression
You can add a new suppression with:
.. code-block:: python

>>> response = postmark.suppressions.add(stream_id="test", emails=["[email protected]"])
>>> print(response[0].email_address + " " + response[0].status)
[email protected] Suppressed
You can delete a suppression with:
.. code-block:: python

>>> response = postmark.suppressions.delete(stream_id="test", emails=["[email protected]"])
>>> print(response[0].email_address + " " + response[0].status)
[email protected] Deleted
2 changes: 2 additions & 0 deletions src/postmarker/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from .models.server import ServerManager
from .models.stats import StatsManager
from .models.status import StatusManager
from .models.suppressions import SuppressionManager
from .models.templates import TemplateManager
from .models.triggers import TriggersManager
from .utils import get_args
Expand All @@ -37,6 +38,7 @@ class PostmarkClient:
ServerManager,
StatsManager,
StatusManager,
SuppressionManager,
TemplateManager,
TriggersManager,
)
Expand Down
79 changes: 79 additions & 0 deletions src/postmarker/models/suppressions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
"""Supressions

Information on suppression lists"""

from .base import ModelManager, MessageModel


class Suppression(MessageModel):
"""Suppression model."""
email_address = None
suppression_reason = None
origin = None
created_at = None

def __init__(self, email_address=None, suppression_reason=None, origin=None, created_at=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.email_address = email_address
self.suppression_reason = suppression_reason
self.origin = origin
self.created_at = created_at


class SuppressionResponse(MessageModel):
"""Suppression request model."""
email_address = None
status = None
message = None

def __init__(self, email_address=None, status=None, message=None, *args, **kwargs):
super().__init__(*args, **kwargs)
self.email_address = email_address
self.status = status
self.message = message


class SuppressionManager(ModelManager):
name = "suppressions"
model = Suppression

def _manage_suppression(self, endpoint, emails):
if type(emails) != list:
emails = [emails]
data = {'Suppressions': [{'EmailAddress': email} for email in emails]}
response = self.call("POST", endpoint=endpoint, data=data)
suppression_response_list = []
for suppression in response['Suppressions']:
suppression_response_list.append(SuppressionResponse(
email_address=suppression['EmailAddress'],
status=suppression['Status'],
message=suppression['Message']
))
return suppression_response_list

def get_suppression(self, stream_id, **kwargs):
params = {}
for key, value in kwargs.items():
if key in ['EmailAddress', 'SuppressionReason', 'Origin', 'todate', 'fromdate']:
params[key] = value
else:
raise ValueError(f"Invalid parameter: {key}")
endpoint = f"/message-streams/{stream_id}/suppressions"
response = self.call("GET", endpoint=endpoint, params=params)
suppression_list = []
for suppression in response['Suppressions']:
suppression_list.append(Suppression(
email_address=suppression['EmailAddress'],
suppression_reason=suppression['SuppressionReason'],
origin=suppression['Origin'],
created_at=suppression['CreatedAt']
))
return suppression_list

def add(self, stream_id, emails):
endpoint = f"/message-streams/{stream_id}/suppressions"
return self._manage_suppression(endpoint, emails)

def delete(self, stream_id, emails):
endpoint = f"/message-streams/{stream_id}/suppressions/delete"
return self._manage_suppression(endpoint, emails)