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
def post_activity(activity_url):
payload = {'message': activity_url}
def post_activity(session_id, activity_url):
payload = {
'sessionid': session_id,
'message': activity_url
}
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:
return ""
else:

View File

@@ -12,24 +12,17 @@ HEADERS = {
logger = logging.getLogger('spa')
def post_notification(user, message):
pass
try:
r = redis.StrictRedis(host='localhost', port=6379, db=0)
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
def post_notification(session_id, message):
payload = {
'sessionid': session_id,
'message': message
}
data = json.dumps(payload)
r = requests.post(localsettings.REALTIME_HOST + '/api/notification',
data=data, headers=HEADERS)
r = requests.post(
localsettings.REALTIME_HOST + 'notification',
data=data,
headers=HEADERS
)
if r.status_code == 200:
return ""
else:

View File

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

View File

@@ -58,3 +58,4 @@ djrill
python-shout
django-dirtyfields
django-storages
django-user-sessions

View File

@@ -1,5 +1,4 @@
from unittest import TestCase
from django.contrib.auth.models import User
from django.core.management.base import NoArgsCommand
from django.utils import unittest
from core.realtime.activity import post_activity
@@ -23,10 +22,18 @@ class TestRealtime(TestCase):
def test_post_activity(self):
try:
mix = Mix.objects.order_by('?')[0]
user = User.objects.get(pk=1)
activity = ActivityDownload(user=user.get_profile(), mix=mix)
user = UserProfile.objects.get(slug='fergalmoran')
activity = ActivityDownload(user=user, mix=mix)
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)
except Exception, ex:

View File

@@ -19,7 +19,9 @@ class NotificationThread(threading.Thread):
#Check if target of notification has an active session
session = self._instance.last_known_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):
@@ -43,7 +45,13 @@ class Notification(BaseModel):
update_fields=None):
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)
def send_notification_email(self):

View File

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

View File

@@ -17,11 +17,14 @@
@audioController = new App.Lib.AudioController()
App.Router = new App.Lib.Router()
App.addInitializer ->
App.realtimeController = new App.Lib.RealtimeController();
App.realtimeController.startSocketIO();
App.addInitializer ->
@headerRegion.show(new App.HeaderApp.Views.Header())
@sidebarLeftRegion.show(new App.SidebarApp.Views.SidebarLeftNav())
App.addInitializer ->
$(document).on("click", "a[href]:not([data-bypass])", (evt) ->
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 id="footer"></div>
<script src="{{ socket_io }}"></script>
<script src="/js/settings/"></script>
<script type="text/javascript">