Fixed update user profile

This commit is contained in:
Fergal Moran
2014-05-01 21:15:46 +01:00
parent 7d3c932140
commit 6ecec7af01
33 changed files with 1526 additions and 53 deletions

View File

@@ -33,8 +33,20 @@ DATABASES = {
'USER': localsettings.DATABASE_USER if hasattr(localsettings, 'DATABASE_USER') else 'deepsouthsounds', 'USER': localsettings.DATABASE_USER if hasattr(localsettings, 'DATABASE_USER') else 'deepsouthsounds',
'PASSWORD': localsettings.DATABASE_PASSWORD if hasattr(localsettings, 'DATABASE_PASSWORD') else '', 'PASSWORD': localsettings.DATABASE_PASSWORD if hasattr(localsettings, 'DATABASE_PASSWORD') else '',
'HOST': localsettings.DATABASE_HOST if hasattr(localsettings, 'DATABASE_HOST') else 'localhost', 'HOST': localsettings.DATABASE_HOST if hasattr(localsettings, 'DATABASE_HOST') else 'localhost',
},
'test': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'test_deepsouthsounds',
'ADMINUSER': 'postgres',
'USER': localsettings.DATABASE_USER if hasattr(localsettings, 'DATABASE_USER') else 'deepsouthsounds',
'PASSWORD': localsettings.DATABASE_PASSWORD if hasattr(localsettings, 'DATABASE_PASSWORD') else '',
'HOST': localsettings.DATABASE_HOST if hasattr(localsettings, 'DATABASE_HOST') else 'localhost',
} }
} }
import sys
if 'test' in sys.argv or 'test_coverage' in sys.argv: #Covers regular testing and django-coverage
print "Testing"
DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'
ROOT_URLCONF = 'dss.urls' ROOT_URLCONF = 'dss.urls'
TIME_ZONE = 'Europe/Dublin' TIME_ZONE = 'Europe/Dublin'
@@ -107,10 +119,10 @@ STATICFILES_DIRS = (
SECRET_KEY = localsettings.SECRET_KEY SECRET_KEY = localsettings.SECRET_KEY
TEMPLATE_LOADERS = ( TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader', ('django.template.loaders.cached.Loader', (
'django.template.loaders.app_directories.Loader', 'django.template.loaders.filesystem.Loader',
'django.template.loaders.eggs.Loader', 'django.template.loaders.app_directories.Loader',
#'django.template.loaders.app_directories.load_template_source', )),
) )
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + ( TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + (
'django_facebook.context_processors.facebook', 'django_facebook.context_processors.facebook',
@@ -140,7 +152,7 @@ MIDDLEWARE_CLASSES = (
'htmlmin.middleware.HtmlMinifyMiddleware', 'htmlmin.middleware.HtmlMinifyMiddleware',
'django_user_agents.middleware.UserAgentMiddleware', 'django_user_agents.middleware.UserAgentMiddleware',
#'spa.middleware.uploadify.SWFUploadMiddleware', #'spa.middleware.uploadify.SWFUploadMiddleware',
#'spa.middleware.sqlprinter.SqlPrintingMiddleware' if DEBUG else None, 'spa.middleware.sqlprinter.SqlPrintingMiddleware' if DEBUG else None,
#'debug_toolbar.middleware.DebugToolbarMiddleware', #'debug_toolbar.middleware.DebugToolbarMiddleware',
) )
@@ -159,6 +171,7 @@ INSTALLED_APPS = (
'django_facebook', 'django_facebook',
'django_extensions', 'django_extensions',
'django_gravatar', 'django_gravatar',
'schedule',
'compressor', 'compressor',
'notification', 'notification',
'djcelery', 'djcelery',

View File

@@ -1,10 +1,11 @@
from django.contrib import admin from django.contrib import admin
from spa.models import Show
from spa.models.genre import Genre from spa.models.genre import Genre
from spa.models.userprofile import UserProfile from spa.models.userprofile import UserProfile
from spa.models.chatmessage import ChatMessage from spa.models.chatmessage import ChatMessage
from spa.models.recurrence import Recurrence from spa.models.recurrence import Recurrence
from spa.models.release import Release from spa.models.release import Release
from spa.models.event import Event #from spa.models.event import Event
from spa.models.label import Label from spa.models.label import Label
from spa.models.mix import Mix from spa.models.mix import Mix
from spa.models.release import ReleaseAudio from spa.models.release import ReleaseAudio
@@ -23,7 +24,8 @@ admin.site.register(Label)
admin.site.register(Release, DefaultAdmin) admin.site.register(Release, DefaultAdmin)
admin.site.register(ReleaseAudio) admin.site.register(ReleaseAudio)
admin.site.register(Venue) admin.site.register(Venue)
admin.site.register(Event) #admin.site.register(Event)
admin.site.register(UserProfile) admin.site.register(UserProfile)
admin.site.register(Recurrence) admin.site.register(Recurrence)
admin.site.register(ChatMessage) admin.site.register(ChatMessage)
admin.site.register(Show)

View File

@@ -3,9 +3,9 @@ import humanize
from tastypie.authorization import Authorization from tastypie.authorization import Authorization
from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource
from spa.models.recurrence import Recurrence from spa.models.recurrence import Recurrence
"""
from spa.models.venue import Venue from spa.models.venue import Venue
from spa.models.event import Event from spa.models.event import Event
class EventResource(BackboneCompatibleResource): class EventResource(BackboneCompatibleResource):
class Meta: class Meta:
queryset = Event.objects.all() queryset = Event.objects.all()
@@ -37,4 +37,5 @@ class EventResource(BackboneCompatibleResource):
if recurrence != None: if recurrence != None:
bundle.obj.event_recurrence = recurrence bundle.obj.event_recurrence = recurrence
return bundle return bundle
"""

View File

@@ -0,0 +1,26 @@
from tastypie.authorization import Authorization
from tastypie.exceptions import ImmediateHttpResponse
from tastypie.http import HttpBadRequest
from spa.api.v1.BackboneCompatibleResource import BackboneCompatibleResource
from spa.models import Show
from spa.models.show import ShowOverlapException
DATE_FORMAT = '%d/%m/%Y %H:%M:%S'
class ShowResource(BackboneCompatibleResource):
class Meta:
queryset = Show.objects.all()
authorization = Authorization()
resource_name = 'schedules'
def obj_create(self, bundle, **kwargs):
try:
return super(ShowResource, self).obj_create(bundle, **kwargs)
except ShowOverlapException:
raise ImmediateHttpResponse(
HttpBadRequest("This event overlaps with an existing event")
)

View File

@@ -76,8 +76,10 @@ class UserResource(BackboneCompatibleResource):
ret = super(UserResource, self).obj_update(bundle, skip_errors, **kwargs) ret = super(UserResource, self).obj_update(bundle, skip_errors, **kwargs)
"""
bundle.obj.update_follower(bundle.request.user, bundle.obj.update_follower(bundle.request.user,
bundle.data['favourited']) bundle.data['favourited'])
"""
update_geo_info_task.delay(ip_address=bundle.request.META['REMOTE_ADDR'], update_geo_info_task.delay(ip_address=bundle.request.META['REMOTE_ADDR'],
profile_id=bundle.request.user.get_profile().id) profile_id=bundle.request.user.get_profile().id)

View File

@@ -41,7 +41,7 @@ class SqlPrintingMiddleware(object):
indentation = 2 indentation = 2
if len(connection.queries) > 0 and settings.DEBUG: if len(connection.queries) > 0 and settings.DEBUG:
width = terminal_width() width = 10000 #terminal_width()
total_time = 0.0 total_time = 0.0
for query in connection.queries: for query in connection.queries:
nice_sql = query['sql'].replace('"', '').replace(',', ', ') nice_sql = query['sql'].replace('"', '').replace(',', ', ')

View File

@@ -0,0 +1,457 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Deleting field 'Label.object_updated'
db.delete_column(u'spa_label', 'object_updated')
# Deleting field 'Label.object_created'
db.delete_column(u'spa_label', 'object_created')
# Deleting field 'Mix.object_updated'
db.delete_column(u'spa_mix', 'object_updated')
# Deleting field 'Mix.object_created'
db.delete_column(u'spa_mix', 'object_created')
# Deleting field 'Tracklist.object_updated'
db.delete_column(u'spa_tracklist', 'object_updated')
# Deleting field 'Tracklist.object_created'
db.delete_column(u'spa_tracklist', 'object_created')
# Deleting field 'ReleaseAudio.object_updated'
db.delete_column(u'spa_releaseaudio', 'object_updated')
# Deleting field 'ReleaseAudio.object_created'
db.delete_column(u'spa_releaseaudio', 'object_created')
# Deleting field 'Genre.object_updated'
db.delete_column(u'spa_genre', 'object_updated')
# Deleting field 'Genre.object_created'
db.delete_column(u'spa_genre', 'object_created')
# Deleting field 'UserProfile.object_created'
db.delete_column(u'spa_userprofile', 'object_created')
# Deleting field 'UserProfile.object_updated'
db.delete_column(u'spa_userprofile', 'object_updated')
# Deleting field 'Venue.object_updated'
db.delete_column(u'spa_venue', 'object_updated')
# Deleting field 'Venue.object_created'
db.delete_column(u'spa_venue', 'object_created')
# Deleting field '_Lookup.object_updated'
db.delete_column(u'spa__lookup', 'object_updated')
# Deleting field '_Lookup.object_created'
db.delete_column(u'spa__lookup', 'object_created')
# Deleting field 'Activity.object_updated'
db.delete_column(u'spa_activity', 'object_updated')
# Deleting field 'Activity.object_created'
db.delete_column(u'spa_activity', 'object_created')
# Deleting field 'Release.object_updated'
db.delete_column(u'spa_release', 'object_updated')
# Deleting field 'Release.object_created'
db.delete_column(u'spa_release', 'object_created')
# Deleting field 'PurchaseLink.object_updated'
db.delete_column(u'spa_purchaselink', 'object_updated')
# Deleting field 'PurchaseLink.object_created'
db.delete_column(u'spa_purchaselink', 'object_created')
# Deleting field 'ChatMessage.object_updated'
db.delete_column(u'spa_chatmessage', 'object_updated')
# Deleting field 'ChatMessage.object_created'
db.delete_column(u'spa_chatmessage', 'object_created')
# Deleting field 'Comment.object_updated'
db.delete_column(u'spa_comment', 'object_updated')
# Deleting field 'Comment.object_created'
db.delete_column(u'spa_comment', 'object_created')
# Deleting field 'Notification.object_updated'
db.delete_column(u'spa_notification', 'object_updated')
# Deleting field 'Notification.object_created'
db.delete_column(u'spa_notification', 'object_created')
def backwards(self, orm):
# Adding field 'Label.object_updated'
db.add_column(u'spa_label', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'Label.object_created'
db.add_column(u'spa_label', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'Mix.object_updated'
db.add_column(u'spa_mix', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'Mix.object_created'
db.add_column(u'spa_mix', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'Tracklist.object_updated'
db.add_column(u'spa_tracklist', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'Tracklist.object_created'
db.add_column(u'spa_tracklist', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'ReleaseAudio.object_updated'
db.add_column(u'spa_releaseaudio', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'ReleaseAudio.object_created'
db.add_column(u'spa_releaseaudio', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'Genre.object_updated'
db.add_column(u'spa_genre', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'Genre.object_created'
db.add_column(u'spa_genre', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'UserProfile.object_created'
db.add_column(u'spa_userprofile', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'UserProfile.object_updated'
db.add_column(u'spa_userprofile', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'Venue.object_updated'
db.add_column(u'spa_venue', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'Venue.object_created'
db.add_column(u'spa_venue', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field '_Lookup.object_updated'
db.add_column(u'spa__lookup', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field '_Lookup.object_created'
db.add_column(u'spa__lookup', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'Activity.object_updated'
db.add_column(u'spa_activity', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'Activity.object_created'
db.add_column(u'spa_activity', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'Release.object_updated'
db.add_column(u'spa_release', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'Release.object_created'
db.add_column(u'spa_release', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'PurchaseLink.object_updated'
db.add_column(u'spa_purchaselink', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'PurchaseLink.object_created'
db.add_column(u'spa_purchaselink', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'ChatMessage.object_updated'
db.add_column(u'spa_chatmessage', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'ChatMessage.object_created'
db.add_column(u'spa_chatmessage', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'Comment.object_updated'
db.add_column(u'spa_comment', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'Comment.object_created'
db.add_column(u'spa_comment', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
# Adding field 'Notification.object_updated'
db.add_column(u'spa_notification', 'object_updated',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now=True, blank=True, db_index=True),
keep_default=False)
# Adding field 'Notification.object_created'
db.add_column(u'spa_notification', 'object_created',
self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2014, 3, 11, 0, 0), auto_now_add=True, blank=True),
keep_default=False)
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'spa._lookup': {
'Meta': {'object_name': '_Lookup'},
'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'spa.activity': {
'Meta': {'object_name': 'Activity'},
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']", 'null': 'True', 'blank': 'True'})
},
'spa.activitycomment': {
'Meta': {'object_name': 'ActivityComment', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_comments'", 'to': "orm['spa.Mix']"})
},
'spa.activitydownload': {
'Meta': {'object_name': 'ActivityDownload', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_downloads'", 'to': "orm['spa.Mix']"})
},
'spa.activityfavourite': {
'Meta': {'object_name': 'ActivityFavourite', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_favourites'", 'to': "orm['spa.Mix']"})
},
'spa.activityfollow': {
'Meta': {'object_name': 'ActivityFollow', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_follow'", 'to': "orm['spa.UserProfile']"})
},
'spa.activitylike': {
'Meta': {'object_name': 'ActivityLike', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_likes'", 'to': "orm['spa.Mix']"})
},
'spa.activityplay': {
'Meta': {'object_name': 'ActivityPlay', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_plays'", 'to': "orm['spa.Mix']"})
},
'spa.chatmessage': {
'Meta': {'object_name': 'ChatMessage'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'message': ('django.db.models.fields.TextField', [], {}),
'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'chat_messages'", 'null': 'True', 'to': "orm['spa.UserProfile']"})
},
'spa.comment': {
'Meta': {'object_name': 'Comment'},
'comment': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comments'", 'null': 'True', 'to': "orm['spa.Mix']"}),
'time_index': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
'spa.event': {
'Meta': {'object_name': 'Event'},
'attendees': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'attendees'", 'symmetrical': 'False', 'to': u"orm['auth.User']"}),
'date_created': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 4, 28, 0, 0)'}),
'event_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 4, 28, 0, 0)'}),
'event_description': ('django.db.models.fields.TextField', [], {}),
'event_recurrence': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Recurrence']"}),
'event_time': ('django.db.models.fields.TimeField', [], {'default': 'datetime.datetime(2014, 4, 28, 0, 0)'}),
'event_title': ('django.db.models.fields.CharField', [], {'max_length': '250'}),
'event_venue': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Venue']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'spa.genre': {
'Meta': {'object_name': 'Genre'},
'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
},
'spa.label': {
'Meta': {'object_name': 'Label'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'spa.mix': {
'Meta': {'object_name': 'Mix'},
'description': ('django.db.models.fields.TextField', [], {}),
'download_allowed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'favourites': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'favourites'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
'filetype': ('django.db.models.fields.CharField', [], {'default': "'mp3'", 'max_length': '10'}),
'genres': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['spa.Genre']", 'symmetrical': 'False'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_featured': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'likes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'likes'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}),
'mp3tags_updated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
'uid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '38', 'blank': 'True'}),
'upload_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2014, 4, 28, 0, 0)'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mixes'", 'to': "orm['spa.UserProfile']"}),
'waveform_generated': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
},
'spa.notification': {
'Meta': {'object_name': 'Notification'},
'accepted_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'from_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'notifications'", 'null': 'True', 'to': "orm['spa.UserProfile']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'notification_html': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'notification_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}),
'target': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}),
'verb': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'})
},
'spa.purchaselink': {
'Meta': {'object_name': 'PurchaseLink'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'track': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'purchase_link'", 'to': "orm['spa.Tracklist']"}),
'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
},
'spa.recurrence': {
'Meta': {'object_name': 'Recurrence', '_ormbases': ['spa._Lookup']},
u'_lookup_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa._Lookup']", 'unique': 'True', 'primary_key': 'True'})
},
'spa.release': {
'Meta': {'object_name': 'Release'},
'embed_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'release_artist': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'release_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 4, 28, 0, 0)'}),
'release_description': ('django.db.models.fields.TextField', [], {}),
'release_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'release_label': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Label']"}),
'release_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']"})
},
'spa.releaseaudio': {
'Meta': {'object_name': 'ReleaseAudio'},
'description': ('django.db.models.fields.TextField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'release_audio'", 'null': 'True', 'to': "orm['spa.Release']"})
},
'spa.tracklist': {
'Meta': {'object_name': 'Tracklist'},
'artist': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'index': ('django.db.models.fields.SmallIntegerField', [], {}),
'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tracklist'", 'to': "orm['spa.Mix']"}),
'remixer': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'timeindex': ('django.db.models.fields.TimeField', [], {'null': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
},
'spa.userprofile': {
'Meta': {'object_name': 'UserProfile'},
'activity_sharing': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'activity_sharing_networks': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'avatar_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}),
'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}),
'city': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'country': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}),
'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}),
'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_known_session': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'default': 'None', 'max_length': '50', 'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'userprofile'", 'unique': 'True', 'to': u"orm['auth.User']"})
},
'spa.venue': {
'Meta': {'object_name': 'Venue'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
'venue_address': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'venue_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'venue_name': ('django.db.models.fields.CharField', [], {'max_length': '250'})
}
}
complete_apps = ['spa']

View File

@@ -0,0 +1,249 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Deleting model 'Event'
db.delete_table(u'spa_event')
# Removing M2M table for field attendees on 'Event'
db.delete_table(db.shorten_name(u'spa_event_attendees'))
def backwards(self, orm):
# Adding model 'Event'
db.create_table(u'spa_event', (
('event_description', self.gf('django.db.models.fields.TextField')()),
('event_recurrence', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['spa.Recurrence'])),
('event_time', self.gf('django.db.models.fields.TimeField')(default=datetime.datetime(2014, 4, 28, 0, 0))),
('event_date', self.gf('django.db.models.fields.DateField')(default=datetime.datetime(2014, 4, 28, 0, 0))),
('event_title', self.gf('django.db.models.fields.CharField')(max_length=250)),
('date_created', self.gf('django.db.models.fields.DateField')(default=datetime.datetime(2014, 4, 28, 0, 0))),
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('event_venue', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['spa.Venue'])),
))
db.send_create_signal('spa', ['Event'])
# Adding M2M table for field attendees on 'Event'
m2m_table_name = db.shorten_name(u'spa_event_attendees')
db.create_table(m2m_table_name, (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('event', models.ForeignKey(orm['spa.event'], null=False)),
('user', models.ForeignKey(orm[u'auth.user'], null=False))
))
db.create_unique(m2m_table_name, ['event_id', 'user_id'])
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'spa._lookup': {
'Meta': {'object_name': '_Lookup'},
'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'spa.activity': {
'Meta': {'object_name': 'Activity'},
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']", 'null': 'True', 'blank': 'True'})
},
'spa.activitycomment': {
'Meta': {'object_name': 'ActivityComment', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_comments'", 'to': "orm['spa.Mix']"})
},
'spa.activitydownload': {
'Meta': {'object_name': 'ActivityDownload', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_downloads'", 'to': "orm['spa.Mix']"})
},
'spa.activityfavourite': {
'Meta': {'object_name': 'ActivityFavourite', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_favourites'", 'to': "orm['spa.Mix']"})
},
'spa.activityfollow': {
'Meta': {'object_name': 'ActivityFollow', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_follow'", 'to': "orm['spa.UserProfile']"})
},
'spa.activitylike': {
'Meta': {'object_name': 'ActivityLike', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_likes'", 'to': "orm['spa.Mix']"})
},
'spa.activityplay': {
'Meta': {'object_name': 'ActivityPlay', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_plays'", 'to': "orm['spa.Mix']"})
},
'spa.chatmessage': {
'Meta': {'object_name': 'ChatMessage'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'message': ('django.db.models.fields.TextField', [], {}),
'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'chat_messages'", 'null': 'True', 'to': "orm['spa.UserProfile']"})
},
'spa.comment': {
'Meta': {'object_name': 'Comment'},
'comment': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comments'", 'null': 'True', 'to': "orm['spa.Mix']"}),
'time_index': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
'spa.genre': {
'Meta': {'object_name': 'Genre'},
'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
},
'spa.label': {
'Meta': {'object_name': 'Label'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'spa.mix': {
'Meta': {'object_name': 'Mix'},
'description': ('django.db.models.fields.TextField', [], {}),
'download_allowed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'favourites': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'favourites'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
'filetype': ('django.db.models.fields.CharField', [], {'default': "'mp3'", 'max_length': '10'}),
'genres': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['spa.Genre']", 'symmetrical': 'False'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_featured': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'likes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'likes'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}),
'mp3tags_updated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
'uid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '38', 'blank': 'True'}),
'upload_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2014, 4, 29, 0, 0)'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mixes'", 'to': "orm['spa.UserProfile']"}),
'waveform_generated': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
},
'spa.notification': {
'Meta': {'object_name': 'Notification'},
'accepted_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'from_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'notifications'", 'null': 'True', 'to': "orm['spa.UserProfile']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'notification_html': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'notification_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}),
'target': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}),
'verb': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'})
},
'spa.purchaselink': {
'Meta': {'object_name': 'PurchaseLink'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'track': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'purchase_link'", 'to': "orm['spa.Tracklist']"}),
'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
},
'spa.recurrence': {
'Meta': {'object_name': 'Recurrence', '_ormbases': ['spa._Lookup']},
u'_lookup_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa._Lookup']", 'unique': 'True', 'primary_key': 'True'})
},
'spa.release': {
'Meta': {'object_name': 'Release'},
'embed_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'release_artist': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'release_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 4, 29, 0, 0)'}),
'release_description': ('django.db.models.fields.TextField', [], {}),
'release_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'release_label': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Label']"}),
'release_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']"})
},
'spa.releaseaudio': {
'Meta': {'object_name': 'ReleaseAudio'},
'description': ('django.db.models.fields.TextField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'release_audio'", 'null': 'True', 'to': "orm['spa.Release']"})
},
'spa.tracklist': {
'Meta': {'object_name': 'Tracklist'},
'artist': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'index': ('django.db.models.fields.SmallIntegerField', [], {}),
'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tracklist'", 'to': "orm['spa.Mix']"}),
'remixer': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'timeindex': ('django.db.models.fields.TimeField', [], {'null': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
},
'spa.userprofile': {
'Meta': {'object_name': 'UserProfile'},
'activity_sharing': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'activity_sharing_networks': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'avatar_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}),
'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}),
'city': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'country': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}),
'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}),
'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_known_session': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'default': 'None', 'max_length': '50', 'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'userprofile'", 'unique': 'True', 'to': u"orm['auth.User']"})
},
'spa.venue': {
'Meta': {'object_name': 'Venue'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
'venue_address': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'venue_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'venue_name': ('django.db.models.fields.CharField', [], {'max_length': '250'})
}
}
complete_apps = ['spa']

View File

@@ -0,0 +1,262 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'Show'
db.create_table(u'spa_show', (
(u'event_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['schedule.Event'], unique=True, primary_key=True)),
))
db.send_create_signal('spa', ['Show'])
def backwards(self, orm):
# Deleting model 'Show'
db.delete_table(u'spa_show')
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'schedule.calendar': {
'Meta': {'object_name': 'Calendar'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200'})
},
'schedule.event': {
'Meta': {'object_name': 'Event'},
'calendar': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Calendar']", 'null': 'True', 'blank': 'True'}),
'created_on': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'creator': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'creator'", 'null': 'True', 'to': u"orm['auth.User']"}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'end': ('django.db.models.fields.DateTimeField', [], {}),
'end_recurring_period': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'rule': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['schedule.Rule']", 'null': 'True', 'blank': 'True'}),
'start': ('django.db.models.fields.DateTimeField', [], {}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'updated_on': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
},
'schedule.rule': {
'Meta': {'object_name': 'Rule'},
'description': ('django.db.models.fields.TextField', [], {}),
'frequency': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
'params': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'spa._lookup': {
'Meta': {'object_name': '_Lookup'},
'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'spa.activity': {
'Meta': {'object_name': 'Activity'},
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']", 'null': 'True', 'blank': 'True'})
},
'spa.activitycomment': {
'Meta': {'object_name': 'ActivityComment', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_comments'", 'to': "orm['spa.Mix']"})
},
'spa.activitydownload': {
'Meta': {'object_name': 'ActivityDownload', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_downloads'", 'to': "orm['spa.Mix']"})
},
'spa.activityfavourite': {
'Meta': {'object_name': 'ActivityFavourite', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_favourites'", 'to': "orm['spa.Mix']"})
},
'spa.activityfollow': {
'Meta': {'object_name': 'ActivityFollow', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_follow'", 'to': "orm['spa.UserProfile']"})
},
'spa.activitylike': {
'Meta': {'object_name': 'ActivityLike', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_likes'", 'to': "orm['spa.Mix']"})
},
'spa.activityplay': {
'Meta': {'object_name': 'ActivityPlay', '_ormbases': ['spa.Activity']},
u'activity_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa.Activity']", 'unique': 'True', 'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'activity_plays'", 'to': "orm['spa.Mix']"})
},
'spa.chatmessage': {
'Meta': {'object_name': 'ChatMessage'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'message': ('django.db.models.fields.TextField', [], {}),
'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'chat_messages'", 'null': 'True', 'to': "orm['spa.UserProfile']"})
},
'spa.comment': {
'Meta': {'object_name': 'Comment'},
'comment': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comments'", 'null': 'True', 'to': "orm['spa.Mix']"}),
'time_index': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
'spa.genre': {
'Meta': {'object_name': 'Genre'},
'description': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'slug': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
},
'spa.label': {
'Meta': {'object_name': 'Label'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'spa.mix': {
'Meta': {'object_name': 'Mix'},
'description': ('django.db.models.fields.TextField', [], {}),
'download_allowed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'duration': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'favourites': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'favourites'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
'filetype': ('django.db.models.fields.CharField', [], {'default': "'mp3'", 'max_length': '10'}),
'genres': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['spa.Genre']", 'symmetrical': 'False'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_featured': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'likes': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'likes'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
'mix_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}),
'mp3tags_updated': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
'uid': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '38', 'blank': 'True'}),
'upload_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2014, 4, 29, 0, 0)'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'mixes'", 'to': "orm['spa.UserProfile']"}),
'waveform_generated': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
},
'spa.notification': {
'Meta': {'object_name': 'Notification'},
'accepted_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'date': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'from_user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'notifications'", 'null': 'True', 'to': "orm['spa.UserProfile']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'notification_html': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'notification_text': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'notification_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}),
'target': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'}),
'to_user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'to_notications'", 'to': "orm['spa.UserProfile']"}),
'verb': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True'})
},
'spa.purchaselink': {
'Meta': {'object_name': 'PurchaseLink'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'track': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'purchase_link'", 'to': "orm['spa.Tracklist']"}),
'url': ('django.db.models.fields.URLField', [], {'max_length': '200'})
},
'spa.recurrence': {
'Meta': {'object_name': 'Recurrence', '_ormbases': ['spa._Lookup']},
u'_lookup_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['spa._Lookup']", 'unique': 'True', 'primary_key': 'True'})
},
'spa.release': {
'Meta': {'object_name': 'Release'},
'embed_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'release_artist': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'release_date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 4, 29, 0, 0)'}),
'release_description': ('django.db.models.fields.TextField', [], {}),
'release_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'release_label': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.Label']"}),
'release_title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['spa.UserProfile']"})
},
'spa.releaseaudio': {
'Meta': {'object_name': 'ReleaseAudio'},
'description': ('django.db.models.fields.TextField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'release': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'release_audio'", 'null': 'True', 'to': "orm['spa.Release']"})
},
'spa.show': {
'Meta': {'object_name': 'Show', '_ormbases': ['schedule.Event']},
u'event_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['schedule.Event']", 'unique': 'True', 'primary_key': 'True'})
},
'spa.tracklist': {
'Meta': {'object_name': 'Tracklist'},
'artist': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'index': ('django.db.models.fields.SmallIntegerField', [], {}),
'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'mix': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tracklist'", 'to': "orm['spa.Mix']"}),
'remixer': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'timeindex': ('django.db.models.fields.TimeField', [], {'null': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
},
'spa.userprofile': {
'Meta': {'object_name': 'UserProfile'},
'activity_sharing': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'activity_sharing_networks': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'avatar_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '1024', 'blank': 'True'}),
'avatar_type': ('django.db.models.fields.CharField', [], {'default': "'social'", 'max_length': '15'}),
'city': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'country': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'blank': 'True'}),
'display_name': ('django.db.models.fields.CharField', [], {'max_length': '35', 'blank': 'True'}),
'following': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'followers'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['spa.UserProfile']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_known_session': ('django.db.models.fields.CharField', [], {'max_length': '250', 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'default': 'None', 'max_length': '50', 'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'userprofile'", 'unique': 'True', 'to': u"orm['auth.User']"})
},
'spa.venue': {
'Meta': {'object_name': 'Venue'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
'venue_address': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'venue_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
'venue_name': ('django.db.models.fields.CharField', [], {'max_length': '250'})
}
}
complete_apps = ['spa']

View File

@@ -4,7 +4,6 @@ from chatmessage import ChatMessage
from recurrence import Recurrence from recurrence import Recurrence
from comment import Comment from comment import Comment
from venue import Venue from venue import Venue
from event import Event
from label import Label from label import Label
from mix import Mix from mix import Mix
from activity import Activity from activity import Activity
@@ -13,3 +12,4 @@ from genre import Genre
from tracklist import Tracklist from tracklist import Tracklist
from purchaselink import PurchaseLink from purchaselink import PurchaseLink
from release import Release from release import Release
from show import Show

View File

@@ -4,7 +4,7 @@ from django.db import models
from spa.models import Recurrence from spa.models import Recurrence
from spa.models.venue import Venue from spa.models.venue import Venue
"""
class Event(models.Model): class Event(models.Model):
class Meta: class Meta:
app_label = 'spa' app_label = 'spa'
@@ -25,4 +25,5 @@ class Event(models.Model):
return '/event/%i' % self.id return '/event/%i' % self.id
def __unicode__(self): def __unicode__(self):
return self.event_title return self.event_title
"""

23
spa/models/show.py Normal file
View File

@@ -0,0 +1,23 @@
from django.db.models import Q
from schedule.models import Event
class ShowOverlapException(Exception):
pass
class Show(Event):
class Meta:
app_label = 'spa'
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
"""
throw an exception if event overlaps with another event
"""
overlaps = Show.objects.filter(
Q(start__gte=self.start, end__lte=self.start) |
Q(start__gte=self.end, end__lte=self.end)
)
if len(overlaps) != 0:
raise ShowOverlapException()
return super(Show, self).save(force_insert, force_update, using, update_fields)

View File

@@ -12,9 +12,8 @@ from sorl import thumbnail
from sorl.thumbnail.helpers import ThumbnailError from sorl.thumbnail.helpers import ThumbnailError
from core.utils.file import generate_save_file_name from core.utils.file import generate_save_file_name
from core.utils.url import unique_slugify, wrap_full from core.utils.url import unique_slugify
from dss import settings from dss import settings
from spa.models.notification import Notification
from spa.models._basemodel import _BaseModel from spa.models._basemodel import _BaseModel

60
spa/tests/schedule.py Normal file
View File

@@ -0,0 +1,60 @@
from datetime import datetime
from django.test import TestCase
from spa.models import Show
from spa.models.show import ShowOverlapException
DATE_FORMAT = '%d/%m/%Y %H:%M:%S'
START_DATE = datetime.strptime("28/04/2013 12:00:00", DATE_FORMAT)
END_DATE = datetime.strptime("28/04/2013 13:00:00", DATE_FORMAT)
class TestScheduleOverlaps(TestCase):
def setUp(self):
Show.objects.all().delete()
Show(description="Test event one", start=START_DATE, end=END_DATE).save()
def test_first_show_saved(self):
self.assertEqual(len(Show.objects.all()), 1)
def test_same_event_overlap(self):
try:
Show(description="Test overlapping event", start=START_DATE, end=END_DATE).save()
self.fail("Shows cannot overlap each other")
except ShowOverlapException:
pass
except Exception, ex:
self.fail(ex.message)
def test_two_events_flush(self):
try:
start = datetime.strptime("28/04/2013 13:00:00", DATE_FORMAT)
end = datetime.strptime("28/04/2013 14:00:00", DATE_FORMAT)
Show(description="Another show begins in middle of this show", start=start, end=end).save()
except ShowOverlapException:
self.fail("These events do not overlap, they are flush")
except Exception, ex:
self.fail(ex.message)
def test_event_straddle_start_end(self):
try:
start = datetime.strptime("28/04/2013 11:30:00", DATE_FORMAT)
end = datetime.strptime("28/04/2013 12:30:00", DATE_FORMAT)
Show(description="Another show begins in middle of this show", start=start, end=end).save()
self.fail("Should not be able to save a show straddling another show")
except ShowOverlapException:
pass
except Exception, ex:
self.fail(ex.message)
def test_event_straddle_end_start(self):
try:
start = datetime.strptime("28/04/2013 12:30:00", DATE_FORMAT)
end = datetime.strptime("28/04/2013 13:30:00", DATE_FORMAT)
s = Show(description="Show begins in middle of another show", start=start, end=end)
s.save()
import ipdb; ipdb.set_trace()
self.fail("Should not be able to save a show straddling another show")
except ShowOverlapException:
pass
except Exception, ex:
self.fail(ex.message)

View File

@@ -7,12 +7,13 @@ from spa.api.v1.NotificationResource import NotificationResource
from spa.audio import AudioHandler from spa.audio import AudioHandler
from spa.api.v1.ChatResource import ChatResource from spa.api.v1.ChatResource import ChatResource
from spa.api.v1.CommentResource import CommentResource from spa.api.v1.CommentResource import CommentResource
from spa.api.v1.EventResource import EventResource #from spa.api.v1.EventResource import EventResource
from spa.api.v1.MixResource import MixResource from spa.api.v1.MixResource import MixResource
from spa.api.v1.ReleaseAudioResource import ReleaseAudioResource from spa.api.v1.ReleaseAudioResource import ReleaseAudioResource
from spa.api.v1.ReleaseResource import ReleaseResource 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
from spa.api.v1.ShowResource import ShowResource
api = Api(api_name='v1') api = Api(api_name='v1')
api.register(ChatResource()) api.register(ChatResource())
@@ -20,10 +21,11 @@ api.register(CommentResource())
api.register(MixResource()) api.register(MixResource())
api.register(ReleaseResource()) api.register(ReleaseResource())
api.register(ReleaseAudioResource()) api.register(ReleaseAudioResource())
api.register(EventResource()) #api.register(EventResource())
api.register(UserResource()) api.register(UserResource())
api.register(ActivityResource()) api.register(ActivityResource())
api.register(NotificationResource()) api.register(NotificationResource())
api.register(ShowResource())
api.register(DebugResource()) api.register(DebugResource())
ajax = AjaxHandler() ajax = AjaxHandler()
@@ -35,7 +37,6 @@ urlpatterns = patterns(
url(r'^tpl/(?P<template_name>\w+)/$', 'spa.templates.get_template'), url(r'^tpl/(?P<template_name>\w+)/$', 'spa.templates.get_template'),
url(r'^dlg/(?P<dialog_name>\w+)/$', 'spa.templates.get_dialog'), url(r'^dlg/(?P<dialog_name>\w+)/$', 'spa.templates.get_dialog'),
url(r'^dlg/embed/(?P<slug>[\w\d_.-]+)/$', 'spa.templates.get_embed_codes_dialog'), url(r'^dlg/embed/(?P<slug>[\w\d_.-]+)/$', 'spa.templates.get_embed_codes_dialog'),
url(r'^js/(?P<template_name>\w+)/$', 'spa.templates.get_javascript'), url(r'^js/(?P<template_name>\w+)/$', 'spa.templates.get_javascript'),
url(r'^tplex/(?P<template_name>\w+)/$', 'spa.templates.get_template_ex'), url(r'^tplex/(?P<template_name>\w+)/$', 'spa.templates.get_template_ex'),
url(r'^podcast', 'spa.podcast.get_default_podcast'), url(r'^podcast', 'spa.podcast.get_default_podcast'),
@@ -51,5 +52,3 @@ urlpatterns = patterns(
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

@@ -27,7 +27,7 @@ def app(request):
'bust': uuid.uuid1() 'bust': uuid.uuid1()
} }
if request.user_agent.browser.family == 'Firefox': if request.user_agent.browser.family == '___Firefox___':
context['ua_html'] = \ context['ua_html'] = \
"""<div class="alert alert-block alert-warning"> """<div class="alert alert-block alert-warning">
<button type="button" class="close" data-dismiss="alert"> <button type="button" class="close" data-dismiss="alert">

View File

@@ -1,15 +1,17 @@
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/schedule/scheduleView',
'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/mixCollection', 'models/mix/mixItem', 'models/user/userItem'], 'models/mix/mixCollection', 'models/mix/mixItem', 'models/user/userItem'],
(App, Marionette, vent, utils, (App, Marionette, vent, utils,
MixListLayout, MixListView, MixDetailView, MixListLayout, MixListView, MixDetailView,
ScheduleView,
MixEditView, UserProfileView, UserListView, UserEditView, MixEditView, UserProfileView, UserListView, UserEditView,
MixCollection, MixItem, UserItem)-> MixCollection, MixItem, UserItem)->
class DssController extends Marionette.Controller class DssController extends Marionette.Controller
initialize: -> initialize: ->
@listenTo(vent, "mix:random", @showRandomMix) @listenTo(vent, "mix:random", @showRandomMix)
home: -> home: ->
console.log "Controller: home" console.log "Controller: home"
@@ -18,13 +20,18 @@ define ['app', 'marionette', 'vent', 'utils'
doLogin: -> doLogin: ->
vent.trigger('app:login') vent.trigger('app:login')
showMixList: (options) -> showSchedule: ->
app = require('app') app = require('app')
app.contentRegion.show(new MixListLayout(options or {order_by: 'latest'})) app.contentRegion.show(new ScheduleView())
vent.trigger('schedule:show')
showMixList: (options, emptyTemplate) ->
app = require('app')
app.contentRegion.show(new MixListLayout(options or {order_by: 'latest'}, emptyTemplate))
vent.trigger('mix:showlist', options or {order_by: 'latest'}) vent.trigger('mix:showlist', options or {order_by: 'latest'})
showStreamList: () -> showStreamList: () ->
@showMixList({stream: true}) @showMixList({stream: true}, '/tpl/EmptyTemplate')
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/mixCollection', 'models/mix/mixItem', 'models/user/userItem'], function(App, Marionette, vent, utils, MixListLayout, MixListView, MixDetailView, MixEditView, UserProfileView, UserListView, UserEditView, MixCollection, MixItem, UserItem) { define(['app', 'marionette', 'vent', 'utils', 'views/mix/mixListLayout', 'views/mix/mixListView', 'views/mix/mixDetailView', 'views/schedule/scheduleView', 'views/mix/mixEditView', 'views/user/userProfileView', 'views/user/userListView', 'views/user/userEditView', 'models/mix/mixCollection', 'models/mix/mixItem', 'models/user/userItem'], function(App, Marionette, vent, utils, MixListLayout, MixListView, MixDetailView, ScheduleView, MixEditView, UserProfileView, UserListView, UserEditView, MixCollection, MixItem, UserItem) {
var DssController; var DssController;
DssController = (function(_super) { DssController = (function(_super) {
@@ -26,12 +26,19 @@
return vent.trigger('app:login'); return vent.trigger('app:login');
}; };
DssController.prototype.showMixList = function(options) { DssController.prototype.showSchedule = function() {
var app;
app = require('app');
app.contentRegion.show(new ScheduleView());
return vent.trigger('schedule:show');
};
DssController.prototype.showMixList = function(options, emptyTemplate) {
var app; var app;
app = require('app'); app = require('app');
app.contentRegion.show(new MixListLayout(options || { app.contentRegion.show(new MixListLayout(options || {
order_by: 'latest' order_by: 'latest'
})); }, emptyTemplate));
return vent.trigger('mix:showlist', options || { return vent.trigger('mix:showlist', options || {
order_by: 'latest' order_by: 'latest'
}); });
@@ -40,7 +47,7 @@
DssController.prototype.showStreamList = function() { DssController.prototype.showStreamList = function() {
return this.showMixList({ return this.showMixList({
stream: true stream: true
}); }, '/tpl/EmptyTemplate');
}; };
DssController.prototype.showMixListType = function(type) { DssController.prototype.showMixListType = function(type) {

View File

@@ -16,6 +16,7 @@ define ['marionette', 'vent', 'app.lib/controller'],
"chat": "showChat", "chat": "showChat",
"random": "showRandomMix", "random": "showRandomMix",
"stream": "showStreamList", "stream": "showStreamList",
"schedule": "showSchedule",
"login": "doLogin" "login": "doLogin"

View File

@@ -27,6 +27,7 @@
"chat": "showChat", "chat": "showChat",
"random": "showRandomMix", "random": "showRandomMix",
"stream": "showStreamList", "stream": "showStreamList",
"schedule": "showSchedule",
"login": "doLogin", "login": "doLogin",
"users": "showUserList", "users": "showUserList",
"user/:slug/favourites": "showUserFavourites", "user/:slug/favourites": "showUserFavourites",

View File

@@ -0,0 +1,7 @@
define ['marionette'],
(Marionette)->
class GenericView extends Marionette.ItemView
initialize: (options)->
@template = _.template(options.template)
true

View File

@@ -0,0 +1,27 @@
// Generated by CoffeeScript 1.4.0
(function() {
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; };
define(['marionette'], function(Marionette) {
var GenericView;
return GenericView = (function(_super) {
__extends(GenericView, _super);
function GenericView() {
return GenericView.__super__.constructor.apply(this, arguments);
}
GenericView.prototype.initialize = function(options) {
return this.template = _.template(options.template);
};
true;
return GenericView;
})(Marionette.ItemView);
});
}).call(this);

View File

@@ -1,11 +1,11 @@
define [ define [
'marionette', 'vent', 'marionette', 'vent',
'models/user/userItem', 'models/mix/mixCollection' 'models/user/userItem', 'models/mix/mixCollection'
'views/widgets/mixTabHeaderView', 'views/user/userItemView', 'views/mix/mixListView', 'views/widgets/mixTabHeaderView', 'views/user/userItemView', 'views/mix/mixListView', 'views/genericView',
'text!/tpl/MixListLayoutView'], 'text!/tpl/MixListLayoutView'],
(Marionette, vent, (Marionette, vent,
UserItem, MixCollection, UserItem, MixCollection,
MixTabHeaderView, UserItemView, MixListView, MixTabHeaderView, UserItemView, MixListView, GenericView,
Template) -> Template) ->
class MixListLayout extends Marionette.Layout class MixListLayout extends Marionette.Layout
template: _.template(Template) template: _.template(Template)
@@ -14,21 +14,24 @@ define [
bodyRegion: "#mix-list-body" bodyRegion: "#mix-list-body"
} }
initialize: (options)-> initialize: (options, emptyTemplate)->
@listenTo(vent, "mix:showlist", @showMixList) @listenTo(vent, "mix:showlist", @showMixList)
@listenTo(vent, "user:showdetail", @showUserView) @listenTo(vent, "user:showdetail", @showUserView)
@showMixList(options) @showMixList(options, emptyTemplate)
onShow: -> onShow: ->
@headerRegion.show(new MixTabHeaderView()) @headerRegion.show(new MixTabHeaderView())
showMixList: (options) -> showMixList: (options, emptyTemplate) ->
@collection = new MixCollection() @collection = new MixCollection()
@collection.fetch @collection.fetch
data: options data: options
success: (collection)=> success: (collection)=>
@bodyRegion.show(new MixListView({collection: collection})) if collection.length > 0
@bodyRegion.show(new MixListView({collection: collection}))
else
$.get emptyTemplate, (data) =>
@bodyRegion.show(new GenericView({template: data}))
showUserView: (options) -> showUserView: (options) ->
@bodyRegion.show(new MixListView(options)) @bodyRegion.show(new MixListView(options))
user = new UserItem({id: options.user}) user = new UserItem({id: options.user})
@@ -37,4 +40,4 @@ define [
@headerRegion.show(new UserItemView({model: user})) @headerRegion.show(new UserItemView({model: user}))
) )
MixListLayout MixListLayout

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(['marionette', 'vent', 'models/user/userItem', 'models/mix/mixCollection', 'views/widgets/mixTabHeaderView', 'views/user/userItemView', 'views/mix/mixListView', 'text!/tpl/MixListLayoutView'], function(Marionette, vent, UserItem, MixCollection, MixTabHeaderView, UserItemView, MixListView, Template) { define(['marionette', 'vent', 'models/user/userItem', 'models/mix/mixCollection', 'views/widgets/mixTabHeaderView', 'views/user/userItemView', 'views/mix/mixListView', 'views/genericView', 'text!/tpl/MixListLayoutView'], function(Marionette, vent, UserItem, MixCollection, MixTabHeaderView, UserItemView, MixListView, GenericView, Template) {
var MixListLayout; var MixListLayout;
MixListLayout = (function(_super) { MixListLayout = (function(_super) {
@@ -20,25 +20,33 @@
bodyRegion: "#mix-list-body" bodyRegion: "#mix-list-body"
}; };
MixListLayout.prototype.initialize = function(options) { MixListLayout.prototype.initialize = function(options, emptyTemplate) {
this.listenTo(vent, "mix:showlist", this.showMixList); this.listenTo(vent, "mix:showlist", this.showMixList);
this.listenTo(vent, "user:showdetail", this.showUserView); this.listenTo(vent, "user:showdetail", this.showUserView);
return this.showMixList(options); return this.showMixList(options, emptyTemplate);
}; };
MixListLayout.prototype.onShow = function() { MixListLayout.prototype.onShow = function() {
return this.headerRegion.show(new MixTabHeaderView()); return this.headerRegion.show(new MixTabHeaderView());
}; };
MixListLayout.prototype.showMixList = function(options) { MixListLayout.prototype.showMixList = function(options, emptyTemplate) {
var _this = this; var _this = this;
this.collection = new MixCollection(); this.collection = new MixCollection();
return this.collection.fetch({ return this.collection.fetch({
data: options, data: options,
success: function(collection) { success: function(collection) {
return _this.bodyRegion.show(new MixListView({ if (collection.length > 0) {
collection: collection return _this.bodyRegion.show(new MixListView({
})); collection: collection
}));
} else {
return $.get(emptyTemplate, function(data) {
return _this.bodyRegion.show(new GenericView({
template: data
}));
});
}
} }
}); });
}; };

View File

@@ -4,7 +4,6 @@ define ['marionette', 'vent', 'models/mix/mixCollection', 'views/mix/mixItemView
template: _.template(Template) template: _.template(Template)
className: "mix-listing audio-listing" className: "mix-listing audio-listing"
emptyView: Marionette.ItemView.extend(template: "#mix-empty-view")
itemView: MixItemView itemView: MixItemView
itemViewContainer: "#mix-list-container-ul" itemViewContainer: "#mix-list-container-ul"

View File

@@ -18,10 +18,6 @@
MixListView.prototype.className = "mix-listing audio-listing"; MixListView.prototype.className = "mix-listing audio-listing";
MixListView.prototype.emptyView = Marionette.ItemView.extend({
template: "#mix-empty-view"
});
MixListView.prototype.itemView = MixItemView; MixListView.prototype.itemView = MixItemView;
MixListView.prototype.itemViewContainer = "#mix-list-container-ul"; MixListView.prototype.itemViewContainer = "#mix-list-container-ul";

View File

@@ -0,0 +1,130 @@
define ['app', 'vent', 'marionette', 'fullcalendar', 'text!/tpl/ScheduleView'],
(App, vent, Marionette, fullcalendar, Template)->
class ScheduleView extends Marionette.ItemView
template: _.template(Template)
onShow: ->
$("#external-events div.external-event").each ->
# create an Event Object (http://arshaw.com/fullcalendar/docs/event_data/Event_Object/)
# it doesn't need to have a start or end
eventObject =
title: $.trim($(this).text()) # use the element's text as the event title
# store the Event Object in the DOM element so we can get to it later
$(this).data "eventObject", eventObject
# make the event draggable using jQuery UI
$(this).draggable
zIndex: 999
revert: true # will cause the event to go back to its
revertDuration: 0 # original position after the drag
return
date = new Date()
d = date.getDate()
m = date.getMonth()
y = date.getFullYear()
calendar = $("#calendar").fullCalendar(
#isRTL: true,
buttonText:
prev: "<i class=\"ace-icon fa fa-chevron-left\"></i>"
next: "<i class=\"ace-icon fa fa-chevron-right\"></i>"
header:
left: "prev,next today"
center: "title"
right: "month,agendaWeek,agendaDay"
events: [
{
title: "All Day Event"
start: new Date(y, m, 1)
className: "label-important"
}
{
title: "Long Event"
start: new Date(y, m, d - 5)
end: new Date(y, m, d - 2)
className: "label-success"
}
{
title: "Some Event"
start: new Date(y, m, d - 3, 16, 0)
allDay: false
}
]
editable: true
droppable: true # this allows things to be dropped onto the calendar !!!
drop: (date, allDay) -> # this function is called when something is dropped
# retrieve the dropped element's stored Event Object
originalEventObject = $(this).data("eventObject")
$extraEventClass = $(this).attr("data-class")
# we need to copy it, so that multiple events don't have a reference to the same object
copiedEventObject = $.extend({}, originalEventObject)
# assign it the date that was reported
copiedEventObject.start = date
copiedEventObject.allDay = allDay
copiedEventObject["className"] = [$extraEventClass] if $extraEventClass
# render the event on the calendar
# the last `true` argument determines if the event "sticks" (http://arshaw.com/fullcalendar/docs/event_rendering/renderEvent/)
$("#calendar").fullCalendar "renderEvent", copiedEventObject, true
# is the "remove after drop" checkbox checked?
# if so, remove the element from the "Draggable Events" list
$(this).remove() if $("#drop-remove").is(":checked")
return
selectable: true
selectHelper: true
select: (start, end, allDay) ->
bootbox.prompt "New Event Title:", (title) ->
if title isnt null
calendar.fullCalendar "renderEvent",
title: title
start: start
end: end
allDay: allDay
, true # make the event "stick"
return
calendar.fullCalendar "unselect"
return
eventClick: (calEvent, jsEvent, view) ->
#display a modal
modal = "<div class=\"modal fade\">\t\t\t <div class=\"modal-dialog\">\t\t\t <div class=\"modal-content\">\t\t\t\t <div class=\"modal-body\">\t\t\t\t <button type=\"button\" class=\"close\" data-dismiss=\"modal\" style=\"margin-top:-10px;\">&times;</button>\t\t\t\t <form class=\"no-margin\">\t\t\t\t\t <label>Change event name &nbsp;</label>\t\t\t\t\t <input class=\"middle\" autocomplete=\"off\" type=\"text\" value=\"" + calEvent.title + "\" />\t\t\t\t\t <button type=\"submit\" class=\"btn btn-sm btn-success\"><i class=\"ace-icon fa fa-check\"></i> Save</button>\t\t\t\t </form>\t\t\t\t </div>\t\t\t\t <div class=\"modal-footer\">\t\t\t\t\t<button type=\"button\" class=\"btn btn-sm btn-danger\" data-action=\"delete\"><i class=\"ace-icon fa fa-trash-o\"></i> Delete Event</button>\t\t\t\t\t<button type=\"button\" class=\"btn btn-sm\" data-dismiss=\"modal\"><i class=\"ace-icon fa fa-times\"></i> Cancel</button>\t\t\t\t </div>\t\t\t </div>\t\t\t </div>\t\t\t</div>"
modal = $(modal).appendTo("body")
modal.find("form").on "submit", (ev) ->
ev.preventDefault()
calEvent.title = $(this).find("input[type=text]").val()
calendar.fullCalendar "updateEvent", calEvent
modal.modal "hide"
return
modal.find("button[data-action=delete]").on "click", ->
calendar.fullCalendar "removeEvents", (ev) ->
ev._id is calEvent._id
modal.modal "hide"
return
modal.modal("show").on "hidden", ->
modal.remove()
return
return
)
true
ScheduleView

View File

@@ -0,0 +1,125 @@
// Generated by CoffeeScript 1.4.0
(function() {
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; };
define(['app', 'vent', 'marionette', 'fullcalendar', 'text!/tpl/ScheduleView'], function(App, vent, Marionette, fullcalendar, Template) {
var ScheduleView;
ScheduleView = (function(_super) {
__extends(ScheduleView, _super);
function ScheduleView() {
return ScheduleView.__super__.constructor.apply(this, arguments);
}
ScheduleView.prototype.template = _.template(Template);
ScheduleView.prototype.onShow = function() {
var calendar, d, date, m, y;
$("#external-events div.external-event").each(function() {
var eventObject;
eventObject = {
title: $.trim($(this).text())
};
$(this).data("eventObject", eventObject);
$(this).draggable({
zIndex: 999,
revert: true,
revertDuration: 0
});
});
date = new Date();
d = date.getDate();
m = date.getMonth();
y = date.getFullYear();
return calendar = $("#calendar").fullCalendar({
buttonText: {
prev: "<i class=\"ace-icon fa fa-chevron-left\"></i>",
next: "<i class=\"ace-icon fa fa-chevron-right\"></i>"
},
header: {
left: "prev,next today",
center: "title",
right: "month,agendaWeek,agendaDay"
},
events: [
{
title: "All Day Event",
start: new Date(y, m, 1),
className: "label-important"
}, {
title: "Long Event",
start: new Date(y, m, d - 5),
end: new Date(y, m, d - 2),
className: "label-success"
}, {
title: "Some Event",
start: new Date(y, m, d - 3, 16, 0),
allDay: false
}
],
editable: true,
droppable: true,
drop: function(date, allDay) {
var $extraEventClass, copiedEventObject, originalEventObject;
originalEventObject = $(this).data("eventObject");
$extraEventClass = $(this).attr("data-class");
copiedEventObject = $.extend({}, originalEventObject);
copiedEventObject.start = date;
copiedEventObject.allDay = allDay;
if ($extraEventClass) {
copiedEventObject["className"] = [$extraEventClass];
}
$("#calendar").fullCalendar("renderEvent", copiedEventObject, true);
if ($("#drop-remove").is(":checked")) {
$(this).remove();
}
},
selectable: true,
selectHelper: true,
select: function(start, end, allDay) {
bootbox.prompt("New Event Title:", function(title) {
if (title !== null) {
calendar.fullCalendar("renderEvent", {
title: title,
start: start,
end: end,
allDay: allDay
}, true);
}
});
calendar.fullCalendar("unselect");
},
eventClick: function(calEvent, jsEvent, view) {
var modal;
modal = "<div class=\"modal fade\">\t\t\t <div class=\"modal-dialog\">\t\t\t <div class=\"modal-content\">\t\t\t\t <div class=\"modal-body\">\t\t\t\t <button type=\"button\" class=\"close\" data-dismiss=\"modal\" style=\"margin-top:-10px;\">&times;</button>\t\t\t\t <form class=\"no-margin\">\t\t\t\t\t <label>Change event name &nbsp;</label>\t\t\t\t\t <input class=\"middle\" autocomplete=\"off\" type=\"text\" value=\"" + calEvent.title + "\" />\t\t\t\t\t <button type=\"submit\" class=\"btn btn-sm btn-success\"><i class=\"ace-icon fa fa-check\"></i> Save</button>\t\t\t\t </form>\t\t\t\t </div>\t\t\t\t <div class=\"modal-footer\">\t\t\t\t\t<button type=\"button\" class=\"btn btn-sm btn-danger\" data-action=\"delete\"><i class=\"ace-icon fa fa-trash-o\"></i> Delete Event</button>\t\t\t\t\t<button type=\"button\" class=\"btn btn-sm\" data-dismiss=\"modal\"><i class=\"ace-icon fa fa-times\"></i> Cancel</button>\t\t\t\t </div>\t\t\t </div>\t\t\t </div>\t\t\t</div>";
modal = $(modal).appendTo("body");
modal.find("form").on("submit", function(ev) {
ev.preventDefault();
calEvent.title = $(this).find("input[type=text]").val();
calendar.fullCalendar("updateEvent", calEvent);
modal.modal("hide");
});
modal.find("button[data-action=delete]").on("click", function() {
calendar.fullCalendar("removeEvents", function(ev) {
return ev._id === calEvent._id;
});
modal.modal("hide");
});
modal.modal("show").on("hidden", function() {
modal.remove();
});
}
});
};
true;
return ScheduleView;
})(Marionette.ItemView);
return ScheduleView;
});
}).call(this);

View File

@@ -5,6 +5,7 @@ requirejs.config({
paths: { paths: {
site: 'app/site', site: 'app/site',
jquery: 'lib/jquery', jquery: 'lib/jquery',
'jquery-ui': 'lib/ace/uncompressed/jquery-ui-1.10.3.custom',
backbone: 'lib/backbone', backbone: 'lib/backbone',
'backbone-associations': 'lib/backbone.associations', 'backbone-associations': 'lib/backbone.associations',
'backbone.syphon': 'lib/backbone.syphon', 'backbone.syphon': 'lib/backbone.syphon',
@@ -26,6 +27,7 @@ requirejs.config({
wysiwyg: 'lib/ace/uncompressed/bootstrap-wysiwyg', wysiwyg: 'lib/ace/uncompressed/bootstrap-wysiwyg',
wizard: 'lib/ace/uncompressed/fuelux/fuelux.wizard', wizard: 'lib/ace/uncompressed/fuelux/fuelux.wizard',
dropzone: 'lib/ace/uncompressed/dropzone', dropzone: 'lib/ace/uncompressed/dropzone',
fullcalendar: 'lib/ace/uncompressed/fullcalendar',
'ace-editable': 'lib/ace/uncompressed/x-editable/ace-editable', 'ace-editable': 'lib/ace/uncompressed/x-editable/ace-editable',
'bootstrap-editable': 'lib/ace/uncompressed/x-editable/bootstrap-editable', 'bootstrap-editable': 'lib/ace/uncompressed/x-editable/bootstrap-editable',
'facebook': '//connect.facebook.net/en_US/all', 'facebook': '//connect.facebook.net/en_US/all',
@@ -82,6 +84,10 @@ requirejs.config({
'facebook': { 'facebook': {
exports: 'FB' exports: 'FB'
}, },
'fullcalendar': {
exports: 'fullCalendar',
deps: ['jquery', 'jquery-ui']
},
'ace': { 'ace': {
exports: 'ace', exports: 'ace',
deps: ['jquery', 'lib/ace/uncompressed/ace-elements', 'lib/ace/uncompressed/ace-extra'] deps: ['jquery', 'lib/ace/uncompressed/ace-elements', 'lib/ace/uncompressed/ace-extra']

View File

@@ -12,6 +12,7 @@
<link rel="stylesheet" href="{% static "css/bootstrap.css" %}"/> <link rel="stylesheet" href="{% static "css/bootstrap.css" %}"/>
<link rel="stylesheet" href="{% static "css/jasny-bootstrap.css" %}"> <link rel="stylesheet" href="{% static "css/jasny-bootstrap.css" %}">
<link rel="stylesheet" href="{% static "css/ace/fullcalendar.css" %}"/>
<link rel="stylesheet" href="{% static "css/ace/dropzone.css" %}"/> <link rel="stylesheet" href="{% static "css/ace/dropzone.css" %}"/>
<link rel="stylesheet" href="{% static "css/ace/uncompressed/ace.css" %}"/> <link rel="stylesheet" href="{% static "css/ace/uncompressed/ace.css" %}"/>
<link rel="stylesheet" href="{% static "css/ace/uncompressed/ace-skins.css" %}"/> <link rel="stylesheet" href="{% static "css/ace/uncompressed/ace-skins.css" %}"/>

View File

@@ -0,0 +1 @@
<h1>Add some stuff!!</h1>

View File

@@ -1,2 +1 @@
<ul id="mix-list-container-ul" class="mix-listing audio-listing"></ul> <ul id="mix-list-container-ul" class="mix-listing audio-listing"></ul>
<div id="#mix-empty-view">No items to display</div>

View File

@@ -0,0 +1,61 @@
<div class="row">
<div class="col-sm-9">
<div class="space"></div>
<div id="calendar"></div>
</div>
<div class="col-sm-3">
<div class="widget-box transparent">
<div class="widget-header">
<h4>Draggable events</h4>
</div>
<div class="widget-body">
<div class="widget-main no-padding">
<div id="external-events">
<div class="external-event label-grey" data-class="label-grey">
<i class="ace-icon fa fa-arrows"></i>
My Event 1
</div>
<div class="external-event label-success" data-class="label-success">
<i class="ace-icon fa fa-arrows"></i>
My Event 2
</div>
<div class="external-event label-danger" data-class="label-danger">
<i class="ace-icon fa fa-arrows"></i>
My Event 3
</div>
<div class="external-event label-purple" data-class="label-purple">
<i class="ace-icon fa fa-arrows"></i>
My Event 4
</div>
<div class="external-event label-yellow" data-class="label-yellow">
<i class="ace-icon fa fa-arrows"></i>
My Event 5
</div>
<div class="external-event label-pink" data-class="label-pink">
<i class="ace-icon fa fa-arrows"></i>
My Event 6
</div>
<div class="external-event label-info" data-class="label-info">
<i class="ace-icon fa fa-arrows"></i>
My Event 7
</div>
<label>
<input type="checkbox" class="ace ace-checkbox" id="drop-remove"/>
<span class="lbl"> Remove after drop</span>
</label>
</div>
</div>
</div>
</div>
</div>
</div>