diff options
| -rw-r--r-- | backend/fixtures/initial_data.json | 26 | ||||
| -rw-r--r-- | backend/models.py | 5 | ||||
| -rw-r--r-- | backend/views.py | 129 |
3 files changed, 151 insertions, 9 deletions
diff --git a/backend/fixtures/initial_data.json b/backend/fixtures/initial_data.json index 78b9616..14ee1d6 100644 --- a/backend/fixtures/initial_data.json +++ b/backend/fixtures/initial_data.json @@ -113,6 +113,7 @@ "fields": { "bio": "", "settings_text": "{}", + "settings_update": "2012-08-16T06:14:49Z", "access": 0, "score": 1, "user": 2, @@ -127,6 +128,7 @@ "fields": { "bio": "", "settings_text": "{}", + "settings_update": "2012-08-16T06:14:49Z", "access": 0, "score": 2, "user": 3, @@ -141,6 +143,7 @@ "fields": { "bio": "", "settings_text": "{}", + "settings_update": "2012-08-16T06:14:49Z", "access": 0, "score": 3, "user": 4, @@ -155,6 +158,7 @@ "fields": { "bio": "", "settings_text": "{}", + "settings_update": "2012-08-16T06:14:49Z", "access": 0, "score": 4, "user": 5, @@ -169,6 +173,7 @@ "fields": { "bio": "", "settings_text": "{}", + "settings_update": "2012-08-16T06:14:49Z", "access": 0, "score": 5, "user": 6, @@ -183,6 +188,7 @@ "fields": { "private": false, "settings_text": "{\"bg\": \"http://exmaple.com/background1\"}", + "settings_update": "2012-08-16T06:14:49Z", "user": 2, "name": "Room 1", "datetime": "2012-08-13T21:21:43Z" @@ -194,6 +200,7 @@ "fields": { "private": true, "settings_text": "{\"bg\": \"http://exmaple.com/background2\"}", + "settings_update": "2012-08-16T06:14:49Z", "user": 3, "name": "Room 2", "datetime": "2012-08-13T21:22:46Z" @@ -205,6 +212,7 @@ "fields": { "private": true, "settings_text": "{\"bg\": \"http://exmaple.com/background3\"}", + "settings_update": "2012-08-16T06:14:49Z", "user": 4, "name": "Room 3", "datetime": "2012-08-13T21:23:07Z" @@ -216,6 +224,7 @@ "fields": { "private": false, "settings_text": "{\"bg\": \"http://exmaple.com/background4\"}", + "settings_update": "2012-08-16T06:14:49Z", "user": 5, "name": "Room 4", "datetime": "2012-08-13T21:23:25Z" @@ -227,6 +236,7 @@ "fields": { "private": false, "settings_text": "{\"bg\": \"http://exmaple.com/background5\"}", + "settings_update": "2012-08-16T06:14:49Z", "user": 6, "name": "Room 5", "datetime": "2012-08-13T21:23:39Z" @@ -238,6 +248,7 @@ "fields": { "private": false, "settings_text": "{\"bg\": \"http://exmaple.com/background6\"}", + "settings_update": "2012-08-16T06:14:49Z", "user": 3, "name": "Room 6", "datetime": "2012-08-13T21:24:00Z" @@ -249,6 +260,7 @@ "fields": { "private": false, "settings_text": "{\"bg\": \"http://exmaple.com/background7\"}", + "settings_update": "2012-08-16T06:14:49Z", "user": 4, "name": "Room 7", "datetime": "2012-08-13T21:24:16Z" @@ -259,6 +271,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"url\":\"http://example.com/room1/user1/url1\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 1, "user": 2, "content_type": "url", @@ -270,6 +283,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"html\": \"<h1>example</h1>\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 1, "user": 2, "content_type": "html", @@ -281,6 +295,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"text\": \"example\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 1, "user": 2, "content_type": "text", @@ -292,6 +307,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"url\": \"http://example.com/image1\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 1, "user": 2, "content_type": "image", @@ -303,6 +319,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"url\": \"http://example.com/room1/user1/video1\", \"title\": \"Video 1\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 1, "user": 2, "content_type": "video", @@ -314,6 +331,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"url\": \"http://example.com/room1/user1/audio1\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 1, "user": 2, "content_type": "audio", @@ -325,6 +343,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"url\": \"http://example.com/background1\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 1, "user": 2, "content_type": "background", @@ -336,6 +355,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"url\":\"http://example.com/room2/user2/url1\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 2, "user": 3, "content_type": "url", @@ -347,6 +367,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"html\": \"<h1>example</h1>\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 2, "user": 3, "content_type": "html", @@ -358,6 +379,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"text\": \"example\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 2, "user": 3, "content_type": "text", @@ -369,6 +391,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"url\": \"http://example.com/image1\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 2, "user": 3, "content_type": "image", @@ -380,6 +403,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"url\": \"http://example.com/room2/user2/video1\", \"title\": \"Video 1\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 2, "user": 3, "content_type": "video", @@ -391,6 +415,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"url\": \"http://example.com/room2/user2/audio1\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 2, "user": 3, "content_type": "audio", @@ -402,6 +427,7 @@ "model": "backend.sjcontent", "fields": { "settings_text": "{\"url\": \"http://example.com/background1\"}", + "settings_update": "2012-08-16T06:14:49Z", "room": 2, "user": 3, "content_type": "background", diff --git a/backend/models.py b/backend/models.py index 0fc6311..9408369 100644 --- a/backend/models.py +++ b/backend/models.py @@ -4,6 +4,7 @@ from django.db import models from django.contrib import auth from django.contrib import admin +from datetime import datetime import json @@ -11,7 +12,7 @@ class SJSettingsModel(models.Model): """ ScannerJammer abstract settings model """ settings_text = models.TextField(blank=True, default='{}') - settings_update = models.DateTimeField(blank=True, null=True) + settings_update = models.DateTimeField(blank=True, default=datetime.now()) class Meta: abstract = True @@ -26,10 +27,12 @@ class SJSettingsModel(models.Model): def settings(self, settings): if isinstance(settings, dict): self.settings_text = json.dumps(settings) + self.settings_update = datetime.now() @settings.deleter def settings(self): self.settings_text = '{}' + self.settings_update = datetime.now() class SJUserProfile(SJSettingsModel): diff --git a/backend/views.py b/backend/views.py index dbbca47..afd21f0 100644 --- a/backend/views.py +++ b/backend/views.py @@ -27,6 +27,7 @@ ROOM_VIDEO_LOG_SIZE = 50 ACCESS_USER = 0 ACCESS_MODERATOR = 1 ACCESS_ADMIN = 9 +LASTSEEN_TIMEOUT= 7 # # Common funtions @@ -130,6 +131,14 @@ def texts_response_str(texts): )) return strio.getvalue() +def likes_response_str(likes): + """ Return string of likes + """ + strio = cStringIO.StringIO() + for like in likes: + strio.write('LIKE\t%s\n' % like.user.username) + return strio.getvalue() + def thraw(settings_text): settings = dict() if settings_text: @@ -151,6 +160,9 @@ def now_timestamp(): def yesterday_datetime(): return datetime.now() - timedelta(days=1) +def lastseen_datetime(): + return datetime.now() - timedelta(seconds=LASTSEEN_TIMEOUT) + # # AUTH API # @@ -402,7 +414,7 @@ def api_room_watch(request): last =int(request.POST['last']) - 1 videos = SJContent.objects.filter(room=room, content_type='video').order_by('-datetime') if videos and last <= datetime_to_timestamp(videos[0].datetime): - response.write(videos_response_str(videos)) + response.write(videos_response_str([v for v in videos if last <= datetime_to_timestamp(v.datetime)])) return response @require_POST @@ -441,7 +453,7 @@ def api_room_view(request): user_profile.lastseen_chat = datetime.now() user_profile.save() response = response_success('\t'.join([u.username for u in room.users.all()])) - videos = SJContent.objects.filter(room=room, content_type='video').order_by('-datetime') + videos = SJContent.objects.filter(room=room, content_type='video').order_by('-datetime')[0:ROOM_VIDEO_LOG_SIZE] response.write(videos_response_str(videos)) response.write(settings_response_str('ROOM', room.settings)) texts = SJContent.objects.filter(room=room, content_type='text').order_by('-datetime').distinct()[0:ROOM_CHAT_LOG_SIZE] @@ -450,7 +462,7 @@ def api_room_view(request): @require_POST def api_room_join(request): - """ Private API + """ Join user into a room. Private API """ user = request.user if not user.is_authenticated(): @@ -475,7 +487,6 @@ def api_room_join(request): user_profile.save() response = response_success('%d\t%s\t%d' % (user.id, user.username, user_profile.access)) response.write('%s\n' % '\t'.join([u.username for u in room.users.all()])) - videos = SJContent.objects.filter(room=room, content_type='video').order_by('-datetime') response.write(videos_response_str(videos)) if 'enqueue' in request.POST and request.POST['enqueue']: @@ -491,50 +502,132 @@ def api_room_join(request): def api_room_read(request): """ Private API """ - form_fields = ['room', 'enqueue'] + user = request.user + if not user.is_authenticated(): + return response_error('no logged in') + user_profile = user.get_profile() + form_fields = ['room'] response = check_form_fields(request, form_fields) if response: return response - return HttpResponse('Not implemented yet!\n') + try: + room = SJRoom.objects.get(name=request.POST['room']) + except: + return response_error('no room') + response = response_success(str(datetime_to_timestamp(datetime.now()))) + response.write('%s\n' % '\t'.join([u.username for u in room.users.all()])) + last = 0 + if 'last' in request.POST: + last =int(request.POST['last']) - 15 + if last <= datetime_to_timestamp(room.settings_update): + response.write(settings_response_str('ROOM', room.settings)) + videos = SJContent.objects.filter(room=room, content_type='video').order_by('-datetime') + if videos and last <= datetime_to_timestamp(videos[0].datetime): + response.write(videos_response_str([v for v in videos if last <= datetime_to_timestamp(v.datetime)])) + texts = SJContent.objects.filter(room=room, content_type='text').order_by('-datetime') + if texts and last <= datetime_to_timestamp(texts[0].datetime): + response.write(texts_response_str([t for t in texts if last <= datetime_to_timestamp(t.datetime)])) + return response @require_POST def api_room_poll(request): """ Private API """ - form_fields = ['room', 'last', 'cam'] + user = request.user + if not user.is_authenticated(): + return response_error('no logged in') + user_profile = user.get_profile() + form_fields = ['room'] response = check_form_fields(request, form_fields) if response: return response - return HttpResponse('Not implemented yet!\n') + try: + room = SJRoom.objects.get(name=request.POST['room']) + except: + return response_error('no room') + nowtime = datetime.now() + lastseentime = lastseen_datetime() + if user not in room.users.all(): + room.users.add(user) + room.save() + user_profile.lastseen_chat = nowtime + user_profile.save() + room.users.filter(sjuserprofile__lastseen_chat__lt=lastseentime).delete() + room.save() + if 'cam' in request.POST and request.POST['cam']: + user_profile.lastseen_webcam = nowtime + user_profile.save() + response = response_success(str(datetime_to_timestamp(nowtime))) + response.write('%s\n' % '\t'.join([u.username for u in room.users.all()])) + last = 0 + if 'last' in request.POST: + last =int(request.POST['last']) - 15 + if last <= datetime_to_timestamp(room.settings_update): + response.write(settings_response_str('ROOM', room.settings)) + videos = SJContent.objects.filter(room=room, content_type='video').order_by('-datetime') + if videos and last <= datetime_to_timestamp(videos[0].datetime): + response.write(videos_response_str([v for v in videos if last <= datetime_to_timestamp(v.datetime)])) + texts = SJContent.objects.filter(room=room, content_type='text').order_by('-datetime') + if texts and last <= datetime_to_timestamp(texts[0].datetime): + response.write(texts_response_str([t for t in texts if last <= datetime_to_timestamp(t.datetime)])) + likes = SJLike.objects.filter(content__content_type='video', content__user=user) + response.write(likes_response_str(likes)) + user_webcams = room.users.filter(sjuserprofile__lastseen_webcam__gt=lastseentime) + response.write('CAM\t%d\n' % user_webcams.count()) + return response @require_POST def api_room_settings(request): """ Private API """ + user = request.user + if not user.is_authenticated(): + return response_error('no logged in') + user_profile = user.get_profile() form_fields = ['room', 'settings'] response = check_form_fields(request, form_fields) if response: return response + try: + room = SJRoom.objects.get(name=request.POST['room']) + except: + return response_error('no room') return HttpResponse('Not implemented yet!\n') @require_POST def api_room_say(request): """ Private API """ + user = request.user + if not user.is_authenticated(): + return response_error('no logged in') + user_profile = user.get_profile() form_fields = ['room', 'msg'] response = check_form_fields(request, form_fields) if response: return response + try: + room = SJRoom.objects.get(name=request.POST['room']) + except: + return response_error('no room') return HttpResponse('Not implemented yet!\n') @require_POST def api_room_video(request): """ Private API """ + user = request.user + if not user.is_authenticated(): + return response_error('no logged in') + user_profile = user.get_profile() form_fields = ['room', 'msg'] response = check_form_fields(request, form_fields) if response: return response + try: + room = SJRoom.objects.get(name=request.POST['room']) + except: + return response_error('no room') return HttpResponse('Not implemented yet!\n') # @@ -555,6 +648,10 @@ def api_video_date(request): def api_video_view(request): """ Private API """ + user = request.user + if not user.is_authenticated(): + return response_error('no logged in') + user_profile = user.get_profile() form_fields = ['video'] response = check_form_fields(request, form_fields) if response: @@ -565,6 +662,10 @@ def api_video_view(request): def api_video_like(request): """ Private API """ + user = request.user + if not user.is_authenticated(): + return response_error('no logged in') + user_profile = user.get_profile() form_fields = ['video'] response = check_form_fields(request, form_fields) if response: @@ -575,6 +676,10 @@ def api_video_like(request): def api_video_unlike(request): """ Private API """ + user = request.user + if not user.is_authenticated(): + return response_error('no logged in') + user_profile = user.get_profile() form_fields = ['video'] response = check_form_fields(request, form_fields) if response: @@ -585,6 +690,10 @@ def api_video_unlike(request): def api_video_remove(request): """ Private API """ + user = request.user + if not user.is_authenticated(): + return response_error('no logged in') + user_profile = user.get_profile() form_fields = ['video', 'room'] response = check_form_fields(request, form_fields) if response: @@ -595,6 +704,10 @@ def api_video_remove(request): def api_video_search(request): """ Private API """ + user = request.user + if not user.is_authenticated(): + return response_error('no logged in') + user_profile = user.get_profile() form_fields = ['q', 'start', 'limit'] response = check_form_fields(request, form_fields) if response: |
