summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/fixtures/initial_data.json26
-rw-r--r--backend/models.py5
-rw-r--r--backend/views.py129
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: