diff --git a/core/realtime/activity.py b/core/realtime/activity.py index dd3fabb..9ad8562 100644 --- a/core/realtime/activity.py +++ b/core/realtime/activity.py @@ -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: diff --git a/core/realtime/notification.py b/core/realtime/notification.py index 49c6d51..709bb18 100644 --- a/core/realtime/notification.py +++ b/core/realtime/notification.py @@ -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: diff --git a/dss/settings.py b/dss/settings.py index c0c95e9..42b414d 100755 --- a/dss/settings.py +++ b/dss/settings.py @@ -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 ' 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 * diff --git a/dss/urls.py b/dss/urls.py index d8e2fec..2eac684 100755 --- a/dss/urls.py +++ b/dss/urls.py @@ -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')), diff --git a/requirements.txt b/requirements.txt index 46b03e8..159bf09 100755 --- a/requirements.txt +++ b/requirements.txt @@ -57,4 +57,5 @@ slimit djrill python-shout django-dirtyfields -django-storages \ No newline at end of file +django-storages +django-user-sessions \ No newline at end of file diff --git a/spa/management/commands/tests.py b/spa/management/commands/tests.py index 2e3e1b4..dc679f0 100644 --- a/spa/management/commands/tests.py +++ b/spa/management/commands/tests.py @@ -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: diff --git a/spa/models/notification.py b/spa/models/notification.py index 046059c..70eb289 100644 --- a/spa/models/notification.py +++ b/spa/models/notification.py @@ -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): diff --git a/spa/views.py b/spa/views.py index e635e43..8f1bf92 100755 --- a/spa/views.py +++ b/spa/views.py @@ -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() } diff --git a/static/js/dss/app.coffee b/static/js/dss/app.coffee index c72fcda..2131b02 100644 --- a/static/js/dss/app.coffee +++ b/static/js/dss/app.coffee @@ -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") } diff --git a/static/js/dss/lib/realtimeController.coffee b/static/js/dss/lib/realtimeController.coffee new file mode 100644 index 0000000..36a5592 --- /dev/null +++ b/static/js/dss/lib/realtimeController.coffee @@ -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) diff --git a/templates/base.html b/templates/base.html index 0896b45..90aea3d 100755 --- a/templates/base.html +++ b/templates/base.html @@ -49,6 +49,7 @@ +