From aefe5b0166f8fa2806866f30909dbfeeac4cf66e Mon Sep 17 00:00:00 2001 From: "fergal.moran" Date: Fri, 10 Aug 2012 15:56:44 +0100 Subject: [PATCH] Added event handling stuff --- requirements.txt | 1 + spa/admin.py | 6 +- spa/api/v1/EventResource.py | 17 ++++++ spa/models.py | 30 +++++++++- spa/templates.py | 2 +- spa/urls.py | 3 +- static/js/app/app.js | 36 +++++++++--- static/js/app/models/event.js | 7 +++ static/js/app/views/comment.js | 4 +- static/js/app/views/event.js | 58 +++++++++++++++++++ static/js/app/views/mix.js | 6 +- static/js/app/views/release.js | 20 +++---- templates/base.html | 2 + ...ItemView.html => CommentListItemView.html} | 0 templates/views/EventItemView.html | 18 ++++++ templates/views/EventListItemView.html | 3 + templates/views/EventListView.html | 17 ++++++ templates/views/EventView.html | 5 ++ ...{MixItemView.html => MixListItemView.html} | 0 19 files changed, 207 insertions(+), 28 deletions(-) create mode 100644 spa/api/v1/EventResource.py create mode 100644 static/js/app/models/event.js create mode 100644 static/js/app/views/event.js rename templates/views/{CommentItemView.html => CommentListItemView.html} (100%) create mode 100644 templates/views/EventItemView.html create mode 100644 templates/views/EventListItemView.html create mode 100644 templates/views/EventListView.html create mode 100644 templates/views/EventView.html rename templates/views/{MixItemView.html => MixListItemView.html} (100%) diff --git a/requirements.txt b/requirements.txt index 1bdd91c..9f53a9a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,6 +11,7 @@ django-avatar>=1.0.5 django-notification>=0.2 django-socialauth>=0.1.2c django-tastypie>=0.9.11 +django-tinymce>=1.5.1b2 git+git://github.com/PaulUithol/backbone-tastypie.git#egg=backbone-tastypie django-grappelli humanize \ No newline at end of file diff --git a/spa/admin.py b/spa/admin.py index bd4bfbe..a3675f6 100644 --- a/spa/admin.py +++ b/spa/admin.py @@ -1,15 +1,15 @@ from django.contrib import admin -from spa.models import Mix, Label, Release, ReleaseAudio, MixLike +from spa.models import Mix, Label, Release, ReleaseAudio, MixLike, Venue, Event class DefaultAdmin(admin.ModelAdmin): def save_model(self, request, obj, form, change): obj.user = request.user.get_profile() obj.save() -#admin.site.register(Event, EventTestPageAdmin) +admin.site.register(Venue) +admin.site.register(Event) admin.site.register(Mix) admin.site.register(MixLike) -#admin.site.register(Venue) #admin.site.register(Genre) admin.site.register(Label) admin.site.register(Release, DefaultAdmin) diff --git a/spa/api/v1/EventResource.py b/spa/api/v1/EventResource.py new file mode 100644 index 0000000..cbf39f8 --- /dev/null +++ b/spa/api/v1/EventResource.py @@ -0,0 +1,17 @@ +import humanize +from tastypie.authorization import Authorization +from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource +from spa.models import Event + +class EventResource(BackboneCompatibleResource): + class Meta: + queryset = Event.objects.all() + authorization = Authorization() + + def dehydrate(self, bundle): + bundle.data['item_url'] = 'event/%s' % bundle.obj.id + bundle.data['venue'] = bundle.obj.event_venue.venue_name + return bundle + + def dehydrate_event_date(self, bundle): + return humanize.naturalday(bundle.obj.event_date) \ No newline at end of file diff --git a/spa/models.py b/spa/models.py index 242442a..381371c 100644 --- a/spa/models.py +++ b/spa/models.py @@ -12,6 +12,7 @@ import os from core.utils.file import generate_save_file_name from dss import settings from tasks.waveform import create_waveform_task +from tinymce import models as tinymce_models def mix_file_name(instance, filename): return generate_save_file_name('mixes', filename) @@ -260,4 +261,31 @@ class MixLike(__Like): class MixPlay(__Like): class Meta: db_table = 'www_play' - mix = models.ForeignKey(Mix, related_name='plays') \ No newline at end of file + mix = models.ForeignKey(Mix, related_name='plays') + +class Venue(models.Model): + user = models.ForeignKey(User) + venue_name = models.CharField(max_length=250) + venue_address = models.CharField(max_length=1024) + venue_image = models.ImageField(blank=True, upload_to=venue_image_name) + + def __unicode__(self): + return self.venue_name + +class Event(models.Model): + event_venue = models.ForeignKey(Venue) + + event_date = models.DateField(default=datetime.now()) + event_time = models.TimeField(default=datetime.now()) + + date_created = models.DateField(default=datetime.now()) + event_title = models.CharField(max_length=250) + event_description = tinymce_models.HTMLField() + + attendees = models.ManyToManyField(User, related_name='event__attendees') + + def get_absolute_url(self): + return '/events/%i' % self.id + + def __unicode__(self): + return self.event_title diff --git a/spa/templates.py b/spa/templates.py index 6cb44c1..2faefea 100644 --- a/spa/templates.py +++ b/spa/templates.py @@ -5,5 +5,5 @@ __author__ = 'fergalm' def get_template(request, template_name): return render_to_response( - 'views/%s.html' % (template_name), + 'views/%s.html' % template_name, context_instance=RequestContext(request)) \ No newline at end of file diff --git a/spa/urls.py b/spa/urls.py index b4c5a84..2708ce3 100644 --- a/spa/urls.py +++ b/spa/urls.py @@ -3,6 +3,7 @@ import django.conf.urls from tastypie.api import Api from spa.ajax import AjaxHandler from spa.api.v1.CommentResource import CommentResource +from spa.api.v1.EventResource import EventResource from spa.api.v1.MixResource import MixResource from spa.api.v1.ReleaseAudioResource import ReleaseAudioResource from spa.api.v1.ReleaseResource import ReleaseResource @@ -13,7 +14,7 @@ v1_api.register(MixResource()) v1_api.register(CommentResource()) v1_api.register(ReleaseResource()) v1_api.register(ReleaseAudioResource()) - +v1_api.register(EventResource()) ajax = AjaxHandler() urlpatterns = django.conf.urls.patterns( diff --git a/static/js/app/app.js b/static/js/app/app.js index a3492b8..c127bf1 100644 --- a/static/js/app/app.js +++ b/static/js/app/app.js @@ -6,6 +6,8 @@ var AppRouter = Backbone.Router.extend({ "/mix/:id":"mixDetails", "/releases":"releaseList", "/release/:id":"releaseDetails", + "/events":"eventList", + "/event/:id":"eventDetails", "/accounts/login/":"login", "/accounts/logout/":"logout" }, @@ -76,6 +78,23 @@ var AppRouter = Backbone.Router.extend({ }}); }}); }, + eventList:function (page) { + var eventList = new EventCollection(); + eventList.fetch({ + success:function () { + var content = new EventListView({collection:eventList}).el; + $('#content').html(content); + } + }); + }, + eventDetails:function (id) { + var event = new Event({id:id}); + $('#site-content-fill').html(''); + event.fetch({success:function () { + var content = new EventView({model:event}).el; + $('#content').html(content); + }}); + }, login:function () { $.colorbox({ href:"/tpl/LoginView/", @@ -90,11 +109,14 @@ var AppRouter = Backbone.Router.extend({ }); utils.loadTemplate([ - 'HeaderView', 'SidebarView', - 'MixListView', 'MixItemView', 'MixView', - 'CommentListView', 'CommentItemView', - 'ReleaseListView', 'ReleaseListItemView', 'ReleaseItemView', 'ReleaseView', 'ReleaseAudioListView', 'ReleaseAudioItemView'], function () { - window.app = new AppRouter(); - Backbone.history.start(); -}); + 'HeaderView', 'SidebarView', + 'MixListView', 'MixListItemView', 'MixView', + 'CommentListView', 'CommentListItemView', + 'ReleaseListView', 'ReleaseListItemView', 'ReleaseItemView', 'ReleaseView', 'ReleaseAudioListView', 'ReleaseAudioItemView', + 'EventListView', 'EventListItemView', 'EventView', 'EventItemView' + ], function () { + window.app = new AppRouter(); + Backbone.history.start(); + } +); var _eventAggregator = _.extend({}, Backbone.Events); diff --git a/static/js/app/models/event.js b/static/js/app/models/event.js new file mode 100644 index 0000000..c5f50d5 --- /dev/null +++ b/static/js/app/models/event.js @@ -0,0 +1,7 @@ +var Event = TastypieModel.extend({ + urlRoot:window.appSettings.urlRoot + "event/" +}); +var EventCollection = TastypieCollection.extend({ + url:window.appSettings.urlRoot + "event/", + model:Event +}); diff --git a/static/js/app/views/comment.js b/static/js/app/views/comment.js index e75f17f..8ec104c 100644 --- a/static/js/app/views/comment.js +++ b/static/js/app/views/comment.js @@ -1,4 +1,4 @@ -window.CommentItemView = Backbone.View.extend({ +window.CommentListItemView = Backbone.View.extend({ tagName:"li", initialize:function () { $(this.el).data("id", this.model.get("id")); @@ -39,7 +39,7 @@ window.CommentListView = Backbone.View.extend({ render:function () { $(this.el).html(this.template()).append(''); this.collection.each(function (item) { - $('.comment-listing', this.el).append(new CommentItemView({model:item}).render().el); + $('.comment-listing', this.el).append(new CommentListItemView({model:item}).render().el); }, this); return this; } diff --git a/static/js/app/views/event.js b/static/js/app/views/event.js new file mode 100644 index 0000000..1360f33 --- /dev/null +++ b/static/js/app/views/event.js @@ -0,0 +1,58 @@ +var EventListItemView = Backbone.View.extend({ + tagName:"tr", + initialize:function () { + $(this.el).addClass("rowlink"); + $(this.el).data("id", this.model.get("id")); + this.render(); + }, + render:function () { + $(this.el).html(this.template({"item":this.model.toJSON()})); + return this; + } +}); +var EventListView = Backbone.View.extend({ + events: { + "click tr" : "showDetails" + }, + initialize:function () { + this.render(); + }, + render:function () { + $(this.el).html(this.template()); + var el = this.el; + this.collection.each(function (item) { + $('#event-list-container', el).append(new EventListItemView({model:item}).render().el); + }); + $("#event-table", this.el).tablesorter({ + sortList: [[0,0],[1,0]] + }); + $('tr.rowlink', this.el).rowlink(); + + return this; + }, + showDetails: function(row){ + window.app.navigate('#/event/' + $(row.currentTarget).data("id"), true); + } +}); +var EventItemView = Backbone.View.extend({ + tagName:"li", + initialize:function () { + this.render(); + }, + render:function () { + $(this.el).html(this.template({"item":this.model.toJSON()})); + return this; + } +}); +var EventView = Backbone.View.extend({ + initialize:function () { + this.render(); + }, + render:function () { + $(this.el).html(this.template()); + var item = new EventItemView({model:this.model}).render(); + $('.event-listing', this.el).append(item.el); + $('#event-description', this.el).html(this.model.get("description")); + return this; + } +}); \ No newline at end of file diff --git a/static/js/app/views/mix.js b/static/js/app/views/mix.js index 13f43bb..171de59 100644 --- a/static/js/app/views/mix.js +++ b/static/js/app/views/mix.js @@ -1,4 +1,4 @@ -window.MixItemView = Backbone.View.extend({ +window.MixListItemView = Backbone.View.extend({ tagName:"li", events:{ "click .play-button-small":"playMix", @@ -69,7 +69,7 @@ window.MixListView = Backbone.View.extend({ var el = this.el; $(this.el).html(this.template()).append(''); this.collection.each(function (item) { - $('.mix-listing', el).append(new MixItemView({model:item}).render().el); + $('.mix-listing', el).append(new MixListItemView({model:item}).render().el); }); var type = this.collection.type; $('#' + type, this.el).parent().addClass('active'); @@ -83,7 +83,7 @@ window.MixView = Backbone.View.extend({ }, render:function () { $(this.el).html(this.template()); - var item = new MixItemView({model:this.model}).render(); + var item = new MixListItemView({model:this.model}).render(); $('.mix-listing', this.el).append(item.el); $('#mix-description', this.el).html(this.model.get("description")); return this; diff --git a/static/js/app/views/release.js b/static/js/app/views/release.js index e3681cd..c9be68e 100644 --- a/static/js/app/views/release.js +++ b/static/js/app/views/release.js @@ -1,13 +1,3 @@ -var ReleaseItemView = Backbone.View.extend({ - tagName:"li", - initialize:function () { - this.render(); - }, - render:function () { - $(this.el).html(this.template({"item":this.model.toJSON()})); - return this; - } -}); var ReleaseListItemView = Backbone.View.extend({ tagName:"tr", initialize:function () { @@ -44,6 +34,16 @@ var ReleaseListView = Backbone.View.extend({ window.app.navigate('#/release/' + $(row.currentTarget).data("id"), true); } }); +var ReleaseItemView = Backbone.View.extend({ + tagName:"li", + initialize:function () { + this.render(); + }, + render:function () { + $(this.el).html(this.template({"item":this.model.toJSON()})); + return this; + } +}); var ReleaseView = Backbone.View.extend({ initialize:function () { this.render(); diff --git a/templates/base.html b/templates/base.html index ecc6451..36a0afc 100644 --- a/templates/base.html +++ b/templates/base.html @@ -79,12 +79,14 @@ + + {% block footerscripts %} diff --git a/templates/views/CommentItemView.html b/templates/views/CommentListItemView.html similarity index 100% rename from templates/views/CommentItemView.html rename to templates/views/CommentListItemView.html diff --git a/templates/views/EventItemView.html b/templates/views/EventItemView.html new file mode 100644 index 0000000..51edd86 --- /dev/null +++ b/templates/views/EventItemView.html @@ -0,0 +1,18 @@ +
+
+
+

