From e5fc34ed4735d002a7acecf154e40ec7f86c3859 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Thu, 15 Oct 2015 20:03:32 +0100 Subject: [PATCH] Pre switch --- api/helpers.py | 93 +++++++++++++++++++++++++++++++++++++ api/urls.py | 9 ++-- core/radio/ice_scrobbler.py | 14 ++++-- core/realtime/activity.py | 4 +- spa/models/notification.py | 16 ++----- spa/tasks.py | 5 +- 6 files changed, 120 insertions(+), 21 deletions(-) diff --git a/api/helpers.py b/api/helpers.py index e69de29..07d4da2 100644 --- a/api/helpers.py +++ b/api/helpers.py @@ -0,0 +1,93 @@ +import datetime +from rest_framework.response import Response +from rest_framework.status import HTTP_400_BAD_REQUEST, HTTP_201_CREATED, HTTP_204_NO_CONTENT, HTTP_200_OK +from rest_framework.views import APIView +from core import realtime +from core.radio import ice_scrobbler +from core.realtime import activity +from dss import settings +from spa.models import Mix, UserProfile +from core.utils import session + + +class Helper(APIView): + pass + + +class ActivityHelper(APIView): + def get_session(self, request): + sessions = session.get_active_sessions(request.session) + + return sessions[0] + + +class ChatHelper(ActivityHelper): + def post(self, request): + # do some persistence stuff with the chat + from core.realtime import chat + + # user = self.get_session(request) + u = request.user + if not u.is_anonymous(): + image = u.userprofile.get_sized_avatar_image(32, 32) + user = u.userprofile.get_nice_name() + else: + image = settings.DEFAULT_USER_IMAGE + user = settings.DEFAULT_USER_NAME + + chat.post_chat(request.data['user'], image, user, request.data['message']) + return Response(request.data['message'], HTTP_201_CREATED) + + +class ActivityPlayHelper(ActivityHelper): + def post(self, request): + if 'id' in self.request.query_params: + try: + mix = Mix.objects.get(slug=self.request.query_params.get('id')) + mix.add_play(request.user) + data = { + 'user': request.user.userprofile.get_nice_name() if request.user.is_authenticated() else settings.DEFAULT_USER_NAME, + 'date': datetime.datetime.now() + } + return Response(data, HTTP_201_CREATED) + except Mix.DoesNotExist: + pass + + return Response("Invalid URI or object does not exist", HTTP_400_BAD_REQUEST) + + +class UserSlugCheckHelper(Helper): + def get(self, request): + try: + UserProfile.objects.get(slug=self.request.query_params.get('slug')) + return Response(status=HTTP_204_NO_CONTENT) + except UserProfile.DoesNotExist: + return Response(status=HTTP_200_OK) + + +class RadioHelper(Helper): + def get(self, request): + if 'rmix' in self.request.query_params: + m = Mix.objects.order_by('?').first() + ret = { + 'url': m.get_stream_url(), + 'slug': m.get_full_url(), + 'title': str(m) + } + elif 'np' in self.request.query_params: + ret = ice_scrobbler.get_server_details() + + return Response(data=ret, status=HTTP_200_OK) + + def post(self, request): + if 'action' in request.query_params: + action = request.query_params.get('action') + if action == 'shuffle': + ice_scrobbler.shuffle() + return Response(status=HTTP_200_OK) + if 'update' in request.query_params and 'url' in request.query_params: + activity.post_activity('site:radio_changed', message={ + 'description': request.query_params.get('update'), + 'url': request.query_params.get('url') + }) + return Response(status=HTTP_400_BAD_REQUEST) diff --git a/api/urls.py b/api/urls.py index 2541d15..2bee4ff 100755 --- a/api/urls.py +++ b/api/urls.py @@ -26,8 +26,8 @@ router.register(r'shows', views.ShowViewSet, base_name='shows') class DebugView(APIView): - permission_classes = (IsAuthenticated, ) - authentication_classes = (JSONWebTokenAuthentication, ) + permission_classes = (IsAuthenticated,) + authentication_classes = (JSONWebTokenAuthentication,) def get(self, request): print(self.request.session) @@ -36,7 +36,10 @@ class DebugView(APIView): def post(self, request, format=None): try: - activity.post_activity('user:message', request.user.userprofile.get_session_id(), 'Hello Sailor') + activity.post_activity( + channel='user:message', + message='Hello Sailor', + session=request.user.userprofile.get_session_id()) except Exception as ex: print(ex) diff --git a/core/radio/ice_scrobbler.py b/core/radio/ice_scrobbler.py index 1d3185f..61bf26b 100644 --- a/core/radio/ice_scrobbler.py +++ b/core/radio/ice_scrobbler.py @@ -1,13 +1,14 @@ import requests from bs4 import BeautifulSoup from requests.packages.urllib3.connection import ConnectionError +from dss import settings -def get_server_details(server, port, mount): - server = "http://%s:%s/status.xsl?mount=/%s" % (server, port, mount) - print("Getting info for %s" % server) +def get_server_details(): + url = "http://%s:%s/status.xsl?mount=/%s" % (settings.ICE_HOST, settings.ICE_PORT, settings.ICE_MOUNT) + print("Getting info for %s" % url) try: - response = requests.get(server) + response = requests.get(url) html = response.text if html: try: @@ -40,6 +41,11 @@ def get_server_details(server, port, mount): } +def shuffle(): + url = "http://%s:%s/a/shuffle" % (settings.RADIO_HOST, settings.RADIO_PORT) + r = requests.post(url) + + if __name__ == '__main__': d = get_server_details("localhost", "8000", "dss") print(d) diff --git a/core/realtime/activity.py b/core/realtime/activity.py index 2d3de4a..d202b62 100755 --- a/core/realtime/activity.py +++ b/core/realtime/activity.py @@ -6,12 +6,12 @@ from dss import settings logger = logging.getLogger('dss') -def post_activity(channel, session, message): +def post_activity(channel, message, session=''): r = redis.StrictRedis(host=settings.REDIS_HOST, port=6379, db=0) payload = json.dumps({'session': session, 'message': message}) response = r.publish(channel, payload) logger.debug("Message sent: {0}".format(payload)) if __name__ == '__main__': - post_activity('site:broadcast', '3a596ca6c97065a67aca3dc4a3ba230d688cf413', 'bargle') + post_activity('site:broadcast', 'bargle', '3a596ca6c97065a67aca3dc4a3ba230d688cf413') diff --git a/spa/models/notification.py b/spa/models/notification.py index e782a30..7ea116f 100755 --- a/spa/models/notification.py +++ b/spa/models/notification.py @@ -29,20 +29,14 @@ class Notification(BaseModel): def save(self, force_insert=False, force_update=False, using=None, update_fields=None): - - """ - if self._activity.should_send_email(): - self.send_notification_email() - """ - post_activity( - 'user:message', - self.to_user.get_session_id(), - { + channel='user:message', + message={ 'from_user': self.from_user.slug if self.from_user is not None else settings.DEFAULT_USER_NAME, 'message': self.target_desc - }) - + }, + session=self.to_user.get_session_id(), + ) return super(Notification, self).save(force_insert, force_update, using, update_fields) def send_notification_email(self): diff --git a/spa/tasks.py b/spa/tasks.py index f23ef2d..969e0f1 100755 --- a/spa/tasks.py +++ b/spa/tasks.py @@ -60,4 +60,7 @@ def update_geo_info_task(ip_address, profile_id): @task def notify_subscriber(session_id, uid): if session_id is not None: - activity.post_activity('user:process', session_id, {'type': 'waveform', 'target': uid}) + activity.post_activity( + channel='user:process', + message={'type': 'waveform', 'target': uid}, + session=session_id)