diff --git a/Dockerfile b/Dockerfile index e730dbb..4069b6e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,4 +4,6 @@ ENV PYTHONUNBUFFERED=1 WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt +RUN apt-get update +RUN apt-get install -y cron COPY . /code/ diff --git a/config/settings.py b/config/settings.py index 63738ad..0d5e7fb 100644 --- a/config/settings.py +++ b/config/settings.py @@ -64,6 +64,7 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django_crontab', 'django_filters', 'corsheaders', 'rest_framework', @@ -251,6 +252,7 @@ EMAIL_USE_TLS = True EMAIL_PORT = 587 EMAIL_HOST_USER = os.getenv('EMAIL_HOST_USER') + DEFAULT_FROM_EMAIL = os.getenv('EMAIL_HOST_USER') EMAIL_HOST_PASSWORD = os.getenv('EMAIL_HOST_PASSWORD') @@ -270,3 +272,9 @@ AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY') AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID') + +CRONJOBS = [ + # TODO: fix "no crontab for root" error in heroku? + # ('*/1 * * * *', 'weekly_digest.cron.weekly_digest_job','>> ./file.log'), # for testing + # ('0 4 * * 1', 'weekly_digest.cron.weekly_digest_job'), # every monday at 4am +] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 3883e2a..cb65f37 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,7 +14,7 @@ services: web: build: . - command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py runserver 0.0.0.0:8000" + command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py crontab add && python manage.py runserver 0.0.0.0:8000" volumes: - .:/code ports: diff --git a/requirements.txt b/requirements.txt index 1c56e6c..aab1935 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,4 @@ Faker==13.15.1 boto3==1.18.36 django-storages==1.11.1 Pillow==9.2.0 +django-crontab==0.7.1 \ No newline at end of file diff --git a/weekly_digest/cron.py b/weekly_digest/cron.py new file mode 100644 index 0000000..9c4ce55 --- /dev/null +++ b/weekly_digest/cron.py @@ -0,0 +1,17 @@ +from django.core.mail import send_mail +from django.conf import settings + + +def weekly_digest_job(self, *args, **options): + subscribed_users = WeeklyDigestSubscription.objects.filter( + subscribed=True + ).all() + + send_mail( + 'subject', + 'Here is the message.', + settings.EMAIL_HOST_USER, + ['daniel.ashcraft@gmail.com'], + fail_silently=False, + ) + print('Successfully sent') diff --git a/weekly_digest/tests/views/test_views.py b/weekly_digest/tests/views/test_views.py index ff3cb1b..3ce0ac5 100644 --- a/weekly_digest/tests/views/test_views.py +++ b/weekly_digest/tests/views/test_views.py @@ -71,6 +71,22 @@ def test_weekly_digest_put_request(self): self.assertEqual(response_data['email'], self.existing_email_address) self.assertEqual(response_data['subscribed'], False) + def test_weekly_digest_patch_request(self): + request_data = { + 'subscribed': 'False', + } + + response = self.client.patch( + f"/api/v1/weekly_digests/{self.weekly_digest_subscription.id}/", + json.dumps(request_data), + content_type="application/json", + ) + response_data = response.json() + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response_data['email'], self.weekly_digest_subscription.email) + self.assertEqual(response_data['subscribed'], False) + + def test_weekly_digest_get_request(self): response = self.client.get( f"/api/v1/weekly_digests/{self.weekly_digest_subscription.id}/", @@ -87,6 +103,7 @@ def test_weekly_digest_delete_request(self): ) self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + def test_trigger_digest_email_request_week_events(self): Event.objects.create( event_name='Today Event',