Added event handling stuff

This commit is contained in:
fergal.moran
2012-08-10 15:56:44 +01:00
parent f155157573
commit aefe5b0166
19 changed files with 207 additions and 28 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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')
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

View File

@@ -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))

View File

@@ -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(

View File

@@ -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);

View File

@@ -0,0 +1,7 @@
var Event = TastypieModel.extend({
urlRoot:window.appSettings.urlRoot + "event/"
});
var EventCollection = TastypieCollection.extend({
url:window.appSettings.urlRoot + "event/",
model:Event
});

View File

@@ -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('<ul class="comment-listing list-nostyle"></ul>');
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;
}

View File

@@ -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;
}
});

View File

@@ -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('<ul class="mix-listing audio-listing"></ul>');
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;

View File

@@ -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();

View File

@@ -79,12 +79,14 @@
<script src="{{ STATIC_URL }}js/app/models/comment.js"></script>
<script src="{{ STATIC_URL }}js/app/models/release.js"></script>
<script src="{{ STATIC_URL }}js/app/models/release_audio.js"></script>
<script src="{{ STATIC_URL }}js/app/models/event.js"></script>
<script src="{{ STATIC_URL }}js/app/views/header.js"></script>
<script src="{{ STATIC_URL }}js/app/views/sidebar.js"></script>
<script src="{{ STATIC_URL }}js/app/views/mix.js"></script>
<script src="{{ STATIC_URL }}js/app/views/comment.js"></script>
<script src="{{ STATIC_URL }}js/app/views/release.js"></script>
<script src="{{ STATIC_URL }}js/app/views/release_audio.js"></script>
<script src="{{ STATIC_URL }}js/app/views/event.js"></script>
<script src="{{ STATIC_URL }}js/app/app.js"></script>
{% block footerscripts %}

View File

@@ -0,0 +1,18 @@
<div class="hero-unit">
<div class="row">
<div id="event-header">
<h3><i class="icon-time"></i>
<%= item.event_date %>
&nbsp;::&nbsp;
<%= item.event_title %>
&nbsp;-&nbsp;
<%= item.venue %>
&nbsp;-&nbsp;
</h3>
</div>
</div>
<div class="row">
<%= item.event_description %>
</div>
</div>

View File

@@ -0,0 +1,3 @@
<td><a href="#/<%= item.item_url %>"><%= item.event_title %></a></td>
<td><%= item.venue %></td>
<td><%= item.event_date %></td>

View File

@@ -0,0 +1,17 @@
<div id="title-area">
<h2 class="bordered">Upcoming Events</h2>
</div>
<div id="layout-area" class="hero-well">
<table id="event-table" class="table table-bordered table-striped">
<thead>
<tr>
<th>What</th>
<th>Where</th>
<th>When</th>
</tr>
</thead>
<tbody id="event-list-container" data-provides="rowlink">
</tbody>
</table>
</div>

View File

@@ -0,0 +1,5 @@
<div id="event-content">
<ul class="event-listing audio-listing"></ul>
</div>
<div id="event-description"></div>