From dbc5867fbcebcd0b8571ca8340e6eb88966ac8e2 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Wed, 13 Aug 2014 20:19:55 +0100 Subject: [PATCH] Adding playlists done --- spa/api/v1/PlaylistResource.py | 14 +++++++- static/css/dss.overrides.css | 2 +- .../apps/playlist/models/playlistModel.coffee | 21 ++++++++++- .../playlist/views/playListItemView.coffee | 36 ++++++++++++++++++- .../apps/playlist/views/playListLayout.coffee | 13 +++++-- static/js/dss/templates/playlistitem.jst | 19 ++++++---- static/js/dss/templates/playlistlayout.jst | 3 +- 7 files changed, 94 insertions(+), 14 deletions(-) diff --git a/spa/api/v1/PlaylistResource.py b/spa/api/v1/PlaylistResource.py index e469d2f..e182ee8 100644 --- a/spa/api/v1/PlaylistResource.py +++ b/spa/api/v1/PlaylistResource.py @@ -10,7 +10,7 @@ from spa.models import Playlist, Mix class PlaylistResource(BackboneCompatibleResource): user = fields.ToOneField('spa.api.v1.UserResource.UserResource', 'user') - mixes = fields.ManyToManyField('spa.api.v1.MixResource.MixResource', 'mixes', null=True) + mixes = fields.ManyToManyField('spa.api.v1.MixResource.MixResource', 'mixes', full=True, null=True) class Meta: queryset = Playlist.objects.all().annotate(mix_count=Count('mixes')).order_by('-mix_count') @@ -33,6 +33,18 @@ class PlaylistResource(BackboneCompatibleResource): bundle.obj.user = bundle.request.user.get_profile() return bundle + def obj_update(self, bundle, skip_errors=False, **kwargs): + mixes = bundle.data['mixes'] + bundle.data.pop('mixes') + result = super(PlaylistResource, self).obj_update(bundle, **kwargs) + if mixes: + for mix_item in mixes: + result.obj.mixes.add(Mix.objects.get(pk=mix_item['id'])) + + result.obj.save() + + return result + def obj_create(self, bundle, **kwargs): mixes = bundle.data['mixes'] bundle.data.pop('mixes') diff --git a/static/css/dss.overrides.css b/static/css/dss.overrides.css index bc0ca22..49dd763 100644 --- a/static/css/dss.overrides.css +++ b/static/css/dss.overrides.css @@ -10,6 +10,6 @@ width: 320px !important; } -.profile-feed{ +.profile-activity{ cursor: pointer !important; } \ No newline at end of file diff --git a/static/js/dss/apps/playlist/models/playlistModel.coffee b/static/js/dss/apps/playlist/models/playlistModel.coffee index 1391711..5dce617 100644 --- a/static/js/dss/apps/playlist/models/playlistModel.coffee +++ b/static/js/dss/apps/playlist/models/playlistModel.coffee @@ -8,7 +8,26 @@ collectionType: App.MixApp.Models.MixCollection ] + containsMix: (mix, callback) -> + mixes = @get("mixes") + result = false + if mixes.length != 0 + mixes.each (item) -> + if item.id == mix.id + result = true + + callback(result) + class Models.PlaylistCollection extends Backbone.Collection model: Models.PlaylistItem - Models.PlaylistCollection + containsMix: (mix, callback)-> + return callback(false) if item.length = 0 + @each (item) -> + if item.containsMix(mix, callback) + return true + + return false + + save: (options)-> + Backbone.sync("create", this, options) diff --git a/static/js/dss/apps/playlist/views/playListItemView.coffee b/static/js/dss/apps/playlist/views/playListItemView.coffee index 3198975..8634daa 100644 --- a/static/js/dss/apps/playlist/views/playListItemView.coffee +++ b/static/js/dss/apps/playlist/views/playListItemView.coffee @@ -1,3 +1,37 @@ -@Dss.module "PlaylistApp.Views", (Views, App, Backbone, Marionette, $ ) -> +@Dss.module "PlaylistApp.Views", (Views, App, Backbone, Marionette, $) -> class Views.PlaylistItemView extends Marionette.ItemView template: "playlistitem" + tagName: "ul" + className: "item-list" + + ui: + mixExistsIndicator: ".playlist-selected-indicator" + + events: + "click .profile-activity": "onClickItem" + + onClickItem: (e) -> + console.log("Clicky clicky") + e.stopPropagation() + + @model.containsMix @mix, (result) => + if result + @model.get("mixes").remove(@mix) + else + @model.get("mixes").add(@mix) + + @model.save( + "mixes" + @model.get("mixes") + patch: true + ) + + @render() + + setContained: (contained)=> + @ui.mixExistsIndicator.prop('checked', contained) + + + onRender: -> + @ui.mixExistsIndicator.hide() + @model.containsMix(@mix, @setContained) diff --git a/static/js/dss/apps/playlist/views/playListLayout.coffee b/static/js/dss/apps/playlist/views/playListLayout.coffee index 909852b..c358fd2 100644 --- a/static/js/dss/apps/playlist/views/playListLayout.coffee +++ b/static/js/dss/apps/playlist/views/playListLayout.coffee @@ -16,12 +16,19 @@ Marionette.CompositeView::constructor.apply this, arguments @mix = arguments[0].mix - onRender: -> - console.log("Rendering") + initialize: -> + console.log("Initializing playlist") stopDefaults: (e)-> e.stopPropagation() + onBeforeAddChild: (child)-> + child.mix = @mix + + renderIntermediate: -> + debugger + @render() + addPlaylist: (e)=> console.log("Clicked") unless typeof(App.currentUser) is "undefined" @@ -32,7 +39,7 @@ mixes: [id: @mix.id] playlist.save() - + @collection.add(playlist) console.log("Adding new: " + playlistName) else @ui.newPlaylistLayout.addClass('has-error') diff --git a/static/js/dss/templates/playlistitem.jst b/static/js/dss/templates/playlistitem.jst index 8323b43..c45738f 100644 --- a/static/js/dss/templates/playlistitem.jst +++ b/static/js/dss/templates/playlistitem.jst @@ -1,11 +1,18 @@ -
-
<%= name %>
-
+
  • + + + + -
  • + + diff --git a/static/js/dss/templates/playlistlayout.jst b/static/js/dss/templates/playlistlayout.jst index 5a7ca89..99d4f16 100644 --- a/static/js/dss/templates/playlistlayout.jst +++ b/static/js/dss/templates/playlistlayout.jst @@ -1,6 +1,7 @@
    -
    +
    +