Skip to content

Commit

Permalink
Newsletter: Extend newsletter export by status column (confirmed)
Browse files Browse the repository at this point in the history
TYPE: Feature
LINK: ogc-1645
  • Loading branch information
Tschuppi81 authored May 23, 2024
1 parent ac6c2a1 commit 201f976
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 21 deletions.
8 changes: 8 additions & 0 deletions src/onegov/newsletter/collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,10 @@ def by_address(

return query.first()

def ordered_by_status_address(self) -> 'Query[Recipient]':
""" Orders the recipients by status and address. """
return self.query().order_by(Recipient.confirmed, Recipient.address)

def add(
self,
address: str,
Expand All @@ -102,3 +106,7 @@ def add(
def delete(self, recipient: Recipient) -> None:
self.session.delete(recipient)
self.session.flush()

def count(self) -> int:
""" Returns the number of recipients. """
return self.session.query(Recipient).count()
16 changes: 11 additions & 5 deletions src/onegov/org/forms/newsletter.py
Original file line number Diff line number Diff line change
Expand Up @@ -341,19 +341,25 @@ class NewsletterSubscriberImportExportForm(Form):
def headers(self) -> dict[str, str]:
return {
'address': self.request.translate(_("Address")),
'confirmed': self.request.translate(_("Confirmed")),
}

def run_export(self) -> list[dict[str, Any]]:
recipients = RecipientCollection(self.request.session)
recipients = RecipientCollection(
self.request.session).ordered_by_status_address()
headers = self.headers

def get(recipient: Recipient, attribute: str) -> str:
def get(recipient: Recipient, attribute: str) -> str | bool:
result = getattr(recipient, attribute, '')
result = result.strip()
return result
if isinstance(result, str):
return result.strip()
elif attribute == 'confirmed':
return bool(result)
else:
return result

result = []
for recipient in recipients.query():
for recipient in recipients.all():
result.append({
v: get(recipient, k)
for k, v in headers.items()
Expand Down
36 changes: 24 additions & 12 deletions tests/onegov/newsletter/test_collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,27 +27,39 @@ def test_newsletter_collection(session):
def test_recipient_collection(session):

recipients = RecipientCollection(session)
r = recipients.add("[email protected]")
r1 = recipients.add("[email protected]", confirmed=True)
r2 = recipients.add("[email protected]", group='tech', confirmed=False)

assert r.address == "[email protected]"
assert r.group is None
assert recipients.count() == 2
assert r1.address == "[email protected]"
assert r1.group is None
assert r1.confirmed
assert r2.address == "[email protected]"
assert r2.group == 'tech'
assert not r2.confirmed

r = recipients.by_id(r.id)
r1 = recipients.by_id(r1.id)

assert r.address == "[email protected]"
assert r.group is None
assert r1.address == "[email protected]"
assert r1.group is None

r = recipients.by_address(r.address, 'abc')
assert r is None
assert recipients.by_id('abc') is None
assert recipients.by_address(r1.address, 'abc') is None

r = recipients.by_address('[email protected]')
assert recipients.ordered_by_status_address().all() == [r2, r1]

assert r.address == "[email protected]"
assert r.group is None
r1 = recipients.by_address('[email protected]')

recipients.delete(r)
assert r1.address == "[email protected]"
assert r1.group is None

recipients.delete(r1)

assert recipients.by_address('[email protected]') is None
assert recipients.count() == 1

recipients.delete(r2)
assert recipients.count() == 0


def test_newsletter_already_exists(session):
Expand Down
8 changes: 4 additions & 4 deletions tests/onegov/town6/test_views_newsletter.py
Original file line number Diff line number Diff line change
Expand Up @@ -522,15 +522,15 @@ def test_import_export_subscribers(client):
page.form['file_format'] = 'json'
response = page.form.submit().json
assert response == [
{'Adresse': '[email protected]'},
{'Adresse': '[email protected]'},
{'Adresse': '[email protected]', 'Bestätigt': True},
{'Adresse': '[email protected]', 'Bestätigt': True},
]

page.form['file_format'] = 'xlsx'

more_recipients = [
{'Adresse': '[email protected]'},
{'Adresse': '[email protected]'},
{'Adresse': '[email protected]', 'Bestätigt': True},
{'Adresse': '[email protected]', 'Bestätigt': False},
]
file = Upload(
'file',
Expand Down

0 comments on commit 201f976

Please sign in to comment.