Added stream function

This commit is contained in:
Fergal Moran
2013-10-28 20:19:30 +00:00
parent 3f385af4d5
commit 5ec7a23f23
10 changed files with 35 additions and 28 deletions

View File

@@ -1,5 +0,0 @@
import pip
from subprocess import call
for dist in pip.get_installed_distributions():
call("pip install --upgrade " + dist.project_name, shell=True)

View File

@@ -151,6 +151,8 @@ class MixResource(BackboneCompatibleResource):
f_user = request.GET.get('user', None) f_user = request.GET.get('user', None)
if request.GET.get('stream'):
semi_filtered = semi_filtered.filter(user__in=request.user.get_profile().following.all())
if f_user is not None: if f_user is not None:
semi_filtered = semi_filtered.filter(user__slug=f_user) semi_filtered = semi_filtered.filter(user__slug=f_user)
else: else:

View File

@@ -37,26 +37,18 @@ class UserResource(BackboneCompatibleResource):
} }
authorization = Authorization() authorization = Authorization()
authentication = Authentication() authentication = Authentication()
favourites = fields.ToManyField('spa.api.v1.MixResource', 'favourites')
def _hydrateBitmapOption(self, source, comparator): def _hydrateBitmapOption(self, source, comparator):
return True if (source & comparator) != 0 else False return True if (source & comparator) != 0 else False
def prepend_urls(self): def prepend_urls(self):
return [ return [
url(r"^(?P<resource_name>%s)/(?P<slug>[\w\d_.-]+)/favourites%s$" % (
self._meta.resource_name, trailing_slash()),
self.wrap_view('get_user_favourites'), name="api_get_user_favourites"),
url(r"^(?P<resource_name>%s)/(?P<pk>\d+)/$" % self._meta.resource_name, url(r"^(?P<resource_name>%s)/(?P<pk>\d+)/$" % self._meta.resource_name,
self.wrap_view('dispatch_detail'), name="api_dispatch_detail"), self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
url(r"^(?P<resource_name>%s)/(?P<slug>[\w\d_.-]+)/$" % self._meta.resource_name, url(r"^(?P<resource_name>%s)/(?P<slug>[\w\d_.-]+)/$" % self._meta.resource_name,
self.wrap_view('dispatch_detail'), name="api_dispatch_detail"), self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
] ]
def ___apply_filters(self, request, applicable_filters):
semi_filtered = super(UserResource, self).apply_filters(request, applicable_filters)
return semi_filtered
def apply_filters(self, request, applicable_filters): def apply_filters(self, request, applicable_filters):
semi_filtered = super(UserResource, self).apply_filters(request, applicable_filters) semi_filtered = super(UserResource, self).apply_filters(request, applicable_filters)
q = request.GET.get('q', None) q = request.GET.get('q', None)

View File

@@ -15,6 +15,7 @@ from spa.models.userprofile import UserProfile
from spa.models._basemodel import _BaseModel from spa.models._basemodel import _BaseModel
from core.utils.file import generate_save_file_name from core.utils.file import generate_save_file_name
def mix_file_name(instance, filename): def mix_file_name(instance, filename):
return generate_save_file_name(instance.uid, 'mixes', filename) return generate_save_file_name(instance.uid, 'mixes', filename)

View File

@@ -13,17 +13,17 @@ from spa.api.v1.ReleaseResource import ReleaseResource
from spa.api.v1.UserResource import UserResource from spa.api.v1.UserResource import UserResource
from spa.api.v1.ActivityResource import ActivityResource from spa.api.v1.ActivityResource import ActivityResource
v1_api = Api(api_name='v1') api = Api(api_name='v1')
v1_api.register(ChatResource()) api.register(ChatResource())
v1_api.register(CommentResource()) api.register(CommentResource())
v1_api.register(MixResource()) api.register(MixResource())
v1_api.register(ReleaseResource()) api.register(ReleaseResource())
v1_api.register(ReleaseAudioResource()) api.register(ReleaseAudioResource())
v1_api.register(EventResource()) api.register(EventResource())
v1_api.register(UserResource()) api.register(UserResource())
v1_api.register(ActivityResource()) api.register(ActivityResource())
v1_api.register(NotificationResource()) api.register(NotificationResource())
v1_api.register(DebugResource()) api.register(DebugResource())
ajax = AjaxHandler() ajax = AjaxHandler()
audio = AudioHandler() audio = AudioHandler()
@@ -44,7 +44,7 @@ urlpatterns = patterns(
url(r'_upload/', 'spa.ajax.upload', name='jfu_upload'), url(r'_upload/', 'spa.ajax.upload', name='jfu_upload'),
url(r'^ajax/', include(ajax.urls)), url(r'^ajax/', include(ajax.urls)),
url(r'^audio/', include(audio.urls)), url(r'^audio/', include(audio.urls)),
url(r'^api/', include(v1_api.urls)), url(r'^api/', include(api.urls)),
url(r'^comments/', include('django.contrib.comments.urls')), url(r'^comments/', include('django.contrib.comments.urls')),
(r'^.*/$', 'spa.views.default') (r'^.*/$', 'spa.views.default')
) )

View File

@@ -1,9 +1,11 @@
define ['app', 'marionette', 'vent', 'utils' define ['app', 'marionette', 'vent', 'utils'
'views/mix/mixListLayout', 'views/mix/mixListView', 'views/mix/mixDetailView' 'views/mix/mixListLayout', 'views/mix/mixListView', 'views/mix/mixDetailView'
'views/stream/streamListLayout',
'views/mix/mixEditView', 'views/user/userProfileView', 'views/user/userListView', 'views/user/userEditView', 'views/mix/mixEditView', 'views/user/userProfileView', 'views/user/userListView', 'views/user/userEditView',
'models/mix/mixItem', 'models/mix/mixCollection', 'models/user/userItem'], 'models/mix/mixItem', 'models/mix/mixCollection', 'models/user/userItem'],
(App, Marionette, vent, utils, (App, Marionette, vent, utils,
MixListLayout, MixListView, MixDetailView, MixListLayout, MixListView, MixDetailView,
StreamListLayout,
MixEditView, UserProfileView, UserListView, UserEditView, MixEditView, UserProfileView, UserListView, UserEditView,
MixItem, MixCollection, UserItem)-> MixItem, MixCollection, UserItem)->
class DssController extends Marionette.Controller class DssController extends Marionette.Controller
@@ -19,6 +21,9 @@ define ['app', 'marionette', 'vent', 'utils'
app = require('app') app = require('app')
app.contentRegion.show(new MixListLayout(options or {order_by: 'latest'})) app.contentRegion.show(new MixListLayout(options or {order_by: 'latest'}))
showStreamList: () ->
@showMixList({stream: true})
showMixListType: (type) -> showMixListType: (type) ->
@showMixList({order_by: type}) @showMixList({order_by: type})

View File

@@ -3,7 +3,7 @@
var __hasProp = {}.hasOwnProperty, var __hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
define(['app', 'marionette', 'vent', 'utils', 'views/mix/mixListLayout', 'views/mix/mixListView', 'views/mix/mixDetailView', 'views/mix/mixEditView', 'views/user/userProfileView', 'views/user/userListView', 'views/user/userEditView', 'models/mix/mixItem', 'models/mix/mixCollection', 'models/user/userItem'], function(App, Marionette, vent, utils, MixListLayout, MixListView, MixDetailView, MixEditView, UserProfileView, UserListView, UserEditView, MixItem, MixCollection, UserItem) { define(['app', 'marionette', 'vent', 'utils', 'views/mix/mixListLayout', 'views/mix/mixListView', 'views/mix/mixDetailView', 'views/stream/streamListLayout', 'views/mix/mixEditView', 'views/user/userProfileView', 'views/user/userListView', 'views/user/userEditView', 'models/mix/mixItem', 'models/mix/mixCollection', 'models/user/userItem'], function(App, Marionette, vent, utils, MixListLayout, MixListView, MixDetailView, StreamListLayout, MixEditView, UserProfileView, UserListView, UserEditView, MixItem, MixCollection, UserItem) {
var DssController; var DssController;
DssController = (function(_super) { DssController = (function(_super) {
@@ -30,6 +30,12 @@
})); }));
}; };
DssController.prototype.showStreamList = function() {
return this.showMixList({
stream: true
});
};
DssController.prototype.showMixListType = function(type) { DssController.prototype.showMixListType = function(type) {
return this.showMixList({ return this.showMixList({
order_by: type order_by: type

View File

@@ -13,7 +13,8 @@ define ['marionette', 'vent', 'app.lib/controller'],
"mix/edit/:slug": "editMix", "mix/edit/:slug": "editMix",
"chat": "showChat", "chat": "showChat",
#"random": "showRandomMix", "random": "showRandomMix",
"stream": "showStreamList",
"users": "showUserList" "users": "showUserList"
"user/:slug/favourites": "showUserFavourites" "user/:slug/favourites": "showUserFavourites"

View File

@@ -24,6 +24,8 @@
"mix/:slug": "showMix", "mix/:slug": "showMix",
"mix/edit/:slug": "editMix", "mix/edit/:slug": "editMix",
"chat": "showChat", "chat": "showChat",
"random": "showRandomMix",
"stream": "showStreamList",
"users": "showUserList", "users": "showUserList",
"user/:slug/favourites": "showUserFavourites", "user/:slug/favourites": "showUserFavourites",
"user/:slug/likes": "showUserLikes", "user/:slug/likes": "showUserLikes",

View File

@@ -11,7 +11,10 @@
<ul class="nav ace-nav"> <ul class="nav ace-nav">
<li><a href="/mixes"><i class="icon-music icon-white"></i>Mixes</a></li> <li><a href="/mixes"><i class="icon-music icon-white"></i>Mixes</a></li>
<li><a href="/users"><i class="icon-user icon-white"></i>Users</a></li> <li><a href="/users"><i class="icon-user icon-white"></i>Users</a></li>
<li><a data-bypass="true" id="header-random-button"><i class="icon-cogs icon-white"></i>Random</a></li> {% if user.is_authenticated %}
<li><a href="/stream" title="Show mixes from people you follow" id="header-stream-button"><i class="icon-circle-arrow-down icon-white"></i>Stream</a></li>
{% endif %}
<li><a data-bypass="true" title="Show random mix from our vaults" id="header-random-button"><i class="icon-cogs icon-white"></i>Random</a></li>
<li><a data-bypass="true" target="_blank" href="/podcast"><i class="icon-rss icon-white"></i>Podcast</a></li> <li><a data-bypass="true" target="_blank" href="/podcast"><i class="icon-rss icon-white"></i>Podcast</a></li>
{% if false %} {% if false %}
<li class="purple"> <li class="purple">