Realtime messaging enabled

This commit is contained in:
Fergal Moran
2015-08-16 22:31:51 +01:00
parent b1c1662054
commit 1486bbd1f6
11 changed files with 405 additions and 54 deletions

View File

@@ -2,7 +2,6 @@ from calendar import timegm
import datetime import datetime
import logging import logging
from rest_framework import permissions from rest_framework import permissions
from rest_framework.authtoken.serializers import AuthTokenSerializer
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import renderers from rest_framework import renderers
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
@@ -14,9 +13,10 @@ from rest_framework_jwt.utils import jwt_payload_handler, jwt_encode_handler
from rest_framework import parsers from rest_framework import parsers
from social.apps.django_app.utils import psa from social.apps.django_app.utils import psa
from dss import settings
logger = logging.getLogger('spa') logger = logging.getLogger('spa')
@psa() @psa()
def auth_by_token(request, backend): def auth_by_token(request, backend):
user = request.backend.do_auth( user = request.backend.do_auth(

View File

@@ -5,7 +5,7 @@ from core.utils.html import strip_tags
from dss import settings from dss import settings
from spa import models from spa import models
from spa.models import Activity from spa.models import Activity, Message
from spa.models.activity import ActivityDownload, ActivityPlay from spa.models.activity import ActivityDownload, ActivityPlay
from spa.models.genre import Genre from spa.models.genre import Genre
from spa.models.notification import Notification from spa.models.notification import Notification
@@ -474,3 +474,19 @@ class NotificationSerializer(serializers.HyperlinkedModelSerializer):
def get_avatar_image(self, obj): def get_avatar_image(self, obj):
return settings.DEFAULT_USER_IMAGE if obj.from_user is None else obj.from_user.get_sized_avatar_image(170, 170) return settings.DEFAULT_USER_IMAGE if obj.from_user is None else obj.from_user.get_sized_avatar_image(170, 170)
class MessageSerializer(serializers.ModelSerializer):
from_user = InlineUserProfileSerializer(read_only=True)
to_user = InlineUserProfileSerializer(read_only=True)
class Meta:
model = Message
fields = (
'id',
'from_user',
'to_user',
'sent_at',
'read_at',
'body',
)

View File

@@ -21,12 +21,18 @@ router.register(r'hitlist', views.HitlistViewSet)
router.register(r'comments', views.CommentViewSet) router.register(r'comments', views.CommentViewSet)
router.register(r'activity', views.ActivityViewSet, base_name='activity') router.register(r'activity', views.ActivityViewSet, base_name='activity')
router.register(r'genre', views.GenreViewSet, base_name='genre') router.register(r'genre', views.GenreViewSet, base_name='genre')
router.register(r'messages', views.MessageViewSet, base_name='messages')
class DebugView(APIView): class DebugView(APIView):
permission_classes = (IsAuthenticated, ) permission_classes = (IsAuthenticated, )
authentication_classes = (JSONWebTokenAuthentication, ) authentication_classes = (JSONWebTokenAuthentication, )
def get(self, request):
print self.request.session
return Response({'status': 'ok', 'session': self.request.session.session_key},
status=status.HTTP_200_OK)
def post(self, request, format=None): def post(self, request, format=None):
try: try:
activity.post_activity('user:message', request.user.userprofile.get_session_id(), 'Hello Sailor') activity.post_activity('user:message', request.user.userprofile.get_session_id(), 'Hello Sailor')

View File

@@ -1,7 +1,7 @@
import logging import logging
import os import os
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist from django.core.exceptions import PermissionDenied, ObjectDoesNotExist, SuspiciousOperation
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.core.files.storage import FileSystemStorage from django.core.files.storage import FileSystemStorage
from django.db.models import Count from django.db.models import Count
@@ -19,6 +19,7 @@ from rest_framework.status import HTTP_202_ACCEPTED, HTTP_401_UNAUTHORIZED, HTTP
from api import serializers from api import serializers
from dss import settings from dss import settings
from spa import tasks from spa import tasks
from spa.models import Message
from spa.models.genre import Genre from spa.models.genre import Genre
from spa.models.activity import ActivityPlay from spa.models.activity import ActivityPlay
from spa.models.mix import Mix from spa.models.mix import Mix
@@ -277,3 +278,33 @@ class GenreViewSet(viewsets.ModelViewSet):
.only('description') \ .only('description') \
.order_by('-used') .order_by('-used')
return rows return rows
class MessageViewSet(viewsets.ModelViewSet):
queryset = Message.objects.all()
serializer_class = serializers.MessageSerializer
permission_classes = (IsAuthenticated,)
def get_queryset(self):
if 'to_user' in self.request.query_params and 'type' in self.request.query_params:
t = UserProfile.objects.get(slug=self.request.query_params['to_user'])
try:
if self.request.query_params['type'] == 'chat':
return Message.objects.get_chat(user1=t, user2=self.request.user.userprofile)
except UserProfile.DoesNotExist:
pass
raise SuspiciousOperation("Must specify a to user")
def __perform_write(self, serializer):
t = None
if 'to_user' in self.request.data:
t = UserProfile.objects.get(slug=self.request.data['to_user'])
serializer.save(from_user=self.request.user.userprofile, to_user=t)
def perform_create(self, serializer):
self.__perform_write(serializer)
def perform_update(self, serializer):
self.__perform_write(serializer)

View File

@@ -1,33 +0,0 @@
import requests
import logging
from requests.packages.urllib3.exceptions import ConnectionError
from dss import localsettings
import json
# classes to avoid duplicating constants below
HEADERS = {
'content-type': 'application/json'
}
logger = logging.getLogger('spa')
def post_notification(session_id, image, message):
try:
payload = {
'sessionid': session_id,
'image': image,
'message': message
}
data = json.dumps(payload)
r = requests.post(
localsettings.REALTIME_HOST + 'notification',
data=data,
headers=HEADERS
)
if r.status_code == 200:
return ""
else:
return r.text
except ConnectionError:
#should probably implement some sort of retry in here
pass

View File

@@ -149,7 +149,7 @@ 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' #SESSION_ENGINE = 'django.contrib.sessions.models.Session'
mimetypes.add_type("text/xml", ".plist", False) mimetypes.add_type("text/xml", ".plist", False)

View File

@@ -0,0 +1,293 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'Message'
db.create_table(u'spa_message', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('object_created', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2015, 8, 13, 0, 0), auto_now_add=True, blank=True)),
('object_updated', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2015, 8, 13, 0, 0), auto_now=True, db_index=True, blank=True)),
('from_user', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='sent_messages', null=True, to=orm['spa.UserProfile'])),
('to_user', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='messages', null=True, to=orm['spa.UserProfile'])),
('sent_at', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, null=True, blank=True)),
('read_at', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
('body', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('spa', ['Message'])
def backwards(self, orm):
# Deleting model 'Message'
db.delete_table(u'spa_message')
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'spa._lookup': {
'Meta': {'object_name': '_Lookup'},
'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'})
},
'spa.activity': {
'Meta': {'object_name': 'Activity'},
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']", 'null': 'True', 'blank': 'True'})
},
'spa.activitycomment': {
'Meta': {'object_name': 'ActivityComment', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_comments'", 'to': "orm['spa.Mix']"})
},
'spa.activitydownload': {
'Meta': {'object_name': 'ActivityDownload', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_downloads'", 'to': "orm['spa.Mix']"})
},
'spa.activityfavourite': {
'Meta': {'object_name': 'ActivityFavourite', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_favourites'", 'to': "orm['spa.Mix']"})
},
'spa.activityfollow': {
'Meta': {'object_name': 'ActivityFollow', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_follow'", 'to': "orm['spa.UserProfile']"})
},
'spa.activitylike': {
'Meta': {'object_name': 'ActivityLike', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_likes'", 'to': "orm['spa.Mix']"})
},
'spa.activityplay': {
'Meta': {'object_name': 'ActivityPlay', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_plays'", 'to': "orm['spa.Mix']"})
},
'spa.chatmessage': {
'Meta': {'object_name': 'ChatMessage'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'message': ('django.db.models.fields.TextField', [], {}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'chat_messages'", 'null': 'True', 'to': "orm['spa.UserProfile']"})
},
'spa.comment': {
'Meta': {'object_name': 'Comment'},
'comment': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'likes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'liked_comments'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comments'", 'null': 'True', 'to': "orm['spa.Mix']"}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'time_index': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
'spa.genre': {
'Meta': {'object_name': 'Genre'},
'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
},
'spa.label': {
'Meta': {'object_name': 'Label'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'})
},
'spa.message': {
'Meta': {'object_name': 'Message'},
'body': ('django.db.models.fields.TextField', [], {}),
'from_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'sent_messages'", 'null': 'True', 'to': "orm['spa.UserProfile']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'read_at': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'sent_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
'to_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'messages'", 'null': 'True', 'to': "orm['spa.UserProfile']"})
},
'spa.mix': {
'Meta': {'ordering': "('-id',)", 'object_name': 'Mix'},
'archive_path': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True', 'blank': 'True'}),
'archive_updated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'description': ('django.db.models.fields.TextField', [], {}),
'download_allowed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'favourites': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'favourites'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
'filetype': ('django.db.models.fields.CharField', [], {'default': "'mp3'", 'max_length': '10'}),
'genres': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['spa.Genre']", 'symmetrical': 'False'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_featured': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'likes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'likes'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}),
'mp3tags_updated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
'uid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '38', 'blank': 'True'}),
'upload_date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mixes'", 'to': "orm['spa.UserProfile']"}),
'waveform_generated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'waveform_version': ('django.db.models.fields.IntegerField', [], {'default': '1'})
},
'spa.notification': {
'Meta': {'ordering': "('-id',)", 'object_name': 'Notification'},
'accepted_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'from_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'notifications'", 'null': 'True', 'to': "orm['spa.UserProfile']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'target': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
'target_desc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
'verb': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'})
},
'spa.playlist': {
'Meta': {'object_name': 'Playlist'},
'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mixes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['spa.Mix']", 'symmetrical': 'False'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'playlists'", 'to': "orm['spa.UserProfile']"})
},
'spa.purchaselink': {
'Meta': {'object_name': 'PurchaseLink'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'track': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'purchase_link'", 'to': "orm['spa.Tracklist']"}),
'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
},
'spa.recurrence': {
'Meta': {'object_name': 'Recurrence', '_ormbases': ['spa._Lookup']},
u'_lookup_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa._Lookup']", 'unique': 'True', 'primary_key': 'True'})
},
'spa.release': {
'Meta': {'object_name': 'Release'},
'embed_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'release_artist': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'release_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)'}),
'release_description': ('django.db.models.fields.TextField', [], {}),
'release_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'release_label': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Label']"}),
'release_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']"})
},
'spa.releaseaudio': {
'Meta': {'object_name': 'ReleaseAudio'},
'description': ('django.db.models.fields.TextField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'release_audio'", 'null': 'True', 'to': "orm['spa.Release']"})
},
'spa.tracklist': {
'Meta': {'object_name': 'Tracklist'},
'artist': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'index': ('django.db.models.fields.SmallIntegerField', [], {}),
'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tracklist'", 'to': "orm['spa.Mix']"}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'remixer': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'timeindex': ('django.db.models.fields.TimeField', [], {'null': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
},
'spa.userprofile': {
'Meta': {'object_name': 'UserProfile'},
'activity_sharing_facebook': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}),
'activity_sharing_networks': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'activity_sharing_twitter': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}),
'avatar_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}),
'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}),
'city': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'country': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}),
'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}),
'email_notifications': ('django.db.models.fields.BigIntegerField', [], {'default': '0'}),
'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_known_session': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'default': 'None', 'max_length': '50', 'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'userprofile'", 'unique': 'True', 'to': u"orm['auth.User']"})
},
'spa.venue': {
'Meta': {'object_name': 'Venue'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now_add': 'True', 'blank': 'True'}),
'object_updated': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2015, 8, 13, 0, 0)', 'auto_now': 'True', 'db_index': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
'venue_address': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'venue_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'venue_name': ('django.db.models.fields.CharField', [], {'max_length': '250'})
}
}
complete_apps = ['spa']

View File

@@ -15,3 +15,4 @@ from tracklist import Tracklist
from purchaselink import PurchaseLink from purchaselink import PurchaseLink
from release import Release from release import Release
from playlist import Playlist from playlist import Playlist
from message import Message

View File

@@ -1,12 +1,49 @@
from datetime import datetime
from django.db import models from django.db import models
from spa.models import BaseModel from django.db.models import Q
from spa.models import BaseModel, Notification
class MessageManager(models.Manager):
def inbox_for(self, from_user, to_user):
return self.filter(
from_user=from_user,
to_user=to_user
)
def get_chat(self, user1, user2):
return self.filter(
Q(from_user=user1, to_user=user2) |
Q(from_user=user2, to_user=user1)
)
class Message(BaseModel): class Message(BaseModel):
from_user = models.ForeignKey('spa.UserProfile', related_name='notifications', null=True, blank=True) objects = MessageManager()
to_user = models.ForeignKey('spa.UserProfile', related_name='notifications', null=True, blank=True)
from_user = models.ForeignKey('spa.UserProfile', null=True, blank=True, related_name='sent_messages')
to_user = models.ForeignKey('spa.UserProfile', null=True, blank=True, related_name='messages')
sent_at = models.DateTimeField(null=True, blank=True, auto_now=True) sent_at = models.DateTimeField(null=True, blank=True, auto_now=True)
read_at = models.DateTimeField(null=True, blank=True) read_at = models.DateTimeField(null=True, blank=True)
body = models.TextField() body = models.TextField()
def create_notification(self, accept=False):
try:
notification = Notification()
notification.from_user = self.from_user
notification.to_user = self.to_user
notification.verb = "Sent"
notification.type = "Message"
notification.target = self.id
notification.target_desc = self.body
notification.date = self.sent_at
if accept:
notification.accepted_date = datetime.now()
notification.save()
except Exception, ex:
print "Error creating message notification: %s" % ex.message

View File

@@ -2,8 +2,8 @@ from django.conf import settings
import mandrill import mandrill
from django.db import models from django.db import models
from django.template import loader, Context from django.template import loader, Context
from core.realtime.activity import post_activity
from core.realtime.notification import post_notification
from dss import localsettings from dss import localsettings
from spa.models import BaseModel, UserProfile from spa.models import BaseModel, UserProfile
@@ -27,21 +27,21 @@ class Notification(BaseModel):
def get_notification_url(self): def get_notification_url(self):
return '/api/v1/notification/%s' % self.id return '/api/v1/notification/%s' % self.id
def __save(self, force_insert=False, force_update=False, using=None, update_fields=None): def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
"""
if self._activity.should_send_email(): if self._activity.should_send_email():
self.send_notification_email() self.send_notification_email()
"""
sessions = self.to_user.user.session_set.all() post_activity(
avatar_image = UserProfile.get_default_avatar_image() 'user:message',
if self.from_user is not None: self.to_user.get_session_id(),
avatar_image = self.from_user.get_avatar_image() {
'from_user': self.from_user.slug,
for session in sessions: 'message': self.target_desc
post_notification( })
session.session_key,
avatar_image,
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)

View File

@@ -59,4 +59,4 @@ def update_geo_info_task(ip_address, profile_id):
@task @task
def notify_subscriber(session_id, uid): def notify_subscriber(session_id, uid):
if session_id is not None: if session_id is not None:
activity.post_activity('user:message', session_id, {'type': 'waveform', 'target': uid}) activity.post_activity('user:process', session_id, {'type': 'waveform', 'target': uid})