This commit is contained in:
Fergal Moran
2014-08-24 19:36:14 +01:00
parent 4de9f97144
commit 7c23eb2450
11 changed files with 90 additions and 31 deletions

View File

@@ -3,10 +3,13 @@ from core.serialisers import json
from dss import localsettings, settings from dss import localsettings, settings
def post_activity(activity_url): def post_activity(session_id, activity_url):
payload = {'message': activity_url} payload = {
'sessionid': session_id,
'message': activity_url
}
data = json.dumps(payload) data = json.dumps(payload)
r = requests.post(localsettings.REALTIME_HOST + '/api/activity', data=data, headers=settings.REALTIME_HEADERS) r = requests.post(localsettings.REALTIME_HOST + 'activity', data=data, headers=settings.REALTIME_HEADERS)
if r.status_code == 200: if r.status_code == 200:
return "" return ""
else: else:

View File

@@ -12,24 +12,17 @@ HEADERS = {
logger = logging.getLogger('spa') logger = logging.getLogger('spa')
def post_notification(user, message): def post_notification(session_id, message):
pass payload = {
try: 'sessionid': session_id,
r = redis.StrictRedis(host='localhost', port=6379, db=0) 'message': message
r.publish('realtime', user.username + ': ' + message) }
except:
logger.exception("Error posting redis notification")
def _post_notification(notification_url, session=None):
payload = {'message': notification_url}
if session:
payload['session_id'] = session
data = json.dumps(payload) data = json.dumps(payload)
r = requests.post(localsettings.REALTIME_HOST + '/api/notification', r = requests.post(
data=data, headers=HEADERS) localsettings.REALTIME_HOST + 'notification',
data=data,
headers=HEADERS
)
if r.status_code == 200: if r.status_code == 200:
return "" return ""
else: else:

View File

@@ -83,7 +83,7 @@ AUTHENTICATION_BACKENDS = global_settings.AUTHENTICATION_BACKENDS + (
MIDDLEWARE_CLASSES = ( MIDDLEWARE_CLASSES = (
'django.middleware.gzip.GZipMiddleware', 'django.middleware.gzip.GZipMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'user_sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
@@ -106,7 +106,7 @@ INSTALLED_APPS = (
'django.contrib.admin', 'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
'django.contrib.contenttypes', 'django.contrib.contenttypes',
'django.contrib.sessions', 'user_sessions',
'django.contrib.sites', 'django.contrib.sites',
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
@@ -175,6 +175,8 @@ TASTYPIE_ALLOW_MISSING_SLASH = True
SENDFILE_ROOT = os.path.join(MEDIA_ROOT, 'mixes') SENDFILE_ROOT = os.path.join(MEDIA_ROOT, 'mixes')
SENDFILE_URL = '/media/mixes' SENDFILE_URL = '/media/mixes'
SESSION_ENGINE = 'user_sessions.backends.db'
mimetypes.add_type("text/xml", ".plist", False) mimetypes.add_type("text/xml", ".plist", False)
HTML_MINIFY = not DEBUG HTML_MINIFY = not DEBUG
@@ -183,6 +185,7 @@ HTML_MINIFY = not DEBUG
DEFAULT_FROM_EMAIL = 'DSS ChatBot <chatbot@deepsouthsounds.com>' DEFAULT_FROM_EMAIL = 'DSS ChatBot <chatbot@deepsouthsounds.com>'
DEFAULT_HTTP_PROTOCOL = 'http' DEFAULT_HTTP_PROTOCOL = 'http'
EMAIL_BACKEND = 'djrill.mail.backends.djrill.DjrillBackend' EMAIL_BACKEND = 'djrill.mail.backends.djrill.DjrillBackend'
if DEBUG: if DEBUG:
@@ -199,7 +202,6 @@ REALTIME_HEADERS = {
'content-type': 'application/json' 'content-type': 'application/json'
} }
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
if 'test' in sys.argv: if 'test' in sys.argv:
try: try:
from test_settings import * from test_settings import *

View File

@@ -14,6 +14,7 @@ urlpatterns = patterns(
'', '',
url(r'^favicon\.ico$', RedirectView.as_view(url='/static/img/favicon.ico')), url(r'^favicon\.ico$', RedirectView.as_view(url='/static/img/favicon.ico')),
url(r'^admin/', include(admin.site.urls)), url(r'^admin/', include(admin.site.urls)),
url(r'', include('user_sessions.urls', 'user_sessions')),
(r'^channel\.html$', TemplateView.as_view(template_name='boiler/fb_channel.html')), (r'^channel\.html$', TemplateView.as_view(template_name='boiler/fb_channel.html')),
(r'^privacy\.html$', TemplateView.as_view(template_name='boiler/privacy.html')), (r'^privacy\.html$', TemplateView.as_view(template_name='boiler/privacy.html')),
(r'^robots\.txt', TemplateView.as_view(template_name='boiler/robots.txt')), (r'^robots\.txt', TemplateView.as_view(template_name='boiler/robots.txt')),

View File

@@ -57,4 +57,5 @@ slimit
djrill djrill
python-shout python-shout
django-dirtyfields django-dirtyfields
django-storages django-storages
django-user-sessions

View File

@@ -1,5 +1,4 @@
from unittest import TestCase from unittest import TestCase
from django.contrib.auth.models import User
from django.core.management.base import NoArgsCommand from django.core.management.base import NoArgsCommand
from django.utils import unittest from django.utils import unittest
from core.realtime.activity import post_activity from core.realtime.activity import post_activity
@@ -23,10 +22,18 @@ class TestRealtime(TestCase):
def test_post_activity(self): def test_post_activity(self):
try: try:
mix = Mix.objects.order_by('?')[0] mix = Mix.objects.order_by('?')[0]
user = User.objects.get(pk=1) user = UserProfile.objects.get(slug='fergalmoran')
activity = ActivityDownload(user=user.get_profile(), mix=mix) activity = ActivityDownload(user=user, mix=mix)
activity.save() activity.save()
result = post_activity(activity.get_activity_url())
"""
Try to find an active session for this user
If it exists, post to the realtime controller
"""
sessions = user.user.session_set.all()
for session in sessions:
result = post_activity(session.session_key, activity.get_activity_url())
self.assertTrue(result == "", msg=result) self.assertTrue(result == "", msg=result)
except Exception, ex: except Exception, ex:

View File

@@ -19,7 +19,9 @@ class NotificationThread(threading.Thread):
#Check if target of notification has an active session #Check if target of notification has an active session
session = self._instance.last_known_session session = self._instance.last_known_session
if session: if session:
post_notification(notification_url=self._instance.get_notification_url(), session=session) post_notification(
session.session_key,
self._instance.notification_html)
class Notification(BaseModel): class Notification(BaseModel):
@@ -43,7 +45,13 @@ class Notification(BaseModel):
update_fields=None): update_fields=None):
self.send_notification_email() self.send_notification_email()
post_notification(self.to_user, self.notification_text)
sessions = self.to_user.user.session_set.all()
for session in sessions:
post_notification(
session.session_key,
self.notification_html)
return super(Notification, self).save(force_insert, force_update, using, update_fields) return super(Notification, self).save(force_insert, force_update, using, update_fields)
def send_notification_email(self): def send_notification_email(self):

View File

@@ -7,6 +7,7 @@ from django.template import loader, Context
from django.template.context import RequestContext from django.template.context import RequestContext
import sys import sys
from core.utils.string import lreplace, rreplace from core.utils.string import lreplace, rreplace
from dss import settings
from spa.social.views import social_redirect from spa.social.views import social_redirect
@@ -25,6 +26,7 @@ def app(request):
context = { context = {
'is_bot': request.user_agent.is_bot, 'is_bot': request.user_agent.is_bot,
'socket_io': settings.SOCKET_IO_JS_URL,
'bust': uuid.uuid1() 'bust': uuid.uuid1()
} }

View File

@@ -17,11 +17,14 @@
@audioController = new App.Lib.AudioController() @audioController = new App.Lib.AudioController()
App.Router = new App.Lib.Router() App.Router = new App.Lib.Router()
App.addInitializer ->
App.realtimeController = new App.Lib.RealtimeController();
App.realtimeController.startSocketIO();
App.addInitializer -> App.addInitializer ->
@headerRegion.show(new App.HeaderApp.Views.Header()) @headerRegion.show(new App.HeaderApp.Views.Header())
@sidebarLeftRegion.show(new App.SidebarApp.Views.SidebarLeftNav()) @sidebarLeftRegion.show(new App.SidebarApp.Views.SidebarLeftNav())
App.addInitializer -> App.addInitializer ->
$(document).on("click", "a[href]:not([data-bypass])", (evt) -> $(document).on("click", "a[href]:not([data-bypass])", (evt) ->
href = { prop: $(this).prop("href"), attr: $(this).attr("href") } href = { prop: $(this).prop("href"), attr: $(this).attr("href") }

View File

@@ -0,0 +1,38 @@
@Dss.module "Lib", (Lib, App, Backbone, Marionette, $ ) ->
class Lib.RealtimeController
startSocketIO: ->
console.log("RealtimeController: SocketIO starting on " + com.podnoms.settings.REALTIME_HOST)
if (io?)
@socket = io.connect(com.podnoms.settings.REALTIME_HOST);
@socket.on "connect", ->
console.log("RealtimeController: Socket connected")
@socket.on "message", (message) ->
alert(message)
@socket.on "server-session", (session) =>
if session
console.log("RealtimeController: Connected " + sessionId)
sessionId = session['sessionId']
@registerSessionWithServer sessionId
else
console.log("RealtimeController: Can't read sessionId from socket")
@socket.on "activity", (data) =>
console.log("RealtimeController: activity " + data['message'])
utils.showMessage("New activity", data['message'])
vent.trigger("model:activity:new", data['message'])
@socket.on "notification", (data) =>
console.log("RealtimeController: notification " + data['message'])
vent.trigger("model:notification:new", data['message'])
else
console.log("Realtime server unavailable")
registerSessionWithServer: (sessionId) ->
console.log("Registering session: " + sessionId)
sendMessage: (message) ->
console.log("RealtimeController: sendMessage")
console.log(message)

View File

@@ -49,6 +49,7 @@
</div> </div>
<div id="footer"></div> <div id="footer"></div>
<script src="{{ socket_io }}"></script>
<script src="/js/settings/"></script> <script src="/js/settings/"></script>
<script type="text/javascript"> <script type="text/javascript">