+ <%= item.event_date %> +  ::  + <%= item.event_title %> +  -  + <%= item.venue %> +  -  +

+
+
+
+ <%= item.event_description %> +
+
+ diff --git a/templates/views/EventListItemView.html b/templates/views/EventListItemView.html new file mode 100644 index 0000000..9f208c9 --- /dev/null +++ b/templates/views/EventListItemView.html @@ -0,0 +1,3 @@ +<%= item.event_title %> +<%= item.venue %> +<%= item.event_date %> diff --git a/templates/views/EventListView.html b/templates/views/EventListView.html new file mode 100644 index 0000000..5e5968f --- /dev/null +++ b/templates/views/EventListView.html @@ -0,0 +1,17 @@ +
+

Upcoming Events

+
+
+ + + + + + + + + + + +
WhatWhereWhen
+
\ No newline at end of file diff --git a/templates/views/EventView.html b/templates/views/EventView.html new file mode 100644 index 0000000..f2fedb0 --- /dev/null +++ b/templates/views/EventView.html @@ -0,0 +1,5 @@ +
+ +
+ +
\ No newline at end of file diff --git a/templates/views/MixItemView.html b/templates/views/MixListItemView.html similarity index 100% rename from templates/views/MixItemView.html rename to templates/views/MixListItemView.html