Skip to content
This repository has been archived by the owner on Jan 5, 2019. It is now read-only.

Send emails about new layers to relevant users asynchronously. #1

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 9 additions & 1 deletion README
Expand Up @@ -14,6 +14,7 @@ In order to make use of this application you will need:
* Python 3.4+
* Django 1.8.x - tested with 1.8.17; newer versions may work, but
the application has not been tested with 1.9 or newer.
* RabbitMQ 3.6.x - tested with 3.6.10.
* For production usage, a web server set up to host Django applications
(not needed for local-only testing)
* A database supported by Django (SQLite, MySQL, etc.). Django takes
Expand Down Expand Up @@ -41,7 +42,9 @@ Setup instructions:
1. Edit settings.py to specify a database, EMAIL_HOST, SECRET_KEY and
other settings specific to your installation. Ensure you set
LAYER_FETCH_DIR to an absolute path to a location with sufficient
space for fetching layer repositories.
space for fetching layer repositories. Modify RABBIT_BROKER
and RABBIT_BACKEND to reflect the settings used by your RabbitMQ
server.

2. Run the following commands within the layerindex-web directory to
initialise the database:
Expand All @@ -64,6 +67,11 @@ Setup instructions:
production you need to use a proper web server and have DEBUG set
to False.

3.1. In order to process asynchronous tasks like sending email,
you will need to run a Celery worker:

celery -A layerindex.tasks worker --loglevel=info

4. You'll need to add at least the openembedded-core layer to the
database, or some equivalent that contains conf/bitbake.conf for
the base system configuration. To add this, follow these steps:
Expand Down
1 change: 0 additions & 1 deletion TODO
Expand Up @@ -27,7 +27,6 @@ Other
* Show layer type in layer detail?
* Usage links in list page?
* Subdirs in list page?
* Prevent SMTP failures from breaking submission process
* Query backend service i.e. special URL to query information for external apps/scripts
* Add comparison to duplicates page
* Create simple script to check for unlisted layer subdirectories in all repos
Expand Down
24 changes: 24 additions & 0 deletions layerindex/tasks.py
@@ -0,0 +1,24 @@
from celery import Celery
from django.core.mail import EmailMessage
from . import utils
import os
import time

try:
import settings
except ImportError:
# not in a full django env, so settings is inaccessible.
# setup django to access settings.
utils.setup_django()
import settings

tasks = Celery('layerindex',
broker=settings.RABBIT_BROKER,
backend=settings.RABBIT_BACKEND)

@tasks.task
def send_email(subject, text_content, from_email=settings.DEFAULT_FROM_EMAIL, to_emails=[]):
# We seem to need to run this within the task
utils.setup_django()
msg = EmailMessage(subject, text_content, from_email, to_emails)
msg.send()
5 changes: 2 additions & 3 deletions layerindex/views.py
Expand Up @@ -19,7 +19,6 @@
from django.db import transaction
from django.contrib.auth.models import User, Permission
from django.db.models import Q, Count, Sum
from django.core.mail import EmailMessage
from django.template.loader import get_template
from django.template import Context
from django.utils.decorators import method_decorator
Expand All @@ -28,6 +27,7 @@
from reversion.models import Revision
from . import utils
from . import simplesearch
from . import tasks
import settings
from django.dispatch import receiver
import reversion
Expand Down Expand Up @@ -181,8 +181,7 @@ def edit_layer_view(request, template_name, branch='master', slug=None):
from_email = settings.SUBMIT_EMAIL_FROM
to_email = user.email
text_content = plaintext.render(d)
msg = EmailMessage(subject, text_content, from_email, [to_email])
msg.send()
tasks.send_email.apply_async((subject, text_content, from_email, [to_email]))
return HttpResponseRedirect(reverse('submit_layer_thanks'))
messages.success(request, 'Layer %s saved successfully.' % layeritem.name)
if return_url:
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
@@ -1,3 +1,4 @@
celery==3.1.25
Django==1.8.17
django-cors-headers==1.1.0
django-nvd3==0.9.7
Expand Down
4 changes: 4 additions & 0 deletions settings.py
Expand Up @@ -224,3 +224,7 @@
# Settings for layer submission feature
SUBMIT_EMAIL_FROM = 'noreply@example.com'
SUBMIT_EMAIL_SUBJECT = 'OE Layerindex layer submission'

# RabbitMQ settings
RABBIT_BROKER = 'amqp://'
RABBIT_BACKEND = 'rpc://'