Commit fd5c5acc by Tyler Hallada

Add emulate_http_request contextmanager for tasks

remove explicit middleware from resolver task

Address Gabe's comment

Add TODO to define middleware_classes in settings
parent c25e4ba0
...@@ -6,7 +6,6 @@ import logging ...@@ -6,7 +6,6 @@ import logging
from urlparse import urljoin from urlparse import urljoin
from celery import task from celery import task
from crum import CurrentRequestUserMiddleware
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
...@@ -22,7 +21,6 @@ import lms.lib.comment_client as cc ...@@ -22,7 +21,6 @@ import lms.lib.comment_client as cc
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
from openedx.core.djangoapps.schedules.template_context import get_base_template_context from openedx.core.djangoapps.schedules.template_context import get_base_template_context
from openedx.core.djangoapps.theming.middleware import CurrentSiteThemeMiddleware
from openedx.core.lib.celery.task_utils import emulate_http_request from openedx.core.lib.celery.task_utils import emulate_http_request
...@@ -44,11 +42,7 @@ def send_ace_message(context): ...@@ -44,11 +42,7 @@ def send_ace_message(context):
if _should_send_message(context): if _should_send_message(context):
context['site'] = Site.objects.get(id=context['site_id']) context['site'] = Site.objects.get(id=context['site_id'])
thread_author = User.objects.get(id=context['thread_author_id']) thread_author = User.objects.get(id=context['thread_author_id'])
middleware_classes = [ with emulate_http_request(site=context['site'], user=thread_author):
CurrentRequestUserMiddleware,
CurrentSiteThemeMiddleware,
]
with emulate_http_request(site=context['site'], user=thread_author, middleware_classes=middleware_classes):
message_context = _build_message_context(context) message_context = _build_message_context(context)
message = ResponseNotification().personalize( message = ResponseNotification().personalize(
Recipient(thread_author.username, thread_author.email), Recipient(thread_author.username, thread_author.email),
......
...@@ -222,12 +222,8 @@ class TaskTestCase(ModuleStoreTestCase): ...@@ -222,12 +222,8 @@ class TaskTestCase(ModuleStoreTestCase):
def _assert_rendered_email(self, message): def _assert_rendered_email(self, message):
# check that we can actually render the message # check that we can actually render the message
middleware_classes = [
CurrentRequestUserMiddleware,
CurrentSiteThemeMiddleware,
]
with emulate_http_request( with emulate_http_request(
site=message.context['site'], user=self.thread_author, middleware_classes=middleware_classes site=message.context['site'], user=self.thread_author
): ):
rendered_email = EmailRenderer().render(message) rendered_email = EmailRenderer().render(message)
self.assertTrue(self.comment['body'] in rendered_email.body_html) self.assertTrue(self.comment['body'] in rendered_email.body_html)
......
...@@ -3,7 +3,6 @@ import logging ...@@ -3,7 +3,6 @@ import logging
import analytics import analytics
from celery.task import task, Task from celery.task import task, Task
from crum import CurrentRequestUserMiddleware
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.sites.models import Site from django.contrib.sites.models import Site
...@@ -20,7 +19,6 @@ from openedx.core.djangoapps.monitoring_utils import set_custom_metric ...@@ -20,7 +19,6 @@ from openedx.core.djangoapps.monitoring_utils import set_custom_metric
from openedx.core.djangoapps.schedules import message_types from openedx.core.djangoapps.schedules import message_types
from openedx.core.djangoapps.schedules.models import Schedule, ScheduleConfig from openedx.core.djangoapps.schedules.models import Schedule, ScheduleConfig
from openedx.core.djangoapps.schedules import resolvers from openedx.core.djangoapps.schedules import resolvers
from openedx.core.djangoapps.theming.middleware import CurrentSiteThemeMiddleware
from openedx.core.lib.celery.task_utils import emulate_http_request from openedx.core.lib.celery.task_utils import emulate_http_request
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)
...@@ -103,11 +101,7 @@ class ScheduleMessageBaseTask(Task): ...@@ -103,11 +101,7 @@ class ScheduleMessageBaseTask(Task):
): ):
msg_type = self.make_message_type(day_offset) msg_type = self.make_message_type(day_offset)
site = Site.objects.select_related('configuration').get(id=site_id) site = Site.objects.select_related('configuration').get(id=site_id)
middleware_classes = [ with emulate_http_request(site=site):
CurrentRequestUserMiddleware,
CurrentSiteThemeMiddleware,
]
with emulate_http_request(site=site, middleware_classes=middleware_classes):
_annotate_for_monitoring(msg_type, site, bin_num, target_day_str, day_offset) _annotate_for_monitoring(msg_type, site, bin_num, target_day_str, day_offset)
return self.resolver( return self.resolver(
self.async_send_task, self.async_send_task,
...@@ -191,11 +185,7 @@ def _schedule_send(msg_str, site_id, delivery_config_var, log_prefix): ...@@ -191,11 +185,7 @@ def _schedule_send(msg_str, site_id, delivery_config_var, log_prefix):
msg = Message.from_string(msg_str) msg = Message.from_string(msg_str)
user = User.objects.get(username=msg.recipient.username) user = User.objects.get(username=msg.recipient.username)
middleware_classes = [ with emulate_http_request(site=site, user=user):
CurrentRequestUserMiddleware,
CurrentSiteThemeMiddleware,
]
with emulate_http_request(site=site, user=user, middleware_classes=middleware_classes):
_annonate_send_task_for_monitoring(msg) _annonate_send_task_for_monitoring(msg)
LOG.debug('%s: Sending message = %s', log_prefix, msg_str) LOG.debug('%s: Sending message = %s', log_prefix, msg_str)
ace.send(msg) ace.send(msg)
......
from contextlib import contextmanager from contextlib import contextmanager
from crum import CurrentRequestUserMiddleware
from django.http import HttpRequest, HttpResponse from django.http import HttpRequest, HttpResponse
from openedx.core.djangoapps.theming.middleware import CurrentSiteThemeMiddleware
@contextmanager @contextmanager
...@@ -20,12 +22,17 @@ def emulate_http_request(site=None, user=None, middleware_classes=None): ...@@ -20,12 +22,17 @@ def emulate_http_request(site=None, user=None, middleware_classes=None):
site (Site): The site that this request should emulate. Defaults to None. site (Site): The site that this request should emulate. Defaults to None.
user (User): The user that initiated this fake request. Defaults to None user (User): The user that initiated this fake request. Defaults to None
middleware_classes (list): A list of classes that implement Django's middleware interface. middleware_classes (list): A list of classes that implement Django's middleware interface.
Defaults to [CurrentRequestUserMiddleware, CurrentSiteThemeMiddleware] if None.
""" """
request = HttpRequest() request = HttpRequest()
request.user = user request.user = user
request.site = site request.site = site
middleware_classes = middleware_classes or [] # TODO: define the default middleware_classes in settings.py
middleware_classes = middleware_classes or [
CurrentRequestUserMiddleware,
CurrentSiteThemeMiddleware,
]
middleware_instances = [klass() for klass in middleware_classes] middleware_instances = [klass() for klass in middleware_classes]
response = HttpResponse() response = HttpResponse()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment