diff options
| -rw-r--r-- | backend/models.py | 2 | ||||
| -rw-r--r-- | backend/views.py | 159 |
2 files changed, 82 insertions, 79 deletions
diff --git a/backend/models.py b/backend/models.py index 6e015cd..9d970c5 100644 --- a/backend/models.py +++ b/backend/models.py @@ -19,7 +19,7 @@ class SJSettingsModel(models.Model): def settings(self): if not self.settings_text: return dict() - return json.loads(self.settings_text, parse_float=True, parse_int=True) + return json.loads(self.settings_text, encoding='utf8', parse_float=True, parse_int=True) @settings.setter def settings(self, settings): diff --git a/backend/views.py b/backend/views.py index f0cfb3f..e084325 100644 --- a/backend/views.py +++ b/backend/views.py @@ -26,7 +26,7 @@ ROOM_VIDEO_LOG_SIZE = 50 # Common funtions # -def set_cors_headers(response): +def headers(response): """ Setup additional headers for response """ response['Access-Control-Allow-Origin'] = '*' @@ -35,22 +35,22 @@ def set_cors_headers(response): response['Access-Control-Max-Age'] = '3628800' response['Content-type'] = 'text/plain; charset=UTF-8' -def api_error_headers(error, response=None): +def response_error(error, response=None): """ Add API error name with setup headers to response """ if not response: response = HttpResponse() - set_cors_headers(response) + headers(response) response.write(API_HEADER) response.write('0\t%s\n' % error) return response -def api_ok_headers(response=None): +def response_success(response=None): """ Add API OK with setup headers to response """ if not response: response = HttpResponse() - set_cors_headers(response) + headers(response) response.write(API_HEADER) response.write('OK\n') return response @@ -62,9 +62,9 @@ def check_form_fields(request, form_fields): print field, '= "%s"' % value for field in form_fields: if field not in request.POST: - return api_error_headers('incomplete form') + return response_error('incomplete form') if not request.POST[field]: - return api_error_headers('no %s' % field) + return response_error('no %s' % field) def user_response_str(request, user=None): """ Return API response string for user @@ -100,23 +100,23 @@ def api_auth_login(request): if user: if user.is_active: auth.login(request, user) - response = api_ok_headers() + response = response_success() response.write(user_response_str(request)) return response else: - return api_error_headers('user disabled') + return response_error('user disabled') else: if auth.models.User.objects.filter(username=request.POST['username']): - return api_error_headers('wrong password') + return response_error('wrong password') else: - return api_error_headers('no such user') + return response_error('no such user') @require_POST def api_auth_logout(request): """ Log out user. Public API """ auth.logout(request) - return api_ok_headers() + return response_success() @require_POST def api_auth_sneakin(request): @@ -129,15 +129,15 @@ def api_auth_sneakin(request): try: user = auth.models.User.objects.get(username=request.POST['username']) if user.id != int(request.POST['userid']): - return api_error_headers('no match') + return response_error('no match') except: - return api_error_headers('no such user') + return response_error('no such user') # Hack to authenticate user manually for backend in auth.get_backends(): user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__) break auth.login(request, user) - response = api_ok_headers() + response = response_success() response.write(user_response_str(request, user)) return response @@ -150,7 +150,7 @@ def api_auth_register(request): if response: return response if auth.models.User.objects.filter(username=request.POST['username']): - return api_error_headers('user exists') + return response_error('user exists') user = auth.models.User.objects.create_user(username=request.POST['username'], email='default@noemail.com', password=request.POST['password']) @@ -158,13 +158,13 @@ def api_auth_register(request): try: user.save() except: - return api_error_headers('db error') + return response_error('db error') user_profile = SJUserProfile(user=user) try: user_profile.save() except: - return api_error_headers('db error') - response = api_ok_headers() + return response_error('db error') + response = response_success() response.write(user_response_str(request, user)) return response @@ -177,15 +177,15 @@ def api_auth_available(request): if response: return response if auth.models.User.objects.filter(username=request.POST['username']): - return api_error_headers('user exists') - return api_ok_headers() + return response_error('user exists') + return response_success() @require_POST def api_auth_checkin(request): """ Check in user. Private API """ if request.user.is_authenticated(): - response = api_ok_headers() + response = response_success() response.write(user_response_str(request)) return response return HttpResponse() @@ -206,10 +206,10 @@ def api_auth_password(request): user_profile = user.get_profile() user_profile.save() except auth.models.User.DoesNotExist: - return api_error_headers('no such user') + return response_error('no such user') except: - return api_error_headers('db error') - return api_ok_headers() + return response_error('db error') + return response_success() return HttpResponse() # @@ -220,64 +220,67 @@ def api_auth_password(request): def api_user_videos(request): """ Get list of user videos. Public API """ -# form_fields = ['user'] -# response = check_form_fields(request, form_fields) -# if response: -# return response -# try: -# query = Q(user=auth.models.User.objects.get(id=request.POST['user'])) -# except auth.models.User.DoesNotExist: -# return api_error_headers('no such user') -# except: -# return api_error_headers('db error') -# if 'start' in request.POST: -# try: -# timestamp = float(request.POST['start']) -# query = query & Q(date__lte=datetime.fromtimestamp(timestamp)) -# except: -# pass -# videos = SJVideo.objects.filter(query).order_by('-date')[0:ROOM_VIDEO_LOG_SIZE] -# if not videos: -# return api_error_headers('no videos') -# response = api_ok_headers() -# response.write('\n'.join(['\t'.join([str(v.id), -# str(v.date), -# str(v.user.id), -# v.user.username, -# v.url, -# v.title]) for v in videos])) -# return response - return HttpResponse('Not implemented yet!\n') + form_fields = ['user'] + response = check_form_fields(request, form_fields) + if response: + return response + try: + query = Q(user=auth.models.User.objects.get(id=request.POST['user'])) + except auth.models.User.DoesNotExist: + return response_error('no such user') + except: + return response_error('db error') + if 'start' in request.POST: + try: + timestamp = float(request.POST['start']) + query = query & Q(datetime__lte=datetime.fromtimestamp(timestamp)) + except: + pass + videos = SJContent.objects.filter(content_type='video').filter(query).order_by('-datetime')[0:ROOM_VIDEO_LOG_SIZE] + if not videos: + return response_error('no videos') + response = response_success() + for v in videos: + s = v.settings + l = '\t'.join([ + str(v.id), + str(v.datetime), + str(v.user.id), + v.user.username, + s['url'], + s['title'], + ]) + response.write(l + '\n') + return response @require_POST def api_user_likes(request): """ Get list of liked videos. Public API """ -# form_fields = ['user'] -# response = check_form_fields(request, form_fields) -# if response: -# return response -# try: -# query = Q(sjlike__user=auth.models.User.objects.get(id=request.POST['user'])) -# except auth.models.User.DoesNotExist: -# return api_error_headers('no such user') -# except: -# return api_error_headers('db error') -# if 'start' in request.POST: -# try: -# timestamp = float(request.POST['start']) -# query = query & Q(date__lte=datetime.fromtimestamp(timestamp)) -# except: -# pass -# videos = SJVideo.objects.filter(query).order_by('-date')[0:ROOM_VIDEO_LOG_SIZE] -# if not videos: -# return api_error_headers('no videos') -# response = api_ok_headers() -# response.write('\n'.join(['\t'.join([str(v.user.id), -# str(v.id), -# str(v.date)]) for v in videos])) -# return response - return HttpResponse('Not implemented yet!\n') + form_fields = ['user'] + response = check_form_fields(request, form_fields) + if response: + return response + try: + query = Q(sjlike__user=auth.models.User.objects.get(id=request.POST['user'])) + except auth.models.User.DoesNotExist: + return response_error('no such user') + except: + return response_error('db error') + if 'start' in request.POST: + try: + timestamp = float(request.POST['start']) + query = query & Q(datetime__lte=datetime.fromtimestamp(timestamp)) + except: + pass + videos = SJContent.objects.filter(content_type='video').filter(query).order_by('-datetime')[0:ROOM_VIDEO_LOG_SIZE] + if not videos: + return response_error('no videos') + response = response_success() + for v in videos: + l = '\t'.join([str(v.user.id), str(v.id), str(v.datetime)]) + response.write(l + '\n') + return response @require_POST def api_user_top(request): |
