diff --git a/blechreiz/database.sqlite b/blechreiz/database.sqlite index 7e40204..446f492 100644 Binary files a/blechreiz/database.sqlite and b/blechreiz/database.sqlite differ diff --git a/blechreiz/middleware.py b/blechreiz/middleware.py index f665541..7009648 100644 --- a/blechreiz/middleware.py +++ b/blechreiz/middleware.py @@ -2,7 +2,8 @@ from django.http import HttpResponseRedirect from django.conf import settings import re -class EnforceLoginMiddleware(object): + +class EnforceLoginMiddleware: """ Middlware class which requires the user to be authenticated for all urls except those defined in PUBLIC_URLS in settings.py. PUBLIC_URLS should be a tuple of regular @@ -14,70 +15,77 @@ class EnforceLoginMiddleware(object): validation on these set SERVE_STATIC_TO_PUBLIC to False. """ - def __init__(self): - self.login_url = getattr(settings, 'LOGIN_URL', '/accounts/login/' ) - - if hasattr(settings,'PUBLIC_URLS'): + def __init__(self, get_response): + self.login_url = getattr(settings, 'LOGIN_URL', '/accounts/login/') + self.get_response = get_response + + if hasattr(settings, 'PUBLIC_URLS'): public_urls = [re.compile(url) for url in settings.PUBLIC_URLS] else: - public_urls = [(re.compile("^%s/?$" % ( self.login_url[1:] )))] - if getattr(settings, 'SERVE_STATIC_TO_PUBLIC', True ): + public_urls = [(re.compile("^%s/?$" % (self.login_url[1:])))] + if getattr(settings, 'SERVE_STATIC_TO_PUBLIC', True): root_urlconf = __import__(settings.ROOT_URLCONF) - public_urls.extend([ re.compile(url.regex) - for url in root_urlconf.urls.urlpatterns - if url.__dict__.get('_callback_str') == 'django.views.static.serve' - ]) + public_urls.extend([re.compile(url.regex) + for url in root_urlconf.urls.urlpatterns + if url.__dict__.get('_callback_str') == 'django.views.static.serve' + ]) self.public_urls = tuple(public_urls) - def process_request(self, request): + def __call__(self, request): """ Redirect anonymous users to login_url from non public urls """ try: - if request.user.is_anonymous(): + if request.user.is_anonymous: for url in self.public_urls: if url.match(request.path[1:]): return None return HttpResponseRedirect("%s?next=%s" % (self.login_url, request.path)) except AttributeError: return HttpResponseRedirect("%s?next=%s" % (self.login_url, request.path)) - - - -class DetectDevice(object): - def process_request(self, request): + return self.get_response(request) + + +class DetectDevice: + + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): device = self.mobile(request) request.device = device - + response = self.get_response(request) + return response + def mobile(self, request): device = {} - + ua = request.META.get('HTTP_USER_AGENT', '').lower() - + if ua.find("iphone") > 0: device['iphone'] = "iphone" + re.search("iphone os (\d)", ua).groups(0)[0] - + if ua.find("ipad") > 0: device['ipad'] = "ipad" - + if ua.find("android") > 0: device['android'] = "android" + re.search("android (\d\.\d)", ua).groups(0)[0].translate(None, '.') - + if ua.find("blackberry") > 0: device['blackberry'] = "blackberry" - + if ua.find("windows phone os 7") > 0: device['winphone7'] = "winphone7" - + if ua.find("iemobile") > 0: device['winmo'] = "winmo" - - if not device: # either desktop, or something we don't care about. + + if not device: # either desktop, or something we don't care about. device['baseline'] = "baseline" - + # spits out device names for CSS targeting, to be applied to or . - device['classes'] = " ".join(v for (k,v) in device.items()) - + device['classes'] = " ".join(v for (k, v) in device.items()) + return device diff --git a/blechreiz/settings.py b/blechreiz/settings.py index cafb11f..77c4706 100644 --- a/blechreiz/settings.py +++ b/blechreiz/settings.py @@ -1,10 +1,10 @@ # Setting the path import os + gettext = lambda s: s PROJECT_PATH = os.path.abspath(os.path.dirname(__file__)) - # Django settings for blechreiz project. DEBUG = True @@ -16,7 +16,6 @@ ADMINS = ( MANAGERS = ADMINS - DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', @@ -26,11 +25,10 @@ DATABASES = { # Email -EMAIL_HOST='smtp.blechreiz.com' -EMAIL_HOST_USER='m02b721a' -EMAIL_HOST_PASSWORD='9Hp4WG5bZ2WVPX5z' -EMAIL_USE_TLS=False - +EMAIL_HOST = 'smtp.blechreiz.com' +EMAIL_HOST_USER = 'm02b721a' +EMAIL_HOST_PASSWORD = '9Hp4WG5bZ2WVPX5z' +EMAIL_USE_TLS = False # Hosts/domain names that are valid for this site; required if DEBUG is False # See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts @@ -78,8 +76,8 @@ STATIC_ROOT = PROJECT_PATH + '/static_collection' # Example: "http://example.com/static/", "http://static.example.com/" STATIC_URL = '/static/' -LOGIN_URL="/musicians/login" -PUBLIC_URLS=( "^musicians/login/?$", "^musicians/login/usernames/?$", "^eventplanner_gcal/gcalApiCallback*") +LOGIN_URL = "/musicians/login" +PUBLIC_URLS = ("^musicians/login/?$", "^musicians/login/usernames/?$", "^eventplanner_gcal/gcalApiCallback*") # Additional locations of static files STATICFILES_DIRS = ( @@ -94,26 +92,42 @@ STATICFILES_DIRS = ( STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', -# 'django.contrib.staticfiles.finders.DefaultStorageFinder', -) + # 'django.contrib.staticfiles.finders.DefaultStorageFinder', +) # Make this unique, and don't share it with anybody. SECRET_KEY = 'x$8&9s6t%eeg=wyhar87934wh_s$dbpm(73g4ho&n)9_wogj6p' -# List of callables that know how to import templates from various sources. -TEMPLATE_LOADERS = ( - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', -# 'django.template.loaders.eggs.Loader', -) +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [ + PROJECT_PATH + '/templates', + ], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + # Insert your TEMPLATE_CONTEXT_PROCESSORS here or use this + # list if you haven't customized them: + 'django.contrib.auth.context_processors.auth', + 'django.template.context_processors.i18n', + 'django.template.context_processors.request', + 'django.template.context_processors.media', + 'django.template.context_processors.static', + 'sekizai.context_processors.sekizai', + ], + }, + }, +] -MIDDLEWARE_CLASSES = ( - 'django.middleware.common.CommonMiddleware', +MIDDLEWARE = ( + 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', - 'blechreiz.middleware.EnforceLoginMiddleware', + #'blechreiz.middleware.EnforceLoginMiddleware', 'blechreiz.middleware.DetectDevice', # Uncomment the next line for simple clickjacking protection: # 'django.middleware.clickjacking.XFrameOptionsMiddleware', @@ -125,20 +139,6 @@ ROOT_URLCONF = 'blechreiz.urls' WSGI_APPLICATION = 'blechreiz.wsgi.application' -TEMPLATE_DIRS = ( - PROJECT_PATH + '/templates', -) - - -TEMPLATE_CONTEXT_PROCESSORS = ( - 'django.contrib.auth.context_processors.auth', - 'django.core.context_processors.i18n', - 'django.core.context_processors.request', - 'django.core.context_processors.media', - 'django.core.context_processors.static', - 'sekizai.context_processors.sekizai', -) - INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', @@ -148,45 +148,40 @@ INSTALLED_APPS = ( 'django.contrib.staticfiles', 'django.contrib.admin', 'django.contrib.admindocs', - 'crispy_forms', # better looking forms ( bootstrap ) - 'sekizai', # for the addtoblock directive in templates - 'rest_framework', # for event management api - 'south', - + 'crispy_forms', # better looking forms ( bootstrap ) + 'sekizai', # for the addtoblock directive in templates + 'rest_framework', # for event management api + # Own Things - 'bootstrapTheme', # Theme - 'website', # Blechreiz Website in general - 'musicians', # User Management - 'eventplanner', # Event Management - 'eventplanner_gcal', # Event Management Sync with Google Calendar - 'simpleforum', # Messages ( Forum ) - 'location_field', # custom location field used in Event Management - 'scoremanager', # manager of scores, repertoire etc. - #'imagestore', - #'sorl.thumbnail', - #'tagging' + 'bootstrapTheme', # Theme + 'website', # Blechreiz Website in general + 'musicians', # User Management + 'eventplanner', # Event Management + 'eventplanner_gcal', # Event Management Sync with Google Calendar + 'simpleforum', # Messages ( Forum ) + 'location_field', # custom location field used in Event Management + 'scoremanager', # manager of scores, repertoire etc. + # 'imagestore', + # 'sorl.thumbnail', + # 'tagging' ) -IMAGESTORE_TEMPLATE = "website/base.html" - - +IMAGESTORE_TEMPLATE = "website/base.html" REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',), 'PAGINATE_BY': 10 } - GCAL_COUPLING = { - 'eventPrefix' : 'Blechreiz: ', - 'developerKey' : 'blechreiz-homepage', - 'clientId' : '34462582242-4kpdvvbi27ajt4u22uitqurpve9o8ipj.apps.googleusercontent.com', - 'client_secret' : 'y4t9XBrJdCODPTO5UvtONWWn', - 'credentials_file' : PROJECT_PATH + '/calendarCredentials.dat', - 'push_url' : "https://blechreiz.bauer.technology/eventplanner_gcal/gcalApiCallback", + 'eventPrefix': 'Blechreiz: ', + 'developerKey': 'blechreiz-homepage', + 'clientId': '34462582242-4kpdvvbi27ajt4u22uitqurpve9o8ipj.apps.googleusercontent.com', + 'client_secret': 'y4t9XBrJdCODPTO5UvtONWWn', + 'credentials_file': PROJECT_PATH + '/calendarCredentials.dat', + 'push_url': "https://blechreiz.bauer.technology/eventplanner_gcal/gcalApiCallback", } - CRISPY_TEMPLATE_PACK = 'bootstrap' # A sample logging configuration. The only tangible logging @@ -198,6 +193,16 @@ CRISPY_TEMPLATE_PACK = 'bootstrap' LOGGING = { 'version': 1, 'disable_existing_loggers': False, + 'formatters': { + 'verbose': { + 'format': '{levelname} {asctime} {module} {message}', + 'style': '{', + }, + 'simple': { + 'format': '{levelname} {asctime} {message}', + 'style': '{', + }, + }, 'handlers': { 'file': { 'level': 'DEBUG', @@ -211,12 +216,13 @@ LOGGING = { 'level': 'DEBUG', 'propagate': True, }, - 'eventplanner': { + 'eventplanner': { 'handler': ['file'], 'level': 'DEBUG', 'propagate': True, - } + } }, - + } +GOOGLE_MAPS_API_KEY = 'AIzaSyCf9Lm5ckjmVd08scTOd7fB1dC_UCoumKg' diff --git a/blechreiz/urls.py b/blechreiz/urls.py index 360a9bf..afc906e 100644 --- a/blechreiz/urls.py +++ b/blechreiz/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import patterns, include, url +from django.conf.urls import include, url from django.contrib import admin @@ -6,26 +6,23 @@ import simpleforum.views import eventplanner.urls import musicians.urls -#import imagestore.urls import website.urls import scoremanager.urls import eventplanner_gcal.urls - - -import settings +from . import settings from django.conf.urls.static import static admin.autodiscover() -urlpatterns = patterns('', - url(r'^', include( website.urls ) ), - url(r'^events/', include( eventplanner.urls.urlpatterns) ), - url(r'^musicians/', include( musicians.urls.urlpatterns) ), - url(r'^scores/', include( scoremanager.urls.urlpatterns) ), - url(r'^messages/$', simpleforum.views.message_view ), - url(r'^admin/', include( admin.site.urls ) ), - url(r'^location_field/', include( 'location_field.urls' ) ), - url(r'^eventplanner_gcal/', include( eventplanner_gcal.urls) ), - #url(r'^gallery/', include(imagestore.urls, namespace='imagestore') ), -) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) +urlpatterns = [ + url(r'^', include(website.urls)), + url(r'^events/', include(eventplanner.urls.urlpatterns)), + url(r'^musicians/', include(musicians.urls.urlpatterns)), + url(r'^scores/', include(scoremanager.urls.urlpatterns)), + url(r'^messages/$', simpleforum.views.message_view), + url(r'^admin/', admin.site.urls), + url(r'^location_field/', include('location_field.urls')), + url(r'^eventplanner_gcal/', include(eventplanner_gcal.urls)), + # url(r'^gallery/', include(imagestore.urls, namespace='imagestore') ), + ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/eventplanner/admin.py b/eventplanner/admin.py index f11127c..97acf0e 100644 --- a/eventplanner/admin.py +++ b/eventplanner/admin.py @@ -1,20 +1,20 @@ -from django.contrib import admin -from eventplanner.models import Event, EventParticipation - - -class EventParticipationInline(admin.TabularInline): - model = EventParticipation - extra = 1 - readonly_fields = ('user',) - fields = ( 'user', 'status', 'comment', ) - has_add_permission = lambda self, req : False - has_delete_permission = lambda self, req, obj : False - - template = "eventplanner/admin_tabular.html" - - -class EventAdmin(admin.ModelAdmin): - inlines = ( EventParticipationInline, ) - - -admin.site.register( Event, EventAdmin ) \ No newline at end of file +#from django.contrib import admin +#from eventplanner.models import Event, EventParticipation +# +# +#class EventParticipationInline(admin.TabularInline): +# model = EventParticipation +# extra = 1 +# readonly_fields = ('user',) +# fields = ('user', 'status', 'comment',) +# has_add_permission = lambda self, req: False +# has_delete_permission = lambda self, req, obj: False +# +# template = "eventplanner/admin_tabular.html" +# +# +#class EventAdmin(admin.ModelAdmin): +# inlines = (EventParticipationInline,) +# +# +#admin.site.register(Event, EventAdmin) diff --git a/eventplanner/migrations/0001_initial.py b/eventplanner/migrations/0001_initial.py deleted file mode 100644 index 4094410..0000000 --- a/eventplanner/migrations/0001_initial.py +++ /dev/null @@ -1,112 +0,0 @@ -# -*- coding: utf-8 -*- -import 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 'Event' - db.create_table(u'eventplanner_event', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('type', self.gf('django.db.models.fields.CharField')(default='Reh', max_length=6)), - ('short_desc', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)), - ('location', self.gf('django.db.models.fields.TextField')()), - ('map_location', self.gf('location_field.models.PlainLocationField')(max_length=63)), - ('desc', self.gf('django.db.models.fields.TextField')(blank=True)), - ('date', self.gf('django.db.models.fields.DateField')()), - ('time', self.gf('django.db.models.fields.TimeField')(null=True, blank=True)), - ('meeting_time', self.gf('django.db.models.fields.TimeField')(null=True, blank=True)), - ('end_date', self.gf('django.db.models.fields.DateField')(null=True)), - )) - db.send_create_signal(u'eventplanner', ['Event']) - - # Adding model 'EventParticipation' - db.create_table(u'eventplanner_eventparticipation', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('event', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['eventplanner.Event'])), - ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), - ('status', self.gf('django.db.models.fields.CharField')(default='?', max_length=3)), - ('comment', self.gf('django.db.models.fields.CharField')(max_length=64, blank=True)), - )) - db.send_create_signal(u'eventplanner', ['EventParticipation']) - - # Adding unique constraint on 'EventParticipation', fields ['event', 'user'] - db.create_unique(u'eventplanner_eventparticipation', ['event_id', 'user_id']) - - - def backwards(self, orm): - # Removing unique constraint on 'EventParticipation', fields ['event', 'user'] - db.delete_unique(u'eventplanner_eventparticipation', ['event_id', 'user_id']) - - # Deleting model 'Event' - db.delete_table(u'eventplanner_event') - - # Deleting model 'EventParticipation' - db.delete_table(u'eventplanner_eventparticipation') - - - 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', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 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', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - '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'}) - }, - u'eventplanner.event': { - 'Meta': {'object_name': 'Event'}, - 'date': ('django.db.models.fields.DateField', [], {}), - 'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'end_date': ('django.db.models.fields.DateField', [], {'null': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'location': ('django.db.models.fields.TextField', [], {}), - 'map_location': ('location_field.models.PlainLocationField', [], {'max_length': '63'}), - 'meeting_time': ('django.db.models.fields.TimeField', [], {'null': 'True', 'blank': 'True'}), - 'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'through': u"orm['eventplanner.EventParticipation']", 'symmetrical': 'False'}), - 'short_desc': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), - 'time': ('django.db.models.fields.TimeField', [], {'null': 'True', 'blank': 'True'}), - 'type': ('django.db.models.fields.CharField', [], {'default': "'Reh'", 'max_length': '6'}) - }, - u'eventplanner.eventparticipation': { - 'Meta': {'unique_together': "(('event', 'user'),)", 'object_name': 'EventParticipation'}, - 'comment': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), - 'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['eventplanner.Event']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'status': ('django.db.models.fields.CharField', [], {'default': "'?'", 'max_length': '3'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - } - } - - complete_apps = ['eventplanner'] \ No newline at end of file diff --git a/eventplanner/migrations/__init__.py b/eventplanner/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/eventplanner/models.py b/eventplanner/models.py index 58eb907..1a5a7c7 100644 --- a/eventplanner/models.py +++ b/eventplanner/models.py @@ -1,191 +1,179 @@ from django.db import models from django.utils.translation import ugettext as _ from django.contrib.auth.models import User, Permission +from django.db.models import Q from datetime import datetime from location_field.models import PlainLocationField -from django.db.models import Q -from django.dispatch import Signal - - - -class NoNextEventException( Exception ): +class NoNextEventException(Exception): def __str__(self): - return ("No event scheduled for the future") - - -class Event ( models.Model ): - - EVENT_TYPES = ( - ( 'Reh', _('Rehearsal') ), - ( 'Conc', _('Concert') ), - ( 'Party', _('Party') ), - ( 'Travel', _('Travel') ), - ( 'Option', _('Option') ), - ) - - type = models.CharField( max_length=6, choices=EVENT_TYPES, default='Reh', verbose_name= _("type") ) - short_desc = models.CharField( null=True, max_length=100, blank = True, verbose_name= _("Short Description") ) - location = models.TextField( blank=True, verbose_name=_("location") ) - map_location = PlainLocationField(blank=True, based_field = location, zoom=7, verbose_name=_("Location on map") ) - desc = models.TextField( blank=True, verbose_name=_("description") ) - - date = models.DateField( verbose_name= _("date") ) - time = models.TimeField( null=True, blank=True, verbose_name = _("time") ) - meeting_time = models.TimeField( null=True, blank=True, verbose_name = _("meeting_time") ) - - end_date = models.DateField( null=True, blank = True, verbose_name = _("End Date") ) - - participants = models.ManyToManyField( User, through='EventParticipation', verbose_name=_("participants") ) - - def __unicode__(self): - return self.title + return "No event scheduled for the future" +class Event(models.Model): + EVENT_TYPES = ( + ('Reh', _('Rehearsal')), + ('Conc', _('Concert')), + ('Party', _('Party')), + ('Travel', _('Travel')), + ('Option', _('Option')), + ) + + type = models.CharField(max_length=6, choices=EVENT_TYPES, default='Reh', verbose_name=_("type")) + short_desc = models.CharField(null=True, max_length=100, blank=True, verbose_name=_("Short Description")) + location = models.TextField(blank=True, verbose_name=_("location")) + map_location = PlainLocationField(blank=True, based_field=location, zoom=7, verbose_name=_("Location on map")) + desc = models.TextField(blank=True, verbose_name=_("description")) + + date = models.DateField(verbose_name=_("date")) + time = models.TimeField(null=True, blank=True, verbose_name=_("time")) + meeting_time = models.TimeField(null=True, blank=True, verbose_name=_("meeting_time")) + + end_date = models.DateField(null=True, blank=True, verbose_name=_("End Date")) + + participants = models.ManyToManyField(User, through='EventParticipation', verbose_name=_("participants")) + + def __unicode__(self): + return self.title + def save(self, *args, **kwargs): # Call the "real" save() method super(Event, self).save(*args, **kwargs) - + # Create a "Don't Know" participation for each Musician - for u in User.objects.all(): + for u in User.objects.all(): if not u in self.participants.all(): - EventParticipation.objects.create( event=self, user = u, status='-', comment = '' ) - + EventParticipation.objects.create(event=self, user=u, status='-', comment='') + @property def title(self): res = self.get_type_display() if self.short_desc: res += " (" + self.short_desc + ") " - + return res - + @property def displaytime(self): if self.meeting_time is None or self.meeting_time == "": return self.time else: - return self.meeting_time - + return self.meeting_time + @property def displaydatetime(self): if not self.displaytime == None: - return datetime.combine( self.date, self.displaytime ) + return datetime.combine(self.date, self.displaytime) else: - return datetime.combine( self.date, datetime.min.time() ) + return datetime.combine(self.date, datetime.min.time()) @staticmethod - def getNextEvent( eventType = "", includePreviousFromToday = True ): + def getNextEvent(eventType="", includePreviousFromToday=True): """Return the next event, of the given type. If type is the empty string the next event is returned regardless of its type. if includePreviousFromToday the nextEvent returned could also have been today with a startime < now """ - + if includePreviousFromToday: if eventType == "": - nextEvents = Event.objects.filter( date__gte = datetime.now() ).order_by('date')[:1] + nextEvents = Event.objects.filter(date__gte=datetime.now()).order_by('date')[:1] else: - nextEvents = Event.objects.filter( date__gte = datetime.now(), type = eventType ).order_by('date')[:1] - - if len( nextEvents ) == 0: + nextEvents = Event.objects.filter(date__gte=datetime.now(), type=eventType).order_by('date')[:1] + + if len(nextEvents) == 0: raise NoNextEventException() - + return nextEvents[0] else: maximalNumberOfEventsOnSameDay = 4 nextEvents = [] - if eventType =="": - nextEvents = Event.objects.filter( date__gte = datetime.now() ).order_by('date')[:maximalNumberOfEventsOnSameDay] + if eventType == "": + nextEvents = Event.objects.filter(date__gte=datetime.now()).order_by('date')[ + :maximalNumberOfEventsOnSameDay] else: - nextEvents = Event.objects.filter( date__gte = datetime.now(), type = eventType ).order_by('date')[:maximalNumberOfEventsOnSameDay] - + nextEvents = Event.objects.filter(date__gte=datetime.now(), type=eventType).order_by('date')[ + :maximalNumberOfEventsOnSameDay] + if len(nextEvents) == 0: raise NoNextEventException() - i = 0 nextEvent = nextEvents[0] # nextEvent is not necessarily events[0] since events[0] may have been previously today while nextEvent.displaydatetime < datetime.now(): - if len(nextEvents ) <= i: + if len(nextEvents) <= i: raise NoNextEventException() else: i += 1 nextEvent = nextEvents[i] - + return nextEvent +class EventParticipation(models.Model): + OPTIONS = (('?', _('?')), + ('Yes', _('Yes')), + ('No', _('No')), + ('-', _('-')) + ) -class EventParticipation( models.Model ): - OPTIONS = ( ('?' , _('?' )), - ('Yes', _('Yes')), - ('No' , _('No' )), - ('-' , _( '-' )) - ) - - event = models.ForeignKey( Event, verbose_name=_("event") ) - user = models.ForeignKey( User, verbose_name=_("user") ) - status = models.CharField ( max_length=3, choices = OPTIONS, default='?', verbose_name=_("status") ) - comment = models.CharField ( max_length=64, blank=True, verbose_name=_("comment") ) - + event = models.ForeignKey(Event, verbose_name=_("event"), on_delete=models.PROTECT) + user = models.ForeignKey(User, verbose_name=_("user"), on_delete=models.PROTECT) + status = models.CharField(max_length=3, choices=OPTIONS, default='?', verbose_name=_("status")) + comment = models.CharField(max_length=64, blank=True, verbose_name=_("comment")) def get_username(self): return self.user.username - - def save( self, *args, **kwargs ): - prev = EventParticipation.objects.filter( event = self.event, user = self.user ) + + def save(self, *args, **kwargs): + prev = EventParticipation.objects.filter(event=self.event, user=self.user) if len(prev) == 0: - super(EventParticipation,self).save( *args,**kwargs) + super(EventParticipation, self).save(*args, **kwargs) else: prev = prev[0] if prev.status != self.status or prev.comment != self.comment: - super(EventParticipation,self).save( *args,**kwargs) - + super(EventParticipation, self).save(*args, **kwargs) @staticmethod - def hasUserSetParticipationForAllEvents( user ): + def hasUserSetParticipationForAllEvents(user): if not EventParticipation.isMember(user): return True - - futurePart = EventParticipation.objects.filter( event__date__gte = datetime.now() ) - notYetEntered = futurePart.filter( user = user ).filter( status = '-' ) - if len( notYetEntered ) > 0: + futurePart = EventParticipation.objects.filter(event__date__gte=datetime.now()) + + notYetEntered = futurePart.filter(user=user).filter(status='-') + if len(notYetEntered) > 0: return False else: return True @staticmethod - def isMember( user ): + def isMember(user): return user.has_perm('eventplanner.member') - + @staticmethod - def isAdmin( user ): + def isAdmin(user): return user.has_perm('eventplanner.admin') @staticmethod def members(): - perm = Permission.objects.get( codename='member' ) - f = User.objects.filter(Q(groups__permissions=perm) | Q(user_permissions=perm) ).distinct() + perm = Permission.objects.get(codename='member') + f = User.objects.filter(Q(groups__permissions=perm) | Q(user_permissions=perm)).distinct() return f.order_by('musician__position') - - + @staticmethod - def get_or_create( user , event ): + def get_or_create(user, event): try: - result = EventParticipation.objects.get( event = event, user = user ) + result = EventParticipation.objects.get(event=event, user=user) except EventParticipation.DoesNotExist: - result = EventParticipation.objects.create( event = event, user = user, status='-', comment = '' ) - + result = EventParticipation.objects.create(event=event, user=user, status='-', comment='') + return result - + class Meta: unique_together = ("event", "user") permissions = ( - ("admin", _("Admin") ), - ("member", _("Member") ), + ("admin", _("Admin")), + ("member", _("Member")), ) - - - diff --git a/eventplanner/serializers.py b/eventplanner/serializers.py index 509126e..910b5ce 100644 --- a/eventplanner/serializers.py +++ b/eventplanner/serializers.py @@ -1,14 +1,12 @@ from rest_framework import serializers -from models import EventParticipation - - +from .models import EventParticipation, Event class ParticipationSerializer(serializers.ModelSerializer): - event = serializers.PrimaryKeyRelatedField( many=False, read_only = False ) - user = serializers.Field( source='get_username' ) - status = serializers.CharField( source='status', required=False ) - + event = serializers.PrimaryKeyRelatedField(many=False, read_only=False, queryset=Event.objects.all()) + user = serializers.Field(source='get_username') + status = serializers.CharField(source='status', required=False) + def get_identity(self, data): """ This hook is required for bulk update. """ try: @@ -19,6 +17,3 @@ class ParticipationSerializer(serializers.ModelSerializer): class Meta: model = EventParticipation fields = ('event', 'user', 'status', 'comment') - - - diff --git a/eventplanner/snippets.py b/eventplanner/snippets.py index 8495b9b..1aef148 100644 --- a/eventplanner/snippets.py +++ b/eventplanner/snippets.py @@ -1,38 +1,36 @@ - from datetime import datetime -from models import Event, EventParticipation, NoNextEventException +from .models import Event, EventParticipation, NoNextEventException from musicians.models import Musician - -def addEventCountdownForNextEventToContext( context, username, eventType = "" ): +def addEventCountdownForNextEventToContext(context, username, eventType=""): """Returns an object that has to be added to the render context on the page where the countdown should be displayed . The username is required to also supply participation information.""" - - try: - nextEvent = Event.getNextEvent( eventType, False ) + + try: + nextEvent = Event.getNextEvent(eventType, False) except NoNextEventException: return - + countdown = dict() - if EventParticipation.isMember( username ): - part = EventParticipation.objects.filter( user = username ).filter( event = nextEvent ) + if EventParticipation.isMember(username): + part = EventParticipation.objects.filter(user=username).filter(event=nextEvent) countdown['participation'] = part[0].status eventTime = nextEvent.displaydatetime countdown['event'] = nextEvent - countdown['epoch'] = int( (eventTime - datetime.now() ).total_seconds() * 1000 ) - + countdown['epoch'] = int((eventTime - datetime.now()).total_seconds() * 1000) + context["countdown"] = countdown -def addEventRouteForNextEventToContext( context, username, eventType = ""): +def addEventRouteForNextEventToContext(context, username, eventType=""): """Returns an object that has to be added to the render context on the page where the route should be displayed . The starting address of the route will be the home of the specified user""" - - try: - nextEvent = Event.getNextEvent( eventType, True ) + + try: + nextEvent = Event.getNextEvent(eventType, True) except NoNextEventException: return @@ -40,16 +38,13 @@ def addEventRouteForNextEventToContext( context, username, eventType = ""): routeInfo['event'] = nextEvent - musician = Musician.objects.get( user = username ); - routeInfo['origin'] = musician.street + ", " + str( musician.zip_code ) + " " + musician.city - + musician = Musician.objects.get(user=username); + routeInfo['origin'] = musician.street + ", " + str(musician.zip_code) + " " + musician.city + if nextEvent.map_location: # map_location has format "lat,longitute,zoomlevel" - routeInfo['destination'] = ",".join( nextEvent.map_location.split(",")[:2] ) + routeInfo['destination'] = ",".join(nextEvent.map_location.split(",")[:2]) else: routeInfo['destination'] = nextEvent.location - - + context["route"] = routeInfo - - diff --git a/eventplanner/templates/eventplanner/event_update_form.html b/eventplanner/templates/eventplanner/event_update_form.html index 2788d13..29d235e 100644 --- a/eventplanner/templates/eventplanner/event_update_form.html +++ b/eventplanner/templates/eventplanner/event_update_form.html @@ -27,16 +27,16 @@ -{% addtoblock "css" strip %} {% endaddtoblock %} -{% addtoblock "css" strip %} {% endaddtoblock %} -{% addtoblock "css" strip %} {% endaddtoblock %} +{% addtoblock "css" strip %} {% endaddtoblock %} +{% addtoblock "css" strip %} {% endaddtoblock %} +{% addtoblock "css" strip %} {% endaddtoblock %} {% addtoblock "js" %} - + {% endaddtoblock %} +{% addtoblock "js" strip %}{% endaddtoblock %} {% addtoblock "js" %} diff --git a/eventplanner/urls.py b/eventplanner/urls.py index 685eba8..5824877 100644 --- a/eventplanner/urls.py +++ b/eventplanner/urls.py @@ -1,18 +1,15 @@ -from django.conf.urls import patterns, url +from django.conf.urls import url from django.contrib.auth.decorators import permission_required +from eventplanner.views import events_grid, eventplanning, event_api, EventUpdate, EventCreate, deleteEvent -from eventplanner.views import events_grid, eventplanning,event_api,EventUpdate,EventCreate,deleteEvent - - -urlpatterns = patterns('', - url(r'^$', eventplanning ), - url(r'^grid$', events_grid ), - url(r'^planning$', eventplanning ), - url(r'^(?P\d+)$', permission_required('eventplanner.change_event')( EventUpdate.as_view() ) ), - url(r'^add$', permission_required('eventplanner.add_event' )( EventCreate.as_view() ) ), - url(r'^(?P\d+)/delete$', permission_required('eventplanner.delete_event')( deleteEvent ) ), - url(r'^api/', event_api, name="event_api" ), - url(r'^api/(\w+)/$', event_api, name="event_api_per_user" ), - url(r'^api/(\w+)/(\d+)$', event_api, name="event_api_per_user_event" ), -) - +urlpatterns = [ + url(r'^$', eventplanning), + url(r'^grid$', events_grid), + url(r'^planning$', eventplanning), + url(r'^(?P\d+)$', permission_required('eventplanner.change_event')(EventUpdate.as_view())), + url(r'^add$', permission_required('eventplanner.add_event')(EventCreate.as_view())), + url(r'^(?P\d+)/delete$', permission_required('eventplanner.delete_event')(deleteEvent)), + url(r'^api/', event_api, name="event_api"), + url(r'^api/(\w+)/$', event_api, name="event_api_per_user"), + url(r'^api/(\w+)/(\d+)$', event_api, name="event_api_per_user_event"), +] diff --git a/eventplanner/views.py b/eventplanner/views.py index a19bd77..3bff467 100644 --- a/eventplanner/views.py +++ b/eventplanner/views.py @@ -1,12 +1,11 @@ - from django.shortcuts import render, redirect from django.http import HttpResponse from django.forms.models import ModelForm from django.forms import TextInput -from models import Event, EventParticipation +from .models import Event, EventParticipation -from serializers import ParticipationSerializer +from .serializers import ParticipationSerializer import datetime @@ -14,7 +13,6 @@ from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status - from crispy_forms.helper import FormHelper from crispy_forms.layout import Submit @@ -22,78 +20,75 @@ from crispy_forms.layout import Submit # ---------------------------------------- API --------------------------------------------------------- -@api_view( ['GET', 'PUT'] ) -def event_api( request, username = None, eventId = None ): +@api_view(['GET', 'PUT']) +def event_api(request, username=None, eventId=None): try: - participationQs = EventParticipation.objects.filter( event__date__gte = datetime.date.today() ) + participationQs = EventParticipation.objects.filter(event__date__gte=datetime.date.today()) if username: - participationQs = EventParticipation.objects.filter( user__username = username ) + participationQs = EventParticipation.objects.filter(user__username=username) if eventId: - participationQs = participationQs.filter( event__pk = eventId ) + participationQs = participationQs.filter(event__pk=eventId) except EventParticipation.DoesNotExist: - return HttpResponse( status=404 ) - + return HttpResponse(status=404) if request.method == 'GET': - serializer = ParticipationSerializer( participationQs ) - return Response( serializer.data ) - - elif request.method == 'PUT': - serializer = ParticipationSerializer ( participationQs, data = request.DATA, many=True ) - if serializer.is_valid(): - for serializedObject in serializer.object: - if not ( EventParticipation.isMember( request.user ) or EventParticipation.isAdmin( request.user ) ): - return Response( status = status.HTTP_403_FORBIDDEN ) - if serializedObject.user != request.user: - if not EventParticipation.isAdmin( request.user ): - return Response( status = status.HTTP_403_FORBIDDEN ) - - serializer.save() - return Response( serializer.data ) - else: - return Response( status = status.HTTP_400_BAD_REQUEST ) + serializer = ParticipationSerializer(participationQs) + return Response(serializer.data) + elif request.method == 'PUT': + serializer = ParticipationSerializer(participationQs, data=request.DATA, many=True) + if serializer.is_valid(): + for serializedObject in serializer.object: + if not (EventParticipation.isMember(request.user) or EventParticipation.isAdmin(request.user)): + return Response(status=status.HTTP_403_FORBIDDEN) + if serializedObject.user != request.user: + if not EventParticipation.isAdmin(request.user): + return Response(status=status.HTTP_403_FORBIDDEN) + + serializer.save() + return Response(serializer.data) + else: + return Response(status=status.HTTP_400_BAD_REQUEST) # ------------------------------------ Normal Views ---------------------------------------------------- -def eventplanning( request ): +def eventplanning(request): """ View for a specific user, to edit his events """ # non-members see the grid - but cannot edit anything - if not EventParticipation.isMember( request.user ): + if not EventParticipation.isMember(request.user): return events_grid(request) - + # All events in the future sorted by date - all_future_events = list ( Event.objects.filter( date__gte = datetime.date.today() ).order_by( 'date') ) - - for e in all_future_events: - e.participation = EventParticipation.get_or_create( event = e, user = request.user ) - - context = { 'events' : all_future_events } - return render ( request, 'eventplanner/eventplanning_view.html', context ) - - - -def events_grid( request ): - usernames = [ u.username for u in EventParticipation.members() ] - - all_future_events = list ( Event.objects.filter( date__gte = datetime.date.today() ).order_by( 'date') ) + all_future_events = list(Event.objects.filter(date__gte=datetime.date.today()).order_by('date')) for e in all_future_events: - e.participation = [ EventParticipation.get_or_create( event = e, user = u ) for u in EventParticipation.members() ] - - context = { 'events': all_future_events, - 'usernames' : usernames } - - return render ( request, 'eventplanner/events_grid.html', context ) + e.participation = EventParticipation.get_or_create(event=e, user=request.user) + + context = {'events': all_future_events} + return render(request, 'eventplanner/eventplanning_view.html', context) +def events_grid(request): + usernames = [u.username for u in EventParticipation.members()] + + all_future_events = list(Event.objects.filter(date__gte=datetime.date.today()).order_by('date')) + + for e in all_future_events: + e.participation = [EventParticipation.get_or_create(event=e, user=u) for u in EventParticipation.members()] + + context = {'events': all_future_events, + 'usernames': usernames} + + return render(request, 'eventplanner/events_grid.html', context) + + +def deleteEvent(request, pk): + Event.objects.get(pk=pk).delete() + return redirect(events_grid) -def deleteEvent( request, pk ): - Event.objects.get( pk = pk ).delete() - return redirect( events_grid ) # ------------------------------------ Detail Views ---------------------------------------------------- @@ -102,7 +97,8 @@ from django.views.generic.edit import UpdateView, CreateView from location_field.widgets import LocationWidget -class EventForm( ModelForm ): + +class EventForm(ModelForm): def __init__(self, *args, **kwargs): self.helper = FormHelper() self.helper.form_class = 'form-horizontal' @@ -111,38 +107,34 @@ class EventForm( ModelForm ): class Meta: model = Event - fields= [ 'type', 'short_desc', 'date', 'end_date', 'time', 'meeting_time', 'location', 'map_location', 'desc', ] - - widgets = { - 'location' : TextInput(), - 'map_location' : LocationWidget(), - } - + fields = ['type', 'short_desc', 'date', 'end_date', 'time', 'meeting_time', 'location', 'map_location', + 'desc', ] -class EventUpdate( UpdateView ): + widgets = { + 'location': TextInput(), + 'map_location': LocationWidget(), + } + + +class EventUpdate(UpdateView): form_class = EventForm - model = Event + model = Event template_name_suffix = "_update_form" success_url = '.' - + def get_context_data(self, **kwargs): context = super(UpdateView, self).get_context_data(**kwargs) context['viewtype'] = "update" return context -class EventCreate( CreateView ): +class EventCreate(CreateView): form_class = EventForm - model = Event + model = Event template_name_suffix = "_update_form" success_url = '.' - + def get_context_data(self, **kwargs): context = super(CreateView, self).get_context_data(**kwargs) context['viewtype'] = "create" return context - - - - - diff --git a/eventplanner_gcal/__init__.py b/eventplanner_gcal/__init__.py index 2c9c56c..e69de29 100644 --- a/eventplanner_gcal/__init__.py +++ b/eventplanner_gcal/__init__.py @@ -1,2 +0,0 @@ -import signals - diff --git a/eventplanner_gcal/google_sync.py b/eventplanner_gcal/google_sync.py index 9debd81..38e0642 100644 --- a/eventplanner_gcal/google_sync.py +++ b/eventplanner_gcal/google_sync.py @@ -3,45 +3,43 @@ import httplib2 import datetime import time -from eventplanner.models import Event, EventParticipation -from eventplanner_gcal.models import GCalMapping, GCalPushChannel,UserGCalCoupling +from eventplanner.models import Event, EventParticipation +from eventplanner_gcal.models import GCalMapping, GCalPushChannel, UserGCalCoupling from apiclient.http import BatchHttpRequest -from django.contrib.auth.models import User from django.conf import settings -from pprint import pprint logger = logging.getLogger(__name__) + # --------------------- Authentication using oauth2 -------------------------------------------- def createGCalServiceObject(): """Creates a Google API service object. This object is required whenever a Google API call is made""" from oauth2client.file import Storage from apiclient.discovery import build - from oauth2client import tools, client gcal_settings = settings.GCAL_COUPLING - storage = Storage( gcal_settings['credentials_file'] ) + storage = Storage(gcal_settings['credentials_file']) credentials = storage.get() print("credentials", credentials) if credentials is None or credentials.invalid == True: - #flow = client.flow_from_clientsecrets(CLIENT_SEICRET_FILE, SCOPES) - + # flow = client.flow_from_clientsecrets(CLIENT_SEICRET_FILE, SCOPES) + print("invalid credentials for gcal") logger.error("Unable to initialize Google Calendar coupling. Check your settings!") return None http = httplib2.Http() - http = credentials.authorize( http ) - res = build( serviceName='calendar', version='v3', - http=http, developerKey=gcal_settings['developerKey'] ) + http = credentials.authorize(http) + res = build(serviceName='calendar', version='v3', + http=http, developerKey=gcal_settings['developerKey']) print("res", res) if res is None: - logger.error( "Authentication at google API failed. Check your settings!" ) + logger.error("Authentication at google API failed. Check your settings!") return res @@ -50,14 +48,15 @@ def getServiceObject(): getServiceObject.__serviceObject = createGCalServiceObject() return getServiceObject.__serviceObject -getServiceObject.__serviceObject = None +getServiceObject.__serviceObject = None + # --------------------- Building GCal event representation ------------------------------------ -def buildGCalAttendeesObj( event ): +def buildGCalAttendeesObj(event): """Builds a attendees object that is inserted into the GCal event. Attendees are all users that have a google mail address. """ result = [] @@ -66,9 +65,9 @@ def buildGCalAttendeesObj( event ): u = userMapping.user # No get or create here, since a create would trigger another synchronization - #participation = EventParticipation.get_or_create( u, event ) + # participation = EventParticipation.get_or_create( u, event ) try: - participation = EventParticipation.objects.get( event = event, user = u ) + participation = EventParticipation.objects.get(event=event, user=u) localStatus = participation.status localComment = participation.comment except EventParticipation.DoesNotExist: @@ -76,9 +75,9 @@ def buildGCalAttendeesObj( event ): localComment = "" status = "needsAction" - if localStatus == "?" : status = "tentative" + if localStatus == "?": status = "tentative" if localStatus == 'Yes': status = "accepted" - if localStatus == 'No' : status = "declined" + if localStatus == 'No': status = "declined" o = { 'id': userMapping.email, @@ -87,20 +86,19 @@ def buildGCalAttendeesObj( event ): 'comment': localComment, 'responseStatus': status, } - result.append( o ) + result.append(o) return result - -def buildGCalEvent( event, timezone="Europe/Berlin" ): +def buildGCalEvent(event, timezone="Europe/Berlin"): """ Builds a GCal event using a local event. """ - def createDateTimeObj( date, time ): + def createDateTimeObj(date, time): if time is None: - return { 'date': unicode(date), 'timeZone': timezone } + return {'date': unicode(date), 'timeZone': timezone} else: - return { 'dateTime': unicode(date) + 'T' + unicode(time) , 'timeZone': timezone } + return {'dateTime': unicode(date) + 'T' + unicode(time), 'timeZone': timezone} startDate = event.date endDate = event.end_date @@ -112,47 +110,48 @@ def buildGCalEvent( event, timezone="Europe/Berlin" ): if startTime is None: endTime = None else: - endTime = datetime.time( 22, 30 ) + endTime = datetime.time(22, 30) gLocation = unicode(event.location) if event.map_location: # Map location has the following format: latitude,longitude,zoomlevel # the first two are needed s = event.map_location.split(",") - gLocation = unicode ( "%s,%s" % (s[0],s[1] ) ) + gLocation = unicode("%s,%s" % (s[0], s[1])) return { - 'summary': unicode(settings.GCAL_COUPLING['eventPrefix'] + event.title), + 'summary': unicode(settings.GCAL_COUPLING['eventPrefix'] + event.title), 'description': unicode(event.desc), - 'location': gLocation, - 'start': createDateTimeObj( startDate, startTime ), - 'end' : createDateTimeObj( endDate, endTime ), + 'location': gLocation, + 'start': createDateTimeObj(startDate, startTime), + 'end': createDateTimeObj(endDate, endTime), 'extendedProperties': { 'private': { 'blechreizEvent': 'true', 'blechreizID': event.id, } }, - 'attendees': buildGCalAttendeesObj( event ), + 'attendees': buildGCalAttendeesObj(event), } # ------------------------------ Callback Functions ------------------------------------------------ -def onGcalEventCreated( request_id, response, exception=None ): +def onGcalEventCreated(request_id, response, exception=None): """Callback function for created events to enter new gcal id in the mapping table""" if exception is not None: - print ( "response " + str( response ) ) + print("response " + str(response)) raise exception googleId = response['id'] djangoId = response['extendedProperties']['private']['blechreizID'] - mapping = GCalMapping( gcal_id = googleId, event = Event.objects.get( pk=djangoId ) ) + mapping = GCalMapping(gcal_id=googleId, event=Event.objects.get(pk=djangoId)) mapping.save() + # ------------------------------ GCal Api Calls ------------------------------------------------- -def getAllGCalEvents( service, fromNow=False ): +def getAllGCalEvents(service, fromNow=False): """Retrieves all gcal events with custom property blechreizEvent=True i.e. all events that have been created by this script.""" @@ -170,99 +169,99 @@ def getAllGCalEvents( service, fromNow=False ): timeMin=minTime, timeMax='2100-01-01T00:00:00-00:00', privateExtendedProperty='blechreizEvent=true', - ).execute() + ).execute() return events['items'] -def createGCalEvent( service, event, timezone="Europe/Berlin" ): + +def createGCalEvent(service, event, timezone="Europe/Berlin"): """Creates a new gcal event using a local event""" - googleEvent = buildGCalEvent(event,timezone) - return service.events().insert(calendarId='primary', body=googleEvent ) + googleEvent = buildGCalEvent(event, timezone) + return service.events().insert(calendarId='primary', body=googleEvent) -def updateGCalEvent( service, event, timezone="Europe/Berlin"): + +def updateGCalEvent(service, event, timezone="Europe/Berlin"): """Updates an existing gcal event, using a local event""" - googleEvent = buildGCalEvent(event,timezone) + googleEvent = buildGCalEvent(event, timezone) try: - mapping = GCalMapping.objects.get( event=event ) + mapping = GCalMapping.objects.get(event=event) except GCalMapping.DoesNotExist: - return createGCalEvent( service, event, timezone ) + return createGCalEvent(service, event, timezone) - return service.events().patch(calendarId='primary', eventId= mapping.gcal_id, body=googleEvent) + return service.events().patch(calendarId='primary', eventId=mapping.gcal_id, body=googleEvent) -def deleteGCalEvent( service, event ): + +def deleteGCalEvent(service, event): """Deletes gcal that belongs to the given local event""" - mapping = GCalMapping.objects.get( event=event ) + mapping = GCalMapping.objects.get(event=event) gcalId = mapping.gcal_id mapping.delete() return service.events().delete(calendarId='primary', eventId=gcalId) - # ------------------------------------- Synchronization ---------------------------------------------------- -def deleteAllGCalEvents( service = getServiceObject() ): +def deleteAllGCalEvents(service=None): """Deletes all gcal events that have been created by this script""" - if service is None: service = getServiceObject() + if service is None: + service = getServiceObject() - gcalIds = [ ev['id'] for ev in getAllGCalEvents( service ) ] - l = len( gcalIds ) + gcalIds = [ev['id'] for ev in getAllGCalEvents(service)] + l = len(gcalIds) if l == 0: return l batch = BatchHttpRequest() for id in gcalIds: - batch.add( service.events().delete(calendarId='primary', eventId=id) ) + batch.add(service.events().delete(calendarId='primary', eventId=id)) batch.execute() GCalMapping.objects.all().delete() return l -def syncFromLocalToGoogle( service = None ): + +def syncFromLocalToGoogle(service=None): """ Creates a google event for each local event (if it does not exist yet) and deletes all google events that are not found in local database. Updates participation info of gcal events using local data """ - + if service is None: service = getServiceObject() - - allEvents = getAllGCalEvents( service ) + + allEvents = getAllGCalEvents(service) eventsAtGoogle_djangoID = set() eventsAtGoogle_googleID = set() for gcalEv in allEvents: - eventsAtGoogle_djangoID.add( int(gcalEv['extendedProperties']['private']['blechreizID'] ) ) - eventsAtGoogle_googleID.add( gcalEv['id'] ) + eventsAtGoogle_djangoID.add(int(gcalEv['extendedProperties']['private']['blechreizID'])) + eventsAtGoogle_googleID.add(gcalEv['id']) - localEvents_djangoID = set( Event. objects.all().values_list('pk' , flat=True) ) - localEvents_googleID = set( GCalMapping.objects.all().values_list('gcal_id', flat=True) ) + localEvents_djangoID = set(Event.objects.all().values_list('pk', flat=True)) + localEvents_googleID = set(GCalMapping.objects.all().values_list('gcal_id', flat=True)) eventsToCreate_djangoID = localEvents_djangoID - eventsAtGoogle_djangoID eventsToDelete_googleID = eventsAtGoogle_googleID - localEvents_googleID - - - - batch = BatchHttpRequest() batchIsEmpty = True for eventDjangoID in eventsToCreate_djangoID: - batch.add( createGCalEvent( service, Event.objects.get( pk=eventDjangoID ) ), callback=onGcalEventCreated ) - batchIsEmpty=False + batch.add(createGCalEvent(service, Event.objects.get(pk=eventDjangoID)), callback=onGcalEventCreated) + batchIsEmpty = False for eventGoogleID in eventsToDelete_googleID: - batch.add( service.events().delete(calendarId='primary', eventId=eventGoogleID) ) - batchIsEmpty=False + batch.add(service.events().delete(calendarId='primary', eventId=eventGoogleID)) + batchIsEmpty = False for gcalEv in allEvents: - eventDjangoID = int( gcalEv['extendedProperties']['private']['blechreizID'] ) + eventDjangoID = int(gcalEv['extendedProperties']['private']['blechreizID']) try: - djangoEv = Event.objects.get( pk=eventDjangoID ) - if 'attendees' not in gcalEv: + djangoEv = Event.objects.get(pk=eventDjangoID) + if 'attendees' not in gcalEv: gcalEv['attendees'] = [] - if gcalEv['attendees'] != buildGCalAttendeesObj( djangoEv ): - batch.add( updateGCalEvent( service, djangoEv ) ) + if gcalEv['attendees'] != buildGCalAttendeesObj(djangoEv): + batch.add(updateGCalEvent(service, djangoEv)) batchIsEmpty = False except Event.DoesNotExist: pass @@ -270,40 +269,38 @@ def syncFromLocalToGoogle( service = None ): if not batchIsEmpty: batch.execute() + return len(eventsToCreate_djangoID), len(eventsToDelete_googleID) - return len (eventsToCreate_djangoID), len(eventsToDelete_googleID) - - - -def syncFromGoogleToLocal( service = None ): +def syncFromGoogleToLocal(service=None): """Retrieves only participation infos for all events and updates local database if anything has changed. """ - - if service is None: service = getServiceObject() + + if service is None: + service = getServiceObject() newStatusReceived = False - allEvents = getAllGCalEvents( service, fromNow=True) + allEvents = getAllGCalEvents(service, fromNow=True) for e in allEvents: - localId = e['extendedProperties']['private']['blechreizID'] - localEvent = Event.objects.get( pk=localId ) + localId = e['extendedProperties']['private']['blechreizID'] + localEvent = Event.objects.get(pk=localId) for a in e['attendees']: - user = UserGCalCoupling.objects.get( email = a['email'] ).user - part = EventParticipation.get_or_create( user, localEvent ) + user = UserGCalCoupling.objects.get(email=a['email']).user + part = EventParticipation.get_or_create(user, localEvent) if 'comment' in a: part.comment = a['comment'] - if a['responseStatus'] == 'needsAction' : + if a['responseStatus'] == 'needsAction': part.status = "-" - elif a['responseStatus']=='tentative': + elif a['responseStatus'] == 'tentative': part.status = '?' elif a['responseStatus'] == 'accepted': part.status = 'Yes' elif a['responseStatus'] == 'declined': part.status = 'No' else: - logger.error("Unknown response status when mapping gcal event: " + a['responseStatus'] ) + logger.error("Unknown response status when mapping gcal event: " + a['responseStatus']) - prev = EventParticipation.objects.get( event = part.event, user = part.user ) + prev = EventParticipation.objects.get(event=part.event, user=part.user) # Important: Save only if the participation info has changed # otherwise everything is synced back to google via the post save signal @@ -315,18 +312,18 @@ def syncFromGoogleToLocal( service = None ): return newStatusReceived - # ------------------------------------- Synchronization ---------------------------------------------------- -def checkGCalSubscription( service=None, timeToLive = 14*24*3600, renewBeforeExpiry = None ): +def checkGCalSubscription(service=None, timeToLive=14 * 24 * 3600, renewBeforeExpiry=None): """Google offers a push service if any event information has changed. This works using a so called channel, which has a certain time to live. This method checks that a valid channel exists: - if none exists a new one is created - if existing channel does expire soon, the channel is renewed - if channel has already expired a sync is triggered and a new channel is created """ - if service is None: service = getServiceObject() + if service is None: + service = getServiceObject() if renewBeforeExpiry is None: renewBeforeExpiry = 0.8 * timeToLive @@ -335,73 +332,75 @@ def checkGCalSubscription( service=None, timeToLive = 14*24*3600, renewBeforeEx # Test if a channel already exists for this callbackURL try: - dbChannel = GCalPushChannel.objects.get( address=callbackUrl ) + dbChannel = GCalPushChannel.objects.get(address=callbackUrl) gChannel = dbChannel.toGChannel() # if expiration time between 0 and two days: stop and create new channel - curTime = int( time.time() * 1000) + curTime = int(time.time() * 1000) if gChannel.expiration > curTime: # not yet expired - if curTime + renewBeforeExpiry*1000 > gChannel.expiration: - #will expire in less than "renewBeforeExpiry" - print ( "Renewing Google Calendar Subscription: " + callbackUrl ) - GCalPushChannel.stop( service, gChannel ) - GCalPushChannel.createNew( callbackUrl, service, timeToLive ) + if curTime + renewBeforeExpiry * 1000 > gChannel.expiration: + # will expire in less than "renewBeforeExpiry" + print("Renewing Google Calendar Subscription: " + callbackUrl) + GCalPushChannel.stop(service, gChannel) + GCalPushChannel.createNew(callbackUrl, service, timeToLive) else: - print ("Channel active until %d " % ( gChannel.expiration, ) ) + print("Channel active until %d " % (gChannel.expiration,)) else: - logger.info( "Google calendar subscription had expired - getting new subscription" ) + logger.info("Google calendar subscription had expired - getting new subscription") # to get back in sync again we have to decide which data to take # so we use the local data as reference - syncFromLocalToGoogle( service ) - GCalPushChannel.createNew( callbackUrl, service, timeToLive ) + syncFromLocalToGoogle(service) + GCalPushChannel.createNew(callbackUrl, service, timeToLive) except GCalPushChannel.DoesNotExist: # create new channel and save it in database - logger.info ( "No CGalCallback Channel exists yet for: " + callbackUrl ) + logger.info("No CGalCallback Channel exists yet for: " + callbackUrl) # to get back in sync again we have to decide which data to take # so we use the local data as reference - syncFromLocalToGoogle( service ) - GCalPushChannel.createNew( callbackUrl, service, timeToLive ) + syncFromLocalToGoogle(service) + GCalPushChannel.createNew(callbackUrl, service, timeToLive) -def stopAllGCalSubscriptions( service=None ): +def stopAllGCalSubscriptions(service=None): """Stops the channel subscription """ - if service is None: service = getServiceObject() + if service is None: + service = getServiceObject() for dbChannel in GCalPushChannel.objects.all(): - print("Stopping %s expiry at %d " % ( dbChannel.id, dbChannel.expiration ) ) - GCalPushChannel.stop( service, dbChannel.toGChannel() ) + print("Stopping %s expiry at %d " % (dbChannel.id, dbChannel.expiration)) + GCalPushChannel.stop(service, dbChannel.toGChannel()) -def checkIfGoogleCallbackIsValid( token, channelID, resourceID, service=None ): - if service is None: service = getServiceObject() +def checkIfGoogleCallbackIsValid(token, channelID, resourceID, service=None): + if service is None: + service = getServiceObject() allChannels = GCalPushChannel.objects.all() if len(allChannels) == 0: - return False # no known subscriptions -> callback has to be from an old channel + return False # no known subscriptions -> callback has to be from an old channel if len(allChannels) > 1: - logger.warning( "Multiple GCal subscriptions! This is strange and probably an error. " - "All channels are closed and one new is created. ") - stopAllGCalSubscriptions( service ) + logger.warning("Multiple GCal subscriptions! This is strange and probably an error. " + "All channels are closed and one new is created. ") + stopAllGCalSubscriptions(service) checkGCalSubscription() allChannels = GCalPushChannel.objects.all() - assert( len(allChannels) == 1 ) + assert (len(allChannels) == 1) theChannel = allChannels[0] if channelID != theChannel.id or resourceID != theChannel.resource_id or token != theChannel.token: - logger.warning( "Got GCal Response from an unexpected Channel" - "Got (%s,%s,%s) " - "expected (%s,%s,%s) " - "Old Channel is stopped." - % ( channelID, resourceID,token, theChannel.id, theChannel.resource_id, theChannel.token )) + logger.warning("Got GCal Response from an unexpected Channel" + "Got (%s,%s,%s) " + "expected (%s,%s,%s) " + "Old Channel is stopped." + % (channelID, resourceID, token, theChannel.id, theChannel.resource_id, theChannel.token)) - channelToStop = GCalPushChannel( id = channelID, resource_id = resourceID, token = token ) - GCalPushChannel.stop( service, channelToStop.toGChannel() ) + channelToStop = GCalPushChannel(id=channelID, resource_id=resourceID, token=token) + GCalPushChannel.stop(service, channelToStop.toGChannel()) return False diff --git a/eventplanner_gcal/models.py b/eventplanner_gcal/models.py index 40d087a..4c698b7 100644 --- a/eventplanner_gcal/models.py +++ b/eventplanner_gcal/models.py @@ -3,59 +3,57 @@ import uuid from eventplanner.models import Event from django.contrib.auth.models import User - from apiclient.channel import Channel from django.db import models - logger = logging.getLogger(__name__) -class UserGCalCoupling( models.Model ): +class UserGCalCoupling(models.Model): # For every user in this table the gcal coupling is activated - user = models.OneToOneField( User ) - email = models.CharField( max_length=1024 ) + user = models.OneToOneField(User, on_delete=models.CASCADE) + email = models.CharField(max_length=1024) -class GCalMapping( models.Model ): +class GCalMapping(models.Model): """Mapping between event id at google and local event id""" - gcal_id = models.CharField( max_length=64 ) - event = models.OneToOneField( Event, primary_key=True ) + gcal_id = models.CharField(max_length=64) + event = models.OneToOneField(Event, primary_key=True, on_delete=models.CASCADE) -class GCalPushChannel( models.Model ): +class GCalPushChannel(models.Model): """This table has either zero or one entry. Required to store if a channel already exists, when it expires and how to stop (renew) the channel """ - id = models.CharField( max_length=128, primary_key=True ) - address = models.CharField( max_length=256 ) - token = models.CharField( max_length=128 ) - resource_id = models.CharField( max_length=128 ) - expiration = models.IntegerField() + id = models.CharField(max_length=128, primary_key=True) + address = models.CharField(max_length=256) + token = models.CharField(max_length=128) + resource_id = models.CharField(max_length=128) + expiration = models.IntegerField() - def toGChannel( self ): - return Channel( 'web_hook', self.id, self.token, self.address, self.expiration, resource_id = self.resource_id ) + def toGChannel(self): + return Channel('web_hook', self.id, self.token, self.address, self.expiration, resource_id=self.resource_id) @staticmethod - def fromGChannel( gChannel ): - return GCalPushChannel( id = gChannel.id, - address = gChannel.address, - token = gChannel.token, - expiration = gChannel.expiration, - resource_id= gChannel.resource_id ) + def fromGChannel(gChannel): + return GCalPushChannel(id=gChannel.id, + address=gChannel.address, + token=gChannel.token, + expiration=gChannel.expiration, + resource_id=gChannel.resource_id) @staticmethod - def createNew( callbackUrl, service, ttl = None ): - gChannel = Channel('web_hook', str(uuid.uuid4()), 'blechreizGcal', callbackUrl, params= { 'ttl' : int(ttl) } ) - response = service.events().watch( calendarId='primary', body= gChannel.body() ).execute() - gChannel.update( response ) + def createNew(callbackUrl, service, ttl=None): + gChannel = Channel('web_hook', str(uuid.uuid4()), 'blechreizGcal', callbackUrl, params={'ttl': int(ttl)}) + response = service.events().watch(calendarId='primary', body=gChannel.body()).execute() + gChannel.update(response) - dbChannel = GCalPushChannel.fromGChannel( gChannel ) + dbChannel = GCalPushChannel.fromGChannel(gChannel) dbChannel.save() @staticmethod - def stop( service, gChannel ): + def stop(service, gChannel): channelService = service.channels() - channelService.stop( body = gChannel.body() ).execute() - GCalPushChannel.fromGChannel( gChannel ).delete() + channelService.stop(body=gChannel.body()).execute() + GCalPushChannel.fromGChannel(gChannel).delete() diff --git a/eventplanner_gcal/signals.py b/eventplanner_gcal/signals.py index 11d880e..1b796dc 100644 --- a/eventplanner_gcal/signals.py +++ b/eventplanner_gcal/signals.py @@ -1,54 +1,51 @@ -from django.db.models.signals import post_save,pre_delete +from django.db.models.signals import post_save, pre_delete from django.dispatch import receiver from eventplanner.models import Event, EventParticipation -from django.contrib.auth.models import User -from eventplanner_gcal.google_sync import getServiceObject, syncFromLocalToGoogle,\ - createGCalEvent, deleteGCalEvent, updateGCalEvent, onGcalEventCreated +from eventplanner_gcal.google_sync import getServiceObject, \ + createGCalEvent, deleteGCalEvent, updateGCalEvent, onGcalEventCreated import logging -logger = logging.getLogger( __name__ ) + +logger = logging.getLogger(__name__) -#@receiver( post_save, sender=User ) -#def user_changed( **kwargs ): +# @receiver( post_save, sender=User ) +# def user_changed( **kwargs ): # logger.info("Synchronizing with google - user information changed") # syncFromLocalToGoogle( getServiceObject() ) -@receiver( post_save,sender= Event) -def event_post_save_handler( **kwargs): +@receiver(post_save, sender=Event) +def event_post_save_handler(**kwargs): event = kwargs['instance'] created = kwargs['created'] try: if created: logger.info("Creating Gcal event") - response = createGCalEvent( getServiceObject(), event ).execute() - onGcalEventCreated( None, response, None ) + response = createGCalEvent(getServiceObject(), event).execute() + onGcalEventCreated(None, response, None) else: - logger.info( "Updating Gcal event") - updateGCalEvent( getServiceObject(),event ).execute() + logger.info("Updating Gcal event") + updateGCalEvent(getServiceObject(), event).execute() except: - logger.error( "Error updating Gcal event") + logger.error("Error updating Gcal event") - - -@receiver( pre_delete,sender= Event) -def event_pre_delete_handler( **kwargs): +@receiver(pre_delete, sender=Event) +def event_pre_delete_handler(**kwargs): try: event = kwargs['instance'] - logger.info ("Deleting GCAL event") - deleteGCalEvent( getServiceObject(), event ).execute() + logger.info("Deleting GCAL event") + deleteGCalEvent(getServiceObject(), event).execute() except: logger.error("Error deleting GCAL event") -@receiver( post_save, sender=EventParticipation ) -def participation_post_save_handler( **kwargs): +@receiver(post_save, sender=EventParticipation) +def participation_post_save_handler(**kwargs): try: participation = kwargs['instance'] logger.info("Participation post save -> update gcal") - updateGCalEvent( getServiceObject(), participation.event ).execute() + updateGCalEvent(getServiceObject(), participation.event).execute() except: logger.error("Error deleting GCAL event") - diff --git a/eventplanner_gcal/urls.py b/eventplanner_gcal/urls.py index 86c613c..5009628 100644 --- a/eventplanner_gcal/urls.py +++ b/eventplanner_gcal/urls.py @@ -1,10 +1,9 @@ -from django.conf.urls import patterns, url +from django.conf.urls import url -from views import runSync, gcalApiCallback, manage - -urlpatterns = patterns('', - url(r'^runSync$', runSync ), - url(r'^gcalApiCallback$', gcalApiCallback ), - url(r'^manage$', manage ), -) +from .views import runSync, gcalApiCallback, manage +urlpatterns = [ + url(r'^runSync$', runSync), + url(r'^gcalApiCallback$', gcalApiCallback), + url(r'^manage$', manage), +] diff --git a/imagestore/__init__.py b/imagestore/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/imagestore/admin.py b/imagestore/admin.py deleted file mode 100644 index 6da3fb2..0000000 --- a/imagestore/admin.py +++ /dev/null @@ -1,36 +0,0 @@ -from django.contrib import admin -from imagestore.models import Image, Album, AlbumUpload -from sorl.thumbnail.admin import AdminInlineImageMixin -from django.conf import settings - -class InlineImageAdmin(AdminInlineImageMixin, admin.TabularInline): - model = Image - fieldsets = ((None, {'fields': ['image', 'user', 'title', 'order', 'tags', 'album']}),) - raw_id_fields = ('user', ) - extra = 0 - -class AlbumAdmin(admin.ModelAdmin): - fieldsets = ((None, {'fields': ['name', 'user', 'is_public', 'order']}),) - list_display = ('name', 'admin_thumbnail', 'user', 'created', 'updated', 'is_public', 'order') - list_editable = ('order', ) - inlines = [InlineImageAdmin] - -admin.site.register(Album, AlbumAdmin) - -class ImageAdmin(admin.ModelAdmin): - fieldsets = ((None, {'fields': ['user', 'title', 'image', 'description', 'order', 'tags', 'album']}),) - list_display = ('admin_thumbnail', 'user', 'order', 'album', 'title') - raw_id_fields = ('user', ) - list_filter = ('album', ) - -class AlbumUploadAdmin(admin.ModelAdmin): - def has_change_permission(self, request, obj=None): - return False - -IMAGE_MODEL = getattr(settings, 'IMAGESTORE_IMAGE_MODEL', None) -if not IMAGE_MODEL: - admin.site.register(Image, ImageAdmin) - -ALBUM_MODEL = getattr(settings, 'IMAGESTORE_ALBUM_MODEL', None) -if not ALBUM_MODEL: - admin.site.register(AlbumUpload, AlbumUploadAdmin) diff --git a/imagestore/autocomplete_light_registry.py b/imagestore/autocomplete_light_registry.py deleted file mode 100644 index 0670223..0000000 --- a/imagestore/autocomplete_light_registry.py +++ /dev/null @@ -1,9 +0,0 @@ -# coding=utf-8 -from __future__ import unicode_literals -import autocomplete_light -from tagging.models import Tag - -autocomplete_light.register( - Tag, - search_fields=['^name'] -) \ No newline at end of file diff --git a/imagestore/context_processors.py b/imagestore/context_processors.py deleted file mode 100644 index 089d180..0000000 --- a/imagestore/context_processors.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 -from django.core.urlresolvers import reverse, NoReverseMatch -from django.conf import settings -from utils import get_model_string -from imagestore.models import image_applabel, image_classname -from imagestore.models import album_applabel, album_classname - -def imagestore_processor(request): - template = getattr(settings, 'IMAGESTORE_TEMPLATE', False) - ret = { - 'IMAGESTORE_SHOW_USER': getattr(settings, 'IMAGESTORE_SHOW_USER', True), - 'IMAGESTORE_SHOW_TAGS': getattr(settings, 'IMAGESTORE_SHOW_TAGS', True), - 'IMAGESTORE_MODEL_STRING': get_model_string('Image'), - 'IMAGESTORE_LOAD_CSS': getattr(settings, 'IMAGESTORE_LOAD_CSS', True), - } - try: - ret['imagestore_index_url'] = reverse('imagestore:index') - except NoReverseMatch: #Bastard django-cms from hell!!!!111 - pass - if template: - ret['IMAGESTORE_TEMPLATE'] = template - ret['imagestore_perms'] = { - 'add_image': request.user.has_perm('%s.add_%s' % (image_applabel, image_classname)), - 'add_album': request.user.has_perm('%s.add_%s' % (album_applabel, album_classname)), - } - return ret - - \ No newline at end of file diff --git a/imagestore/forms.py b/imagestore/forms.py deleted file mode 100644 index 03ba9bf..0000000 --- a/imagestore/forms.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 -try: - import autocomplete_light - AUTOCOMPLETE_LIGHT_INSTALLED = True -except ImportError: - AUTOCOMPLETE_LIGHT_INSTALLED = False - -__author__ = 'zeus' - -from django import forms -from models import Image, Album -from django.utils.translation import ugettext_lazy as _ - - -class ImageForm(forms.ModelForm): - class Meta(object): - model = Image - exclude = ('user', 'order') - - description = forms.CharField(widget=forms.Textarea(attrs={'rows': 2, 'cols': 19}), required=False, - label=_('Description')) - - def __init__(self, user, *args, **kwargs): - super(ImageForm, self).__init__(*args, **kwargs) - self.fields['album'].queryset = Album.objects.filter(user=user) - self.fields['album'].required = True - if AUTOCOMPLETE_LIGHT_INSTALLED: - self.fields['tags'].widget = autocomplete_light.TextWidget('TagAutocomplete') - - -class AlbumForm(forms.ModelForm): - class Meta(object): - model = Album - exclude = ('user', 'created', 'updated') - - def __init__(self, *args, **kwargs): - super(AlbumForm, self).__init__(*args, **kwargs) - if 'instance' in kwargs and kwargs['instance']: - self.fields['head'].queryset = Image.objects.filter(album=kwargs['instance']) - else: - self.fields['head'].widget = forms.HiddenInput() diff --git a/imagestore/imagestore_cms/__init__.py b/imagestore/imagestore_cms/__init__.py deleted file mode 100644 index 04ccd4b..0000000 --- a/imagestore/imagestore_cms/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - \ No newline at end of file diff --git a/imagestore/imagestore_cms/cms_app.py b/imagestore/imagestore_cms/cms_app.py deleted file mode 100644 index 0b81e01..0000000 --- a/imagestore/imagestore_cms/cms_app.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - -from cms.app_base import CMSApp -from cms.apphook_pool import apphook_pool -from django.utils.translation import ugettext_lazy as _ - -class ImagestoreApp(CMSApp): - name = _("Imagestore App") # give your app a name, this is required - urls = ["imagestore.imagestore_cms.urls"] # link your app to url configuration(s) - -apphook_pool.register(ImagestoreApp) # register your app - \ No newline at end of file diff --git a/imagestore/imagestore_cms/cms_plugins.py b/imagestore/imagestore_cms/cms_plugins.py deleted file mode 100644 index c4b97b2..0000000 --- a/imagestore/imagestore_cms/cms_plugins.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - -from cms.plugin_base import CMSPluginBase -from cms.plugin_pool import plugin_pool -from models import ImagestoreAlbumPtr, ImagestoreAlbumCarousel -from django.utils.translation import ugettext_lazy as _ -from django.conf import settings - -class AlbumPlugin(CMSPluginBase): - model = ImagestoreAlbumPtr - name = _('Album') - render_template = "cms/plugins/imagestore_album.html" - text_enabled = True - - def render(self, context, instance, placeholder): - context.update({'album': instance.album}) - return context - - -class AlbumCarouselPlugin(CMSPluginBase): - model = ImagestoreAlbumCarousel - name = _('Album as carousel') - render_template = "cms/plugins/imagestore_album_carousel.html" - text_enabled = True - - def render(self, context, instance, placeholder): - - # default carousel template in the settings file - carousel_template = getattr(settings, 'IMAGESTORE_CAROUSEL_TEMPLATE', None) - - if carousel_template: - self.render_template = carousel_template - - if instance.template_file: - self.render_template = instance.template_file - else: - if carousel_template: - instance.template_file = carousel_template - else: - instance.template_file = self.render_template - instance.save() - - images = instance.album.images.all() - if instance.limit: - images = images[:instance.limit] - context.update({'images': images, 'carousel': instance}) - return context - -plugin_pool.register_plugin(AlbumCarouselPlugin) -plugin_pool.register_plugin(AlbumPlugin) \ No newline at end of file diff --git a/imagestore/imagestore_cms/migrations/0001_initial.py b/imagestore/imagestore_cms/migrations/0001_initial.py deleted file mode 100644 index d3be993..0000000 --- a/imagestore/imagestore_cms/migrations/0001_initial.py +++ /dev/null @@ -1,112 +0,0 @@ -# encoding: utf-8 -import 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 'ImagestoreAlbumPtr' - db.create_table('cmsplugin_imagestorealbumptr', ( - ('cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)), - ('album', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['imagestore.Album'])), - )) - db.send_create_signal('imagestore_cms', ['ImagestoreAlbumPtr']) - - - def backwards(self, orm): - - # Deleting model 'ImagestoreAlbumPtr' - db.delete_table('cmsplugin_imagestorealbumptr') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'cms.cmsplugin': { - 'Meta': {'object_name': 'CMSPlugin'}, - 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), - 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), - 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), - 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), - 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) - }, - 'cms.placeholder': { - 'Meta': {'object_name': 'Placeholder'}, - 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '20'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore_cms.imagestorealbumptr': { - 'Meta': {'object_name': 'ImagestoreAlbumPtr', 'db_table': "'cmsplugin_imagestorealbumptr'", '_ormbases': ['cms.CMSPlugin']}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']"}), - 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}) - } - } - - complete_apps = ['imagestore_cms'] diff --git a/imagestore/imagestore_cms/migrations/0002_add_carusel.py b/imagestore/imagestore_cms/migrations/0002_add_carusel.py deleted file mode 100644 index 5cdd9c5..0000000 --- a/imagestore/imagestore_cms/migrations/0002_add_carusel.py +++ /dev/null @@ -1,121 +0,0 @@ -# encoding: utf-8 -import 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 'ImagestoreAlbumCarusel' - db.create_table('cmsplugin_imagestorealbumcarusel', ( - ('cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)), - ('album', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['imagestore.Album'])), - ('width', self.gf('django.db.models.fields.IntegerField')(default=200)), - ('limit', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - )) - db.send_create_signal('imagestore_cms', ['ImagestoreAlbumCarusel']) - - - def backwards(self, orm): - - # Deleting model 'ImagestoreAlbumCarusel' - db.delete_table('cmsplugin_imagestorealbumcarusel') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'cms.cmsplugin': { - 'Meta': {'object_name': 'CMSPlugin'}, - 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), - 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), - 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), - 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), - 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) - }, - 'cms.placeholder': { - 'Meta': {'object_name': 'Placeholder'}, - 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '20'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore_cms.imagestorealbumcarusel': { - 'Meta': {'object_name': 'ImagestoreAlbumCarusel', 'db_table': "'cmsplugin_imagestorealbumcarusel'", '_ormbases': ['cms.CMSPlugin']}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']"}), - 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), - 'limit': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'width': ('django.db.models.fields.IntegerField', [], {'default': '200'}) - }, - 'imagestore_cms.imagestorealbumptr': { - 'Meta': {'object_name': 'ImagestoreAlbumPtr', 'db_table': "'cmsplugin_imagestorealbumptr'", '_ormbases': ['cms.CMSPlugin']}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']"}), - 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}) - } - } - - complete_apps = ['imagestore_cms'] diff --git a/imagestore/imagestore_cms/migrations/0003_more_carousel_options.py b/imagestore/imagestore_cms/migrations/0003_more_carousel_options.py deleted file mode 100644 index 1b09fc1..0000000 --- a/imagestore/imagestore_cms/migrations/0003_more_carousel_options.py +++ /dev/null @@ -1,137 +0,0 @@ -# encoding: utf-8 -import 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 'ImagestoreAlbumCarusel' - db.delete_table('cmsplugin_imagestorealbumcarusel') - - # Adding model 'ImagestoreAlbumCarousel' - db.create_table('cmsplugin_imagestorealbumcarousel', ( - ('cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)), - ('album', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['imagestore.Album'])), - ('width', self.gf('django.db.models.fields.IntegerField')(default=200)), - ('height', self.gf('django.db.models.fields.IntegerField')(default=200)), - ('skin', self.gf('django.db.models.fields.CharField')(default='jcarousel-skin-tango', max_length=100)), - ('limit', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - )) - db.send_create_signal('imagestore_cms', ['ImagestoreAlbumCarousel']) - - - def backwards(self, orm): - - # Adding model 'ImagestoreAlbumCarusel' - db.create_table('cmsplugin_imagestorealbumcarusel', ( - ('album', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['imagestore.Album'])), - ('limit', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('cmsplugin_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['cms.CMSPlugin'], unique=True, primary_key=True)), - ('width', self.gf('django.db.models.fields.IntegerField')(default=200)), - )) - db.send_create_signal('imagestore_cms', ['ImagestoreAlbumCarusel']) - - # Deleting model 'ImagestoreAlbumCarousel' - db.delete_table('cmsplugin_imagestorealbumcarousel') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'cms.cmsplugin': { - 'Meta': {'object_name': 'CMSPlugin'}, - 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), - 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), - 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), - 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), - 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) - }, - 'cms.placeholder': { - 'Meta': {'object_name': 'Placeholder'}, - 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '20'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore_cms.imagestorealbumcarousel': { - 'Meta': {'object_name': 'ImagestoreAlbumCarousel', 'db_table': "'cmsplugin_imagestorealbumcarousel'", '_ormbases': ['cms.CMSPlugin']}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']"}), - 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), - 'height': ('django.db.models.fields.IntegerField', [], {'default': '200'}), - 'limit': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'skin': ('django.db.models.fields.CharField', [], {'default': "'jcarousel-skin-tango'", 'max_length': '100'}), - 'width': ('django.db.models.fields.IntegerField', [], {'default': '200'}) - }, - 'imagestore_cms.imagestorealbumptr': { - 'Meta': {'object_name': 'ImagestoreAlbumPtr', 'db_table': "'cmsplugin_imagestorealbumptr'", '_ormbases': ['cms.CMSPlugin']}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']"}), - 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}) - } - } - - complete_apps = ['imagestore_cms'] diff --git a/imagestore/imagestore_cms/migrations/0004_add_carousel_sizes.py b/imagestore/imagestore_cms/migrations/0004_add_carousel_sizes.py deleted file mode 100644 index 43cb76c..0000000 --- a/imagestore/imagestore_cms/migrations/0004_add_carousel_sizes.py +++ /dev/null @@ -1,135 +0,0 @@ -# encoding: utf-8 -import 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 'ImagestoreAlbumCarousel.height' - db.delete_column('cmsplugin_imagestorealbumcarousel', 'height') - - # Deleting field 'ImagestoreAlbumCarousel.width' - db.delete_column('cmsplugin_imagestorealbumcarousel', 'width') - - # Adding field 'ImagestoreAlbumCarousel.size' - db.add_column('cmsplugin_imagestorealbumcarousel', 'size', self.gf('django.db.models.fields.CharField')(default='72x72', max_length=20), keep_default=False) - - # Adding field 'ImagestoreAlbumCarousel.full_size' - db.add_column('cmsplugin_imagestorealbumcarousel', 'full_size', self.gf('django.db.models.fields.CharField')(default='600x600', max_length=20), keep_default=False) - - - def backwards(self, orm): - - # Adding field 'ImagestoreAlbumCarousel.height' - db.add_column('cmsplugin_imagestorealbumcarousel', 'height', self.gf('django.db.models.fields.IntegerField')(default=200), keep_default=False) - - # Adding field 'ImagestoreAlbumCarousel.width' - db.add_column('cmsplugin_imagestorealbumcarousel', 'width', self.gf('django.db.models.fields.IntegerField')(default=200), keep_default=False) - - # Deleting field 'ImagestoreAlbumCarousel.size' - db.delete_column('cmsplugin_imagestorealbumcarousel', 'size') - - # Deleting field 'ImagestoreAlbumCarousel.full_size' - db.delete_column('cmsplugin_imagestorealbumcarousel', 'full_size') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'cms.cmsplugin': { - 'Meta': {'object_name': 'CMSPlugin'}, - 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), - 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), - 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), - 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), - 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) - }, - 'cms.placeholder': { - 'Meta': {'object_name': 'Placeholder'}, - 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '20'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore_cms.imagestorealbumcarousel': { - 'Meta': {'object_name': 'ImagestoreAlbumCarousel', 'db_table': "'cmsplugin_imagestorealbumcarousel'", '_ormbases': ['cms.CMSPlugin']}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']"}), - 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), - 'full_size': ('django.db.models.fields.CharField', [], {'default': "'600x600'", 'max_length': '20'}), - 'limit': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'size': ('django.db.models.fields.CharField', [], {'default': "'72x72'", 'max_length': '20'}), - 'skin': ('django.db.models.fields.CharField', [], {'default': "'jcarousel-skin-tango'", 'max_length': '100'}) - }, - 'imagestore_cms.imagestorealbumptr': { - 'Meta': {'object_name': 'ImagestoreAlbumPtr', 'db_table': "'cmsplugin_imagestorealbumptr'", '_ormbases': ['cms.CMSPlugin']}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']"}), - 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}) - } - } - - complete_apps = ['imagestore_cms'] diff --git a/imagestore/imagestore_cms/migrations/0005_auto__add_field_imagestorealbumcarousel_template_file.py b/imagestore/imagestore_cms/migrations/0005_auto__add_field_imagestorealbumcarousel_template_file.py deleted file mode 100644 index 232f475..0000000 --- a/imagestore/imagestore_cms/migrations/0005_auto__add_field_imagestorealbumcarousel_template_file.py +++ /dev/null @@ -1,210 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding field 'ImagestoreAlbumCarousel.template_file' - db.add_column('cmsplugin_imagestorealbumcarousel', 'template_file', self.gf('django.db.models.fields.CharField')(default='cms/plugins/imagestore_album_carousel.html', max_length=100), keep_default=False) - - - def backwards(self, orm): - - # Deleting field 'ImagestoreAlbumCarousel.template_file' - db.delete_column('cmsplugin_imagestorealbumcarousel', 'template_file') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'cms.cmsplugin': { - 'Meta': {'object_name': 'CMSPlugin'}, - 'creation_date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'language': ('django.db.models.fields.CharField', [], {'max_length': '15', 'db_index': 'True'}), - 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'parent': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.CMSPlugin']", 'null': 'True', 'blank': 'True'}), - 'placeholder': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['cms.Placeholder']", 'null': 'True'}), - 'plugin_type': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}), - 'position': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True', 'blank': 'True'}), - 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) - }, - 'cms.placeholder': { - 'Meta': {'object_name': 'Placeholder'}, - 'default_width': ('django.db.models.fields.PositiveSmallIntegerField', [], {'null': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'slot': ('django.db.models.fields.CharField', [], {'max_length': '50', 'db_index': 'True'}) - }, - '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'}), - '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'}) - }, - 'image.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image', 'db_table': "'imagestore_image'"}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'place': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['places.GeoPlace']"}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['image.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore_cms.imagestorealbumcarousel': { - 'Meta': {'object_name': 'ImagestoreAlbumCarousel', 'db_table': "'cmsplugin_imagestorealbumcarousel'", '_ormbases': ['cms.CMSPlugin']}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']"}), - 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}), - 'full_size': ('django.db.models.fields.CharField', [], {'default': "'600x600'", 'max_length': '20'}), - 'limit': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'size': ('django.db.models.fields.CharField', [], {'default': "'72x72'", 'max_length': '20'}), - 'skin': ('django.db.models.fields.CharField', [], {'default': "'jcarousel-skin-tango'", 'max_length': '100'}), - 'template_file': ('django.db.models.fields.CharField', [], {'default': "'cms/plugins/imagestore_album_carousel.html'", 'max_length': '100'}) - }, - 'imagestore_cms.imagestorealbumptr': { - 'Meta': {'object_name': 'ImagestoreAlbumPtr', 'db_table': "'cmsplugin_imagestorealbumptr'", '_ormbases': ['cms.CMSPlugin']}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']"}), - 'cmsplugin_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['cms.CMSPlugin']", 'unique': 'True', 'primary_key': 'True'}) - }, - 'places.geoplace': { - 'Meta': {'object_name': 'GeoPlace'}, - 'addional_info': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'address': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'imagestore_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'latitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'longtitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'metro': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), - 'minuses': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'near_objects': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'near_objects_rel_+'", 'null': 'True', 'to': "orm['places.GeoPlace']"}), - 'near_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'owner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), - 'path_to': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'phone': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'pluses': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'private': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'topic': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['pybb.Topic']", 'null': 'True', 'blank': 'True'}), - 'topic_on_demand': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['places.PlaceType']", 'null': 'None', 'blank': 'None'}), - 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'work_time': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) - }, - 'places.placetype': { - 'Meta': {'object_name': 'PlaceType'}, - 'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['pybb.Forum']", 'null': 'True', 'blank': 'True'}), - 'forum_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), - 'icon_style': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'name_plural': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'path_to_image': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'private': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}) - }, - 'pybb.category': { - 'Meta': {'ordering': "['position']", 'object_name': 'Category'}, - 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}), - 'position': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}) - }, - 'pybb.forum': { - 'Meta': {'ordering': "['position']", 'object_name': 'Forum'}, - 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'forums'", 'to': "orm['pybb.Category']"}), - 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'headline': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'moderators': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}), - 'position': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), - 'post_count': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), - 'readed_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'readed_forums'", 'symmetrical': 'False', 'through': "orm['pybb.ForumReadTracker']", 'to': "orm['auth.User']"}), - 'topic_count': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) - }, - 'pybb.forumreadtracker': { - 'Meta': {'object_name': 'ForumReadTracker'}, - 'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['pybb.Forum']", 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'time_stamp': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'pybb.topic': { - 'Meta': {'ordering': "['-created']", 'object_name': 'Topic'}, - 'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), - 'forum': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'topics'", 'to': "orm['pybb.Forum']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'on_moderation': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'post_count': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), - 'readed_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'readed_topics'", 'symmetrical': 'False', 'through': "orm['pybb.TopicReadTracker']", 'to': "orm['auth.User']"}), - 'sticky': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'subscribers': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'subscriptions'", 'blank': 'True', 'to': "orm['auth.User']"}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), - 'views': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}) - }, - 'pybb.topicreadtracker': { - 'Meta': {'object_name': 'TopicReadTracker'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'time_stamp': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'topic': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['pybb.Topic']", 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore_cms'] diff --git a/imagestore/imagestore_cms/migrations/__init__.py b/imagestore/imagestore_cms/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/imagestore/imagestore_cms/models.py b/imagestore/imagestore_cms/models.py deleted file mode 100644 index c4d18d5..0000000 --- a/imagestore/imagestore_cms/models.py +++ /dev/null @@ -1,21 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - -from cms.models import CMSPlugin -from django.db import models -from imagestore.models import Album -from django.utils.translation import ugettext_lazy as _ -from django.conf import settings - -class ImagestoreAlbumPtr(CMSPlugin): - album = models.ForeignKey(Album, verbose_name=_('Album'), blank=False, null=False) - -class ImagestoreAlbumCarousel(CMSPlugin): - album = models.ForeignKey(Album, verbose_name=_('Album'), blank=False, null=False) - skin = models.CharField(max_length=100, verbose_name=_('Skin'), default='jcarousel-skin-tango') - limit = models.IntegerField(verbose_name=_('Image limit'), blank=True, null=True) - size = models.CharField(max_length=20, verbose_name=_('Thumbnail size'), default='72x72') - full_size = models.CharField(max_length=20, verbose_name=_('Full size view'), default='600x600') - template_file = models.CharField(max_length=100, verbose_name=_('Template file'), default=getattr(settings,'IMAGESTORE_CAROUSEL_TEMPLATE','cms/plugins/imagestore_album_carousel.html'), blank=True, null=True) \ No newline at end of file diff --git a/imagestore/imagestore_cms/urls.py b/imagestore/imagestore_cms/urls.py deleted file mode 100644 index f386372..0000000 --- a/imagestore/imagestore_cms/urls.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - -from django.conf.urls.defaults import * -from imagestore.views import AlbumListView - -urlpatterns = patterns('', - url(r'^', include('imagestore.urls', namespace='imagestore')), - ) \ No newline at end of file diff --git a/imagestore/locale/de/LC_MESSAGES/django.mo b/imagestore/locale/de/LC_MESSAGES/django.mo deleted file mode 100644 index 011f84f..0000000 Binary files a/imagestore/locale/de/LC_MESSAGES/django.mo and /dev/null differ diff --git a/imagestore/locale/de/LC_MESSAGES/django.po b/imagestore/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index c689e71..0000000 --- a/imagestore/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,276 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-09-29 16:54+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: forms.py:22 models/bases/image.py:44 -msgid "Description" -msgstr "Beschreibung" - -#: views.py:63 -#, python-format -msgid "No Tag found matching \"%s\"." -msgstr "Kein Tag gefunden der auf \"%s\" passt." - -#: imagestore_cms/cms_app.py:11 -msgid "Imagestore App" -msgstr "" - -#: imagestore_cms/cms_plugins.py:14 imagestore_cms/models.py:13 -#: imagestore_cms/models.py:16 models/album.py:14 models/bases/image.py:51 -#: templates/imagestore/image-scope.html:9 templates/imagestore/image.html:16 -msgid "Album" -msgstr "" - -#: imagestore_cms/cms_plugins.py:25 -msgid "Album as carousel" -msgstr "Album als Karousel" - -#: imagestore_cms/models.py:17 -msgid "Skin" -msgstr "Skin" - -#: imagestore_cms/models.py:18 -msgid "Image limit" -msgstr "Bilder Limit" - -#: imagestore_cms/models.py:19 -msgid "Thumbnail size" -msgstr "Thumbnail Größe" - -#: imagestore_cms/models.py:20 -msgid "Full size view" -msgstr "Vollbild Ansicht" - -#: imagestore_cms/models.py:21 -msgid "Template file" -msgstr "Template File" - -#: models/album.py:15 -msgid "Albums" -msgstr "Alben" - -#: models/image.py:13 templates/imagestore/image.html:8 -msgid "Image" -msgstr "Bild" - -#: models/image.py:14 -msgid "Images" -msgstr "Bilder" - -#: models/upload.py:84 -msgid "images file (.zip)" -msgstr "Bild Datei (.zip)" - -#: models/upload.py:85 -msgid "Select a .zip file of images to upload into a new Gallery." -msgstr "Zip Datei mit Bilder auswählen um eine neue Gallerie zu erstellen." - -#: models/upload.py:90 -msgid "" -"Select an album to add these images to. leave this empty to create a new " -"album from the supplied title." -msgstr "Bitte Album für neue Bilder auswählen. Leer lassen um ein neues Album zu erstellen." - -#: models/upload.py:95 -msgid "New album name" -msgstr "Name für neues Album" - -#: models/upload.py:96 -msgid "" -"If not empty new album with this name will be created and images will be " -"upload to this album" -msgstr "Falls nicht leer wird ein Album mit diesem Namen erstellt, und hochgeladene Bilder werden in dieses Album hinzugefügt." - -#: models/upload.py:98 -msgid "tags" -msgstr "Tags" - -#: models/upload.py:101 -msgid "Album upload" -msgstr "Album upload" - -#: models/upload.py:102 -msgid "Album uploads" -msgstr "Album uploads" - -#: models/bases/album.py:38 models/bases/image.py:48 -#: templates/imagestore/image-scope.html:4 templates/imagestore/image.html:13 -#: templates/imagestore/user_info.html:7 -msgid "User" -msgstr "Benutzer" - -#: models/bases/album.py:39 -msgid "Name" -msgstr "Name" - -#: models/bases/album.py:40 models/bases/image.py:49 -msgid "Created" -msgstr "Erstellt" - -#: models/bases/album.py:41 models/bases/image.py:50 -msgid "Updated" -msgstr "Aktualisiert" - -#: models/bases/album.py:42 -msgid "Is public" -msgstr "Öffentlich" - -#: models/bases/album.py:45 models/bases/image.py:46 -msgid "Order" -msgstr "Reihenfolge" - -#: models/bases/album.py:72 templates/imagestore/album_list.html:53 -msgid "Empty album" -msgstr "Leeres Album" - -#: models/bases/album.py:74 -msgid "Head" -msgstr "" - -#: models/bases/image.py:43 -msgid "Title" -msgstr "Titel" - -#: models/bases/image.py:45 templates/imagestore/image.html:77 -#: templates/imagestore/tag-cloud.html:7 -msgid "Tags" -msgstr "" - -#: models/bases/image.py:47 -msgid "File" -msgstr "Datei" - -#: models/bases/image.py:68 -msgid "Thumbnail" -msgstr "Vorschau" - -#: templates/imagestore/album_delete.html:6 -msgid "Are you sure that you would like to delete this album?" -msgstr "Dieses Album wirklich löschen?" - -#: templates/imagestore/album_delete.html:10 -#: templates/imagestore/image_confirm_delete.html:10 -#: templates/imagestore/image_delete.html:10 -msgid "No, take me back" -msgstr "Nein, zurück" - -#: templates/imagestore/album_delete.html:11 -#: templates/imagestore/image_confirm_delete.html:11 -#: templates/imagestore/image_delete.html:11 -msgid "Yes, I am sure" -msgstr "Ja" - -#: templates/imagestore/album_list.html:7 -#: templates/imagestore/album_list.html:16 -#: templates/imagestore/album_list.html:37 -msgid "Albums for user" -msgstr "" - -#: templates/imagestore/album_list.html:9 -#: templates/imagestore/album_list.html:18 -#: templates/imagestore/album_list.html:39 -msgid "All albums" -msgstr "Alle Alben" - -#: templates/imagestore/album_list.html:60 -msgid "user" -msgstr "Benutzer" - -#: templates/imagestore/base.html:27 -msgid "Home" -msgstr "Home" - -#: templates/imagestore/base.html:30 templates/imagestore/tag.html:7 -msgid "Gallery" -msgstr "Galerie" - -#: templates/imagestore/base.html:46 -#: templates/imagestore/forms/image_form.html:7 -#: templates/imagestore/forms/image_form.html:11 -#: templates/imagestore/forms/image_form.html:15 -msgid "Upload image" -msgstr "Bild hochladen" - -#: templates/imagestore/base.html:49 -msgid "Create new album" -msgstr "Neues Album erstellen" - -#: templates/imagestore/image-list.html:14 -#: templates/imagestore/image_list.html:55 -msgid "Info" -msgstr "" - -#: templates/imagestore/image-scope.html:14 templates/imagestore/image.html:19 -#: templates/imagestore/tag.html:7 templates/imagestore/tag.html.py:11 -#: templates/imagestore/tag.html:15 -msgid "Tag" -msgstr "" - -#: templates/imagestore/image.html:56 -msgid "previous image" -msgstr "Vorheriges Bild" - -#: templates/imagestore/image.html:59 -msgid "next image" -msgstr "Nächstes Bild" - -#: templates/imagestore/image.html:69 -msgid "Edit info" -msgstr "Info editieren" - -#: templates/imagestore/image.html:70 -msgid "Delete image" -msgstr "Bild löschen" - -#: templates/imagestore/image.html:85 -msgid "Place" -msgstr "" - -#: templates/imagestore/image_confirm_delete.html:6 -#: templates/imagestore/image_delete.html:6 -msgid "Are you sure that you would like to delete this image?" -msgstr "Soll das Bild sicher gelöscht werden?" - -#: templates/imagestore/image_list.html:34 -#: templates/imagestore/forms/album_form.html:13 -#: templates/imagestore/forms/album_form.html:23 -msgid "Edit album" -msgstr "Album bearbeiten" - -#: templates/imagestore/pagination.html:8 -msgid "previous page" -msgstr "Vorherige Seite" - -#: templates/imagestore/pagination.html:22 -msgid "next page" -msgstr "Nächste Seite" - -#: templates/imagestore/forms/album_form.html:7 -#: templates/imagestore/forms/album_form.html:15 -#: templates/imagestore/forms/album_form.html:25 -msgid "Create album" -msgstr "Neues album" - -#: templates/imagestore/forms/album_form.html:31 -msgid "Save" -msgstr "Speichern" - -#: templates/imagestore/forms/image_form.html:19 -msgid "Upload" -msgstr "Hochladen" diff --git a/imagestore/migrations/0001_initial.py b/imagestore/migrations/0001_initial.py deleted file mode 100644 index b1b6942..0000000 --- a/imagestore/migrations/0001_initial.py +++ /dev/null @@ -1,78 +0,0 @@ -# encoding: utf-8 -import 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 'Category' - db.create_table('imagestore_category', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('parent', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='children', null=True, to=orm['imagestore.Category'])), - ('slug', self.gf('django.db.models.fields.SlugField')(max_length=200, db_index=True)), - ('title', self.gf('django.db.models.fields.CharField')(max_length=200)), - ('order', self.gf('django.db.models.fields.IntegerField')()), - ('is_public', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('lft', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)), - ('rght', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)), - ('tree_id', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)), - ('level', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)), - )) - db.send_create_signal('imagestore', ['Category']) - - # Adding model 'Image' - db.create_table('imagestore_image', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('slug', self.gf('django.db.models.fields.SlugField')(db_index=True, max_length=200, null=True, blank=True)), - ('title', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)), - ('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)), - ('tags', self.gf('tagging.fields.TagField')()), - ('category', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['imagestore.Category'])), - ('order', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)), - ('is_public', self.gf('django.db.models.fields.BooleanField')(default=True)), - ('image', self.gf('sorl.thumbnail.fields.ImageField')(max_length=100)), - )) - db.send_create_signal('imagestore', ['Image']) - - - def backwards(self, orm): - - # Deleting model 'Category' - db.delete_table('imagestore_category') - - # Deleting model 'Image' - db.delete_table('imagestore_image') - - - models = { - 'imagestore.category': { - 'Meta': {'object_name': 'Category'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {}), - 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['imagestore.Category']"}), - 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200', 'db_index': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), - 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) - }, - 'imagestore.image': { - 'Meta': {'object_name': 'Image'}, - 'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Category']"}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'slug': ('django.db.models.fields.SlugField', [], {'db_index': 'True', 'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0002_removeslug.py b/imagestore/migrations/0002_removeslug.py deleted file mode 100644 index 4d6fe66..0000000 --- a/imagestore/migrations/0002_removeslug.py +++ /dev/null @@ -1,48 +0,0 @@ -# encoding: utf-8 -import 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 'Image.slug' - db.delete_column('imagestore_image', 'slug') - - - def backwards(self, orm): - - # Adding field 'Image.slug' - db.add_column('imagestore_image', 'slug', self.gf('django.db.models.fields.SlugField')(blank=True, max_length=200, null=True, db_index=True), keep_default=False) - - - models = { - 'imagestore.category': { - 'Meta': {'ordering': "('order', 'title')", 'object_name': 'Category'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {}), - 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['imagestore.Category']"}), - 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200', 'db_index': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), - 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) - }, - 'imagestore.image': { - 'Meta': {'object_name': 'Image'}, - 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'images'", 'to': "orm['imagestore.Category']"}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0003_adduser.py b/imagestore/migrations/0003_adduser.py deleted file mode 100644 index e458f79..0000000 --- a/imagestore/migrations/0003_adduser.py +++ /dev/null @@ -1,85 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding field 'Image.user' - db.add_column('imagestore_image', 'user', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='images', null=True, to=orm['auth.User']), keep_default=False) - - - def backwards(self, orm): - - # Deleting field 'Image.user' - db.delete_column('imagestore_image', 'user_id') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.category': { - 'Meta': {'ordering': "('order', 'title')", 'object_name': 'Category'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {}), - 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['imagestore.Category']"}), - 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200', 'db_index': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), - 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) - }, - 'imagestore.image': { - 'Meta': {'object_name': 'Image'}, - 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'images'", 'to': "orm['imagestore.Category']"}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0004_nonullorder.py b/imagestore/migrations/0004_nonullorder.py deleted file mode 100644 index 783bbba..0000000 --- a/imagestore/migrations/0004_nonullorder.py +++ /dev/null @@ -1,85 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'Image.order' - db.alter_column('imagestore_image', 'order', self.gf('django.db.models.fields.IntegerField')()) - - - def backwards(self, orm): - - # Changing field 'Image.order' - db.alter_column('imagestore_image', 'order', self.gf('django.db.models.fields.IntegerField')(null=True)) - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.category': { - 'Meta': {'ordering': "('order', 'title')", 'object_name': 'Category'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['imagestore.Category']"}), - 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200', 'db_index': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), - 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'images'", 'to': "orm['imagestore.Category']"}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0005_addalbum.py b/imagestore/migrations/0005_addalbum.py deleted file mode 100644 index b92d5bd..0000000 --- a/imagestore/migrations/0005_addalbum.py +++ /dev/null @@ -1,98 +0,0 @@ -# encoding: utf-8 -import 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 'Album' - db.create_table('imagestore_album', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('name', self.gf('django.db.models.fields.CharField')(max_length=200)), - ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), - ('updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)), - )) - db.send_create_signal('imagestore', ['Album']) - - - def backwards(self, orm): - - # Deleting model 'Album' - db.delete_table('imagestore_album') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'imagestore.category': { - 'Meta': {'ordering': "('order', 'title')", 'object_name': 'Category'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {}), - 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['imagestore.Category']"}), - 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200', 'db_index': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), - 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'images'", 'to': "orm['imagestore.Category']"}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0006_addcreatedupdated.py b/imagestore/migrations/0006_addcreatedupdated.py deleted file mode 100644 index 7a13588..0000000 --- a/imagestore/migrations/0006_addcreatedupdated.py +++ /dev/null @@ -1,106 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding field 'Image.created' - db.add_column('imagestore_image', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, null=True, blank=True), keep_default=False) - - # Adding field 'Image.updated' - db.add_column('imagestore_image', 'updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, null=True, blank=True), keep_default=False) - - # Changing field 'Image.category' - db.alter_column('imagestore_image', 'category_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['imagestore.Category'])) - - - def backwards(self, orm): - - # Deleting field 'Image.created' - db.delete_column('imagestore_image', 'created') - - # Deleting field 'Image.updated' - db.delete_column('imagestore_image', 'updated') - - # User chose to not deal with backwards NULL issues for 'Image.category' - raise RuntimeError("Cannot reverse this migration. 'Image.category' and its values cannot be restored.") - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}) - }, - 'imagestore.category': { - 'Meta': {'ordering': "('order', 'title')", 'object_name': 'Category'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'level': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'lft': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'parent': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'children'", 'null': 'True', 'to': "orm['imagestore.Category']"}), - 'rght': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}), - 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '200', 'db_index': 'True'}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200'}), - 'tree_id': ('django.db.models.fields.PositiveIntegerField', [], {'db_index': 'True'}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'category': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Category']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0007_albumfix.py b/imagestore/migrations/0007_albumfix.py deleted file mode 100644 index 7a8d6a1..0000000 --- a/imagestore/migrations/0007_albumfix.py +++ /dev/null @@ -1,131 +0,0 @@ -# encoding: utf-8 -import 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 'Category' - db.delete_table('imagestore_category') - - # Adding field 'Album.user' - db.add_column('imagestore_album', 'user', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='albums', null=True, to=orm['auth.User']), keep_default=False) - - # Adding field 'Album.is_public' - db.add_column('imagestore_album', 'is_public', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False) - - # Adding field 'Album.head' - db.add_column('imagestore_album', 'head', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='head_of', null=True, to=orm['imagestore.Image']), keep_default=False) - - # Deleting field 'Image.is_public' - db.delete_column('imagestore_image', 'is_public') - - # Deleting field 'Image.category' - db.delete_column('imagestore_image', 'category_id') - - # Adding field 'Image.album' - db.add_column('imagestore_image', 'album', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='images', null=True, to=orm['imagestore.Album']), keep_default=False) - - - def backwards(self, orm): - - # Adding model 'Category' - db.create_table('imagestore_category', ( - ('rght', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)), - ('parent', self.gf('django.db.models.fields.related.ForeignKey')(related_name='children', null=True, to=orm['imagestore.Category'], blank=True)), - ('lft', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)), - ('is_public', self.gf('django.db.models.fields.BooleanField')(default=False)), - ('slug', self.gf('django.db.models.fields.SlugField')(max_length=200, db_index=True)), - ('level', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)), - ('title', self.gf('django.db.models.fields.CharField')(max_length=200)), - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('tree_id', self.gf('django.db.models.fields.PositiveIntegerField')(db_index=True)), - ('order', self.gf('django.db.models.fields.IntegerField')(default=0)), - )) - db.send_create_signal('imagestore', ['Category']) - - # Deleting field 'Album.user' - db.delete_column('imagestore_album', 'user_id') - - # Deleting field 'Album.is_public' - db.delete_column('imagestore_album', 'is_public') - - # Deleting field 'Album.head' - db.delete_column('imagestore_album', 'head_id') - - # Adding field 'Image.is_public' - db.add_column('imagestore_image', 'is_public', self.gf('django.db.models.fields.BooleanField')(default=True), keep_default=False) - - # Adding field 'Image.category' - db.add_column('imagestore_image', 'category', self.gf('django.db.models.fields.related.ForeignKey')(related_name='images', null=True, to=orm['imagestore.Category'], blank=True), keep_default=False) - - # Deleting field 'Image.album' - db.delete_column('imagestore_image', 'album_id') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0008_permissions.py b/imagestore/migrations/0008_permissions.py deleted file mode 100644 index f6cf342..0000000 --- a/imagestore/migrations/0008_permissions.py +++ /dev/null @@ -1,93 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import DataMigration -from django.db import models -from django.contrib.auth.management import create_permissions -from django.contrib.auth.models import User, Permission -from django.db.models import get_app - -class Migration(DataMigration): - - def forwards(self, orm): - app = get_app('imagestore') - create_permissions(app, (), 2) - add_image_permission = Permission.objects.get_by_natural_key('add_image', 'imagestore', 'image') - add_album_permission = Permission.objects.get_by_natural_key('add_album', 'imagestore', 'album') - change_image_permission = Permission.objects.get_by_natural_key('change_image', 'imagestore', 'image') - change_album_permission = Permission.objects.get_by_natural_key('change_album', 'imagestore', 'album') - delete_image_permission = Permission.objects.get_by_natural_key('delete_image', 'imagestore','image') - delete_album_permission = Permission.objects.get_by_natural_key('delete_album', 'imagestore', 'album') - for user in User.objects.all(): - user.user_permissions.add(add_image_permission, add_album_permission,) - user.user_permissions.add(change_image_permission, change_album_permission,) - user.user_permissions.add(delete_image_permission, delete_album_permission,) - user.save() - - def backwards(self, orm): - "Write your backwards methods here." - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0009_limits.py b/imagestore/migrations/0009_limits.py deleted file mode 100644 index 8ec5ffb..0000000 --- a/imagestore/migrations/0009_limits.py +++ /dev/null @@ -1,89 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'Album.name' - db.alter_column('imagestore_album', 'name', self.gf('django.db.models.fields.CharField')(max_length=20)) - - # Changing field 'Image.title' - db.alter_column('imagestore_image', 'title', self.gf('django.db.models.fields.CharField')(max_length=20, null=True)) - - - def backwards(self, orm): - - # Changing field 'Album.name' - db.alter_column('imagestore_album', 'name', self.gf('django.db.models.fields.CharField')(max_length=200)) - - # Changing field 'Image.title' - db.alter_column('imagestore_image', 'title', self.gf('django.db.models.fields.CharField')(max_length=200, null=True)) - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '20'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0010_addplace.py b/imagestore/migrations/0010_addplace.py deleted file mode 100644 index 6ba9731..0000000 --- a/imagestore/migrations/0010_addplace.py +++ /dev/null @@ -1,172 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models -try: - from places.models import GeoPlace -except: - GeoPlace = None - -class Migration(SchemaMigration): - - def forwards(self, orm): - if GeoPlace: - # Adding field 'Image.place' - db.add_column('imagestore_image', 'place', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='images', null=True, to=orm['places.GeoPlace']), keep_default=False) - - - def backwards(self, orm): - - # Deleting field 'Image.place' - db.delete_column('imagestore_image', 'place_id') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '20'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'place': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['places.GeoPlace']"}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'places.geoplace': { - 'Meta': {'object_name': 'GeoPlace'}, - 'addional_info': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'address': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '255', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'imagestore_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'latitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'longtitude': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}), - 'metro': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), - 'minuses': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'near_objects': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'near_objects_rel_+'", 'null': 'True', 'to': "orm['places.GeoPlace']"}), - 'near_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'path_to': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'phone': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'pluses': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'topic': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['pybb.Topic']", 'null': 'True', 'blank': 'True'}), - 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['places.PlaceType']", 'null': 'None', 'blank': 'None'}), - 'work_time': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}) - }, - 'places.placetype': { - 'Meta': {'object_name': 'PlaceType'}, - 'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['pybb.Forum']", 'null': 'True', 'blank': 'True'}), - 'forum_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), - 'icon_style': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'name_plural': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'path_to_image': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), - 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}) - }, - 'pybb.category': { - 'Meta': {'ordering': "['position']", 'object_name': 'Category'}, - 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}), - 'position': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}) - }, - 'pybb.forum': { - 'Meta': {'ordering': "['position']", 'object_name': 'Forum'}, - 'category': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'forums'", 'to': "orm['pybb.Category']"}), - 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'headline': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'hidden': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'moderators': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '80'}), - 'position': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), - 'post_count': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), - 'readed_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'readed_forums'", 'symmetrical': 'False', 'through': "orm['pybb.ForumReadTracker']", 'to': "orm['auth.User']"}), - 'topic_count': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}) - }, - 'pybb.forumreadtracker': { - 'Meta': {'object_name': 'ForumReadTracker'}, - 'forum': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['pybb.Forum']", 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'time_stamp': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - }, - 'pybb.topic': { - 'Meta': {'ordering': "['-created']", 'object_name': 'Topic'}, - 'closed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'created': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), - 'forum': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'topics'", 'to': "orm['pybb.Forum']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}), - 'post_count': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}), - 'readed_by': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'readed_topics'", 'symmetrical': 'False', 'through': "orm['pybb.TopicReadTracker']", 'to': "orm['auth.User']"}), - 'sticky': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'subscribers': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'subscriptions'", 'blank': 'True', 'to': "orm['auth.User']"}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}), - 'views': ('django.db.models.fields.IntegerField', [], {'default': '0', 'blank': 'True'}) - }, - 'pybb.topicreadtracker': { - 'Meta': {'object_name': 'TopicReadTracker'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'time_stamp': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'topic': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['pybb.Topic']", 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0011_add_mass_upload.py b/imagestore/migrations/0011_add_mass_upload.py deleted file mode 100644 index f0df949..0000000 --- a/imagestore/migrations/0011_add_mass_upload.py +++ /dev/null @@ -1,98 +0,0 @@ -# encoding: utf-8 -import 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 'AlbumUpload' - db.create_table('imagestore_albumupload', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('zip_file', self.gf('django.db.models.fields.files.FileField')(max_length=100)), - ('album', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['imagestore.Album'], null=True, blank=True)), - ('new_album_name', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), - ('tags', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), - )) - db.send_create_signal('imagestore', ['AlbumUpload']) - - - def backwards(self, orm): - - # Deleting model 'AlbumUpload' - db.delete_table('imagestore_albumupload') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '20'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.albumupload': { - 'Meta': {'object_name': 'AlbumUpload'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']", 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'new_album_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'tags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'zip_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0012_add_order.py b/imagestore/migrations/0012_add_order.py deleted file mode 100644 index 181a4b5..0000000 --- a/imagestore/migrations/0012_add_order.py +++ /dev/null @@ -1,92 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Adding field 'Album.order' - db.add_column('imagestore_album', 'order', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False) - - - def backwards(self, orm): - - # Deleting field 'Album.order' - db.delete_column('imagestore_album', 'order') - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '20'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.albumupload': { - 'Meta': {'object_name': 'AlbumUpload'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']", 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'new_album_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'tags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'zip_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '20', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0013_fix_album_title_length.py b/imagestore/migrations/0013_fix_album_title_length.py deleted file mode 100644 index fa3f42f..0000000 --- a/imagestore/migrations/0013_fix_album_title_length.py +++ /dev/null @@ -1,92 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'Image.title' - db.alter_column('imagestore_image', 'title', self.gf('django.db.models.fields.CharField')(max_length=100, null=True)) - - - def backwards(self, orm): - - # Changing field 'Image.title' - db.alter_column('imagestore_image', 'title', self.gf('django.db.models.fields.CharField')(max_length=20, null=True)) - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '20'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.albumupload': { - 'Meta': {'object_name': 'AlbumUpload'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']", 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'new_album_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'tags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'zip_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/0014_fix_album_name_length.py b/imagestore/migrations/0014_fix_album_name_length.py deleted file mode 100644 index 2cc2713..0000000 --- a/imagestore/migrations/0014_fix_album_name_length.py +++ /dev/null @@ -1,92 +0,0 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models - -class Migration(SchemaMigration): - - def forwards(self, orm): - - # Changing field 'Album.name' - db.alter_column('imagestore_album', 'name', self.gf('django.db.models.fields.CharField')(max_length=100)) - - - def backwards(self, orm): - - # Changing field 'Album.name' - db.alter_column('imagestore_album', 'name', self.gf('django.db.models.fields.CharField')(max_length=20)) - - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - '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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - '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', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - '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', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - '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'}), - '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'}) - }, - 'imagestore.album': { - 'Meta': {'ordering': "('created', 'name')", 'object_name': 'Album'}, - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), - 'head': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'head_of'", 'null': 'True', 'to': "orm['imagestore.Image']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'albums'", 'null': 'True', 'to': "orm['auth.User']"}) - }, - 'imagestore.albumupload': { - 'Meta': {'object_name': 'AlbumUpload'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['imagestore.Album']", 'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'new_album_name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'tags': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}), - 'zip_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}) - }, - 'imagestore.image': { - 'Meta': {'ordering': "('order', 'id')", 'object_name': 'Image'}, - 'album': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['imagestore.Album']"}), - 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'null': 'True', 'blank': 'True'}), - 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('sorl.thumbnail.fields.ImageField', [], {'max_length': '100'}), - 'order': ('django.db.models.fields.IntegerField', [], {'default': '0'}), - 'tags': ('tagging.fields.TagField', [], {}), - 'title': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}), - 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'images'", 'null': 'True', 'to': "orm['auth.User']"}) - } - } - - complete_apps = ['imagestore'] diff --git a/imagestore/migrations/__init__.py b/imagestore/migrations/__init__.py deleted file mode 100644 index 04ccd4b..0000000 --- a/imagestore/migrations/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - \ No newline at end of file diff --git a/imagestore/models/__init__.py b/imagestore/models/__init__.py deleted file mode 100644 index c9fd014..0000000 --- a/imagestore/models/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' -from imagestore.utils import load_class, get_model_string -from django.conf import settings - -Album = load_class(getattr(settings, 'IMAGESTORE_ALBUM_MODEL', 'imagestore.models.album.Album')) -Image = load_class(getattr(settings, 'IMAGESTORE_IMAGE_MODEL', 'imagestore.models.image.Image')) - -# This labels and classnames used to generate permissons labels -image_applabel = Image._meta.app_label -image_classname = Image.__name__.lower() - -album_applabel = Album._meta.app_label -album_classname = Album.__name__.lower() - - -from upload import AlbumUpload \ No newline at end of file diff --git a/imagestore/models/album.py b/imagestore/models/album.py deleted file mode 100644 index 1e69927..0000000 --- a/imagestore/models/album.py +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - -from bases.album import BaseAlbum -from django.utils.translation import ugettext_lazy as _ -from imagestore.utils import load_class, get_model_string - -class Album(BaseAlbum): - - class Meta(BaseAlbum.Meta): - abstract = False - verbose_name = _('Album') - verbose_name_plural = _('Albums') - app_label = 'imagestore' \ No newline at end of file diff --git a/imagestore/models/bases/__init__.py b/imagestore/models/bases/__init__.py deleted file mode 100644 index 04ccd4b..0000000 --- a/imagestore/models/bases/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - \ No newline at end of file diff --git a/imagestore/models/bases/album.py b/imagestore/models/bases/album.py deleted file mode 100644 index cf64801..0000000 --- a/imagestore/models/bases/album.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - - -from django.db import models -from django.db.models import permalink -from django.utils.translation import ugettext_lazy as _ -from django.conf import settings -from sorl.thumbnail import get_thumbnail - -try: - from django.contrib.auth import get_user_model - User = get_user_model() -except ImportError: - from django.contrib.auth.models import User - -try: - import Image as PILImage -except ImportError: - from PIL import Image as PILImage - -from imagestore.utils import get_model_string - - -SELF_MANAGE = getattr(settings, 'IMAGESTORE_SELF_MANAGE', True) - - -class BaseAlbum(models.Model): - class Meta(object): - abstract = True - ordering = ('order', 'created', 'name') - permissions = ( - ('moderate_albums', 'View, update and delete any album'), - ) - - user = models.ForeignKey(User, verbose_name=_('User'), null=True, blank=True, related_name='albums') - name = models.CharField(_('Name'), max_length=100, blank=False, null=False) - created = models.DateTimeField(_('Created'), auto_now_add=True) - updated = models.DateTimeField(_('Updated'), auto_now=True) - is_public = models.BooleanField(_('Is public'), default=True) - head = models.ForeignKey(get_model_string('Image'), related_name='head_of', null=True, blank=True, on_delete=models.SET_NULL) - - order = models.IntegerField(_('Order'), default=0) - - def get_head(self): - if self.head: - return self.head - else: - if self.images.all().count()>0: - self.head = self.images.all()[0] - self.save() - return self.head - else: - return None - - @permalink - def get_absolute_url(self): - return 'imagestore:album', (), {'album_id': self.id} - - def __unicode__(self): - return self.name - - def admin_thumbnail(self): - img = self.get_head() - if img: - try: - return '' % get_thumbnail(img.image, '100x100', crop='center').url - except IOError: - return 'IOError' - return _('Empty album') - - admin_thumbnail.short_description = _('Head') - admin_thumbnail.allow_tags = True \ No newline at end of file diff --git a/imagestore/models/bases/image.py b/imagestore/models/bases/image.py deleted file mode 100644 index ef2ef21..0000000 --- a/imagestore/models/bases/image.py +++ /dev/null @@ -1,104 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - - -from django.db import models -from django.db.models import permalink -from sorl.thumbnail.helpers import ThumbnailError -from tagging.fields import TagField -from django.utils.translation import ugettext_lazy as _ -from django.conf import settings -from sorl.thumbnail import ImageField, get_thumbnail -from django.contrib.auth.models import Permission -from django.db.models.signals import post_save -from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import ObjectDoesNotExist - -try: - from django.contrib.auth import get_user_model - User = get_user_model() -except ImportError: - from django.contrib.auth.models import User - -try: - import Image as PILImage -except ImportError: - from PIL import Image as PILImage - -from imagestore.utils import get_file_path, get_model_string - -SELF_MANAGE = getattr(settings, 'IMAGESTORE_SELF_MANAGE', True) - - -class BaseImage(models.Model): - class Meta(object): - abstract = True - ordering = ('order', 'id') - permissions = ( - ('moderate_images', 'View, update and delete any image'), - ) - - title = models.CharField(_('Title'), max_length=100, blank=True, null=True) - description = models.TextField(_('Description'), blank=True, null=True) - tags = TagField(_('Tags'), blank=True) - order = models.IntegerField(_('Order'), default=0) - image = ImageField(verbose_name = _('File'), upload_to=get_file_path) - user = models.ForeignKey(User, verbose_name=_('User'), null=True, blank=True, related_name='images') - created = models.DateTimeField(_('Created'), auto_now_add=True, null=True) - updated = models.DateTimeField(_('Updated'), auto_now=True, null=True) - album = models.ForeignKey(get_model_string('Album'), verbose_name=_('Album'), null=True, blank=True, related_name='images') - - @permalink - def get_absolute_url(self): - return 'imagestore:image', (), {'pk': self.id} - - def __unicode__(self): - return '%s'% self.id - - def admin_thumbnail(self): - try: - return '' % get_thumbnail(self.image, '100x100', crop='center').url - except IOError: - return 'IOError' - except ThumbnailError, ex: - return 'ThumbnailError, %s' % ex.message - - admin_thumbnail.short_description = _('Thumbnail') - admin_thumbnail.allow_tags = True - - -#noinspection PyUnusedLocal -def setup_imagestore_permissions(instance, created, **kwargs): - if not created: - return - try: - from imagestore.models import Album, Image - album_type = ContentType.objects.get( - #app_label=load_class('imagestore.models.Album')._meta.app_label, - app_label = Album._meta.app_label, - name='Album' - ) - image_type = ContentType.objects.get( - #app_label=load_class('imagestore.models.Image')._meta.app_label, - app_label = Image._meta.app_label, - name='Image' - ) - add_image_permission = Permission.objects.get(codename='add_image', content_type=image_type) - add_album_permission = Permission.objects.get(codename='add_album', content_type=album_type) - change_image_permission = Permission.objects.get(codename='change_image', content_type=image_type) - change_album_permission = Permission.objects.get(codename='change_album', content_type=album_type) - delete_image_permission = Permission.objects.get(codename='delete_image', content_type=image_type) - delete_album_permission = Permission.objects.get(codename='delete_album', content_type=album_type) - instance.user_permissions.add(add_image_permission, add_album_permission,) - instance.user_permissions.add(change_image_permission, change_album_permission,) - instance.user_permissions.add(delete_image_permission, delete_album_permission,) - except ObjectDoesNotExist: - # Permissions are not yet installed or conten does not created yet - # probaly this is first - pass - - -if SELF_MANAGE: - post_save.connect(setup_imagestore_permissions, User) \ No newline at end of file diff --git a/imagestore/models/image.py b/imagestore/models/image.py deleted file mode 100644 index 17876f1..0000000 --- a/imagestore/models/image.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - -from bases.image import BaseImage -from django.utils.translation import ugettext_lazy as _ -from imagestore.utils import load_class, get_model_string - -class Image(BaseImage): - class Meta(BaseImage.Meta): - abstract = False - verbose_name = _('Image') - verbose_name_plural = _('Images') - app_label = 'imagestore' \ No newline at end of file diff --git a/imagestore/models/upload.py b/imagestore/models/upload.py deleted file mode 100644 index 348a7a9..0000000 --- a/imagestore/models/upload.py +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 -from django.core.exceptions import ImproperlyConfigured -from django.utils.importlib import import_module - -__author__ = 'zeus' - -import os -import zipfile -from django.db import models -from django.utils.translation import ugettext_lazy as _ -from django.conf import settings -from django.core.files.base import ContentFile -try: - import Image as PILImage -except ImportError: - from PIL import Image as PILImage - -from imagestore.models import Album, Image - -TEMP_DIR = getattr(settings, 'TEMP_DIR', 'temp/') - - -def process_zipfile(uploaded_album): - if os.path.isfile(uploaded_album.zip_file.path): - # TODO: implement try-except here - zip = zipfile.ZipFile(uploaded_album.zip_file.path) - bad_file = zip.testzip() - if bad_file: - raise Exception('"%s" in the .zip archive is corrupt.' % bad_file) - - if not uploaded_album.album: - uploaded_album.album = Album.objects.create(name=uploaded_album.new_album_name) - - from cStringIO import StringIO - for filename in sorted(zip.namelist()): - if filename.startswith('__'): # do not process meta files - continue - print filename - data = zip.read(filename) - if len(data): - try: - # the following is taken from django.forms.fields.ImageField: - # load() could spot a truncated JPEG, but it loads the entire - # image in memory, which is a DoS vector. See #3848 and #18520. - # verify() must be called immediately after the constructor. - PILImage.open(StringIO(data)).verify() - except Exception, ex: - # if a "bad" file is found we just skip it. - print('Error verify image: %s' % ex.message) - continue - if hasattr(data, 'seek') and callable(data.seek): - print 'seeked' - data.seek(0) - try: - img = Image(album=uploaded_album.album) - img.image.save(filename, ContentFile(data)) - img.save() - except Exception, ex: - print('error create Image: %s' % ex.message) - zip.close() - uploaded_album.delete() - - -upload_processor_function = getattr(settings, 'IMAGESTORE_UPLOAD_ALBUM_PROCESSOR', None) -upload_processor = process_zipfile -if upload_processor_function: - i = upload_processor_function.rfind('.') - module, attr = upload_processor_function[:i], upload_processor_function[i+1:] - try: - mod = import_module(module) - except ImportError as e: - raise ImproperlyConfigured('Error importing request processor module %s: "%s"' % (module, e)) - try: - upload_processor = getattr(mod, attr) - except AttributeError: - raise ImproperlyConfigured('Module "%s" does not define a "%s" callable request processor' % (module, attr)) - - -class AlbumUpload(models.Model): - """ - Just re-written django-photologue GalleryUpload method - """ - zip_file = models.FileField(_('images file (.zip)'), upload_to=TEMP_DIR, - help_text=_('Select a .zip file of images to upload into a new Gallery.')) - album = models.ForeignKey( - Album, - null=True, - blank=True, - help_text=_('Select an album to add these images to. leave this empty to create a new album from the supplied title.') - ) - new_album_name = models.CharField( - max_length=255, - blank=True, - verbose_name=_('New album name'), - help_text=_('If not empty new album with this name will be created and images will be upload to this album') - ) - tags = models.CharField(max_length=255, blank=True, verbose_name=_('tags')) - - class Meta(object): - verbose_name = _('Album upload') - verbose_name_plural = _('Album uploads') - app_label = 'imagestore' - - def save(self, *args, **kwargs): - super(AlbumUpload, self).save(*args, **kwargs) - upload_processor(self) - - def delete(self, *args, **kwargs): - storage, path = self.zip_file.storage, self.zip_file.path - super(AlbumUpload, self).delete(*args, **kwargs) - storage.delete(path) diff --git a/imagestore/static/imagestore.css b/imagestore/static/imagestore.css deleted file mode 100644 index b5bc09c..0000000 --- a/imagestore/static/imagestore.css +++ /dev/null @@ -1,107 +0,0 @@ -#category-list li{ - font-size: 120%; - padding-bottom: 15px; -} - -#category-list { - padding-bottom: 10px; -} - -#controls { - font-size: 90%; -} - -#controls .controls-group { - padding-top: 10px; -} - -.image-description { - padding: 10px 0 10px 0; -} - -.navigation { - text-align: center; - padding: 0 0 10px 0; - font-size: 110%; -} - -.navigation .next-link { - margin-left: 100px; -} - -img.current { - border: 1px red solid; -} - -#image-view img.preview { - display: block; - margin: 0 auto 0 auto; -} - -#image-view { - margin-right: 300px; -} - -.album-list .album { - width: 160px; - height: 200px; - float: left; - padding: 5px; - margin: 10px; -} - -.album-name { - width: 100%; - text-align: center; -} - -.album-user { - width: 100%; - text-align: center; - font-size: 80%; - color: #CCC; -} - -.album-head { - height: 150px; - width: 150px; - display: table-cell; - vertical-align: middle; - text-align: center; -} -.album-head a { - text-align: center; -} - -.user-info { - padding: 20px 0; -} - -.image-preview { - float: left; - width: 130px; - padding: 5px; - height: 160px; -} - -.image-preview .image-title { - font-size: 80%; -} - -.extra-fields { - font-size: 80%; - margin: 10px 0; -} - -.extra-fields label { - color: #666666; -} - -.basic-fields, .extra-fields { - display: block; - float: left; -} - -.pagination .disabled { - display: none; -} \ No newline at end of file diff --git a/imagestore/static/prettyphoto/README b/imagestore/static/prettyphoto/README deleted file mode 100755 index 1e56842..0000000 --- a/imagestore/static/prettyphoto/README +++ /dev/null @@ -1,30 +0,0 @@ -prettyPhoto v3.1.4 -© Copyright, Stephane Caron -http://www.no-margin-for-errors.com - - -============================= Released under ============================= - -Creative Commons 2.5 -http://creativecommons.org/licenses/by/2.5/ - -OR - -GPLV2 license -http://www.gnu.org/licenses/gpl-2.0.html - -You are free to use prettyPhoto in commercial projects as long as the -copyright header is left intact. - -============================ More information ============================ -http://www.no-margin-for-errors.com/projects/prettyPhoto/ - - -============================== Description =============================== - -prettyPhoto is a jQuery based lightbox clone. Not only does it support images, -it also add support for videos, flash, YouTube, iFrame. It's a full blown -media modal box. - -Please refer to http://www.no-margin-for-errors.com/projects/prettyPhoto/ -for all the details on how to use. diff --git a/imagestore/static/prettyphoto/css/prettyPhoto.css b/imagestore/static/prettyphoto/css/prettyPhoto.css deleted file mode 100644 index 8a2a2fd..0000000 --- a/imagestore/static/prettyphoto/css/prettyPhoto.css +++ /dev/null @@ -1,170 +0,0 @@ -div.pp_default .pp_top,div.pp_default .pp_top .pp_middle,div.pp_default .pp_top .pp_left,div.pp_default .pp_top .pp_right,div.pp_default .pp_bottom,div.pp_default .pp_bottom .pp_left,div.pp_default .pp_bottom .pp_middle,div.pp_default .pp_bottom .pp_right{height:13px} -div.pp_default .pp_top .pp_left{background:url(../images/prettyPhoto/default/sprite.png) -78px -93px no-repeat} -div.pp_default .pp_top .pp_middle{background:url(../images/prettyPhoto/default/sprite_x.png) top left repeat-x} -div.pp_default .pp_top .pp_right{background:url(../images/prettyPhoto/default/sprite.png) -112px -93px no-repeat} -div.pp_default .pp_content .ppt{color:#f8f8f8} -div.pp_default .pp_content_container .pp_left{background:url(../images/prettyPhoto/default/sprite_y.png) -7px 0 repeat-y;padding-left:13px} -div.pp_default .pp_content_container .pp_right{background:url(../images/prettyPhoto/default/sprite_y.png) top right repeat-y;padding-right:13px} -div.pp_default .pp_next:hover{background:url(../images/prettyPhoto/default/sprite_next.png) center right no-repeat;cursor:pointer} -div.pp_default .pp_previous:hover{background:url(../images/prettyPhoto/default/sprite_prev.png) center left no-repeat;cursor:pointer} -div.pp_default .pp_expand{background:url(../images/prettyPhoto/default/sprite.png) 0 -29px no-repeat;cursor:pointer;width:28px;height:28px} -div.pp_default .pp_expand:hover{background:url(../images/prettyPhoto/default/sprite.png) 0 -56px no-repeat;cursor:pointer} -div.pp_default .pp_contract{background:url(../images/prettyPhoto/default/sprite.png) 0 -84px no-repeat;cursor:pointer;width:28px;height:28px} -div.pp_default .pp_contract:hover{background:url(../images/prettyPhoto/default/sprite.png) 0 -113px no-repeat;cursor:pointer} -div.pp_default .pp_close{width:30px;height:30px;background:url(../images/prettyPhoto/default/sprite.png) 2px 1px no-repeat;cursor:pointer} -div.pp_default .pp_gallery ul li a{background:url(../images/prettyPhoto/default/default_thumb.png) center center #f8f8f8;border:1px solid #aaa} -div.pp_default .pp_social{margin-top:7px} -div.pp_default .pp_gallery a.pp_arrow_previous,div.pp_default .pp_gallery a.pp_arrow_next{position:static;left:auto} -div.pp_default .pp_nav .pp_play,div.pp_default .pp_nav .pp_pause{background:url(../images/prettyPhoto/default/sprite.png) -51px 1px no-repeat;height:30px;width:30px} -div.pp_default .pp_nav .pp_pause{background-position:-51px -29px} -div.pp_default a.pp_arrow_previous,div.pp_default a.pp_arrow_next{background:url(../images/prettyPhoto/default/sprite.png) -31px -3px no-repeat;height:20px;width:20px;margin:4px 0 0} -div.pp_default a.pp_arrow_next{left:52px;background-position:-82px -3px} -div.pp_default .pp_content_container .pp_details{margin-top:5px} -div.pp_default .pp_nav{clear:none;height:30px;width:110px;position:relative} -div.pp_default .pp_nav .currentTextHolder{font-family:Georgia;font-style:italic;color:#999;font-size:11px;left:75px;line-height:25px;position:absolute;top:2px;margin:0;padding:0 0 0 10px} -div.pp_default .pp_close:hover,div.pp_default .pp_nav .pp_play:hover,div.pp_default .pp_nav .pp_pause:hover,div.pp_default .pp_arrow_next:hover,div.pp_default .pp_arrow_previous:hover{opacity:0.7} -div.pp_default .pp_description{font-size:11px;font-weight:700;line-height:14px;margin:5px 50px 5px 0} -div.pp_default .pp_bottom .pp_left{background:url(../images/prettyPhoto/default/sprite.png) -78px -127px no-repeat} -div.pp_default .pp_bottom .pp_middle{background:url(../images/prettyPhoto/default/sprite_x.png) bottom left repeat-x} -div.pp_default .pp_bottom .pp_right{background:url(../images/prettyPhoto/default/sprite.png) -112px -127px no-repeat} -div.pp_default .pp_loaderIcon{background:url(../images/prettyPhoto/default/loader.gif) center center no-repeat} -div.light_rounded .pp_top .pp_left{background:url(../images/prettyPhoto/light_rounded/sprite.png) -88px -53px no-repeat} -div.light_rounded .pp_top .pp_right{background:url(../images/prettyPhoto/light_rounded/sprite.png) -110px -53px no-repeat} -div.light_rounded .pp_next:hover{background:url(../images/prettyPhoto/light_rounded/btnNext.png) center right no-repeat;cursor:pointer} -div.light_rounded .pp_previous:hover{background:url(../images/prettyPhoto/light_rounded/btnPrevious.png) center left no-repeat;cursor:pointer} -div.light_rounded .pp_expand{background:url(../images/prettyPhoto/light_rounded/sprite.png) -31px -26px no-repeat;cursor:pointer} -div.light_rounded .pp_expand:hover{background:url(../images/prettyPhoto/light_rounded/sprite.png) -31px -47px no-repeat;cursor:pointer} -div.light_rounded .pp_contract{background:url(../images/prettyPhoto/light_rounded/sprite.png) 0 -26px no-repeat;cursor:pointer} -div.light_rounded .pp_contract:hover{background:url(../images/prettyPhoto/light_rounded/sprite.png) 0 -47px no-repeat;cursor:pointer} -div.light_rounded .pp_close{width:75px;height:22px;background:url(../images/prettyPhoto/light_rounded/sprite.png) -1px -1px no-repeat;cursor:pointer} -div.light_rounded .pp_nav .pp_play{background:url(../images/prettyPhoto/light_rounded/sprite.png) -1px -100px no-repeat;height:15px;width:14px} -div.light_rounded .pp_nav .pp_pause{background:url(../images/prettyPhoto/light_rounded/sprite.png) -24px -100px no-repeat;height:15px;width:14px} -div.light_rounded .pp_arrow_previous{background:url(../images/prettyPhoto/light_rounded/sprite.png) 0 -71px no-repeat} -div.light_rounded .pp_arrow_next{background:url(../images/prettyPhoto/light_rounded/sprite.png) -22px -71px no-repeat} -div.light_rounded .pp_bottom .pp_left{background:url(../images/prettyPhoto/light_rounded/sprite.png) -88px -80px no-repeat} -div.light_rounded .pp_bottom .pp_right{background:url(../images/prettyPhoto/light_rounded/sprite.png) -110px -80px no-repeat} -div.dark_rounded .pp_top .pp_left{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -88px -53px no-repeat} -div.dark_rounded .pp_top .pp_right{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -110px -53px no-repeat} -div.dark_rounded .pp_content_container .pp_left{background:url(../images/prettyPhoto/dark_rounded/contentPattern.png) top left repeat-y} -div.dark_rounded .pp_content_container .pp_right{background:url(../images/prettyPhoto/dark_rounded/contentPattern.png) top right repeat-y} -div.dark_rounded .pp_next:hover{background:url(../images/prettyPhoto/dark_rounded/btnNext.png) center right no-repeat;cursor:pointer} -div.dark_rounded .pp_previous:hover{background:url(../images/prettyPhoto/dark_rounded/btnPrevious.png) center left no-repeat;cursor:pointer} -div.dark_rounded .pp_expand{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -31px -26px no-repeat;cursor:pointer} -div.dark_rounded .pp_expand:hover{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -31px -47px no-repeat;cursor:pointer} -div.dark_rounded .pp_contract{background:url(../images/prettyPhoto/dark_rounded/sprite.png) 0 -26px no-repeat;cursor:pointer} -div.dark_rounded .pp_contract:hover{background:url(../images/prettyPhoto/dark_rounded/sprite.png) 0 -47px no-repeat;cursor:pointer} -div.dark_rounded .pp_close{width:75px;height:22px;background:url(../images/prettyPhoto/dark_rounded/sprite.png) -1px -1px no-repeat;cursor:pointer} -div.dark_rounded .pp_description{margin-right:85px;color:#fff} -div.dark_rounded .pp_nav .pp_play{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -1px -100px no-repeat;height:15px;width:14px} -div.dark_rounded .pp_nav .pp_pause{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -24px -100px no-repeat;height:15px;width:14px} -div.dark_rounded .pp_arrow_previous{background:url(../images/prettyPhoto/dark_rounded/sprite.png) 0 -71px no-repeat} -div.dark_rounded .pp_arrow_next{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -22px -71px no-repeat} -div.dark_rounded .pp_bottom .pp_left{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -88px -80px no-repeat} -div.dark_rounded .pp_bottom .pp_right{background:url(../images/prettyPhoto/dark_rounded/sprite.png) -110px -80px no-repeat} -div.dark_rounded .pp_loaderIcon{background:url(../images/prettyPhoto/dark_rounded/loader.gif) center center no-repeat} -div.dark_square .pp_left,div.dark_square .pp_middle,div.dark_square .pp_right,div.dark_square .pp_content{background:#000} -div.dark_square .pp_description{color:#fff;margin:0 85px 0 0} -div.dark_square .pp_loaderIcon{background:url(../images/prettyPhoto/dark_square/loader.gif) center center no-repeat} -div.dark_square .pp_expand{background:url(../images/prettyPhoto/dark_square/sprite.png) -31px -26px no-repeat;cursor:pointer} -div.dark_square .pp_expand:hover{background:url(../images/prettyPhoto/dark_square/sprite.png) -31px -47px no-repeat;cursor:pointer} -div.dark_square .pp_contract{background:url(../images/prettyPhoto/dark_square/sprite.png) 0 -26px no-repeat;cursor:pointer} -div.dark_square .pp_contract:hover{background:url(../images/prettyPhoto/dark_square/sprite.png) 0 -47px no-repeat;cursor:pointer} -div.dark_square .pp_close{width:75px;height:22px;background:url(../images/prettyPhoto/dark_square/sprite.png) -1px -1px no-repeat;cursor:pointer} -div.dark_square .pp_nav{clear:none} -div.dark_square .pp_nav .pp_play{background:url(../images/prettyPhoto/dark_square/sprite.png) -1px -100px no-repeat;height:15px;width:14px} -div.dark_square .pp_nav .pp_pause{background:url(../images/prettyPhoto/dark_square/sprite.png) -24px -100px no-repeat;height:15px;width:14px} -div.dark_square .pp_arrow_previous{background:url(../images/prettyPhoto/dark_square/sprite.png) 0 -71px no-repeat} -div.dark_square .pp_arrow_next{background:url(../images/prettyPhoto/dark_square/sprite.png) -22px -71px no-repeat} -div.dark_square .pp_next:hover{background:url(../images/prettyPhoto/dark_square/btnNext.png) center right no-repeat;cursor:pointer} -div.dark_square .pp_previous:hover{background:url(../images/prettyPhoto/dark_square/btnPrevious.png) center left no-repeat;cursor:pointer} -div.light_square .pp_expand{background:url(../images/prettyPhoto/light_square/sprite.png) -31px -26px no-repeat;cursor:pointer} -div.light_square .pp_expand:hover{background:url(../images/prettyPhoto/light_square/sprite.png) -31px -47px no-repeat;cursor:pointer} -div.light_square .pp_contract{background:url(../images/prettyPhoto/light_square/sprite.png) 0 -26px no-repeat;cursor:pointer} -div.light_square .pp_contract:hover{background:url(../images/prettyPhoto/light_square/sprite.png) 0 -47px no-repeat;cursor:pointer} -div.light_square .pp_close{width:75px;height:22px;background:url(../images/prettyPhoto/light_square/sprite.png) -1px -1px no-repeat;cursor:pointer} -div.light_square .pp_nav .pp_play{background:url(../images/prettyPhoto/light_square/sprite.png) -1px -100px no-repeat;height:15px;width:14px} -div.light_square .pp_nav .pp_pause{background:url(../images/prettyPhoto/light_square/sprite.png) -24px -100px no-repeat;height:15px;width:14px} -div.light_square .pp_arrow_previous{background:url(../images/prettyPhoto/light_square/sprite.png) 0 -71px no-repeat} -div.light_square .pp_arrow_next{background:url(../images/prettyPhoto/light_square/sprite.png) -22px -71px no-repeat} -div.light_square .pp_next:hover{background:url(../images/prettyPhoto/light_square/btnNext.png) center right no-repeat;cursor:pointer} -div.light_square .pp_previous:hover{background:url(../images/prettyPhoto/light_square/btnPrevious.png) center left no-repeat;cursor:pointer} -div.facebook .pp_top .pp_left{background:url(../images/prettyPhoto/facebook/sprite.png) -88px -53px no-repeat} -div.facebook .pp_top .pp_middle{background:url(../images/prettyPhoto/facebook/contentPatternTop.png) top left repeat-x} -div.facebook .pp_top .pp_right{background:url(../images/prettyPhoto/facebook/sprite.png) -110px -53px no-repeat} -div.facebook .pp_content_container .pp_left{background:url(../images/prettyPhoto/facebook/contentPatternLeft.png) top left repeat-y} -div.facebook .pp_content_container .pp_right{background:url(../images/prettyPhoto/facebook/contentPatternRight.png) top right repeat-y} -div.facebook .pp_expand{background:url(../images/prettyPhoto/facebook/sprite.png) -31px -26px no-repeat;cursor:pointer} -div.facebook .pp_expand:hover{background:url(../images/prettyPhoto/facebook/sprite.png) -31px -47px no-repeat;cursor:pointer} -div.facebook .pp_contract{background:url(../images/prettyPhoto/facebook/sprite.png) 0 -26px no-repeat;cursor:pointer} -div.facebook .pp_contract:hover{background:url(../images/prettyPhoto/facebook/sprite.png) 0 -47px no-repeat;cursor:pointer} -div.facebook .pp_close{width:22px;height:22px;background:url(../images/prettyPhoto/facebook/sprite.png) -1px -1px no-repeat;cursor:pointer} -div.facebook .pp_description{margin:0 37px 0 0} -div.facebook .pp_loaderIcon{background:url(../images/prettyPhoto/facebook/loader.gif) center center no-repeat} -div.facebook .pp_arrow_previous{background:url(../images/prettyPhoto/facebook/sprite.png) 0 -71px no-repeat;height:22px;margin-top:0;width:22px} -div.facebook .pp_arrow_previous.disabled{background-position:0 -96px;cursor:default} -div.facebook .pp_arrow_next{background:url(../images/prettyPhoto/facebook/sprite.png) -32px -71px no-repeat;height:22px;margin-top:0;width:22px} -div.facebook .pp_arrow_next.disabled{background-position:-32px -96px;cursor:default} -div.facebook .pp_nav{margin-top:0} -div.facebook .pp_nav p{font-size:15px;padding:0 3px 0 4px} -div.facebook .pp_nav .pp_play{background:url(../images/prettyPhoto/facebook/sprite.png) -1px -123px no-repeat;height:22px;width:22px} -div.facebook .pp_nav .pp_pause{background:url(../images/prettyPhoto/facebook/sprite.png) -32px -123px no-repeat;height:22px;width:22px} -div.facebook .pp_next:hover{background:url(../images/prettyPhoto/facebook/btnNext.png) center right no-repeat;cursor:pointer} -div.facebook .pp_previous:hover{background:url(../images/prettyPhoto/facebook/btnPrevious.png) center left no-repeat;cursor:pointer} -div.facebook .pp_bottom .pp_left{background:url(../images/prettyPhoto/facebook/sprite.png) -88px -80px no-repeat} -div.facebook .pp_bottom .pp_middle{background:url(../images/prettyPhoto/facebook/contentPatternBottom.png) top left repeat-x} -div.facebook .pp_bottom .pp_right{background:url(../images/prettyPhoto/facebook/sprite.png) -110px -80px no-repeat} -div.pp_pic_holder a:focus{outline:none} -div.pp_overlay{background:#000;display:none;left:0;position:absolute;top:0;width:100%;z-index:9500} -div.pp_pic_holder{display:none;position:absolute;width:100px;z-index:10000} -.pp_content{height:40px;min-width:40px} -* html .pp_content{width:40px} -.pp_content_container{position:relative;text-align:left;width:100%} -.pp_content_container .pp_left{padding-left:20px} -.pp_content_container .pp_right{padding-right:20px} -.pp_content_container .pp_details{float:left;margin:10px 0 2px} -.pp_description{display:none;margin:0} -.pp_social{float:left;margin:0} -.pp_social .facebook{float:left;margin-left:5px;width:55px;overflow:hidden} -.pp_social .twitter{float:left} -.pp_nav{clear:right;float:left;margin:3px 10px 0 0} -.pp_nav p{float:left;white-space:nowrap;margin:2px 4px} -.pp_nav .pp_play,.pp_nav .pp_pause{float:left;margin-right:4px;text-indent:-10000px} -a.pp_arrow_previous,a.pp_arrow_next{display:block;float:left;height:15px;margin-top:3px;overflow:hidden;text-indent:-10000px;width:14px} -.pp_hoverContainer{position:absolute;top:0;width:100%;z-index:2000} -.pp_gallery{display:none;left:50%;margin-top:-50px;position:absolute;z-index:10000} -.pp_gallery div{float:left;overflow:hidden;position:relative} -.pp_gallery ul{float:left;height:35px;position:relative;white-space:nowrap;margin:0 0 0 5px;padding:0} -.pp_gallery ul a{border:1px rgba(0,0,0,0.5) solid;display:block;float:left;height:33px;overflow:hidden} -.pp_gallery ul a img{border:0} -.pp_gallery li{display:block;float:left;margin:0 5px 0 0;padding:0} -.pp_gallery li.default a{background:url(../images/prettyPhoto/facebook/default_thumbnail.gif) 0 0 no-repeat;display:block;height:33px;width:50px} -.pp_gallery .pp_arrow_previous,.pp_gallery .pp_arrow_next{margin-top:7px!important} -a.pp_next{background:url(../images/prettyPhoto/light_rounded/btnNext.png) 10000px 10000px no-repeat;display:block;float:right;height:100%;text-indent:-10000px;width:49%} -a.pp_previous{background:url(../images/prettyPhoto/light_rounded/btnNext.png) 10000px 10000px no-repeat;display:block;float:left;height:100%;text-indent:-10000px;width:49%} -a.pp_expand,a.pp_contract{cursor:pointer;display:none;height:20px;position:absolute;right:30px;text-indent:-10000px;top:10px;width:20px;z-index:20000} -a.pp_close{position:absolute;right:0;top:0;display:block;line-height:22px;text-indent:-10000px} -.pp_loaderIcon{display:block;height:24px;left:50%;position:absolute;top:50%;width:24px;margin:-12px 0 0 -12px} -#pp_full_res{line-height:1!important} -#pp_full_res .pp_inline{text-align:left} -#pp_full_res .pp_inline p{margin:0 0 15px} -div.ppt{color:#fff;display:none;font-size:17px;z-index:9999;margin:0 0 5px 15px} -div.pp_default .pp_content,div.light_rounded .pp_content{background-color:#fff} -div.pp_default #pp_full_res .pp_inline,div.light_rounded .pp_content .ppt,div.light_rounded #pp_full_res .pp_inline,div.light_square .pp_content .ppt,div.light_square #pp_full_res .pp_inline,div.facebook .pp_content .ppt,div.facebook #pp_full_res .pp_inline{color:#000} -div.pp_default .pp_gallery ul li a:hover,div.pp_default .pp_gallery ul li.selected a,.pp_gallery ul a:hover,.pp_gallery li.selected a{border-color:#fff} -div.pp_default .pp_details,div.light_rounded .pp_details,div.dark_rounded .pp_details,div.dark_square .pp_details,div.light_square .pp_details,div.facebook .pp_details{position:relative} -div.light_rounded .pp_top .pp_middle,div.light_rounded .pp_content_container .pp_left,div.light_rounded .pp_content_container .pp_right,div.light_rounded .pp_bottom .pp_middle,div.light_square .pp_left,div.light_square .pp_middle,div.light_square .pp_right,div.light_square .pp_content,div.facebook .pp_content{background:#fff} -div.light_rounded .pp_description,div.light_square .pp_description{margin-right:85px} -div.light_rounded .pp_gallery a.pp_arrow_previous,div.light_rounded .pp_gallery a.pp_arrow_next,div.dark_rounded .pp_gallery a.pp_arrow_previous,div.dark_rounded .pp_gallery a.pp_arrow_next,div.dark_square .pp_gallery a.pp_arrow_previous,div.dark_square .pp_gallery a.pp_arrow_next,div.light_square .pp_gallery a.pp_arrow_previous,div.light_square .pp_gallery a.pp_arrow_next{margin-top:12px!important} -div.light_rounded .pp_arrow_previous.disabled,div.dark_rounded .pp_arrow_previous.disabled,div.dark_square .pp_arrow_previous.disabled,div.light_square .pp_arrow_previous.disabled{background-position:0 -87px;cursor:default} -div.light_rounded .pp_arrow_next.disabled,div.dark_rounded .pp_arrow_next.disabled,div.dark_square .pp_arrow_next.disabled,div.light_square .pp_arrow_next.disabled{background-position:-22px -87px;cursor:default} -div.light_rounded .pp_loaderIcon,div.light_square .pp_loaderIcon{background:url(../images/prettyPhoto/light_rounded/loader.gif) center center no-repeat} -div.dark_rounded .pp_top .pp_middle,div.dark_rounded .pp_content,div.dark_rounded .pp_bottom .pp_middle{background:url(../images/prettyPhoto/dark_rounded/contentPattern.png) top left repeat} -div.dark_rounded .currentTextHolder,div.dark_square .currentTextHolder{color:#c4c4c4} -div.dark_rounded #pp_full_res .pp_inline,div.dark_square #pp_full_res .pp_inline{color:#fff} -.pp_top,.pp_bottom{height:20px;position:relative} -* html .pp_top,* html .pp_bottom{padding:0 20px} -.pp_top .pp_left,.pp_bottom .pp_left{height:20px;left:0;position:absolute;width:20px} -.pp_top .pp_middle,.pp_bottom .pp_middle{height:20px;left:20px;position:absolute;right:20px} -* html .pp_top .pp_middle,* html .pp_bottom .pp_middle{left:0;position:static} -.pp_top .pp_right,.pp_bottom .pp_right{height:20px;left:auto;position:absolute;right:0;top:0;width:20px} -.pp_fade,.pp_gallery li.default a img{display:none} \ No newline at end of file diff --git a/imagestore/static/prettyphoto/images/fullscreen/1.jpg b/imagestore/static/prettyphoto/images/fullscreen/1.jpg deleted file mode 100755 index ffb4763..0000000 Binary files a/imagestore/static/prettyphoto/images/fullscreen/1.jpg and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/fullscreen/2.jpg b/imagestore/static/prettyphoto/images/fullscreen/2.jpg deleted file mode 100755 index b8759b4..0000000 Binary files a/imagestore/static/prettyphoto/images/fullscreen/2.jpg and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/fullscreen/3.jpg b/imagestore/static/prettyphoto/images/fullscreen/3.jpg deleted file mode 100755 index 145c696..0000000 Binary files a/imagestore/static/prettyphoto/images/fullscreen/3.jpg and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/fullscreen/4.jpg b/imagestore/static/prettyphoto/images/fullscreen/4.jpg deleted file mode 100755 index 33f221c..0000000 Binary files a/imagestore/static/prettyphoto/images/fullscreen/4.jpg and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/fullscreen/5.jpg b/imagestore/static/prettyphoto/images/fullscreen/5.jpg deleted file mode 100755 index 47d0b90..0000000 Binary files a/imagestore/static/prettyphoto/images/fullscreen/5.jpg and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/fullscreen/6.jpg b/imagestore/static/prettyphoto/images/fullscreen/6.jpg deleted file mode 100755 index 31524dc..0000000 Binary files a/imagestore/static/prettyphoto/images/fullscreen/6.jpg and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/fullscreen/high.gif b/imagestore/static/prettyphoto/images/fullscreen/high.gif deleted file mode 100755 index ccf5d16..0000000 Binary files a/imagestore/static/prettyphoto/images/fullscreen/high.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/fullscreen/huge.gif b/imagestore/static/prettyphoto/images/fullscreen/huge.gif deleted file mode 100755 index 5b3102e..0000000 Binary files a/imagestore/static/prettyphoto/images/fullscreen/huge.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/fullscreen/wide.gif b/imagestore/static/prettyphoto/images/fullscreen/wide.gif deleted file mode 100755 index f17c5b8..0000000 Binary files a/imagestore/static/prettyphoto/images/fullscreen/wide.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/btnNext.png b/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/btnNext.png deleted file mode 100755 index b28c1ef..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/btnNext.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/btnPrevious.png b/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/btnPrevious.png deleted file mode 100755 index e0cd9c4..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/btnPrevious.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/contentPattern.png b/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/contentPattern.png deleted file mode 100755 index e5a047c..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/contentPattern.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/default_thumbnail.gif b/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/default_thumbnail.gif deleted file mode 100755 index 2b1280f..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/default_thumbnail.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/loader.gif b/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/loader.gif deleted file mode 100755 index 50820ee..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/loader.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/sprite.png b/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/sprite.png deleted file mode 100755 index fb8c0f8..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_rounded/sprite.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/btnNext.png b/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/btnNext.png deleted file mode 100755 index b28c1ef..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/btnNext.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/btnPrevious.png b/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/btnPrevious.png deleted file mode 100755 index e0cd9c4..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/btnPrevious.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/contentPattern.png b/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/contentPattern.png deleted file mode 100755 index 7b50aff..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/contentPattern.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/default_thumbnail.gif b/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/default_thumbnail.gif deleted file mode 100755 index 2b1280f..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/default_thumbnail.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/loader.gif b/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/loader.gif deleted file mode 100755 index 50820ee..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/loader.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/sprite.png b/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/sprite.png deleted file mode 100755 index 4fe3547..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/dark_square/sprite.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/default/default_thumb.png b/imagestore/static/prettyphoto/images/prettyPhoto/default/default_thumb.png deleted file mode 100644 index 1a26e4b..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/default/default_thumb.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/default/loader.gif b/imagestore/static/prettyphoto/images/prettyPhoto/default/loader.gif deleted file mode 100644 index 35d397c..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/default/loader.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite.png b/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite.png deleted file mode 100644 index 5f07ddc..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_next.png b/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_next.png deleted file mode 100644 index 379dc0d..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_next.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_prev.png b/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_prev.png deleted file mode 100644 index 1ee4865..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_prev.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_x.png b/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_x.png deleted file mode 100644 index d4433ab..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_x.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_y.png b/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_y.png deleted file mode 100644 index 7786ab5..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/default/sprite_y.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/btnNext.png b/imagestore/static/prettyphoto/images/prettyPhoto/facebook/btnNext.png deleted file mode 100755 index e809c3b..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/btnNext.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/btnPrevious.png b/imagestore/static/prettyphoto/images/prettyPhoto/facebook/btnPrevious.png deleted file mode 100755 index 0812542..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/btnPrevious.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternBottom.png b/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternBottom.png deleted file mode 100755 index a9be3b2..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternBottom.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternLeft.png b/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternLeft.png deleted file mode 100755 index 277c87a..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternLeft.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternRight.png b/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternRight.png deleted file mode 100755 index 76e50d0..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternRight.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternTop.png b/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternTop.png deleted file mode 100755 index 8b110ba..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/contentPatternTop.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/default_thumbnail.gif b/imagestore/static/prettyphoto/images/prettyPhoto/facebook/default_thumbnail.gif deleted file mode 100755 index 2b1280f..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/default_thumbnail.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/loader.gif b/imagestore/static/prettyphoto/images/prettyPhoto/facebook/loader.gif deleted file mode 100755 index 7ac990c..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/loader.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/sprite.png b/imagestore/static/prettyphoto/images/prettyPhoto/facebook/sprite.png deleted file mode 100755 index 660a254..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/facebook/sprite.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/btnNext.png b/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/btnNext.png deleted file mode 100755 index b28c1ef..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/btnNext.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/btnPrevious.png b/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/btnPrevious.png deleted file mode 100755 index e0cd9c4..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/btnPrevious.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/default_thumbnail.gif b/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/default_thumbnail.gif deleted file mode 100755 index 2b1280f..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/default_thumbnail.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/loader.gif b/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/loader.gif deleted file mode 100755 index 7ac990c..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/loader.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/sprite.png b/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/sprite.png deleted file mode 100755 index 7f28379..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/light_rounded/sprite.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/light_square/btnNext.png b/imagestore/static/prettyphoto/images/prettyPhoto/light_square/btnNext.png deleted file mode 100755 index b28c1ef..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/light_square/btnNext.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/light_square/btnPrevious.png b/imagestore/static/prettyphoto/images/prettyPhoto/light_square/btnPrevious.png deleted file mode 100755 index e0cd9c4..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/light_square/btnPrevious.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/light_square/default_thumbnail.gif b/imagestore/static/prettyphoto/images/prettyPhoto/light_square/default_thumbnail.gif deleted file mode 100755 index 2b1280f..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/light_square/default_thumbnail.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/light_square/loader.gif b/imagestore/static/prettyphoto/images/prettyPhoto/light_square/loader.gif deleted file mode 100755 index 7ac990c..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/light_square/loader.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/prettyPhoto/light_square/sprite.png b/imagestore/static/prettyphoto/images/prettyPhoto/light_square/sprite.png deleted file mode 100755 index 4fe3547..0000000 Binary files a/imagestore/static/prettyphoto/images/prettyPhoto/light_square/sprite.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/thumbnails/flash-logo.png b/imagestore/static/prettyphoto/images/thumbnails/flash-logo.png deleted file mode 100755 index 4b81e00..0000000 Binary files a/imagestore/static/prettyphoto/images/thumbnails/flash-logo.png and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/thumbnails/quicktime-logo.gif b/imagestore/static/prettyphoto/images/thumbnails/quicktime-logo.gif deleted file mode 100755 index b6a20ef..0000000 Binary files a/imagestore/static/prettyphoto/images/thumbnails/quicktime-logo.gif and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/thumbnails/t_1.jpg b/imagestore/static/prettyphoto/images/thumbnails/t_1.jpg deleted file mode 100755 index 8c4e865..0000000 Binary files a/imagestore/static/prettyphoto/images/thumbnails/t_1.jpg and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/thumbnails/t_2.jpg b/imagestore/static/prettyphoto/images/thumbnails/t_2.jpg deleted file mode 100755 index 7f427c6..0000000 Binary files a/imagestore/static/prettyphoto/images/thumbnails/t_2.jpg and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/thumbnails/t_3.jpg b/imagestore/static/prettyphoto/images/thumbnails/t_3.jpg deleted file mode 100755 index 91b774a..0000000 Binary files a/imagestore/static/prettyphoto/images/thumbnails/t_3.jpg and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/thumbnails/t_4.jpg b/imagestore/static/prettyphoto/images/thumbnails/t_4.jpg deleted file mode 100755 index 9781430..0000000 Binary files a/imagestore/static/prettyphoto/images/thumbnails/t_4.jpg and /dev/null differ diff --git a/imagestore/static/prettyphoto/images/thumbnails/t_5.jpg b/imagestore/static/prettyphoto/images/thumbnails/t_5.jpg deleted file mode 100755 index 7c16952..0000000 Binary files a/imagestore/static/prettyphoto/images/thumbnails/t_5.jpg and /dev/null differ diff --git a/imagestore/static/prettyphoto/index.html b/imagestore/static/prettyphoto/index.html deleted file mode 100755 index de35293..0000000 --- a/imagestore/static/prettyphoto/index.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - jQuery lightbox clone - prettyPhoto - by Stephane Caron - - - - - - - - - -
-

