add support for after jobs (running them in threads) (#6735)
This commit is contained in:
parent
0de5efb88a
commit
263edfbf2a
|
@ -28,6 +28,10 @@ import wcs.qommon.sms
|
|||
import qommon.sms
|
||||
from qommon.errors import ConnectionError
|
||||
|
||||
import wcs.middleware
|
||||
|
||||
wcs.middleware.AfterJobsMiddleware.ASYNC = False
|
||||
|
||||
class KnownElements(object):
|
||||
pickle_app_dir = None
|
||||
sql_app_dir = None
|
||||
|
|
|
@ -168,6 +168,8 @@ class CompatWcsPublisher(WcsPublisher):
|
|||
continue
|
||||
django_response[name] = value
|
||||
|
||||
django_response.after_jobs = response.after_jobs
|
||||
|
||||
self._clear_request()
|
||||
return django_response
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@ import thread
|
|||
import threading
|
||||
|
||||
from quixote import get_publisher
|
||||
from .qommon.http_response import HTTPResponse
|
||||
from .compat import CompatHTTPRequest, CompatWcsPublisher
|
||||
|
||||
|
||||
|
@ -31,3 +32,19 @@ class PublisherInitialisationMiddleware(object):
|
|||
pub.init_publish(compat_request)
|
||||
pub._set_request(compat_request)
|
||||
request._publisher = pub
|
||||
|
||||
|
||||
class AfterJobsMiddleware(object):
|
||||
ASYNC = True
|
||||
|
||||
def process_response(self, request, response):
|
||||
if hasattr(response, 'after_jobs') and response.after_jobs:
|
||||
http_response = HTTPResponse()
|
||||
http_response.after_jobs = response.after_jobs
|
||||
if self.ASYNC:
|
||||
thread.start_new_thread(
|
||||
http_response.process_after_jobs,
|
||||
(get_publisher(),))
|
||||
else:
|
||||
http_response.process_after_jobs()
|
||||
return response
|
||||
|
|
|
@ -32,10 +32,13 @@ class Publisher(quixote.publish.Publisher):
|
|||
PublisherOrig.__init__(self, root_directory, *args, **kwargs)
|
||||
except RuntimeError:
|
||||
pass
|
||||
_thread_local.publisher = self
|
||||
self.set_in_thread()
|
||||
self.root_directory = root_directory
|
||||
self._request = None
|
||||
|
||||
def set_in_thread(self):
|
||||
_thread_local.publisher = self
|
||||
|
||||
def get_publisher():
|
||||
return getattr(_thread_local, 'publisher', None)
|
||||
|
||||
|
|
|
@ -237,6 +237,7 @@ def email(subject, mail_body, email_rcpt, replyto = None, bcc = None,
|
|||
else:
|
||||
msg_from = msg['From']
|
||||
|
||||
print 'sending email', msg['To']
|
||||
if not fire_and_forget:
|
||||
s = create_smtp_server(emails_cfg, smtp_timeout=smtp_timeout)
|
||||
try:
|
||||
|
|
|
@ -139,10 +139,13 @@ class HTTPResponse(quixote.http_response.HTTPResponse):
|
|||
self.after_jobs.append((job, cmd))
|
||||
return job
|
||||
|
||||
def process_after_jobs(self):
|
||||
def process_after_jobs(self, publisher=None):
|
||||
if not self.after_jobs:
|
||||
return
|
||||
|
||||
if publisher:
|
||||
publisher.set_in_thread()
|
||||
|
||||
for job, job_function in self.after_jobs:
|
||||
if job.completion_time:
|
||||
continue
|
||||
|
|
|
@ -103,6 +103,7 @@ MIDDLEWARE_CLASSES = (
|
|||
# Uncomment the next line for simple clickjacking protection:
|
||||
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
'wcs.compat.PublishErrorMiddleware',
|
||||
'wcs.middleware.AfterJobsMiddleware',
|
||||
)
|
||||
|
||||
ROOT_URLCONF = 'wcs.urls'
|
||||
|
|
Loading…
Reference in New Issue