Skip to content
This repository was archived by the owner on Nov 11, 2020. It is now read-only.
Merged
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
5 changes: 2 additions & 3 deletions notifier/digest.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@

from django.conf import settings
from django.template.loader import get_template
from django.template import Context
from django.utils.html import strip_tags
from django.utils.translation import ugettext as _, activate, deactivate
from opaque_keys.edx.keys import CourseKey
Expand Down Expand Up @@ -228,7 +227,7 @@ def render_digest(user, digest, title, description):
Returns two strings: (text_body, html_body).
"""
logger.info("rendering email message: {user_id: %s}", user['id'])
context = Context({
context = {
'user': user,
'digest': digest,
'title': title,
Expand All @@ -239,7 +238,7 @@ def render_digest(user, digest, title, description):
'logo_image_url': settings.LOGO_IMAGE_URL,
'unsubscribe_url': _get_unsubscribe_url(user),
'postal_address': settings.EMAIL_SENDER_POSTAL_ADDRESS,
})
}

with _activate_user_lang(user):
text = get_template('digest-email.txt').render(context)
Expand Down
73 changes: 29 additions & 44 deletions notifier/management/commands/forums_digest.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,13 @@
from __future__ import unicode_literals
import datetime

import celery

from dateutil.parser import parse as date_parse
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
from django.core.management.base import BaseCommand
from django.core.serializers.json import DjangoJSONEncoder
import json
import logging
from optparse import make_option
import pytz
import requests
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unused, right? @ericfab179

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes

import sys

from notifier.digest import render_digest, Digest, DigestCourse, DigestThread, DigestItem
from notifier.pull import generate_digest_content
Expand All @@ -39,45 +35,34 @@ class Command(BaseCommand):

"""
"""
def add_arguments(self, parser):
"""Add comand arguments."""
parser.add_argument('--to_datetime',
help='datetime as of which to generate digest content, in ISO-8601 format (UTC). Defaults to today at 00:00 (UTC).'),
parser.add_argument('--minutes',
type='int',
default=1440,
help='number of minutes up to TO_DATETIME for which to generate digest content. Defaults to 1440 (one day).'),
parser.add_argument('--users',
dest='users_str',
help='send digests for the specified users only (regardless of opt-out settings!)'),
parser.add_argument('--show-content',
action='store_true',
dest='show_content',
help='output the retrieved content only (don\'t send anything)'),
parser.add_argument('--show-users',
action='store_true',
dest='show_users',
help='output the retrieved users only (don\'t fetch content or send anything)'),
parser.add_argument('--show-text',
action='store_true',
dest='show_text',
help='output the rendered text body of the first user-digest generated, and exit (don\'t send anything)'),
parser.add_argument('--show-html',
action='store_true',
dest='show_html',
help='output the rendered html body of the first user-digest generated, and exit (don\'t send anything)'),

option_list = BaseCommand.option_list + (
make_option('--to_datetime',
action='store',
dest='to_datetime',
default=None,
help='datetime as of which to generate digest content, in ISO-8601 format (UTC). Defaults to today at 00:00 (UTC).'),
make_option('--minutes',
action='store',
dest='minutes',
type='int',
default=1440,
help='number of minutes up to TO_DATETIME for which to generate digest content. Defaults to 1440 (one day).'),
make_option('--users',
action='store',
dest='users_str',
default=None,
help='send digests for the specified users only (regardless of opt-out settings!)'),
make_option('--show-content',
action='store_true',
dest='show_content',
default=None,
help='output the retrieved content only (don\'t send anything)'),
make_option('--show-users',
action='store_true',
dest='show_users',
default=None,
help='output the retrieved users only (don\'t fetch content or send anything)'),
make_option('--show-text',
action='store_true',
dest='show_text',
default=None,
help='output the rendered text body of the first user-digest generated, and exit (don\'t send anything)'),
make_option('--show-html',
action='store_true',
dest='show_html',
default=None,
help='output the rendered html body of the first user-digest generated, and exit (don\'t send anything)'),
)

def get_specific_users(self, user_ids):
# this makes an individual HTTP request for each user -
Expand Down
2 changes: 1 addition & 1 deletion notifier/management/commands/scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from __future__ import unicode_literals
from apscheduler.schedulers.blocking import BlockingScheduler
from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
from django.core.management.base import BaseCommand

from notifier.tasks import do_forums_digests

Expand Down
23 changes: 23 additions & 0 deletions notifier/settings.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
from __future__ import absolute_import
from __future__ import unicode_literals
from datetime import timedelta
from os.path import abspath, dirname, join
import logging
import os
import platform

here = lambda *x: join(abspath(dirname(__file__)), *x)
PROJECT_ROOT = here('..')
root = lambda *x: abspath(join(abspath(PROJECT_ROOT), *x))

DATABASES = {
'default': {
# Database backend defaults to 'sqlite3', but 'mysql' is also supported.
Expand All @@ -30,6 +35,24 @@

SERVICE_NAME = 'notifier'

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'APP_DIRS': True,
'DIRS': (
root('templates'),
),
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]

# Misc. Notifier Formatting

FORUM_DIGEST_EMAIL_SENDER = os.getenv('FORUM_DIGEST_EMAIL_SENDER', 'notifications@example.org')
Expand Down
2 changes: 1 addition & 1 deletion notifier/tests/test_digest.py
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ def test_user_lang_pref_supported(self, mock_activate, mock_deactivate):
self.user["preferences"][LANGUAGE_PREFERENCE_KEY] = user_lang
render_digest(self.user, self.digest, "dummy", "dummy")
mock_activate.assert_called_with(user_lang)
mock_deactivate.assert_called()
self.assertTrue(mock_deactivate.called)

@patch("notifier.digest.activate")
def test_user_lang_pref_unsupported(self, mock_activate):
Expand Down
14 changes: 7 additions & 7 deletions requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,28 +11,28 @@ apscheduler==3.6.3 # via -r requirements/base.in
billiard==3.3.0.23 # via -r requirements/base.in, celery
boto==2.49.0 # via -r requirements/base.in, django-ses
celery==3.1.26.post2 # via -r requirements/base.in, django-celery
certifi==2020.4.5.1 # via requests
certifi==2020.6.20 # via requests
chardet==3.0.4 # via requests
django-celery==3.3.1 # via -r requirements/base.in
django-configurations==2.2 # via -r requirements/base.in
django-coverage==1.2.4 # via -r requirements/base.in
django-ses==0.8.14 # via -r requirements/base.in
django==1.8.18 # via -c requirements/constraints.txt, -r requirements/base.in, django-celery
django==1.11.29 # via -c requirements/constraints.txt, -r requirements/base.in, django-celery
funcsigs==1.0.2 # via apscheduler
future==0.18.2 # via django-ses
futures==3.3.0 ; python_version == "2.7" # via -c requirements/constraints.txt, apscheduler
idna==2.9 # via requests
idna==2.10 # via requests
kombu==3.0.37 # via -r requirements/base.in, celery
logilab-astng==0.24.3 # via -r requirements/base.in
logilab-common==1.4.4 # via -r requirements/base.in, logilab-astng
mysqlclient==1.4.6 # via -r requirements/base.in
pbr==5.4.5 # via stevedore
pymongo==3.10.1 # via edx-opaque-keys
python-dateutil==2.8.1 # via -r requirements/base.in
pytz==2020.1 # via -r requirements/base.in, apscheduler, celery, django-ses, tzlocal
redis==3.5.2 # via -r requirements/base.in
requests==2.23.0 # via -r requirements/base.in
six==1.14.0 # via -r requirements/base.in, apscheduler, django-configurations, edx-opaque-keys, logilab-common, python-dateutil, stevedore
pytz==2020.1 # via -r requirements/base.in, apscheduler, celery, django, django-ses, tzlocal
redis==3.5.3 # via -r requirements/base.in
requests==2.24.0 # via -r requirements/base.in
six==1.15.0 # via -r requirements/base.in, apscheduler, django-configurations, edx-opaque-keys, logilab-common, python-dateutil, stevedore
stevedore==1.32.0 # via edx-opaque-keys
tzlocal==2.1 # via apscheduler
urllib3==1.25.9 # via requests
Expand Down
5 changes: 4 additions & 1 deletion requirements/constraints.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@
# TODO: Many pinned dependencies should be unpinned and/or moved to this constraints file.

# Use latest Django LTS version
Django<1.8.19
Django<2

# mock version 4.0.0 drops support for python 3.5
mock<4.0.0

# edx-lint remove support for python 2 after this version
edx-lint<1.5.0

# Already in python3 standard library
futures; python_version == "2.7"
27 changes: 16 additions & 11 deletions requirements/dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,23 @@
amqp==1.4.9 # via -r requirements/base.txt, kombu
anyjson==0.3.3 # via -r requirements/base.txt, kombu
apscheduler==3.6.3 # via -r requirements/base.txt
autopep8==1.5.2 # via -r requirements/dev.in
autopep8==1.5.3 # via -r requirements/dev.in
billiard==3.3.0.23 # via -r requirements/base.txt, celery
boto==2.49.0 # via -r requirements/base.txt, django-ses
celery==3.1.26.post2 # via -r requirements/base.txt, django-celery
certifi==2020.4.5.1 # via -r requirements/base.txt, requests
certifi==2020.6.20 # via -r requirements/base.txt, requests
chardet==3.0.4 # via -r requirements/base.txt, requests
django-celery==3.3.1 # via -r requirements/base.txt
django-configurations==2.2 # via -r requirements/base.txt
django-coverage==1.2.4 # via -r requirements/base.txt
django-ses==0.8.14 # via -r requirements/base.txt
django==1.8.18 # via -c requirements/constraints.txt, -r requirements/base.txt, django-celery
django==1.11.29 # via -c requirements/constraints.txt, -r requirements/base.txt, django-celery
funcsigs==1.0.2 # via -r requirements/base.txt, apscheduler
future==0.18.2 # via -r requirements/base.txt, django-ses
futures==3.3.0 ; python_version == "2.7" # via -c requirements/constraints.txt, -r requirements/base.txt, apscheduler
idna==2.9 # via -r requirements/base.txt, requests
gitdb2==2.0.6 # via gitpython
gitpython==2.1.15 # via transifex-client
idna==2.10 # via -r requirements/base.txt, requests
kombu==3.0.37 # via -r requirements/base.txt, celery
logilab-astng==0.24.3 # via -r requirements/base.txt
logilab-common==1.4.4 # via -r requirements/base.txt, logilab-astng
Expand All @@ -31,15 +33,18 @@ pbr==5.4.5 # via -r requirements/base.txt, stevedore
pycodestyle==2.6.0 # via autopep8
pymongo==3.10.1 # via -r requirements/base.txt, edx-opaque-keys
python-dateutil==2.8.1 # via -r requirements/base.txt
python-slugify==1.2.6 # via transifex-client
pytz==2020.1 # via -r requirements/base.txt, apscheduler, celery, django-ses, tzlocal
redis==3.5.2 # via -r requirements/base.txt
requests==2.23.0 # via -r requirements/base.txt, transifex-client
six==1.14.0 # via -r requirements/base.txt, apscheduler, django-configurations, edx-opaque-keys, logilab-common, python-dateutil, stevedore, transifex-client
python-slugify==4.0.1 # via transifex-client
pytz==2020.1 # via -r requirements/base.txt, apscheduler, celery, django, django-ses, tzlocal
redis==3.5.3 # via -r requirements/base.txt
requests==2.24.0 # via -r requirements/base.txt, transifex-client
six==1.15.0 # via -r requirements/base.txt, apscheduler, django-configurations, edx-opaque-keys, logilab-common, python-dateutil, stevedore, transifex-client
smmap2==3.0.1 # via gitdb2
smmap==3.0.4 # via smmap2
stevedore==1.32.0 # via -r requirements/base.txt, edx-opaque-keys
transifex-client==0.13.9 # via -r requirements/dev.in
text-unidecode==1.3 # via python-slugify
toml==0.10.1 # via autopep8
transifex-client==0.13.11 # via -r requirements/dev.in
tzlocal==2.1 # via -r requirements/base.txt, apscheduler
unidecode==1.1.1 # via python-slugify
urllib3==1.25.9 # via -r requirements/base.txt, requests, transifex-client

# The following packages are considered to be unsafe in a requirements file:
Expand Down
2 changes: 1 addition & 1 deletion requirements/django.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
django==1.8.18 # via -c requirements/constraints.txt, -r requirements/base.in, -r requirements/base.txt, django-celery
django==1.11.29 # via -c requirements/constraints.txt, -r requirements/base.in, -r requirements/base.txt, django-celery
4 changes: 2 additions & 2 deletions requirements/pip_tools.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
# make upgrade
#
click==7.1.2 # via pip-tools
pip-tools==5.1.2 # via -r requirements/pip_tools.in
six==1.14.0 # via pip-tools
pip-tools==5.2.1 # via -r requirements/pip_tools.in
six==1.15.0 # via pip-tools

# The following packages are considered to be unsafe in a requirements file:
# pip
16 changes: 8 additions & 8 deletions requirements/quality.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,30 @@ argparse==1.4.0 # via caniusepython3
astroid==1.6.6 # via pylint, pylint-celery
backports.functools-lru-cache==1.6.1 # via astroid, caniusepython3, isort, pylint
caniusepython3==7.2.0 # via -r requirements/quality.in
certifi==2020.4.5.1 # via requests
certifi==2020.6.20 # via requests
chardet==3.0.4 # via requests
click-log==0.3.2 # via edx-lint
click==7.1.2 # via click-log, edx-lint
configparser==4.0.2 # via pydocstyle, pylint
distlib==0.3.0 # via caniusepython3
edx-lint==1.4.1 # via -r requirements/quality.in
distlib==0.3.1 # via caniusepython3
edx-lint==1.4.1 # via -c requirements/constraints.txt, -r requirements/quality.in
enum34==1.1.10 # via astroid
futures==3.3.0 ; python_version == "2.7" # via -c requirements/constraints.txt, caniusepython3, isort
idna==2.9 # via requests
idna==2.10 # via requests
isort==4.3.21 # via -r requirements/quality.in, pylint
lazy-object-proxy==1.4.3 # via astroid
lazy-object-proxy==1.5.0 # via astroid
mccabe==0.6.1 # via pylint
packaging==20.3 # via caniusepython3
packaging==20.4 # via caniusepython3
pycodestyle==2.6.0 # via -r requirements/quality.in
pydocstyle==3.0.0 # via -r requirements/quality.in
pylint-celery==0.3 # via edx-lint
pylint-django==0.11.1 # via edx-lint
pylint-plugin-utils==0.6 # via pylint-celery, pylint-django
pylint==1.9.5 # via edx-lint, pylint-celery, pylint-django, pylint-plugin-utils
pyparsing==2.4.7 # via packaging
requests==2.23.0 # via caniusepython3
requests==2.24.0 # via caniusepython3
singledispatch==3.4.0.3 # via astroid, pylint
six==1.14.0 # via astroid, edx-lint, packaging, pydocstyle, pylint, singledispatch
six==1.15.0 # via astroid, edx-lint, packaging, pydocstyle, pylint, singledispatch
snowballstemmer==2.0.0 # via pydocstyle
urllib3==1.25.9 # via requests
wrapt==1.12.1 # via astroid
Expand Down
12 changes: 6 additions & 6 deletions requirements/test.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ apscheduler==3.6.3 # via -r requirements/base.in, -r requirements/base.tx
billiard==3.3.0.23 # via -r requirements/base.in, -r requirements/base.txt, celery
boto==2.49.0 # via -r requirements/base.in, -r requirements/base.txt, django-ses
celery==3.1.26.post2 # via -r requirements/base.in, -r requirements/base.txt, django-celery
certifi==2020.4.5.1 # via -r requirements/base.txt, requests
certifi==2020.6.20 # via -r requirements/base.txt, requests
chardet==3.0.4 # via -r requirements/base.txt, requests
django-celery==3.3.1 # via -r requirements/base.in, -r requirements/base.txt
django-configurations==2.2 # via -r requirements/base.in, -r requirements/base.txt
Expand All @@ -20,7 +20,7 @@ django-ses==0.8.14 # via -r requirements/base.in, -r requirements/base.tx
funcsigs==1.0.2 # via -r requirements/base.txt, apscheduler, mock
future==0.18.2 # via -r requirements/base.txt, django-ses
futures==3.3.0 ; python_version == "2.7" # via -c requirements/constraints.txt, -r requirements/base.txt, apscheduler
idna==2.9 # via -r requirements/base.txt, requests
idna==2.10 # via -r requirements/base.txt, requests
kombu==3.0.37 # via -r requirements/base.in, -r requirements/base.txt, celery
logilab-astng==0.24.3 # via -r requirements/base.in, -r requirements/base.txt
logilab-common==1.4.4 # via -r requirements/base.in, -r requirements/base.txt, logilab-astng
Expand All @@ -29,10 +29,10 @@ mysqlclient==1.4.6 # via -r requirements/base.in, -r requirements/base.tx
pbr==5.4.5 # via -r requirements/base.txt, stevedore
pymongo==3.10.1 # via -r requirements/base.txt, edx-opaque-keys
python-dateutil==2.8.1 # via -r requirements/base.in, -r requirements/base.txt
pytz==2020.1 # via -r requirements/base.in, -r requirements/base.txt, apscheduler, celery, django-ses, tzlocal
redis==3.5.2 # via -r requirements/base.in, -r requirements/base.txt
requests==2.23.0 # via -r requirements/base.in, -r requirements/base.txt
six==1.14.0 # via -r requirements/base.in, -r requirements/base.txt, apscheduler, django-configurations, edx-opaque-keys, logilab-common, mock, python-dateutil, stevedore
pytz==2020.1 # via -r requirements/base.in, -r requirements/base.txt, apscheduler, celery, django, django-ses, tzlocal
redis==3.5.3 # via -r requirements/base.in, -r requirements/base.txt
requests==2.24.0 # via -r requirements/base.in, -r requirements/base.txt
six==1.15.0 # via -r requirements/base.in, -r requirements/base.txt, apscheduler, django-configurations, edx-opaque-keys, logilab-common, mock, python-dateutil, stevedore
stevedore==1.32.0 # via -r requirements/base.txt, edx-opaque-keys
tzlocal==2.1 # via -r requirements/base.txt, apscheduler
urllib3==1.25.9 # via -r requirements/base.txt, requests
Expand Down
Loading