prettyPhoto

- -

This page has been made for testing purpose only. It covers all the basic things you can handle in prettyPhoto.

- -

For complete documentation, please refer to the official website: http://www.no-margin-for-errors.com/projects/prettyphoto-jquery-lightbox-clone/

- -

Gallery

- - -

Gallery 2

- - -

API Call

- -

API call

- -

Picture alone

- -
-

Flash

- -
-
-

YouTube

- -
-
-

Vimeo

- -
- -
- -

Movies (.mov)

- - -

Movies (.mov) alone

- - -

Unusual sizes

- - -

Iframe

- - -

AJAX

- - -

Mixed gallery

- - -

Inline content

- - - - - -

Custom content

- - -

- - - - - - - - - - - - - - - -
- - \ No newline at end of file diff --git a/imagestore/static/prettyphoto/js/jquery-1.3.2.min.js b/imagestore/static/prettyphoto/js/jquery-1.3.2.min.js deleted file mode 100755 index b1ae21d..0000000 --- a/imagestore/static/prettyphoto/js/jquery-1.3.2.min.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - * jQuery JavaScript Library v1.3.2 - * http://jquery.com/ - * - * Copyright (c) 2009 John Resig - * Dual licensed under the MIT and GPL licenses. - * http://docs.jquery.com/License - * - * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) - * Revision: 6246 - */ -(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); -/* - * Sizzle CSS Selector Engine - v0.9.3 - * Copyright 2009, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/imagestore/static/prettyphoto/js/jquery-1.4.4.min.js b/imagestore/static/prettyphoto/js/jquery-1.4.4.min.js deleted file mode 100644 index 2bd4cbb..0000000 --- a/imagestore/static/prettyphoto/js/jquery-1.4.4.min.js +++ /dev/null @@ -1,167 +0,0 @@ -/*! - * jQuery JavaScript Library v1.4.4 - * http://jquery.com/ - * - * Copyright 2010, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2010, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu Nov 11 19:04:53 2010 -0500 - */ -(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h= -h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;kd)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La, -"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this, -e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a, -"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+ -a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/, -C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j, -s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this, -j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length}, -toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j=== --1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false; -if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload", -b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&& -!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&& -l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H
a";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"), -k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false, -scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent= -false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom= -1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="
";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="
t
";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display= -"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h= -c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando); -else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one"; -if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true}, -attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&& -b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0}; -c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem, -arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid= -d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+ -c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType=== -8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k=== -"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+ -d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired= -B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type=== -"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]=== -0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}}); -(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3]; -break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr, -q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h= -l;g.sort(w);if(h)for(var i=1;i0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n, -m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled=== -true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"=== -g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return in[3]-0},nth:function(g,i,n){return n[3]- -0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()=== -i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]]; -if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m, -g);else if(typeof g.length==="number")for(var p=g.length;n";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g); -n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&& -function(){var g=k,i=t.createElement("div");i.innerHTML="

";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F|| -p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g= -t.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition? -function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n0)for(var h=d;h0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h= -h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context): -c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a, -2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a, -b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&& -e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/\s]+\/)>/g,P={option:[1, -""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= -c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, -wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, -prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, -this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); -return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null; -else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1>");try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append", -prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument|| -b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]===""&&!x?r.childNodes:[];for(o=k.length- -1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script")))); -d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i, -jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true, -zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b), -h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b); -if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f= -d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left; -e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/)<[^<]*)*<\/script>/gi, -ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b=== -"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("
").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&& -!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})}, -getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html", -script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data|| -!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache= -false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset; -A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type", -b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&& -c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d|| -c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]= -encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess", -[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"), -e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}}); -if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show", -3),a,b,d);else{d=0;for(var e=this.length;d=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b, -d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a* -Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)} -var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true; -this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide|| -this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a= -c.timers,b=0;b-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a, -e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&& -c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase(); -c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+ -b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window); \ No newline at end of file diff --git a/imagestore/static/prettyphoto/js/jquery-1.6.1.min.js b/imagestore/static/prettyphoto/js/jquery-1.6.1.min.js deleted file mode 100644 index eb6a596..0000000 --- a/imagestore/static/prettyphoto/js/jquery-1.6.1.min.js +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * jQuery JavaScript Library v1.6.1 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Thu May 12 15:04:36 2011 -0400 - */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!cj[a]){var b=f("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),c.body.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write("");b=cl.createElement(a),cl.body.appendChild(b),d=f.css(b,"display"),c.body.removeChild(ck)}cj[a]=d}return cj[a]}function cu(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function ct(){cq=b}function cs(){setTimeout(ct,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g=0===c})}function W(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function O(a,b){return(a&&a!=="*"?a+".":"")+b.replace(A,"`").replace(B,"&")}function N(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function L(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function F(){return!0}function E(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function H(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(H,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=d.userAgent,x,y,z,A=Object.prototype.toString,B=Object.prototype.hasOwnProperty,C=Array.prototype.push,D=Array.prototype.slice,E=String.prototype.trim,F=Array.prototype.indexOf,G={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.1",length:0,size:function(){return this.length},toArray:function(){return D.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?C.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),y.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(D.apply(this,arguments),"slice",D.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:C,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;y.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!y){y=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",z,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",z),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&H()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):G[A.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!B.call(a,"constructor")&&!B.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||B.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};f=c.createElement("select"),g=f.appendChild(c.createElement("option")),h=a.getElementsByTagName("input")[0],j={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},h.checked=!0,j.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,j.optDisabled=!g.disabled;try{delete a.test}catch(s){j.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function b(){j.noCloneEvent=!1,a.detachEvent("onclick",b)}),a.cloneNode(!0).fireEvent("onclick")),h=c.createElement("input"),h.value="t",h.setAttribute("type","radio"),j.radioValue=h.value==="t",h.setAttribute("checked","checked"),a.appendChild(h),k=c.createDocumentFragment(),k.appendChild(a.firstChild),j.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",l=c.createElement("body"),m={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"};for(q in m)l.style[q]=m[q];l.appendChild(a),b.insertBefore(l,b.firstChild),j.appendChecked=h.checked,j.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,j.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
",j.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
t
",n=a.getElementsByTagName("td"),r=n[0].offsetHeight===0,n[0].style.display="",n[1].style.display="none",j.reliableHiddenOffsets=r&&n[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(i=c.createElement("div"),i.style.width="0",i.style.marginRight="0",a.appendChild(i),j.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(i,null)||{marginRight:0}).marginRight,10)||0)===0),l.innerHTML="",b.removeChild(l);if(a.attachEvent)for(q in{submit:1,change:1,focusin:1})p="on"+q,r=p in a,r||(a.setAttribute(p,"return;"),r=typeof a[p]=="function"),j[q+"Bubbles"]=r;return j}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;return(e.value||"").replace(p,"")}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);c=j&&f.attrFix[c]||c,i=f.attrHooks[c],i||(!t.test(c)||typeof d!="boolean"&&d!==b&&d.toLowerCase()!==c.toLowerCase()?v&&(f.nodeName(a,"form")||u.test(c))&&(i=v):i=w);if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j)return i.get(a,c);h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);c=i&&f.propFix[c]||c,h=f.propHooks[c];return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return a[f.propFix[c]||c]?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=b),a.setAttribute(c,c.toLowerCase()));return c}},f.attrHooks.value={get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return a.value},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=Object.prototype.hasOwnProperty,y=/\.(.*)$/,z=/^(?:textarea|input|select)$/i,A=/\./g,B=/ /g,C=/[^\w\s.|`]/g,D=function(a){return a.replace(C,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=E;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=E);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),D).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem -)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},K=function(c){var d=c.target,e,g;if(!!z.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=J(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:K,beforedeactivate:K,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&K.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&K.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",J(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in I)f.event.add(this,c+".specialChange",I[c]);return z.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return z.test(this.nodeName)}},I=f.event.special.change.filters,I.focus=I.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=U.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(W(c[0])||W(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=T.call(arguments);P.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!V[a]?f.unique(e):e,(this.length>1||R.test(d))&&Q.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var Y=/ jQuery\d+="(?:\d+|null)"/g,Z=/^\s+/,$=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,_=/<([\w:]+)/,ba=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Y,""):null;if(typeof a=="string"&&!bc.test(a)&&(f.support.leadingWhitespace||!Z.test(a))&&!bg[(_.exec(a)||["",""])[1].toLowerCase()]){a=a.replace($,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bj(a,d),e=bk(a),g=bk(d);for(h=0;e[h];++h)bj(e[h],g[h])}if(b){bi(a,d);if(c){e=bk(a),g=bk(d);for(h=0;e[h];++h)bi(e[h],g[h])}}return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument|| -b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!bb.test(k))k=b.createTextNode(k);else{k=k.replace($,"<$1>");var l=(_.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=ba.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Z.test(k)&&o.insertBefore(b.createTextNode(Z.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bp.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bo.test(g)?g.replace(bo,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,c){var d,e,g;c=c.replace(br,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bs.test(d)&&bt.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bE=/%20/g,bF=/\[\]$/,bG=/\r?\n/g,bH=/#.*$/,bI=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bJ=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bK=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bL=/^(?:GET|HEAD)$/,bM=/^\/\//,bN=/\?/,bO=/)<[^<]*)*<\/script>/gi,bP=/^(?:select|textarea)/i,bQ=/\s+/,bR=/([?&])_=[^&]*/,bS=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bT=f.fn.load,bU={},bV={},bW,bX;try{bW=e.href}catch(bY){bW=c.createElement("a"),bW.href="",bW=bW.href}bX=bS.exec(bW.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bT)return bT.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bO,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bP.test(this.nodeName)||bJ.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bG,"\r\n")}}):{name:b.name,value:c.replace(bG,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bW,isLocal:bK.test(bX[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bZ(bU),ajaxTransport:bZ(bV),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?ca(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=cb(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bI.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bH,"").replace(bM,bX[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bQ),d.crossDomain==null&&(r=bS.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bX[1]&&r[2]==bX[2]&&(r[3]||(r[1]==="http:"?80:443))==(bX[3]||(bX[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bU,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bL.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bN.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bR,"$1_="+x);d.url=y+(y===d.url?(bN.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bV,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bE,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq,cr=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){return this[0]?parseFloat(f.css(this[0],d,"padding")):null},f.fn["outer"+c]=function(a){return this[0]?parseFloat(f.css(this[0],d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file diff --git a/imagestore/static/prettyphoto/js/jquery.prettyPhoto.js b/imagestore/static/prettyphoto/js/jquery.prettyPhoto.js deleted file mode 100644 index d958202..0000000 --- a/imagestore/static/prettyphoto/js/jquery.prettyPhoto.js +++ /dev/null @@ -1,7 +0,0 @@ -/* ------------------------------------------------------------------------ - Class: prettyPhoto - Use: Lightbox clone for jQuery - Author: Stephane Caron (http://www.no-margin-for-errors.com) - Version: 3.1.5 -------------------------------------------------------------------------- */ -(function(e){function t(){var e=location.href;hashtag=e.indexOf("#prettyPhoto")!==-1?decodeURI(e.substring(e.indexOf("#prettyPhoto")+1,e.length)):false;return hashtag}function n(){if(typeof theRel=="undefined")return;location.hash=theRel+"/"+rel_index+"/"}function r(){if(location.href.indexOf("#prettyPhoto")!==-1)location.hash="prettyPhoto"}function i(e,t){e=e.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var n="[\\?&]"+e+"=([^&#]*)";var r=new RegExp(n);var i=r.exec(t);return i==null?"":i[1]}e.prettyPhoto={version:"3.1.5"};e.fn.prettyPhoto=function(s){function g(){e(".pp_loaderIcon").hide();projectedTop=scroll_pos["scrollTop"]+(d/2-a["containerHeight"]/2);if(projectedTop<0)projectedTop=0;$ppt.fadeTo(settings.animation_speed,1);$pp_pic_holder.find(".pp_content").animate({height:a["contentHeight"],width:a["contentWidth"]},settings.animation_speed);$pp_pic_holder.animate({top:projectedTop,left:v/2-a["containerWidth"]/2<0?0:v/2-a["containerWidth"]/2,width:a["containerWidth"]},settings.animation_speed,function(){$pp_pic_holder.find(".pp_hoverContainer,#fullResImage").height(a["height"]).width(a["width"]);$pp_pic_holder.find(".pp_fade").fadeIn(settings.animation_speed);if(isSet&&S(pp_images[set_position])=="image"){$pp_pic_holder.find(".pp_hoverContainer").show()}else{$pp_pic_holder.find(".pp_hoverContainer").hide()}if(settings.allow_expand){if(a["resized"]){e("a.pp_expand,a.pp_contract").show()}else{e("a.pp_expand").hide()}}if(settings.autoplay_slideshow&&!m&&!f)e.prettyPhoto.startSlideshow();settings.changepicturecallback();f=true});C();s.ajaxcallback()}function y(t){$pp_pic_holder.find("#pp_full_res object,#pp_full_res embed").css("visibility","hidden");$pp_pic_holder.find(".pp_fade").fadeOut(settings.animation_speed,function(){e(".pp_loaderIcon").show();t()})}function b(t){t>1?e(".pp_nav").show():e(".pp_nav").hide()}function w(e,t){resized=false;E(e,t);imageWidth=e,imageHeight=t;if((p>v||h>d)&&doresize&&settings.allow_resize&&!u){resized=true,fitting=false;while(!fitting){if(p>v){imageWidth=v-200;imageHeight=t/e*imageWidth}else if(h>d){imageHeight=d-200;imageWidth=e/t*imageHeight}else{fitting=true}h=imageHeight,p=imageWidth}if(p>v||h>d){w(p,h)}E(imageWidth,imageHeight)}return{width:Math.floor(imageWidth),height:Math.floor(imageHeight),containerHeight:Math.floor(h),containerWidth:Math.floor(p)+settings.horizontal_padding*2,contentHeight:Math.floor(l),contentWidth:Math.floor(c),resized:resized}}function E(t,n){t=parseFloat(t);n=parseFloat(n);$pp_details=$pp_pic_holder.find(".pp_details");$pp_details.width(t);detailsHeight=parseFloat($pp_details.css("marginTop"))+parseFloat($pp_details.css("marginBottom"));$pp_details=$pp_details.clone().addClass(settings.theme).width(t).appendTo(e("body")).css({position:"absolute",top:-1e4});detailsHeight+=$pp_details.height();detailsHeight=detailsHeight<=34?36:detailsHeight;$pp_details.remove();$pp_title=$pp_pic_holder.find(".ppt");$pp_title.width(t);titleHeight=parseFloat($pp_title.css("marginTop"))+parseFloat($pp_title.css("marginBottom"));$pp_title=$pp_title.clone().appendTo(e("body")).css({position:"absolute",top:-1e4});titleHeight+=$pp_title.height();$pp_title.remove();l=n+detailsHeight;c=t;h=l+titleHeight+$pp_pic_holder.find(".pp_top").height()+$pp_pic_holder.find(".pp_bottom").height();p=t}function S(e){if(e.match(/youtube\.com\/watch/i)||e.match(/youtu\.be/i)){return"youtube"}else if(e.match(/vimeo\.com/i)){return"vimeo"}else if(e.match(/\b.mov\b/i)){return"quicktime"}else if(e.match(/\b.swf\b/i)){return"flash"}else if(e.match(/\biframe=true\b/i)){return"iframe"}else if(e.match(/\bajax=true\b/i)){return"ajax"}else if(e.match(/\bcustom=true\b/i)){return"custom"}else if(e.substr(0,1)=="#"){return"inline"}else{return"image"}}function x(){if(doresize&&typeof $pp_pic_holder!="undefined"){scroll_pos=T();contentHeight=$pp_pic_holder.height(),contentwidth=$pp_pic_holder.width();projectedTop=d/2+scroll_pos["scrollTop"]-contentHeight/2;if(projectedTop<0)projectedTop=0;if(contentHeight>d)return;$pp_pic_holder.css({top:projectedTop,left:v/2+scroll_pos["scrollLeft"]-contentwidth/2})}}function T(){if(self.pageYOffset){return{scrollTop:self.pageYOffset,scrollLeft:self.pageXOffset}}else if(document.documentElement&&document.documentElement.scrollTop){return{scrollTop:document.documentElement.scrollTop,scrollLeft:document.documentElement.scrollLeft}}else if(document.body){return{scrollTop:document.body.scrollTop,scrollLeft:document.body.scrollLeft}}}function N(){d=e(window).height(),v=e(window).width();if(typeof $pp_overlay!="undefined")$pp_overlay.height(e(document).height()).width(v)}function C(){if(isSet&&settings.overlay_gallery&&S(pp_images[set_position])=="image"){itemWidth=52+5;navWidth=settings.theme=="facebook"||settings.theme=="pp_default"?50:30;itemsPerPage=Math.floor((a["containerWidth"]-100-navWidth)/itemWidth);itemsPerPage=itemsPerPage"}toInject=settings.gallery_markup.replace(/{gallery}/g,toInject);$pp_pic_holder.find("#pp_full_res").after(toInject);$pp_gallery=e(".pp_pic_holder .pp_gallery"),$pp_gallery_li=$pp_gallery.find("li");$pp_gallery.find(".pp_arrow_next").click(function(){e.prettyPhoto.changeGalleryPage("next");e.prettyPhoto.stopSlideshow();return false});$pp_gallery.find(".pp_arrow_previous").click(function(){e.prettyPhoto.changeGalleryPage("previous");e.prettyPhoto.stopSlideshow();return false});$pp_pic_holder.find(".pp_content").hover(function(){$pp_pic_holder.find(".pp_gallery:not(.disabled)").fadeIn()},function(){$pp_pic_holder.find(".pp_gallery:not(.disabled)").fadeOut()});itemWidth=52+5;$pp_gallery_li.each(function(t){e(this).find("a").click(function(){e.prettyPhoto.changePage(t);e.prettyPhoto.stopSlideshow();return false})})}if(settings.slideshow){$pp_pic_holder.find(".pp_nav").prepend('Play');$pp_pic_holder.find(".pp_nav .pp_play").click(function(){e.prettyPhoto.startSlideshow();return false})}$pp_pic_holder.attr("class","pp_pic_holder "+settings.theme);$pp_overlay.css({opacity:0,height:e(document).height(),width:e(window).width()}).bind("click",function(){if(!settings.modal)e.prettyPhoto.close()});e("a.pp_close").bind("click",function(){e.prettyPhoto.close();return false});if(settings.allow_expand){e("a.pp_expand").bind("click",function(t){if(e(this).hasClass("pp_expand")){e(this).removeClass("pp_expand").addClass("pp_contract");doresize=false}else{e(this).removeClass("pp_contract").addClass("pp_expand");doresize=true}y(function(){e.prettyPhoto.open()});return false})}$pp_pic_holder.find(".pp_previous, .pp_nav .pp_arrow_previous").bind("click",function(){e.prettyPhoto.changePage("previous");e.prettyPhoto.stopSlideshow();return false});$pp_pic_holder.find(".pp_next, .pp_nav .pp_arrow_next").bind("click",function(){e.prettyPhoto.changePage("next");e.prettyPhoto.stopSlideshow();return false});x()}s=jQuery.extend({hook:"rel",animation_speed:"fast",ajaxcallback:function(){},slideshow:5e3,autoplay_slideshow:false,opacity:.8,show_title:true,allow_resize:true,allow_expand:true,default_width:500,default_height:344,counter_separator_label:"/",theme:"pp_default",horizontal_padding:20,hideflash:false,wmode:"opaque",autoplay:true,modal:false,deeplinking:true,overlay_gallery:true,overlay_gallery_max:30,keyboard_shortcuts:true,changepicturecallback:function(){},callback:function(){},ie6_fallback:true,markup:'
 
',gallery_markup:'',image_markup:'',flash_markup:'',quicktime_markup:'',iframe_markup:'',inline_markup:'
{content}
',custom_markup:"",social_tools:''},s);var o=this,u=false,a,f,l,c,h,p,d=e(window).height(),v=e(window).width(),m;doresize=true,scroll_pos=T();e(window).unbind("resize.prettyphoto").bind("resize.prettyphoto",function(){x();N()});if(s.keyboard_shortcuts){e(document).unbind("keydown.prettyphoto").bind("keydown.prettyphoto",function(t){if(typeof $pp_pic_holder!="undefined"){if($pp_pic_holder.is(":visible")){switch(t.keyCode){case 37:e.prettyPhoto.changePage("previous");t.preventDefault();break;case 39:e.prettyPhoto.changePage("next");t.preventDefault();break;case 27:if(!settings.modal)e.prettyPhoto.close();t.preventDefault();break}}}})}e.prettyPhoto.initialize=function(){settings=s;if(settings.theme=="pp_default")settings.horizontal_padding=16;theRel=e(this).attr(settings.hook);galleryRegExp=/\[(?:.*)\]/;isSet=galleryRegExp.exec(theRel)?true:false;pp_images=isSet?jQuery.map(o,function(t,n){if(e(t).attr(settings.hook).indexOf(theRel)!=-1)return e(t).attr("href")}):e.makeArray(e(this).attr("href"));pp_titles=isSet?jQuery.map(o,function(t,n){if(e(t).attr(settings.hook).indexOf(theRel)!=-1)return e(t).find("img").attr("alt")?e(t).find("img").attr("alt"):""}):e.makeArray(e(this).find("img").attr("alt"));pp_descriptions=isSet?jQuery.map(o,function(t,n){if(e(t).attr(settings.hook).indexOf(theRel)!=-1)return e(t).attr("title")?e(t).attr("title"):""}):e.makeArray(e(this).attr("title"));if(pp_images.length>settings.overlay_gallery_max)settings.overlay_gallery=false;set_position=jQuery.inArray(e(this).attr("href"),pp_images);rel_index=isSet?set_position:e("a["+settings.hook+"^='"+theRel+"']").index(e(this));k(this);if(settings.allow_resize)e(window).bind("scroll.prettyphoto",function(){x()});e.prettyPhoto.open();return false};e.prettyPhoto.open=function(t){if(typeof settings=="undefined"){settings=s;pp_images=e.makeArray(arguments[0]);pp_titles=arguments[1]?e.makeArray(arguments[1]):e.makeArray("");pp_descriptions=arguments[2]?e.makeArray(arguments[2]):e.makeArray("");isSet=pp_images.length>1?true:false;set_position=arguments[3]?arguments[3]:0;k(t.target)}if(settings.hideflash)e("object,embed,iframe[src*=youtube],iframe[src*=vimeo]").css("visibility","hidden");b(e(pp_images).size());e(".pp_loaderIcon").show();if(settings.deeplinking)n();if(settings.social_tools){facebook_like_link=settings.social_tools.replace("{location_href}",encodeURIComponent(location.href));$pp_pic_holder.find(".pp_social").html(facebook_like_link)}if($ppt.is(":hidden"))$ppt.css("opacity",0).show();$pp_overlay.show().fadeTo(settings.animation_speed,settings.opacity);$pp_pic_holder.find(".currentTextHolder").text(set_position+1+settings.counter_separator_label+e(pp_images).size());if(typeof pp_descriptions[set_position]!="undefined"&&pp_descriptions[set_position]!=""){$pp_pic_holder.find(".pp_description").show().html(unescape(pp_descriptions[set_position]))}else{$pp_pic_holder.find(".pp_description").hide()}movie_width=parseFloat(i("width",pp_images[set_position]))?i("width",pp_images[set_position]):settings.default_width.toString();movie_height=parseFloat(i("height",pp_images[set_position]))?i("height",pp_images[set_position]):settings.default_height.toString();u=false;if(movie_height.indexOf("%")!=-1){movie_height=parseFloat(e(window).height()*parseFloat(movie_height)/100-150);u=true}if(movie_width.indexOf("%")!=-1){movie_width=parseFloat(e(window).width()*parseFloat(movie_width)/100-150);u=true}$pp_pic_holder.fadeIn(function(){settings.show_title&&pp_titles[set_position]!=""&&typeof pp_titles[set_position]!="undefined"?$ppt.html(unescape(pp_titles[set_position])):$ppt.html(" ");imgPreloader="";skipInjection=false;switch(S(pp_images[set_position])){case"image":imgPreloader=new Image;nextImage=new Image;if(isSet&&set_position0)movie_id=movie_id.substr(0,movie_id.indexOf("?"));if(movie_id.indexOf("&")>0)movie_id=movie_id.substr(0,movie_id.indexOf("&"))}movie="http://www.youtube.com/embed/"+movie_id;i("rel",pp_images[set_position])?movie+="?rel="+i("rel",pp_images[set_position]):movie+="?rel=1";if(settings.autoplay)movie+="&autoplay=1";toInject=settings.iframe_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie);break;case"vimeo":a=w(movie_width,movie_height);movie_id=pp_images[set_position];var t=/http(s?):\/\/(www\.)?vimeo.com\/(\d+)/;var n=movie_id.match(t);movie="http://player.vimeo.com/video/"+n[3]+"?title=0&byline=0&portrait=0";if(settings.autoplay)movie+="&autoplay=1;";vimeo_width=a["width"]+"/embed/?moog_width="+a["width"];toInject=settings.iframe_markup.replace(/{width}/g,vimeo_width).replace(/{height}/g,a["height"]).replace(/{path}/g,movie);break;case"quicktime":a=w(movie_width,movie_height);a["height"]+=15;a["contentHeight"]+=15;a["containerHeight"]+=15;toInject=settings.quicktime_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,pp_images[set_position]).replace(/{autoplay}/g,settings.autoplay);break;case"flash":a=w(movie_width,movie_height);flash_vars=pp_images[set_position];flash_vars=flash_vars.substring(pp_images[set_position].indexOf("flashvars")+10,pp_images[set_position].length);filename=pp_images[set_position];filename=filename.substring(0,filename.indexOf("?"));toInject=settings.flash_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,filename+"?"+flash_vars);break;case"iframe":a=w(movie_width,movie_height);frame_url=pp_images[set_position];frame_url=frame_url.substr(0,frame_url.indexOf("iframe")-1);toInject=settings.iframe_markup.replace(/{width}/g,a["width"]).replace(/{height}/g,a["height"]).replace(/{path}/g,frame_url);break;case"ajax":doresize=false;a=w(movie_width,movie_height);doresize=true;skipInjection=true;e.get(pp_images[set_position],function(e){toInject=settings.inline_markup.replace(/{content}/g,e);$pp_pic_holder.find("#pp_full_res")[0].innerHTML=toInject;g()});break;case"custom":a=w(movie_width,movie_height);toInject=settings.custom_markup;break;case"inline":myClone=e(pp_images[set_position]).clone().append('
').css({width:settings.default_width}).wrapInner('
').appendTo(e("body")).show();doresize=false;a=w(e(myClone).width(),e(myClone).height());doresize=true;e(myClone).remove();toInject=settings.inline_markup.replace(/{content}/g,e(pp_images[set_position]).html());break}if(!imgPreloader&&!skipInjection){$pp_pic_holder.find("#pp_full_res")[0].innerHTML=toInject;g()}});return false};e.prettyPhoto.changePage=function(t){currentGalleryPage=0;if(t=="previous"){set_position--;if(set_position<0)set_position=e(pp_images).size()-1}else if(t=="next"){set_position++;if(set_position>e(pp_images).size()-1)set_position=0}else{set_position=t}rel_index=set_position;if(!doresize)doresize=true;if(settings.allow_expand){e(".pp_contract").removeClass("pp_contract").addClass("pp_expand")}y(function(){e.prettyPhoto.open()})};e.prettyPhoto.changeGalleryPage=function(e){if(e=="next"){currentGalleryPage++;if(currentGalleryPage>totalPage)currentGalleryPage=0}else if(e=="previous"){currentGalleryPage--;if(currentGalleryPage<0)currentGalleryPage=totalPage}else{currentGalleryPage=e}slide_speed=e=="next"||e=="previous"?settings.animation_speed:0;slide_to=currentGalleryPage*itemsPerPage*itemWidth;$pp_gallery.find("ul").animate({left:-slide_to},slide_speed)};e.prettyPhoto.startSlideshow=function(){if(typeof m=="undefined"){$pp_pic_holder.find(".pp_play").unbind("click").removeClass("pp_play").addClass("pp_pause").click(function(){e.prettyPhoto.stopSlideshow();return false});m=setInterval(e.prettyPhoto.startSlideshow,settings.slideshow)}else{e.prettyPhoto.changePage("next")}};e.prettyPhoto.stopSlideshow=function(){$pp_pic_holder.find(".pp_pause").unbind("click").removeClass("pp_pause").addClass("pp_play").click(function(){e.prettyPhoto.startSlideshow();return false});clearInterval(m);m=undefined};e.prettyPhoto.close=function(){if($pp_overlay.is(":animated"))return;e.prettyPhoto.stopSlideshow();$pp_pic_holder.stop().find("object,embed").css("visibility","hidden");e("div.pp_pic_holder,div.ppt,.pp_fade").fadeOut(settings.animation_speed,function(){e(this).remove()});$pp_overlay.fadeOut(settings.animation_speed,function(){if(settings.hideflash)e("object,embed,iframe[src*=youtube],iframe[src*=vimeo]").css("visibility","visible");e(this).remove();e(window).unbind("scroll.prettyphoto");r();settings.callback();doresize=true;f=false;delete settings})};if(!pp_alreadyInitialized&&t()){pp_alreadyInitialized=true;hashIndex=t();hashRel=hashIndex;hashIndex=hashIndex.substring(hashIndex.indexOf("/")+1,hashIndex.length-1);hashRel=hashRel.substring(0,hashRel.indexOf("/"));setTimeout(function(){e("a["+s.hook+"^='"+hashRel+"']:eq("+hashIndex+")").trigger("click")},50)}return this.unbind("click.prettyphoto").bind("click.prettyphoto",e.prettyPhoto.initialize)};})(jQuery);var pp_alreadyInitialized=false \ No newline at end of file diff --git a/imagestore/static/prettyphoto/xhr_response.html b/imagestore/static/prettyphoto/xhr_response.html deleted file mode 100644 index 84490c8..0000000 --- a/imagestore/static/prettyphoto/xhr_response.html +++ /dev/null @@ -1,5 +0,0 @@ -

This is an XHR Response

-
-

This is sample content brought in.

-

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

-
\ No newline at end of file diff --git a/imagestore/tahoma.ttf b/imagestore/tahoma.ttf deleted file mode 100644 index 4bc6857..0000000 Binary files a/imagestore/tahoma.ttf and /dev/null differ diff --git a/imagestore/templates/cms/plugins/imagestore_album.html b/imagestore/templates/cms/plugins/imagestore_album.html deleted file mode 100644 index 69af394..0000000 --- a/imagestore/templates/cms/plugins/imagestore_album.html +++ /dev/null @@ -1,23 +0,0 @@ -{% load thumbnail %} - diff --git a/imagestore/templates/cms/plugins/imagestore_album_carousel.html b/imagestore/templates/cms/plugins/imagestore_album_carousel.html deleted file mode 100644 index 11ec0ec..0000000 --- a/imagestore/templates/cms/plugins/imagestore_album_carousel.html +++ /dev/null @@ -1 +0,0 @@ -{% include 'cms/plugins/imagestore_album_carousel_base.html' %} diff --git a/imagestore/templates/cms/plugins/imagestore_album_carousel_base.html b/imagestore/templates/cms/plugins/imagestore_album_carousel_base.html deleted file mode 100644 index 7d55320..0000000 --- a/imagestore/templates/cms/plugins/imagestore_album_carousel_base.html +++ /dev/null @@ -1,28 +0,0 @@ -{% load thumbnail %} -
-
    - {% for image in images %} - {% thumbnail image.image carousel.size crop="center" as im %} - {% thumbnail image.image carousel.full_size as full %} -
  • - {{ image.title }} -
  • - {% endthumbnail %} - {% endthumbnail %} - {% endfor %} -
- - -
\ No newline at end of file diff --git a/imagestore/templates/imagestore/album_delete.html b/imagestore/templates/imagestore/album_delete.html deleted file mode 100644 index ebecfdd..0000000 --- a/imagestore/templates/imagestore/album_delete.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "imagestore/base.html" %} - -{% load i18n %} - -{% block imagestore_content %} -

{% trans "Are you sure that you would like to delete this album?" %}

-
- {% csrf_token %} -

- ← {% trans "No, take me back" %} - -

-
-{% endblock %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/album_list.html b/imagestore/templates/imagestore/album_list.html deleted file mode 100644 index a776d17..0000000 --- a/imagestore/templates/imagestore/album_list.html +++ /dev/null @@ -1,70 +0,0 @@ -{% extends "imagestore/base.html" %} -{% load i18n %} -{% load thumbnail %} - -{% block title %} - {% if view_user %} - {% trans "Albums for user" %} {{ view_user }} - {% else %} - {% trans "All albums" %} - {% endif %} -{% endblock %} - -{% block imagestore-breadcrumb %} -
  • - {% if view_user %} - {% trans "Albums for user" %} {{ view_user }} - {% else %} - {% trans "All albums" %} - {% endif %} -
  • -{% endblock %} - -{% block imagestore-info %} - {% if view_user and IMAGESTORE_SHOW_USER %} - {% with user=view_user %} - {% include "imagestore/user_info.html" %} - {% endwith %} - {% endif %} -{% endblock %} - -{% block imagestore-related %} - {% include "imagestore/tag-cloud.html" %} -{% endblock %} - -{% block imagestore_content %} -

    {% if view_user %} - {% trans "Albums for user" %} {{ view_user }} - {% else %} - {% trans "All albums" %} - {% endif %}

    - {% include "imagestore/pagination.html" %} - - {% include "imagestore/pagination.html" %} -{% endblock %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/base.html b/imagestore/templates/imagestore/base.html deleted file mode 100644 index 8b72453..0000000 --- a/imagestore/templates/imagestore/base.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends "website/base.html" %} -{% load i18n %} -{% load url from future %} -{% load sekizai_tags staticfiles %} - - -{% block navbar_options %} navbar navbar-inverse navbar-static-top {% endblock %} - - -{% block content %} - -{% include "imagestore/pphoto.html" %} - - -{% addtoblock "css" %} - -{% endaddtoblock %} - -
    -
    -
    - - {% block breadcrumb %} - - {% endblock %} - - {% block imagestore_content %} - {% endblock imagestore_content %} - - {% block imagestore_content-related %} - {% block imagestore-info %} - {% endblock %} -
    - -
    - {% block imagestore-related %} - {% endblock %} - {% endblock %} -
    -
    -
    -{% endblock content %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/forms/album_form.html b/imagestore/templates/imagestore/forms/album_form.html deleted file mode 100644 index 612308d..0000000 --- a/imagestore/templates/imagestore/forms/album_form.html +++ /dev/null @@ -1,33 +0,0 @@ -{% extends "imagestore/base.html" %} -{% load i18n %} -{% load thumbnail %} - - -{% block title %} - {% trans "Create album" %} -{% endblock %} - -{% block imagestore-breadcrumb %} -
  • - {% if object %} - {% trans "Edit album" %}: {{ object.name }} - {% else %} - {% trans "Create album" %} - {% endif %} -
  • -{% endblock %} - -{% block imagestore_content %} -

    - {% if object %} - {% trans "Edit album" %}: {{ object.name }} - {% else %} - {% trans "Create album" %} - {% endif %} -

    -
    - {% csrf_token %} - {{ form.as_p }} - -
    -{% endblock imagestore_content %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/forms/image_form.html b/imagestore/templates/imagestore/forms/image_form.html deleted file mode 100644 index 5e34681..0000000 --- a/imagestore/templates/imagestore/forms/image_form.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "imagestore/base.html" %} -{% load i18n %} -{% load thumbnail %} -{% load url from future %} - -{% block title %} - {% trans "Upload image" %} -{% endblock %} - -{% block imagestore-breadcrumb %} -
  • {% trans "Upload image" %}
  • -{% endblock %} - -{% block imagestore_content %} -

    {% trans "Upload image" %}

    -
    - {% csrf_token %} - {{ form.as_p }} - -
    -{% endblock imagestore_content %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/image-href.html b/imagestore/templates/imagestore/image-href.html deleted file mode 100644 index 4131eb9..0000000 --- a/imagestore/templates/imagestore/image-href.html +++ /dev/null @@ -1,10 +0,0 @@ -{% load url from future %} -{% if album %} - {% url 'imagestore:image-album' album_id=album.id pk=image.id %} -{% else %} - {% if tag %} - {% url 'imagestore:image-tag' tag=tag pk=image.id %} - {% else %} - {{ image.get_absolute_url }} - {% endif %} -{% endif %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/image-list.html b/imagestore/templates/imagestore/image-list.html deleted file mode 100644 index dae6863..0000000 --- a/imagestore/templates/imagestore/image-list.html +++ /dev/null @@ -1,22 +0,0 @@ -{% load i18n %} -{% load thumbnail %} - -
    - {% for image in image_list %} - {% thumbnail image.image "120x120" crop="center" as im %} - - {{ image.title }} - - - {% if image.title %} -
    {{ image.title }} - {% else %} - {% trans 'Info' %} - {% endif %} -
    - {% endthumbnail %} - {% endfor %} - {% include "imagestore/pagination.html" %} -
    - - diff --git a/imagestore/templates/imagestore/image-scope.html b/imagestore/templates/imagestore/image-scope.html deleted file mode 100644 index 3d5881c..0000000 --- a/imagestore/templates/imagestore/image-scope.html +++ /dev/null @@ -1,16 +0,0 @@ -{% load i18n %} -{% if view_user %} - {% if scope_tag %}<{{ scope_tag }} class='scope-view-user'>{% endif %} - {% trans "User" %}: {{ view_user }} - {% if scope_tag %}{% endif %} -{% endif %} -{% if album %} - {% if scope_tag %}<{{ scope_tag }} class='scope-album'>{% endif %} - {% trans "Album" %}: {{ album.name }} - {% if scope_tag %}{% endif %} -{% endif %} -{% if tag %} - {% if scope_tag %}<{{ scope_tag }} class='scope-album'>{% endif %} - {% trans "Tag" %}: {{ tag }} - {% if scope_tag %}{% endif %} -{% endif %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/image.html b/imagestore/templates/imagestore/image.html deleted file mode 100644 index 569e3a4..0000000 --- a/imagestore/templates/imagestore/image.html +++ /dev/null @@ -1,89 +0,0 @@ -{% extends "imagestore/base.html" %} -{% load i18n %} -{% load thumbnail %} -{% load tagging_tags %} -{% load url from future %} - -{% block title %} - {% trans "Image" %} - {{ image.title }} -{% endblock %} - -{% block imagestore-breadcrumb %} - {% if view_user and IMAGESTORE_SHOW_USER %} -
  • {% trans "User" %}: {{ view_user }} /
  • - {% endif %} - {% if album %} -
  • {% trans "Album" %}: {{ album.name }} /
  • - {% endif %} - {% if tag %} -
  • {% trans "Tag" %}: {{ tag }} /
  • - {% endif %} -
  • - {% if image.title %} - {{ image.title }} - {% else %} - {{ image.id }} - {% endif %} -
  • -{% endblock %} - -{% block imagestore-info %} - -{% endblock %} - -{% block imagestore_content %} - {% if image.title %}

    {{ image.title }}

    {% endif %} - {% if album or tag or view_user %} -

    - {% include "imagestore/image-scope.html" %} -

    - {% endif %} -
    - {{ image.description }} -
    -
    - - {% thumbnail image.image "800x800" as full_im %} - {{ image.title }} - {% endthumbnail %} -
    -{% endblock imagestore_content %} - -{% block controls %} - {% if request.user == image.user or perms.imagestore.moderate_images %} -
  • {% trans "Edit info" %}
  • -
  • {% trans "Delete image" %}
  • - {% endif %} -{% endblock %} - -{% block imagestore-related %} - -
    -

    {% trans "Tags" %}

    - {% tags_for_object image as itags %} - {% for tag in itags %} - {{ tag.name }} - {% endfor %} -
    - {% if image.place %} -
    -

    {% trans "Place" %}

    - {{ image.place.name }} → -
    - {% endif %} -{% endblock %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/image_confirm_delete.html b/imagestore/templates/imagestore/image_confirm_delete.html deleted file mode 100644 index 44f7685..0000000 --- a/imagestore/templates/imagestore/image_confirm_delete.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "imagestore/base.html" %} - -{% load i18n %} - -{% block imagestore_content %} -

    {% trans "Are you sure that you would like to delete this image?" %}

    -
    - {% csrf_token %} -

    - ← {% trans "No, take me back" %} - -

    -
    -{% endblock %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/image_delete.html b/imagestore/templates/imagestore/image_delete.html deleted file mode 100644 index 44f7685..0000000 --- a/imagestore/templates/imagestore/image_delete.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "imagestore/base.html" %} - -{% load i18n %} - -{% block imagestore_content %} -

    {% trans "Are you sure that you would like to delete this image?" %}

    -
    - {% csrf_token %} -

    - ← {% trans "No, take me back" %} - -

    -
    -{% endblock %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/image_list.html b/imagestore/templates/imagestore/image_list.html deleted file mode 100644 index 6089732..0000000 --- a/imagestore/templates/imagestore/image_list.html +++ /dev/null @@ -1,65 +0,0 @@ -{% extends "imagestore/base.html" %} -{% load i18n %} -{% load thumbnail %} -{% load url from future %} - -{% block imagestore-breadcrumb %} - {% with "li" as scope_tag %} - {% include "imagestore/image-scope.html" %} - {% endwith %} -{% endblock %} - -{% block title %} - {% include "imagestore/image-scope.html" %} -{% endblock %} - -{% block imagestore-info %} - {% if view_user and IMAGESTORE_SHOW_USER %} - {% with user=view_user %} - {% include "imagestore/user_info.html" %} - {% endwith %} - {% endif %} - {% if album and IMAGESTORE_SHOW_USER %} - {% with user=album.user %} - {% include "imagestore/user_info.html" %} - {% endwith %} - {% endif %} - -{% endblock %} - - -{% block controls %} - {% if album %} - {% if request.user == album.user or perms.imagestore.moderate_albums %} -
  • {% trans "Edit album" %}
  • - {% endif %} - {% endif %} -{% endblock %} - -{% block imagestore_content %} -

    - {% include "imagestore/image-scope.html" %} -

    - {% include "imagestore/pagination.html" %} -
    - {% for image in image_list %} -
    - {% thumbnail image.image "120x120" crop="center" as im %} - - {{ image.title }} - - - {% if image.title %} -
    {{ image.title }} - {% else %} - {% trans 'Info' %} - {% endif %} -
    - {% endthumbnail %} -
    - {% endfor %} -
    - {% include "imagestore/pagination.html" %} -{% endblock %} - - diff --git a/imagestore/templates/imagestore/pagination.html b/imagestore/templates/imagestore/pagination.html deleted file mode 100644 index c46ea50..0000000 --- a/imagestore/templates/imagestore/pagination.html +++ /dev/null @@ -1,26 +0,0 @@ -{% load i18n %} - -{% if is_paginated %} - -{% endif %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/pphoto.html b/imagestore/templates/imagestore/pphoto.html deleted file mode 100644 index a557d69..0000000 --- a/imagestore/templates/imagestore/pphoto.html +++ /dev/null @@ -1,28 +0,0 @@ -{% load sekizai_tags staticfiles %} - -{% addtoblock "css" %} - -{% endaddtoblock %} - -{% addtoblock "js" %} - - - -{% endaddtoblock %} diff --git a/imagestore/templates/imagestore/tag-cloud.html b/imagestore/templates/imagestore/tag-cloud.html deleted file mode 100644 index c89d450..0000000 --- a/imagestore/templates/imagestore/tag-cloud.html +++ /dev/null @@ -1,13 +0,0 @@ -{% load tagging_tags %} -{% load i18n %} -{% load url from future %} - -{% if IMAGESTORE_SHOW_TAGS %} -
    -

    {% trans "Tags" %}

    - {% tag_cloud_for_model imagestore.Image as image_tags %} - {% for tag in image_tags %} - {{ tag.name }} - {% endfor %} -
    -{% endif %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/tag.html b/imagestore/templates/imagestore/tag.html deleted file mode 100644 index 8929682..0000000 --- a/imagestore/templates/imagestore/tag.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "imagestore/base.html" %} - -{% load i18n %} -{% load thumbnail %} - -{% block title %} - {% trans "Gallery" %} - {% trans "Tag" %}: {{ tag }} -{% endblock %} - -{% block imagestore-breadcrumb %} -
  • {% trans "Tag" %}: {{ tag }}
  • -{% endblock %} - -{% block imagestore_content %} -

    {% trans "Tag" %} - {{ tag }}

    - {% include "imagestore/image-list.html" %} -{% endblock imagestore_content %} - -{% block imagestore_content-related %} - {% include "imagestore/tag-cloud.html" %} -{% endblock %} \ No newline at end of file diff --git a/imagestore/templates/imagestore/user_info.html b/imagestore/templates/imagestore/user_info.html deleted file mode 100644 index 8e5323b..0000000 --- a/imagestore/templates/imagestore/user_info.html +++ /dev/null @@ -1,22 +0,0 @@ -{% load i18n %} -{% load thumbnail %} - -{# if we can't get profile then return user model itself #} -{% with profile=user.get_profile|default_if_none:user %} - -{% endwith %} \ No newline at end of file diff --git a/imagestore/test_img.jpg b/imagestore/test_img.jpg deleted file mode 100644 index 7ff447f..0000000 Binary files a/imagestore/test_img.jpg and /dev/null differ diff --git a/imagestore/tests.py b/imagestore/tests.py deleted file mode 100644 index b2f2f5d..0000000 --- a/imagestore/tests.py +++ /dev/null @@ -1,178 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - -from django.test import TestCase -from django.test.client import Client -from django.core.urlresolvers import reverse -from models import * -import os -from django.contrib.auth.models import User -from django.db import models - -try: - from lxml import html -except: - raise ImportError('Imagestore require lxml for self-testing') - -class ImagestoreTest(TestCase): - def setUp(self): - self.image_file = open(os.path.join(os.path.dirname(__file__), 'test_img.jpg')) - self.user = User.objects.create_user('zeus', 'zeus@example.com', 'zeus') - self.client = Client() - self.album = Album(name='test album', user=self.user) - self.album.save() - - def _upload_test_image(self, username='zeus', password='zeus'): - self.client.login(username=username, password=password) - self.image_file = open(os.path.join(os.path.dirname(__file__), 'test_img.jpg')) - response = self.client.get(reverse('imagestore:upload')) - self.assertEqual(response.status_code, 200) - tree = html.fromstring(response.content) - values = dict(tree.xpath('//form[@method="post"]')[0].form_values()) - values['image'] = self.image_file - values['album'] = Album.objects.filter(user=self.user)[0].id - response = self.client.post(reverse('imagestore:upload'), values, follow=True) - return response - - def _create_test_album(self, username='zeus', password='zeus'): - self.client.login(username=username, password=password) - response = self.client.get(reverse('imagestore:create-album')) - self.assertEqual(response.status_code, 200) - tree = html.fromstring(response.content) - values = dict(tree.xpath('//form[@method="post"]')[0].form_values()) - values['name'] = 'test album creation' - response = self.client.post(reverse('imagestore:create-album'), values, follow=True) - return response - - def test_empty_index(self): - response = self.client.get(reverse('imagestore:index')) - self.assertEqual(response.status_code, 200) - - def test_empty_album(self): - self.album.is_public = False - self.album.save() - response = self.client.get(self.album.get_absolute_url()) - self.assertTrue(response.status_code == 403) - self.client.login(username='zeus', password='zeus') - self.user.is_superuser = True - self.user.save() - response = self.client.get(self.album.get_absolute_url()) - self.assertEqual(response.status_code, 200) - - def test_user(self): - response = self.client.get(reverse('imagestore:user', kwargs={'username': 'zeus'})) - self.assertEqual(response.status_code, 200) - - def test_album_creation(self): - response = self._create_test_album() - self.assertEqual(response.status_code, 200) - - def test_album_edit(self): - response = self._create_test_album() - album_id = Album.objects.get(name='test album creation').id - self.client.login(username='zeus', password='zeus') - response = self.client.get(reverse('imagestore:update-album', kwargs={'pk': album_id})) - self.assertEqual(response.status_code, 200) - tree = html.fromstring(response.content) - values = dict(tree.xpath('//form[@method="post"]')[0].form_values()) - values['name'] = 'test album update' - self.client.post(reverse('imagestore:update-album', kwargs={'pk': album_id}), values, follow=True) - self.assertEqual(response.status_code, 200) - self.assertTrue(Album.objects.get(id=album_id).name == 'test album update') - - def test_album_delete(self): - response = self._create_test_album() - self.client.login(username='zeus', password='zeus') - album_id = Album.objects.get(name='test album creation').id - response = self.client.post(reverse('imagestore:delete-album', kwargs={'pk': album_id}), follow=True) - self.assertEqual(response.status_code, 200) - self.assertTrue(len(Album.objects.filter(id=album_id)) == 0) - - - def test_image_upload(self): - response = self._create_test_album() - response = self._upload_test_image() - self.assertEqual(response.status_code, 200) - img_url = Image.objects.get(user__username='zeus').get_absolute_url() - response = self.client.get(img_url) - self.assertEqual(response.status_code, 200) - self.test_user() - - def test_tagging(self): - response = self._create_test_album() - self.client.login(username='zeus', password='zeus') - response = self.client.get(reverse('imagestore:upload')) - self.assertEqual(response.status_code, 200) - tree = html.fromstring(response.content) - values = dict(tree.xpath('//form[@method="post"]')[0].form_values()) - values['image'] = self.image_file - values['tags'] = 'one, tow, three' - values['album'] = Album.objects.filter(user=self.user)[0].id - self.client.post(reverse('imagestore:upload'), values, follow=True) - self.assertEqual(response.status_code, 200) - response = self.client.get(reverse('imagestore:tag', kwargs={'tag': 'one'})) - self.assertEqual(response.status_code, 200) - self.assertTrue(len(response.context['image_list']) == 1) - - def test_delete(self): - User.objects.create_user('bad', 'bad@example.com', 'bad') - response = self._create_test_album() - self._upload_test_image() - self.client.login(username='bad', password='bad') - image_id = Image.objects.get(user__username='zeus').id - response = self.client.post(reverse('imagestore:delete-image', kwargs={'pk': image_id}), follow=True) - self.assertEqual(response.status_code, 404) - self.client.login(username='zeus', password='zeus') - response = self.client.post(reverse('imagestore:delete-image', kwargs={'pk': image_id}), follow=True) - self.assertEqual(response.status_code, 200) - self.assertEqual(len(Image.objects.all()), 0) - - def test_update_image(self): - self._upload_test_image() - self.client.login(username='zeus', password='zeus') - image_id = Image.objects.get(user__username='zeus').id - response = self.client.get(reverse('imagestore:update-image', kwargs={'pk': image_id}), follow=True) - self.assertEqual(response.status_code, 200) - tree = html.fromstring(response.content) - values = dict(tree.xpath('//form[@method="post"]')[0].form_values()) - values['tags'] = 'one, tow, three' - values['title'] = 'changed title' - values['album'] = Album.objects.filter(user=self.user)[0].id - self.client.post(reverse('imagestore:update-image', kwargs={'pk': image_id}), values, follow=True) - self.assertEqual(response.status_code, 200) - self.assertTrue(Image.objects.get(user__username='zeus').title == 'changed title') - - def test_prev_next_with_ordering(self): - self.test_album_creation() - for i in range(1, 6): - self._upload_test_image() - img = Image.objects.order_by('-id')[0] - img.order = i - img.save() - # Swap two id's - im1 = Image.objects.get(order=2) - im2 = Image.objects.get(order=4) - im1.order, im2.order = 4, 2 - im1.save() - im2.save() - response = self.client.get(Image.objects.get(order=3).get_absolute_url()) - self.assertEqual(response.context['next'], im1) - self.assertEqual(response.context['previous'], im2) - - def test_album_order(self): - self.album.delete() - a1 = Album.objects.create(name='b2', order=1, user=self.user) - a2 = Album.objects.create(name='a1', order=2, user=self.user) - response = self.client.get(reverse('imagestore:index')) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.context['object_list'][0].name, 'b2') - self.assertEqual(response.context['object_list'][1].name, 'a1') - a1.order, a2.order = 2, 1 - a1.save() - a2.save() - response = self.client.get(reverse('imagestore:index')) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.context['object_list'][0].name, 'a1') - self.assertEqual(response.context['object_list'][1].name, 'b2') \ No newline at end of file diff --git a/imagestore/urls.py b/imagestore/urls.py deleted file mode 100644 index 7a0e916..0000000 --- a/imagestore/urls.py +++ /dev/null @@ -1,33 +0,0 @@ -try: - from django.conf.urls import patterns, url -except ImportError: - from django.conf.urls.defaults import patterns, url -from views import (AlbumListView, ImageListView, UpdateImage, UpdateAlbum, CreateImage, CreateAlbum, DeleteImage, \ - DeleteAlbum, ImageView) - - -urlpatterns = patterns('imagestore.views', - url(r'^$', AlbumListView.as_view(), name='index'), - - - url(r'^album/add/$', CreateAlbum.as_view(), name='create-album'), - url(r'^album/(?P\d+)/$', ImageListView.as_view(), name='album'), - url(r'^album/(?P\d+)/edit/$', UpdateAlbum.as_view(), name='update-album'), - url(r'^album/(?P\d+)/delete/$', DeleteAlbum.as_view(), name='delete-album'), - - url(r'^tag/(?P[^/]+)/$', ImageListView.as_view(), name='tag'), - - url(r'^user/(?P\w+)/albums/', AlbumListView.as_view(), name='user'), - url(r'^user/(?P\w+)/$', ImageListView.as_view(), name='user-images'), - - url(r'^upload/$', CreateImage.as_view(), name='upload'), - - url(r'^image/(?P\d+)/$', ImageView.as_view(), name='image'), - url(r'^album/(?P\d+)/image/(?P\d+)/$', ImageView.as_view(), name='image-album'), - url(r'^tag/(?P[^/]+)/image/(?P\d+)/$', ImageView.as_view(), name='image-tag'), - url(r'^image/(?P\d+)/delete/$', DeleteImage.as_view(), name='delete-image'), - url(r'^image/(?P\d+)/update/$', UpdateImage.as_view(), name='update-image'), - ) - - - diff --git a/imagestore/utils.py b/imagestore/utils.py deleted file mode 100644 index 973f85c..0000000 --- a/imagestore/utils.py +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env python -# vim:fileencoding=utf-8 - -__author__ = 'zeus' - -import os -import uuid -from django.core.exceptions import ImproperlyConfigured -from django.utils.importlib import import_module -from django.conf import settings - -UPLOAD_TO = getattr(settings, 'IMAGESTORE_UPLOAD_TO', 'imagestore/') - -def load_class(class_path, setting_name=None): - """ - Loads a class given a class_path. - The setting_name parameter is only there for pretty error output, and - therefore is optional - - Taken from https://github.com/divio/django-shop/blob/master/shop/util/loader.py - """ - try: - class_module, class_name = class_path.rsplit('.', 1) - except ValueError: - if setting_name: - txt = '%s isn\'t a valid module. Check your %s setting' % (class_path,setting_name) - else: - txt = '%s isn\'t a valid module.' % class_path - raise ImproperlyConfigured(txt) - - try: - mod = import_module(class_module) - except ImportError, e: - if setting_name: - txt = 'Error importing backend %s: "%s". Check your %s setting' % (class_module, e, setting_name) - else: - txt = 'Error importing backend %s: "%s".' % (class_module, e) - raise ImproperlyConfigured(txt) - - try: - clazz = getattr(mod, class_name) - except AttributeError, e: - if setting_name: - txt = 'Backend module "%s" does not define a "%s" class. Check your %s setting. (%s)' % (class_module, class_name, setting_name) - else: - txt = 'Backend module "%s" does not define a "%s" class. (%s)' % (class_module, class_name, e) - raise ImproperlyConfigured(txt) - return clazz - -def get_model_string(model_name): - """ - Returns the model string notation Django uses for lazily loaded ForeignKeys - (eg 'auth.User') to prevent circular imports. - This is needed to allow our crazy custom model usage. - - Taken from https://github.com/divio/django-shop/blob/master/shop/util/loader.py - """ - class_path = getattr(settings, 'IMAGESTORE_%s_MODEL' % model_name.upper().replace('_', ''), None) - if not class_path: - return 'imagestore.%s' % model_name - else: - klass = load_class(class_path) - return '%s.%s' % (klass._meta.app_label, klass.__name__) - -def get_file_path(instance, filename): - ext = filename.split('.')[-1] - filename = "%s.%s" % (uuid.uuid4(), ext) - return os.path.join(UPLOAD_TO, filename) \ No newline at end of file diff --git a/imagestore/views.py b/imagestore/views.py deleted file mode 100644 index 2d1a933..0000000 --- a/imagestore/views.py +++ /dev/null @@ -1,256 +0,0 @@ -from django.core.exceptions import PermissionDenied -from django.core.urlresolvers import reverse -from django.utils.decorators import method_decorator -from imagestore.models import Album, Image -from imagestore.models import image_applabel, image_classname -from imagestore.models import album_applabel, album_classname -from django.shortcuts import get_object_or_404 -from django.http import Http404, HttpResponseRedirect -from django.conf import settings -from django.contrib.auth.models import User -from django.contrib.auth.decorators import permission_required -from django.contrib.auth.decorators import login_required -from django.utils.translation import ugettext_lazy as _ -from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView -from tagging.models import TaggedItem -from tagging.utils import get_tag -from utils import load_class -from django.db.models import Q - -try: - from django.contrib.auth import get_user_model - User = get_user_model() - username_field = User.USERNAME_FIELD -except ImportError: - from django.contrib.auth.models import User - username_field = 'username' - -IMAGESTORE_IMAGES_ON_PAGE = getattr(settings, 'IMAGESTORE_IMAGES_ON_PAGE', 20) - -IMAGESTORE_ON_PAGE = getattr(settings, 'IMAGESTORE_ON_PAGE', 20) - -ImageForm = load_class(getattr(settings, 'IMAGESTORE_IMAGE_FORM', 'imagestore.forms.ImageForm')) -AlbumForm = load_class(getattr(settings, 'IMAGESTORE_ALBUM_FORM', 'imagestore.forms.AlbumForm')) - - -class AlbumListView(ListView): - context_object_name = 'album_list' - template_name = 'imagestore/album_list.html' - paginate_by = getattr(settings, 'IMAGESTORE_ALBUMS_ON_PAGE', 20) - allow_empty = True - - def get_queryset(self): - albums = Album.objects.filter(is_public=True).select_related('head') - self.e_context = dict() - if 'username' in self.kwargs: - user = get_object_or_404(**{'klass': User, username_field: self.kwargs['username']}) - albums = albums.filter(user=user) - self.e_context['view_user'] = user - return albums - - def get_context_data(self, **kwargs): - context = super(AlbumListView, self).get_context_data(**kwargs) - context.update(self.e_context) - return context - - -def get_images_queryset(self): - images = Image.objects.all() - self.e_context = dict() - if 'tag' in self.kwargs: - tag_instance = get_tag(self.kwargs['tag']) - if tag_instance is None: - raise Http404(_('No Tag found matching "%s".') % self.kwargs['tag']) - self.e_context['tag'] = tag_instance - images = TaggedItem.objects.get_by_model(images, tag_instance) - if 'username' in self.kwargs: - user = get_object_or_404(**{'klass': User, username_field: self.kwargs['username']}) - self.e_context['view_user'] = user - images = images.filter(user=user) - if 'album_id' in self.kwargs: - album = get_object_or_404(Album, id=self.kwargs['album_id']) - self.e_context['album'] = album - images = images.filter(album=album) - if (not album.is_public) and\ - (self.request.user != album.user) and\ - (not self.request.user.has_perm('imagestore.moderate_albums')): - raise PermissionDenied - return images - - -class ImageListView(ListView): - context_object_name = 'image_list' - template_name = 'imagestore/image_list.html' - paginate_by = getattr(settings, 'IMAGESTORE_IMAGES_ON_PAGE', 20) - allow_empty = True - - get_queryset = get_images_queryset - - def get_context_data(self, **kwargs): - context = super(ImageListView, self).get_context_data(**kwargs) - context.update(self.e_context) - return context - - -class ImageView(DetailView): - context_object_name = 'image' - template_name = 'imagestore/image.html' - - get_queryset = get_images_queryset - - def get(self, request, *args, **kwargs): - self.object = self.get_object() - - if self.object.album: - if (not self.object.album.is_public) and\ - (self.request.user != self.object.album.user) and\ - (not self.request.user.has_perm('imagestore.moderate_albums')): - raise PermissionDenied - - context = self.get_context_data(object=self.object) - return self.render_to_response(context) - - def get_context_data(self, **kwargs): - context = super(ImageView, self).get_context_data(**kwargs) - image = context['image'] - - base_qs = self.get_queryset() - count = base_qs.count() - img_pos = base_qs.filter( - Q(order__lt=image.order)| - Q(id__lt=image.id, order=image.order) - ).count() - next = None - previous = None - if count - 1 > img_pos: - try: - next = base_qs.filter( - Q(order__gt=image.order)| - Q(id__gt=image.id, order=image.order) - )[0] - except IndexError: - pass - if img_pos > 0: - try: - previous = base_qs.filter( - Q(order__lt=image.order)| - Q(id__lt=image.id, order=image.order) - ).order_by('-order', '-id')[0] - except IndexError: - pass - context['next'] = next - context['previous'] = previous - context.update(self.e_context) - return context - - -class CreateAlbum(CreateView): - template_name = 'imagestore/forms/album_form.html' - model = Album - form_class = AlbumForm - - @method_decorator(login_required) - @method_decorator(permission_required('%s.add_%s' % (album_applabel, album_classname))) - def dispatch(self, *args, **kwargs): - return super(CreateAlbum, self).dispatch(*args, **kwargs) - - def form_valid(self, form): - self.object = form.save(commit=False) - self.object.user = self.request.user - self.object.save() - return HttpResponseRedirect(self.get_success_url()) - - -def filter_album_queryset(self): - if self.request.user.has_perm('imagestore.moderate_albums'): - return Album.objects.all() - else: - return Album.objects.filter(user=self.request.user) - - -class UpdateAlbum(UpdateView): - template_name = 'imagestore/forms/album_form.html' - model = Album - form_class = AlbumForm - - get_queryset = filter_album_queryset - - @method_decorator(login_required) - @method_decorator(permission_required('%s.add_%s' % (album_applabel, album_classname))) - def dispatch(self, *args, **kwargs): - return super(UpdateAlbum, self).dispatch(*args, **kwargs) - - -class DeleteAlbum(DeleteView): - template_name = 'imagestore/album_delete.html' - model = Album - - def get_success_url(self): - return reverse('imagestore:index') - - get_queryset = filter_album_queryset - - @method_decorator(login_required) - @method_decorator(permission_required('%s.change_%s' % (album_applabel, album_classname))) - def dispatch(self, *args, **kwargs): - return super(DeleteAlbum, self).dispatch(*args, **kwargs) - - -class CreateImage(CreateView): - template_name = 'imagestore/forms/image_form.html' - model = Image - form_class = ImageForm - - @method_decorator(login_required) - @method_decorator(permission_required('%s.add_%s' % (image_applabel, image_classname))) - def dispatch(self, *args, **kwargs): - return super(CreateImage, self).dispatch(*args, **kwargs) - - def get_form(self, form_class): - return form_class(user=self.request.user, **self.get_form_kwargs()) - - def form_valid(self, form): - self.object = form.save(commit=False) - self.object.user = self.request.user - self.object.save() - if self.object.album: - self.object.album.save() - return HttpResponseRedirect(self.get_success_url()) - - -def get_edit_image_queryset(self): - if self.request.user.has_perm('%s.moderate_%s' % (image_applabel, image_classname)): - return Image.objects.all() - else: - return Image.objects.filter(user=self.request.user) - - -class UpdateImage(UpdateView): - template_name = 'imagestore/forms/image_form.html' - model = Image - form_class = ImageForm - - get_queryset = get_edit_image_queryset - - def get_form(self, form_class): - return form_class(user=self.object.user, **self.get_form_kwargs()) - - @method_decorator(login_required) - @method_decorator(permission_required('%s.change_%s' % (image_applabel, image_classname))) - def dispatch(self, *args, **kwargs): - return super(UpdateImage, self).dispatch(*args, **kwargs) - - -class DeleteImage(DeleteView): - template_name = 'imagestore/image_delete.html' - model = Image - - def get_success_url(self): - return reverse('imagestore:index') - - get_queryset = get_edit_image_queryset - - @method_decorator(login_required) - @method_decorator(permission_required('%s.delete_%s' % (image_applabel, image_classname))) - def dispatch(self, *args, **kwargs): - return super(DeleteImage, self).dispatch(*args, **kwargs) \ No newline at end of file diff --git a/location_field/media/form.js b/location_field/media/form.js index 5969e7d..4b7d4e4 100644 --- a/location_field/media/form.js +++ b/location_field/media/form.js @@ -40,14 +40,14 @@ theObject.placeMarker( l ); theObject.saveToInputField(); }); - } + }; this.placeMarker = function( location ) { this.marker.setPosition( location ); this.map.setCenter( location ); this.map.panTo( location ); - } + }; this.geocode = function(address, cb) @@ -60,7 +60,7 @@ } }); } - } + }; this.geocode_reverse = function( cb) { @@ -71,13 +71,13 @@ } }); } - } + }; this.saveToInputField = function() { var p = this.marker.getPosition(); coordinate_field.value = p.lat().toFixed(6) + "," + p.lng().toFixed(6) + "," + this.map.getZoom() ; - } + }; this.loadFromInputField = function() { @@ -95,7 +95,7 @@ this.placeMarker( init_position ); this.map.setZoom( 16 ); } - } + }; // --------------------------- Constructor ------------------------------------- @@ -118,7 +118,7 @@ }); theObject.loadFromInputField(); - } + }; this.init(); } @@ -169,7 +169,7 @@ $dialogElement[0].map.placeMarkerUsingAddressString( $dialogLocationField.val() ); $dialogLocationField.on("keypress", function(e) { - if ( e.keyCode == 13 ) { // enter + if ( e.keyCode === 13 ) { // enter $dialogElement[0].map.placeMarkerUsingAddressString( $dialogLocationField.val() ); return false; } @@ -184,7 +184,5 @@ $dialogElement.dialog('open'); }); - - - + }); diff --git a/location_field/urls.py b/location_field/urls.py index 9878cc9..c1b888c 100644 --- a/location_field/urls.py +++ b/location_field/urls.py @@ -1,11 +1,9 @@ -from django.conf.urls.defaults import patterns - import os +from django.urls import re_path +from django.views.static import serve app_dir = os.path.dirname(__file__) -urlpatterns = patterns( - '', - (r'^media/(.*)$', 'django.views.static.serve', { - 'document_root': '%s/media' % app_dir}), -) +urlpatterns = [ + re_path(r'^media/(.*)$', serve, {'document_root': '%s/media' % app_dir}), +] diff --git a/location_field/widgets.py b/location_field/widgets.py index 304a31f..9cc6c84 100644 --- a/location_field/widgets.py +++ b/location_field/widgets.py @@ -1,21 +1,22 @@ from django.forms import widgets from django.utils.safestring import mark_safe - +from django.conf import settings import os + class LocationWidget(widgets.TextInput): - def __init__(self, attrs=None, based_field=None, zoom=None, width=610, height = 480, **kwargs): + def __init__(self, attrs=None, based_field=None, zoom=None, width=610, height=480, **kwargs): self.based_field = based_field self.zoom = zoom self.width = width self.height = height super(LocationWidget, self).__init__(attrs) - def render(self, name, value, attrs=None): - - if value is not None and len(value)>0: + def render(self, name, value, attrs=None, renderer=None): + + if value is not None and len(value) > 0: lat, lng, zoom = value.split(',') - + value = '%s,%s,%d' % ( float(lat), float(lng), @@ -25,7 +26,7 @@ class LocationWidget(widgets.TextInput): value = '' based_field = "#id_" + self.based_field.name - + attrs = attrs or {} attrs['readonly'] = "readonly" attrs['data-location-widget'] = name @@ -35,25 +36,23 @@ class LocationWidget(widgets.TextInput): attrs['data-dialog-id'] = "#map_dialog_" + name text_input = super(LocationWidget, self).render(name, value, attrs) - path = os.path.abspath(os.path.dirname(__file__)) - with open( path + "/media/form.html" , 'r') as content_file: + with open(path + "/media/form.html", 'r') as content_file: html = content_file.read() - return mark_safe(text_input + html % {'name': name, 'width': self.width, 'height': self.height }) + return mark_safe(text_input + html % {'name': name, 'width': self.width, 'height': self.height}) class Media: - css = { - 'all' : ('/location_field/media/form.css', ) + css = { + 'all': ('/location_field/media/form.css',) } # Use schemaless URL so it works with both, http and https websites js = ( - '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js', # jquery - '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js', + #'//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js', # jquery + #'//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js', + '/static/js/jquery-ui-1.10.0.custom.min.js', + #'//maps.google.com/maps/api/js?sensor=false&language=de&key={}'.format(settings.GOOGLE_MAPS_API_KEY), '//maps.google.com/maps/api/js?sensor=false&language=de', '/static/js/bindWithDelay.js', '/location_field/media/form.js', ) - - - diff --git a/musicians/admin.py b/musicians/admin.py index ef7bc42..32a52d1 100644 --- a/musicians/admin.py +++ b/musicians/admin.py @@ -2,37 +2,31 @@ from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User from django.utils.translation import ugettext as _ - - from musicians.models import Musician - -from eventplanner.admin import EventParticipationInline +# from eventplanner.admin import EventParticipationInline # Define an inline admin descriptor for Musician model # which acts a bit like a singleton -class MusicianInline( admin.StackedInline ): +class MusicianInline(admin.StackedInline): model = Musician can_delete = False verbose_name_plural = _('musicians') verbose_name = _('musician') - -# Define a new User admin -class UserAdmin( UserAdmin ): - inlines = (MusicianInline, ) +# Define a new User admin +class UserAdmin(UserAdmin): + inlines = (MusicianInline,) + class MusicianAdmin(admin.ModelAdmin): readonly_fields = ('user',) - inlines = ( EventParticipationInline, ) + # inlines = ( EventParticipationInline, ) model = Musician # Re-register UserAdmin -admin.site.unregister( User ) +admin.site.unregister(User) admin.site.register(User, UserAdmin) - - -admin.site.register( Musician, MusicianAdmin ) - +admin.site.register(Musician, MusicianAdmin) diff --git a/musicians/migrations/0001_initial.py b/musicians/migrations/0001_initial.py deleted file mode 100644 index da4704a..0000000 --- a/musicians/migrations/0001_initial.py +++ /dev/null @@ -1,92 +0,0 @@ -# -*- coding: utf-8 -*- -import 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 'Musician' - db.create_table(u'musicians_musician', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)), - ('image', self.gf('django.db.models.fields.files.ImageField')(max_length=100)), - ('small_image', self.gf('django.db.models.fields.files.ImageField')(max_length=100)), - ('instrument', self.gf('django.db.models.fields.CharField')(max_length=4, blank=True)), - ('birthday', self.gf('django.db.models.fields.DateField')(null=True)), - ('street', self.gf('django.db.models.fields.CharField')(max_length=80, blank=True)), - ('city', self.gf('django.db.models.fields.CharField')(max_length=40, blank=True)), - ('zip_code', self.gf('django.db.models.fields.IntegerField')(null=True)), - ('phone_home', self.gf('django.db.models.fields.CharField')(max_length=18, blank=True)), - ('phone_mobile', self.gf('django.db.models.fields.CharField')(max_length=18, blank=True)), - ('phone_work', self.gf('django.db.models.fields.CharField')(max_length=18, blank=True)), - ('position', self.gf('django.db.models.fields.IntegerField')(null=True)), - ('public_description', self.gf('django.db.models.fields.TextField')(blank=True)), - )) - db.send_create_signal(u'musicians', ['Musician']) - - - def backwards(self, orm): - # Deleting model 'Musician' - db.delete_table(u'musicians_musician') - - - 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', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 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', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - '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'}) - }, - u'musicians.musician': { - 'Meta': {'object_name': 'Musician'}, - 'birthday': ('django.db.models.fields.DateField', [], {'null': 'True'}), - 'city': ('django.db.models.fields.CharField', [], {'max_length': '40', 'blank': 'True'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), - 'instrument': ('django.db.models.fields.CharField', [], {'max_length': '4', 'blank': 'True'}), - 'phone_home': ('django.db.models.fields.CharField', [], {'max_length': '18', 'blank': 'True'}), - 'phone_mobile': ('django.db.models.fields.CharField', [], {'max_length': '18', 'blank': 'True'}), - 'phone_work': ('django.db.models.fields.CharField', [], {'max_length': '18', 'blank': 'True'}), - 'position': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), - 'public_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'small_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}), - 'street': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}), - 'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}), - 'zip_code': ('django.db.models.fields.IntegerField', [], {'null': 'True'}) - } - } - - complete_apps = ['musicians'] \ No newline at end of file diff --git a/musicians/migrations/__init__.py b/musicians/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/musicians/models.py b/musicians/models.py index ccc4d33..c44294d 100644 --- a/musicians/models.py +++ b/musicians/models.py @@ -5,55 +5,54 @@ from django.utils.translation import ugettext as _ import os INSTRUMENTS = ( - ('TR', _('Trumpet') ), - ('TRB', _('Trombone') ), - ('HRN',_('Horn') ), - ('TUBA',_('Tuba') ) + ('TR', _('Trumpet')), + ('TRB', _('Trombone')), + ('HRN', _('Horn')), + ('TUBA', _('Tuba')) ) - -def musicianPictureName( musician, originalName ): + +def musicianPictureName(musician, originalName): fileExtension = os.path.splitext(originalName)[1] return "user_images/" + musician.user.username + fileExtension -def musicianSmallPictureName( musician, originalName ): + +def musicianSmallPictureName(musician, originalName): fileExtension = os.path.splitext(originalName)[1] return "user_images/" + musician.user.username + "_thumb" + fileExtension -class Musician( models.Model ): +class Musician(models.Model): # Link to user object, contains first name and last name - user = models.OneToOneField( User, verbose_name=_("user") ) - - image = models.ImageField( upload_to = musicianPictureName, verbose_name=_("image") ) - small_image = models.ImageField( upload_to = musicianSmallPictureName, verbose_name = _("circular thumbnail") ) - + user = models.OneToOneField(User, verbose_name=_("user"), on_delete=models.CASCADE) + + image = models.ImageField(upload_to=musicianPictureName, verbose_name=_("image")) + small_image = models.ImageField(upload_to=musicianSmallPictureName, verbose_name=_("circular thumbnail")) + # Properties - instrument = models.CharField( max_length=4, choices=INSTRUMENTS, blank=True, verbose_name=_("instrument") ) - - birthday = models.DateField( null=True, verbose_name=_("birthday") ) - - street = models.CharField( max_length=80, blank=True, verbose_name=_("street") ) - city = models.CharField( max_length=40, blank=True, verbose_name=_("city") ) - zip_code = models.IntegerField( null=True, verbose_name=_("zip_code") ) - - phone_home = models.CharField( max_length=18, blank=True, verbose_name=_("phone_home") ) - phone_mobile = models.CharField( max_length=18, blank=True, verbose_name=_("phone_mobile") ) - phone_work = models.CharField( max_length=18, blank=True, verbose_name=_("phone_work") ) - - position = models.IntegerField( null=True, verbose_name=_("Position") ) - - public_description = models.TextField( blank=True, verbose_name=_("public_description") ) + instrument = models.CharField(max_length=4, choices=INSTRUMENTS, blank=True, verbose_name=_("instrument")) + + birthday = models.DateField(null=True, verbose_name=_("birthday")) + + street = models.CharField(max_length=80, blank=True, verbose_name=_("street")) + city = models.CharField(max_length=40, blank=True, verbose_name=_("city")) + zip_code = models.IntegerField(null=True, verbose_name=_("zip_code")) + + phone_home = models.CharField(max_length=18, blank=True, verbose_name=_("phone_home")) + phone_mobile = models.CharField(max_length=18, blank=True, verbose_name=_("phone_mobile")) + phone_work = models.CharField(max_length=18, blank=True, verbose_name=_("phone_work")) + + position = models.IntegerField(null=True, verbose_name=_("Position")) + + public_description = models.TextField(blank=True, verbose_name=_("public_description")) @property def isDeepBrass(self): return self.instrument == 'TRB' or self.instrument == "EUPH" or self.instrument == "TUBA" or self.instrument == "HRN" - + @property def isHighBrass(self): return self.instrument == 'TR' - - - def __unicode__( self ): + + def __unicode__(self): return self.user.username - \ No newline at end of file diff --git a/musicians/urls.py b/musicians/urls.py index 45ca4bf..d93cf29 100644 --- a/musicians/urls.py +++ b/musicians/urls.py @@ -1,14 +1,12 @@ -from django.conf.urls import patterns, url +from django.conf.urls import url import musicians.views - -urlpatterns = patterns('', - url(r'^$', musicians.views.addressbook ), - url(r'^profile$', musicians.views.own_profile ), - url(r'^changePassword/$', musicians.views.change_password ), - url(r'^login/$', musicians.views.login_view), - url(r'^login/usernames$', musicians.views.userlistForAutocompletion), - url(r'^logout/$', musicians.views.logout_view), -) - +urlpatterns = [ + url(r'^$', musicians.views.addressbook), + url(r'^profile$', musicians.views.own_profile), + url(r'^changePassword/$', musicians.views.change_password), + url(r'^login/$', musicians.views.login_view), + url(r'^login/usernames$', musicians.views.userlistForAutocompletion), + url(r'^logout/$', musicians.views.logout_view), +] diff --git a/musicians/views.py b/musicians/views.py index f7268ec..c81f8ce 100644 --- a/musicians/views.py +++ b/musicians/views.py @@ -1,155 +1,146 @@ - from django.views.generic.edit import UpdateView from django.views.generic import ListView -from musicians.models import Musician +from musicians.models import Musician from django import forms from django.http import HttpResponseRedirect from django.shortcuts import render from django.shortcuts import get_object_or_404 -class MusicianList( ListView): +class MusicianList(ListView): model = Musician -class UserEditForm( forms.ModelForm ): - - email = forms.EmailField() - +class UserEditForm(forms.ModelForm): + email = forms.EmailField() + def __init__(self, *args, **kw): - + if 'instance' in kw.keys(): user = kw['instance'].user - initVals = { 'email': user.email } - if not 'initial' in kw.keys(): + initVals = {'email': user.email} + if not 'initial' in kw.keys(): kw['initial'] = initVals else: kw['initial'].update(initVals) - - super(UserEditForm, self).__init__( *args, **kw ) - + super(UserEditForm, self).__init__(*args, **kw) + self.fields.keyOrder.remove('email') - - self.fields.keyOrder.insert(2, 'email') + + self.fields.keyOrder.insert(2, 'email') def save(self): if self.is_valid(): - super(UserEditForm,self).save() - self.instance.user.email = self.cleaned_data['email'] + super(UserEditForm, self).save() + self.instance.user.email = self.cleaned_data['email'] self.instance.user.save() - + class Meta: - model = Musician - exclude = [ 'user','image', 'small_image', 'instrument', 'position', 'public_description' ] - #fields = '__all__' + model = Musician + exclude = ['user', 'image', 'small_image', 'instrument', 'position', 'public_description'] + # fields = '__all__' -def own_profile( request ): - return user_edit( request, request.user ) - +def own_profile(request): + return user_edit(request, request.user) -def user_edit( request, username ): - musician = get_object_or_404( Musician, user__username=username ) - - if request.method == 'POST': # If the form has been submitted... - form = UserEditForm(request.POST) # A form bound to the POST data + +def user_edit(request, username): + musician = get_object_or_404(Musician, user__username=username) + + if request.method == 'POST': # If the form has been submitted... + form = UserEditForm(request.POST) # A form bound to the POST data form.instance = musician - if form.is_valid(): # All validation rules pass + if form.is_valid(): # All validation rules pass form.save() - return HttpResponseRedirect('/') # Redirect after POST + return HttpResponseRedirect('/') # Redirect after POST else: - form = UserEditForm( instance= musician ) + form = UserEditForm(instance=musician) - return render(request, 'musicians/musician_edit.html', { 'form': form, 'musician': musician } ) - + return render(request, 'musicians/musician_edit.html', {'form': form, 'musician': musician}) -class MusicianUpdate( UpdateView ): +class MusicianUpdate(UpdateView): model = Musician - #fields = [] + # fields = [] template_name = "musicians/musician_edit.html" success_url = '/books/' - - -def addressbook( request ): + + +def addressbook(request): context = dict() context['musicians'] = Musician.objects.all().order_by('user__first_name') - - return render( request, 'musicians/addressbook.html', context ) - - + + return render(request, 'musicians/addressbook.html', context) + + ############################################################################################################ ######################### User Management Views ############################################################ ############################################################################################################ -from django.contrib.auth.views import password_change + +from django.contrib.auth.views import PasswordChangeView from django.contrib.auth import authenticate, login, logout from django.shortcuts import redirect from django.http import HttpResponse -from django.utils import simplejson +import json from django.contrib.auth.models import User from datetime import timedelta -def change_password( request ): - return password_change(request, "musicians/change_password.html", post_change_redirect= "/" ) - +def change_password(request): + return PasswordChangeView.as_view(request, "musicians/change_password.html", post_change_redirect="/") + def logout_view(request): - logout( request ) - return redirect( login_view ) + logout(request) + return redirect(login_view) def userlistForAutocompletion(request): - result = [ u.username for u in User.objects.all() ] - return HttpResponse( simplejson.dumps(result), mimetype='application/json' ) + result = [u.username for u in User.objects.all()] + return HttpResponse(json.dumps(result), content_type='application/json') -def login_view( request ): - if request.method == 'POST': # If the form has been submitted... - raiseFirstLetter = lambda s: s[:1].upper() + s[1:] if s else '' - username = raiseFirstLetter( request.POST['username'] ) +def login_view(request): + if request.method == 'POST': # If the form has been submitted... + raise_first_letter = lambda s: s[:1].upper() + s[1:] if s else '' + username = raise_first_letter(request.POST['username']) password = request.POST['password'] - user = authenticate( username=username, password=password ) + user = authenticate(username=username, password=password) result = dict() result['err'] = "" if user is not None: if user.is_active: if not request.POST.get('remember', None): # Expire in one year - request.session.set_expiry( timedelta( weeks=52 ) ) + request.session.set_expiry(timedelta(weeks=52).seconds) else: # Expire on browser close - request.session.set_expiry( 0 ) - + request.session.set_expiry(0) + login(request, user) result['redirect'] = "/" - print ( "Setting Redirect" ) - if 'next' in request.POST : + print("Setting Redirect") + if 'next' in request.POST: result['redirect'] = request.POST["next"] - print ( "Using " + request.POST["next"] ) + print("Using " + request.POST["next"]) else: result['err'] = "Dein Account wurde deaktiviert." # Return a 'disabled account' error message else: result['err'] = "Falscher Benutzername oder falsches Kennwort." - - return HttpResponse( simplejson.dumps(result), mimetype='application/json' ) - + + return HttpResponse(json.dumps(result), content_type='application/json') + else: # Check if user already logged in - if request.user.is_authenticated(): - return redirect( "/") - + if request.user.is_authenticated: + return redirect("/") + if 'next' in request.GET: nextPage = request.GET['next'] else: nextPage = "/" - return render( request, 'musicians/login.html', { 'next' : nextPage } ) - - - - - - + return render(request, 'musicians/login.html', {'next': nextPage}) diff --git a/scoremanager/models.py b/scoremanager/models.py index d1d920d..97c360d 100644 --- a/scoremanager/models.py +++ b/scoremanager/models.py @@ -12,61 +12,60 @@ from django.utils.safestring import mark_safe def space_to_camelcase(value): - def camelcase(): + def camelcase(): yield type(value).lower while True: yield type(value).capitalize c = camelcase() - return "".join(c.next()(x) if x else '_' for x in value.split() ) + return "".join(c.next()(x) if x else '_' for x in value.split()) -def score_filename(score,original_name): +def score_filename(score, original_name): fileExtension = os.path.splitext(original_name)[1] - filename = "scores/" - filename += space_to_camelcase( score.piece.title ) + "/" - filename += space_to_camelcase( score.score_type ) + filename = "scores/" + filename += space_to_camelcase(score.piece.title) + "/" + filename += space_to_camelcase(score.score_type) filename += fileExtension return filename -def recordingFileName( recording, originalName ): +def recordingFileName(recording, originalName): fileExtension = os.path.splitext(originalName)[1] - filename = "recordings/" - filename += space_to_camelcase( recording.piece.title ) + "/" - filename += space_to_camelcase( recording.artist ) + filename = "recordings/" + filename += space_to_camelcase(recording.piece.title) + "/" + filename += space_to_camelcase(recording.artist) filename += fileExtension return filename -_ + ####################################################################################################### -class Piece (models.Model): - title = models.CharField( max_length = 255, verbose_name = _("title"), unique=True ) - composer = models.CharField( max_length = 255, blank = True, verbose_name = _("composer") ) - repertoire_nr = models.IntegerField( null = True, blank=True, unique=True, default = None ) - +class Piece(models.Model): + title = models.CharField(max_length=255, verbose_name=_("title"), unique=True) + composer = models.CharField(max_length=255, blank=True, verbose_name=_("composer")) + repertoire_nr = models.IntegerField(null=True, blank=True, unique=True, default=None) + def __unicode__(self): res = self.title - return res - + return res + def isInRepertoire(self): return self.repertoire_nr is not None def get_score_for_user(self, user): try: - return ScoreUserMapping.objects.get( user=user, score__in = self.scores.all() ).score + return ScoreUserMapping.objects.get(user=user, score__in=self.scores.all()).score except Piece.DoesNotExist: - if len( self.scores.all() ) > 0: + if len(self.scores.all()) > 0: return self.scores.all()[0] else: return None - @staticmethod def getRepertoire(): - return Piece.objects.filter( repertoire_nr__isnull = False ).order_by( 'repertoire_nr' ) + return Piece.objects.filter(repertoire_nr__isnull=False).order_by('repertoire_nr') class Meta: permissions = ( @@ -74,36 +73,34 @@ class Piece (models.Model): ) +class BookLocation(models.Model): + piece = models.ForeignKey('Piece', on_delete=models.PROTECT) + book = models.CharField(max_length=100, blank=False, verbose_name=_("Buch")) + page = models.IntegerField(verbose_name=_("page")) -class BookLocation ( models.Model ): - piece = models.ForeignKey ( 'Piece' ) - book = models.CharField( max_length = 100, blank = False, verbose_name = _("Buch") ) - page = models.IntegerField( verbose_name = _("page") ) - def __unicode__(self): - return "%s, %d" % ( self.book, self.page ) - + return "%s, %d" % (self.book, self.page) -class Score( models.Model ): - piece = ForeignKey('Piece', related_name="scores") - score_type = models.CharField(max_length=100, verbose_name="score type" ) # for example partitur, unterstimmen ... - file = models.FileField(upload_to=score_filename, verbose_name = _("file") ) - uploaded_by = ForeignKey( User, verbose_name=_("uploaded_by") ) +class Score(models.Model): + piece = ForeignKey('Piece', related_name="scores", on_delete=models.PROTECT) + score_type = models.CharField(max_length=100, verbose_name="score type") # for example partitur, unterstimmen ... + file = models.FileField(upload_to=score_filename, verbose_name=_("file")) + uploaded_by = ForeignKey(User, verbose_name=_("uploaded_by"), on_delete=models.PROTECT) @property def image_file_name(self): return os.path.splitext("image_cache/" + str(self.file))[0] + ".jpg" @staticmethod - def pdf2jpg(source_file, target_file, resolution = 100, crop = 15): + def pdf2jpg(source_file, target_file, resolution=100, crop=15): from wand.image import Image ret = True try: - with Image(filename=source_file, resolution=(resolution,resolution)) as img: - img.crop( crop,crop, width= img.width - 2*crop, height = int( 0.5 * img.height) - 2*crop ) + with Image(filename=source_file, resolution=(resolution, resolution)) as img: + img.crop(crop, crop, width=img.width - 2 * crop, height=int(0.5 * img.height) - 2 * crop) img.format = 'jpeg' - img.save(filename = target_file) + img.save(filename=target_file) except Exception as e: print(e) ret = False @@ -113,71 +110,63 @@ class Score( models.Model ): def get_image_file(self): from django.conf import settings - inputFile = settings.MEDIA_ROOT + "/" + str(self.file) + inputFile = settings.MEDIA_ROOT + "/" + str(self.file) cacheFile = settings.MEDIA_ROOT + "/" + str(self.image_file_name) # Create a jpg for this score, if it does not exist yet - if not os.path.exists( cacheFile ): - if not os.path.exists( os.path.dirname( cacheFile )): - os.makedirs( os.path.dirname(cacheFile) ) - Score.pdf2jpg ( inputFile, cacheFile ) + if not os.path.exists(cacheFile): + if not os.path.exists(os.path.dirname(cacheFile)): + os.makedirs(os.path.dirname(cacheFile)) + Score.pdf2jpg(inputFile, cacheFile) return self.image_file_name - def is_active_score(self,user): - return len( ScoreUserMapping.objects.filter( score= self, user=user ) ) > 0 + def is_active_score(self, user): + return len(ScoreUserMapping.objects.filter(score=self, user=user)) > 0 class Meta: unique_together = (("piece", "score_type"),) ordering = ['score_type'] - - -class Recording( models.Model ): - piece = ForeignKey( 'Piece', related_name='recordings' ) - artist = models.CharField( max_length = 100, verbose_name = _("Artist") ) - file = models.FileField( upload_to = recordingFileName, verbose_name = _("file") ) - uploaded_by = ForeignKey( User, verbose_name=_("uploaded_by") ) +class Recording(models.Model): + piece = ForeignKey('Piece', related_name='recordings', on_delete=models.PROTECT) + artist = models.CharField(max_length=100, verbose_name=_("Artist")) + file = models.FileField(upload_to=recordingFileName, verbose_name=_("file")) + uploaded_by = ForeignKey(User, verbose_name=_("uploaded_by"), on_delete=models.PROTECT) class Meta: unique_together = (("piece", "artist"),) ordering = ['artist'] - -class YoutubeRecording( models.Model ): - piece = models.ForeignKey('Piece', related_name="youtubeLinks" ) - link = models.CharField( max_length = 300, blank=False) - uploaded_by = ForeignKey( User, verbose_name=_("uploaded_by") ) +class YoutubeRecording(models.Model): + piece = models.ForeignKey('Piece', related_name="youtubeLinks", on_delete=models.PROTECT) + link = models.CharField(max_length=300, blank=False) + uploaded_by = ForeignKey(User, verbose_name=_("uploaded_by"), on_delete=models.PROTECT) - youtubeRegex = re.compile( u'(?:https://)?(?:http://)?www.youtube.(?:com|de)/watch\?v=(?P[-\w]*)' ) + youtubeRegex = re.compile(u'(?:https://)?(?:http://)?www.youtube.(?:com|de)/watch\?v=(?P[-\w]*)') @property - def embed_html( self ): + def embed_html(self): replacement = """
    """ - return mark_safe( YoutubeRecording.youtubeRegex.sub( replacement, self.link ) ) + return mark_safe(YoutubeRecording.youtubeRegex.sub(replacement, self.link)) class Meta: - unique_together = (("link", "piece" )) + unique_together = ("link", "piece") - - -class ScoreUserMapping( models.Model): - score = ForeignKey( 'Score' ) - user = models.OneToOneField( User ) - piece = ForeignKey( 'Piece' ) +class ScoreUserMapping(models.Model): + score = ForeignKey('Score', on_delete=models.PROTECT) + user = models.OneToOneField(User, on_delete=models.PROTECT) + piece = ForeignKey('Piece', on_delete=models.PROTECT) @staticmethod - def add_user_score_mapping( score, user ): + def add_user_score_mapping(score, user): piece = score.piece - ScoreUserMapping.objects.filter( user=user, piece=piece ).delete() - ScoreUserMapping.objects.create( score=score, user=user, piece= piece ) - + ScoreUserMapping.objects.filter(user=user, piece=piece).delete() + ScoreUserMapping.objects.create(score=score, user=user, piece=piece) class Meta: - unique_together = (("piece", "user" )) - - + unique_together = ("piece", "user") diff --git a/scoremanager/urls.py b/scoremanager/urls.py index 1645cde..e603a2f 100644 --- a/scoremanager/urls.py +++ b/scoremanager/urls.py @@ -1,17 +1,16 @@ -from django.conf.urls import patterns, url +from django.conf.urls import url import scoremanager.views import scoremanager.pdf_views -urlpatterns = patterns('', - url(r'^repertoireManager$', scoremanager.views.manage_repertoire ), - url(r'^repertoireAjaxSave$$', scoremanager.views.manage_repertoire_ajax_save ), - url(r'^$', scoremanager.views.list_repertoire ), - url(r'^piece/(?P\d+)', scoremanager.views.piece_view ), - url(r'^score_usermapping_save', scoremanager.views.score_user_mapping_save ), - url(r'^score/(?P\d+)', scoremanager.views.score ), - url(r'^youtubeLink$', scoremanager.views.youtube_link ), - url(r'^inhaltsverzeichnis.pdf$',scoremanager.pdf_views.repertoire_toc), - url(r'^repertoire.pdf', scoremanager.pdf_views.repertoire_pdf ), -) - +urlpatterns = [ + url(r'^repertoireManager$', scoremanager.views.manage_repertoire), + url(r'^repertoireAjaxSave$$', scoremanager.views.manage_repertoire_ajax_save), + url(r'^$', scoremanager.views.list_repertoire), + url(r'^piece/(?P\d+)', scoremanager.views.piece_view), + url(r'^score_usermapping_save', scoremanager.views.score_user_mapping_save), + url(r'^score/(?P\d+)', scoremanager.views.score), + url(r'^youtubeLink$', scoremanager.views.youtube_link), + url(r'^inhaltsverzeichnis.pdf$', scoremanager.pdf_views.repertoire_toc), + url(r'^repertoire.pdf', scoremanager.pdf_views.repertoire_pdf), +] diff --git a/scoremanager/views.py b/scoremanager/views.py index 6fbff7c..68e1580 100644 --- a/scoremanager/views.py +++ b/scoremanager/views.py @@ -66,7 +66,7 @@ def score( request, pk ): if request.method == 'GET': imageFile = requestedScore.get_image_file() image_data = open( settings.MEDIA_ROOT + imageFile, "rb").read() - return HttpResponse(image_data, mimetype="image/jpeg") + return HttpResponse(image_data, content_type="image/jpeg") if request.method == "DELETE": if requestedScore.uploaded_by != request.user or request.user.has_perm('scoremanager.manage_scores'): raise PermissionDenied diff --git a/simpleforum/admin.py b/simpleforum/admin.py index 5cd2e6e..297113f 100644 --- a/simpleforum/admin.py +++ b/simpleforum/admin.py @@ -1,4 +1,4 @@ from django.contrib import admin -from models import Message +from simpleforum.models import Message admin.site.register(Message) \ No newline at end of file diff --git a/simpleforum/migrations/0001_initial.py b/simpleforum/migrations/0001_initial.py deleted file mode 100644 index 2d16ccd..0000000 --- a/simpleforum/migrations/0001_initial.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- -import 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 'Message' - db.create_table(u'simpleforum_message', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('titel', self.gf('django.db.models.fields.CharField')(max_length=100)), - ('text', self.gf('django.db.models.fields.TextField')()), - ('creation_time', self.gf('django.db.models.fields.DateTimeField')()), - ('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), - )) - db.send_create_signal(u'simpleforum', ['Message']) - - - def backwards(self, orm): - # Deleting model 'Message' - db.delete_table(u'simpleforum_message') - - - 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', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 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', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - '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'}) - }, - u'simpleforum.message': { - 'Meta': {'object_name': 'Message'}, - 'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}), - 'creation_time': ('django.db.models.fields.DateTimeField', [], {}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'text': ('django.db.models.fields.TextField', [], {}), - 'titel': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - } - } - - complete_apps = ['simpleforum'] \ No newline at end of file diff --git a/simpleforum/migrations/__init__.py b/simpleforum/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/simpleforum/models.py b/simpleforum/models.py index 7fca8f5..ea81d99 100644 --- a/simpleforum/models.py +++ b/simpleforum/models.py @@ -1,53 +1,43 @@ from django.db import models from django.utils.translation import ugettext as _ from django.contrib.auth.models import User - - -class Message ( models.Model ): - - titel = models.CharField( max_length = 100, verbose_name = _("titel") ) - text = models.TextField( blank=False, verbose_name = _("text") ) - - creation_time = models.DateTimeField( verbose_name=_("creation_time") ) - - author = models.ForeignKey( User, verbose_name=_("Author") ) - - - def __unicode__( self ): - return self.author.username + " : " + self.titel - - - from django.db.models.signals import post_save from django.dispatch import receiver - from django.core.mail import EmailMultiAlternatives - from musicians.models import Musician - from django.template.loader import get_template - from django.template import Context + +class Message(models.Model): + titel = models.CharField(max_length=100, verbose_name=_("titel")) + text = models.TextField(blank=False, verbose_name=_("text")) + + creation_time = models.DateTimeField(verbose_name=_("creation_time")) + author = models.ForeignKey(User, verbose_name=_("Author"), on_delete=models.PROTECT) + + def __unicode__(self): + return self.author.username + " : " + self.titel + + @receiver(post_save, sender=Message) def my_handler(sender, instance, created, **kwargs): if not created: return - - receivers = [ m.user.email for m in Musician.objects.all() ] - subject = "Blechreiz Forum: " + instance.titel + receivers = [m.user.email for m in Musician.objects.all()] + + subject = "Blechreiz Forum: " + instance.titel from_email = 'forum@blechreiz.com' - - c = { 'messages': Message.objects.all().order_by('-creation_time')[:10] } - - text_template = get_template( "simpleforum/mail.txt" ) - #html_template = get_template( "simpleforum/mail.html" ) - - text_content = text_template.render( Context(c) ) - #html_content = html_template.render( Context(c) ) - - msg = EmailMultiAlternatives( subject, text_content, from_email, receivers ) - #msg.attach_alternative( html_content, "text/html" ) + + c = {'messages': Message.objects.all().order_by('-creation_time')[:10]} + + text_template = get_template("simpleforum/mail.txt") + # html_template = get_template( "simpleforum/mail.html" ) + + text_content = text_template.render(Context(c)) + # html_content = html_template.render( Context(c) ) + + msg = EmailMultiAlternatives(subject, text_content, from_email, receivers) + # msg.attach_alternative( html_content, "text/html" ) msg.send() - diff --git a/simpleforum/views.py b/simpleforum/views.py index 0c29a80..a8e3a56 100644 --- a/simpleforum/views.py +++ b/simpleforum/views.py @@ -1,43 +1,34 @@ -from django.contrib.auth.decorators import login_required -from django.shortcuts import render,redirect - from datetime import datetime -from models import Message +from django.shortcuts import render, redirect +from simpleforum.models import Message -def message_view( request ): - +def message_view(request): if request.method == 'POST': if 'titel' in request.POST and 'text' in request.POST: titel = request.POST.get('titel') - text = request.POST.get('text') - + text = request.POST.get('text') + if len(titel) > 0 and len(text) > 0: - print "create" - Message.objects.create( titel = titel, text = text, author = request.user, creation_time = datetime.now() ) - - return redirect( message_view ) - - + Message.objects.create(titel=titel, text=text, author=request.user, creation_time=datetime.now()) + + return redirect(message_view) + context = dict() - + if request.method == 'GET': if 'month' in request.GET and 'year' in request.GET: - year = int( request.GET['year'] ) - month = int( request.GET['month'] ) - until_date = datetime( year, month+1, 01 ) - from_date = datetime( year, month , 01 ) + year = int(request.GET['year']) + month = int(request.GET['month']) + until_date = datetime(year, month + 1, 1) + from_date = datetime(year, month, 1) context['archiveMode'] = True - context['year'] = year + context['year'] = year context['month'] = month - context['messages'] = Message.objects.filter( creation_time__lt=until_date ).filter( creation_time__gte=from_date).order_by('-creation_time') + context['messages'] = Message.objects.filter(creation_time__lt=until_date).filter( + creation_time__gte=from_date).order_by('-creation_time') else: - context['messages'] = Message.objects.order_by('-creation_time')[:20] + context['messages'] = Message.objects.order_by('-creation_time')[:20] context['archiveMode'] = False - - return render ( request, 'simpleforum/simpleforum.html', context ) - - - - \ No newline at end of file + return render(request, 'simpleforum/simpleforum.html', context) diff --git a/website/templates/website/base.html b/website/templates/website/base.html index 61b3841..21324fe 100644 --- a/website/templates/website/base.html +++ b/website/templates/website/base.html @@ -72,7 +72,7 @@
    diff --git a/website/urls.py b/website/urls.py index 93ad2a4..40b7e17 100644 --- a/website/urls.py +++ b/website/urls.py @@ -1,9 +1,7 @@ -from django.conf.urls import patterns, url +from django.conf.urls import url from website.views import home_view - -urlpatterns = patterns('', - url(r'$^', home_view ), -) - +urlpatterns = [ + url(r'$^', home_view), +] diff --git a/website/views.py b/website/views.py index c116325..23ade6d 100644 --- a/website/views.py +++ b/website/views.py @@ -1,5 +1,5 @@ from django.shortcuts import render - +from django.conf import settings from django.contrib.auth.decorators import login_required from eventplanner.snippets import addEventCountdownForNextEventToContext, addEventRouteForNextEventToContext from eventplanner.models import EventParticipation @@ -10,11 +10,12 @@ def home_view(request): context = dict() # Event participation for slider text - if EventParticipation.isMember( request.user ): - context['hasParticipationSetForAllEvents'] = EventParticipation.hasUserSetParticipationForAllEvents( request.user) + if EventParticipation.isMember(request.user): + context['hasParticipationSetForAllEvents'] = EventParticipation.hasUserSetParticipationForAllEvents( + request.user) - addEventCountdownForNextEventToContext( context, request.user ); - addEventRouteForNextEventToContext(context, request.user, 'Conc' ) - - return render( request, 'website/mainpage.html', context ) + addEventCountdownForNextEventToContext(context, request.user) + addEventRouteForNextEventToContext(context, request.user, 'Conc') + context['GOOGLE_MAPS_API_KEY'] = settings.GOOGLE_MAPS_API_KEY + return render(request, 'website/mainpage.html', context)