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('
| What | +Where | +When | +
|---|