diff --git a/make_post_sell/lib/digest_sender.py b/make_post_sell/lib/digest_sender.py index 47d617a..e6804f0 100644 --- a/make_post_sell/lib/digest_sender.py +++ b/make_post_sell/lib/digest_sender.py @@ -2,12 +2,14 @@ Console script to send email digests to shop subscribers. Usage: + digest_sender data/development.ini --frequency immediate digest_sender data/development.ini --frequency daily digest_sender data/development.ini --frequency weekly --dry-run Cron setup: - 0 8 * * * /path/to/env/bin/digest_sender /path/to/production.ini --frequency daily - 0 8 * * 1 /path/to/env/bin/digest_sender /path/to/production.ini --frequency weekly + */5 * * * * /path/to/env/bin/digest_sender /path/to/production.ini --frequency immediate + 0 8 * * * /path/to/env/bin/digest_sender /path/to/production.ini --frequency daily + 0 8 * * 1 /path/to/env/bin/digest_sender /path/to/production.ini --frequency weekly """ import argparse @@ -22,6 +24,7 @@ from ..models.product import Product from ..models.shop_subscription import ( FREQUENCY_DAILY, FREQUENCY_WEEKLY, + FREQUENCY_IMMEDIATE, get_verified_subscriptions_for_shop, ) from .mail import send_email @@ -37,7 +40,7 @@ def parse_args(argv): p.add_argument("config_uri", help="Pyramid config file, e.g. development.ini") p.add_argument( "--frequency", - choices=["daily", "weekly"], + choices=["immediate", "daily", "weekly"], required=True, help="Which frequency of subscribers to process", ) @@ -95,7 +98,12 @@ def build_digest_html(shop_name, items, unsubscribe_url, get_endpoint=""): def run(env, frequency_str, dry_run=False): """Process all shops and send digests.""" - frequency = FREQUENCY_DAILY if frequency_str == "daily" else FREQUENCY_WEEKLY + freq_map = { + "immediate": FREQUENCY_IMMEDIATE, + "daily": FREQUENCY_DAILY, + "weekly": FREQUENCY_WEEKLY, + } + frequency = freq_map.get(frequency_str, FREQUENCY_DAILY) request = env["request"] dbsession = request.dbsession settings = request.registry.settings diff --git a/make_post_sell/models/shop_subscription.py b/make_post_sell/models/shop_subscription.py index 21f7cdc..fb10039 100644 --- a/make_post_sell/models/shop_subscription.py +++ b/make_post_sell/models/shop_subscription.py @@ -13,10 +13,12 @@ from .meta import ( FREQUENCY_DAILY = 0 FREQUENCY_WEEKLY = 1 +FREQUENCY_IMMEDIATE = 2 FREQUENCY_HUMAN = { FREQUENCY_DAILY: "Daily", FREQUENCY_WEEKLY: "Weekly", + FREQUENCY_IMMEDIATE: "Immediate", } @@ -27,7 +29,7 @@ class ShopSubscription(RBase, Base): shop_id = Column(UUIDType, foreign_key("Shop", "id"), nullable=False, index=True) user_id = Column(UUIDType, foreign_key("User", "id"), nullable=True, index=True) email = Column(Unicode(64), nullable=False) - frequency = Column(Integer, nullable=False, default=FREQUENCY_WEEKLY) + frequency = Column(Integer, nullable=False, default=FREQUENCY_DAILY) verified = Column(Boolean, nullable=False, default=False) unsubscribe_token = Column(Unicode(64), nullable=False, unique=True) verify_token = Column(Unicode(64), nullable=True) @@ -40,7 +42,7 @@ class ShopSubscription(RBase, Base): self.email = email self.shop_id = shop_id self.user_id = user_id - self.frequency = FREQUENCY_WEEKLY + self.frequency = FREQUENCY_DAILY self.disabled = False self.unsubscribe_token = secrets.token_urlsafe(32) self.created_timestamp = now_timestamp() @@ -56,7 +58,7 @@ class ShopSubscription(RBase, Base): @property def human_frequency(self): - return FREQUENCY_HUMAN.get(self.frequency, "Weekly") + return FREQUENCY_HUMAN.get(self.frequency, "Daily") def get_subscription_for_email_and_shop(dbsession, email, shop_id): diff --git a/make_post_sell/templates/subscribe.j2 b/make_post_sell/templates/subscribe.j2 index ad21517..1897234 100644 --- a/make_post_sell/templates/subscribe.j2 +++ b/make_post_sell/templates/subscribe.j2 @@ -111,12 +111,15 @@ - - + + - + + + + diff --git a/make_post_sell/tests/test_models.py b/make_post_sell/tests/test_models.py index 2d9481d..0d2f038 100644 --- a/make_post_sell/tests/test_models.py +++ b/make_post_sell/tests/test_models.py @@ -2548,12 +2548,12 @@ class TestShopSubscription(unittest.TestCase): self.assertNotEqual(sub1.unsubscribe_token, sub2.unsubscribe_token) self.assertNotEqual(sub1.verify_token, sub2.verify_token) - def test_default_frequency_weekly(self): - """Test that default frequency is weekly.""" - from ..models.shop_subscription import ShopSubscription, FREQUENCY_WEEKLY + def test_default_frequency_daily(self): + """Test that default frequency is daily.""" + from ..models.shop_subscription import ShopSubscription, FREQUENCY_DAILY sub = ShopSubscription("test@example.com", self.shop.id) - self.assertEqual(sub.frequency, FREQUENCY_WEEKLY) + self.assertEqual(sub.frequency, FREQUENCY_DAILY) def test_human_frequency(self): """Test human_frequency property.""" diff --git a/make_post_sell/views/subscribe.py b/make_post_sell/views/subscribe.py index 1b62065..c680dda 100644 --- a/make_post_sell/views/subscribe.py +++ b/make_post_sell/views/subscribe.py @@ -7,6 +7,7 @@ from ..models.shop_subscription import ( ShopSubscription, FREQUENCY_DAILY, FREQUENCY_WEEKLY, + FREQUENCY_IMMEDIATE, get_subscription_for_email_and_shop, get_subscription_by_unsubscribe_token, get_subscription_by_verify_token, @@ -45,17 +46,17 @@ def subscribe(request): ) if request.method == "POST": - frequency_str = request.params.get("frequency", "1") + frequency_str = request.params.get("frequency", "0") try: frequency = int(frequency_str) except (ValueError, TypeError): - frequency = FREQUENCY_WEEKLY + frequency = FREQUENCY_DAILY # frequency -1 means "None" — disable notifications wants_unsubscribe = frequency == -1 - if frequency not in (FREQUENCY_DAILY, FREQUENCY_WEEKLY): - frequency = FREQUENCY_WEEKLY + if frequency not in (FREQUENCY_DAILY, FREQUENCY_WEEKLY, FREQUENCY_IMMEDIATE): + frequency = FREQUENCY_DAILY if request.user and request.user.authenticated: # Logged-in user: one-click subscribe