Merge branch 'master' of github.com:Gluejar/regluit into goodreads

Conflicts:
	frontend/urls.py
pull/1/head
Raymond Yee 2011-11-15 10:37:19 -08:00
commit 45f58ae955
41 changed files with 1141 additions and 187 deletions

View File

@ -0,0 +1,174 @@
# 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 'UserProfile.facebook_id'
db.add_column('core_userprofile', 'facebook_id', self.gf('django.db.models.fields.PositiveIntegerField')(null=True), keep_default=False)
# Adding field 'UserProfile.librarything_id'
db.add_column('core_userprofile', 'librarything_id', self.gf('django.db.models.fields.CharField')(default='', max_length=15, blank=True), keep_default=False)
def backwards(self, orm):
# Deleting field 'UserProfile.facebook_id'
db.delete_column('core_userprofile', 'facebook_id')
# Deleting field 'UserProfile.librarything_id'
db.delete_column('core_userprofile', 'librarything_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'})
},
'core.author': {
'Meta': {'object_name': 'Author'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'editions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'authors'", 'symmetrical': 'False', 'to': "orm['core.Edition']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '500'})
},
'core.campaign': {
'Meta': {'object_name': 'Campaign'},
'activated': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'amazon_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'deadline': ('django.db.models.fields.DateTimeField', [], {}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True'}),
'paypal_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'suspended': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'suspended_reason': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'target': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '14', 'decimal_places': '2'}),
'withdrawn': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'withdrawn_reason': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'campaigns'", 'to': "orm['core.Work']"})
},
'core.claim': {
'Meta': {'object_name': 'Claim'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'rights_holder': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'claim'", 'to': "orm['core.RightsHolder']"}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user'", 'to': "orm['auth.User']"}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'claim'", 'to': "orm['core.Work']"})
},
'core.ebook': {
'Meta': {'object_name': 'Ebook'},
'edition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ebooks'", 'to': "orm['core.Edition']"}),
'format': ('django.db.models.fields.CharField', [], {'max_length': '25'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'rights': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
'url': ('django.db.models.fields.CharField', [], {'max_length': '1024'})
},
'core.edition': {
'Meta': {'object_name': 'Edition'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'default': "''", 'null': 'True'}),
'googlebooks_id': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'isbn_10': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True'}),
'isbn_13': ('django.db.models.fields.CharField', [], {'max_length': '13', 'null': 'True'}),
'language': ('django.db.models.fields.CharField', [], {'max_length': '2', 'null': 'True'}),
'oclc': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True'}),
'public_domain': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'publication_date': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
'publisher': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'editions'", 'null': 'True', 'to': "orm['core.Work']"})
},
'core.premium': {
'Meta': {'object_name': 'Premium'},
'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '0'}),
'campaign': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'premiums'", 'null': 'True', 'to': "orm['core.Campaign']"}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '2'})
},
'core.rightsholder': {
'Meta': {'object_name': 'RightsHolder'},
'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rights_holder'", 'to': "orm['auth.User']"}),
'rights_holder_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
},
'core.subject': {
'Meta': {'object_name': 'Subject'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'editions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'subjects'", 'symmetrical': 'False', 'to': "orm['core.Edition']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '500'})
},
'core.userprofile': {
'Meta': {'object_name': 'UserProfile'},
'facebook_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
'goodreads_auth_secret': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'goodreads_auth_token': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'goodreads_user_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
'goodreads_user_link': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'goodreads_user_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'home_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'librarything_id': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}),
'tagline': ('django.db.models.fields.CharField', [], {'max_length': '140', 'blank': 'True'}),
'twitter_id': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'profile'", 'unique': 'True', 'to': "orm['auth.User']"})
},
'core.wishlist': {
'Meta': {'object_name': 'Wishlist'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'wishlist'", 'unique': 'True', 'to': "orm['auth.User']"}),
'works': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'wishlists'", 'symmetrical': 'False', 'to': "orm['core.Work']"})
},
'core.work': {
'Meta': {'object_name': 'Work'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'openlibrary_id': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000'})
}
}
complete_apps = ['core']

View File

@ -0,0 +1,169 @@
# 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 'UserProfile.pic_url'
db.add_column('core_userprofile', 'pic_url', self.gf('django.db.models.fields.URLField')(default='', max_length=200, blank=True), keep_default=False)
def backwards(self, orm):
# Deleting field 'UserProfile.pic_url'
db.delete_column('core_userprofile', 'pic_url')
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'})
},
'core.author': {
'Meta': {'object_name': 'Author'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'editions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'authors'", 'symmetrical': 'False', 'to': "orm['core.Edition']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '500'})
},
'core.campaign': {
'Meta': {'object_name': 'Campaign'},
'activated': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'amazon_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'deadline': ('django.db.models.fields.DateTimeField', [], {}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True'}),
'paypal_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'suspended': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'suspended_reason': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'target': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '14', 'decimal_places': '2'}),
'withdrawn': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'withdrawn_reason': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'campaigns'", 'to': "orm['core.Work']"})
},
'core.claim': {
'Meta': {'object_name': 'Claim'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'rights_holder': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'claim'", 'to': "orm['core.RightsHolder']"}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user'", 'to': "orm['auth.User']"}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'claim'", 'to': "orm['core.Work']"})
},
'core.ebook': {
'Meta': {'object_name': 'Ebook'},
'edition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ebooks'", 'to': "orm['core.Edition']"}),
'format': ('django.db.models.fields.CharField', [], {'max_length': '25'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'rights': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
'url': ('django.db.models.fields.CharField', [], {'max_length': '1024'})
},
'core.edition': {
'Meta': {'object_name': 'Edition'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'default': "''", 'null': 'True'}),
'googlebooks_id': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'isbn_10': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True'}),
'isbn_13': ('django.db.models.fields.CharField', [], {'max_length': '13', 'null': 'True'}),
'language': ('django.db.models.fields.CharField', [], {'max_length': '2', 'null': 'True'}),
'oclc': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True'}),
'public_domain': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'publication_date': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
'publisher': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'editions'", 'null': 'True', 'to': "orm['core.Work']"})
},
'core.premium': {
'Meta': {'object_name': 'Premium'},
'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '0'}),
'campaign': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'premiums'", 'null': 'True', 'to': "orm['core.Campaign']"}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '2'})
},
'core.rightsholder': {
'Meta': {'object_name': 'RightsHolder'},
'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rights_holder'", 'to': "orm['auth.User']"}),
'rights_holder_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
},
'core.subject': {
'Meta': {'object_name': 'Subject'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'editions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'subjects'", 'symmetrical': 'False', 'to': "orm['core.Edition']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '500'})
},
'core.userprofile': {
'Meta': {'object_name': 'UserProfile'},
'facebook_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
'goodreads_auth_secret': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'goodreads_auth_token': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'goodreads_user_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
'goodreads_user_link': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'goodreads_user_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'home_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'librarything_id': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}),
'pic_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'tagline': ('django.db.models.fields.CharField', [], {'max_length': '140', 'blank': 'True'}),
'twitter_id': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'profile'", 'unique': 'True', 'to': "orm['auth.User']"})
},
'core.wishlist': {
'Meta': {'object_name': 'Wishlist'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'wishlist'", 'unique': 'True', 'to': "orm['auth.User']"}),
'works': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'wishlists'", 'symmetrical': 'False', 'to': "orm['core.Work']"})
},
'core.work': {
'Meta': {'object_name': 'Work'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'openlibrary_id': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000'})
}
}
complete_apps = ['core']

View File

@ -0,0 +1,169 @@
# 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 'UserProfile.librarything_id'
db.alter_column('core_userprofile', 'librarything_id', self.gf('django.db.models.fields.CharField')(max_length=31))
def backwards(self, orm):
# Changing field 'UserProfile.librarything_id'
db.alter_column('core_userprofile', 'librarything_id', self.gf('django.db.models.fields.CharField')(max_length=15))
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'})
},
'core.author': {
'Meta': {'object_name': 'Author'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'editions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'authors'", 'symmetrical': 'False', 'to': "orm['core.Edition']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '500'})
},
'core.campaign': {
'Meta': {'object_name': 'Campaign'},
'activated': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'amazon_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'deadline': ('django.db.models.fields.DateTimeField', [], {}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True'}),
'paypal_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'suspended': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'suspended_reason': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'target': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '14', 'decimal_places': '2'}),
'withdrawn': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'withdrawn_reason': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'campaigns'", 'to': "orm['core.Work']"})
},
'core.claim': {
'Meta': {'object_name': 'Claim'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'rights_holder': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'claim'", 'to': "orm['core.RightsHolder']"}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'user'", 'to': "orm['auth.User']"}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'claim'", 'to': "orm['core.Work']"})
},
'core.ebook': {
'Meta': {'object_name': 'Ebook'},
'edition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ebooks'", 'to': "orm['core.Edition']"}),
'format': ('django.db.models.fields.CharField', [], {'max_length': '25'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'provider': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'rights': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
'url': ('django.db.models.fields.CharField', [], {'max_length': '1024'})
},
'core.edition': {
'Meta': {'object_name': 'Edition'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'default': "''", 'null': 'True'}),
'googlebooks_id': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'isbn_10': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True'}),
'isbn_13': ('django.db.models.fields.CharField', [], {'max_length': '13', 'null': 'True'}),
'language': ('django.db.models.fields.CharField', [], {'max_length': '2', 'null': 'True'}),
'oclc': ('django.db.models.fields.CharField', [], {'max_length': '25', 'null': 'True'}),
'public_domain': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'publication_date': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
'publisher': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'editions'", 'null': 'True', 'to': "orm['core.Work']"})
},
'core.premium': {
'Meta': {'object_name': 'Premium'},
'amount': ('django.db.models.fields.DecimalField', [], {'max_digits': '10', 'decimal_places': '0'}),
'campaign': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'premiums'", 'null': 'True', 'to': "orm['core.Campaign']"}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '2'})
},
'core.rightsholder': {
'Meta': {'object_name': 'RightsHolder'},
'email': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'owner': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rights_holder'", 'to': "orm['auth.User']"}),
'rights_holder_name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
},
'core.subject': {
'Meta': {'object_name': 'Subject'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'editions': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'subjects'", 'symmetrical': 'False', 'to': "orm['core.Edition']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '500'})
},
'core.userprofile': {
'Meta': {'object_name': 'UserProfile'},
'facebook_id': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True'}),
'goodreads_auth_secret': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'goodreads_auth_token': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'goodreads_user_id': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
'goodreads_user_link': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'goodreads_user_name': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'home_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'librarything_id': ('django.db.models.fields.CharField', [], {'max_length': '31', 'blank': 'True'}),
'pic_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
'tagline': ('django.db.models.fields.CharField', [], {'max_length': '140', 'blank': 'True'}),
'twitter_id': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'profile'", 'unique': 'True', 'to': "orm['auth.User']"})
},
'core.wishlist': {
'Meta': {'object_name': 'Wishlist'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'wishlist'", 'unique': 'True', 'to': "orm['auth.User']"}),
'works': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'wishlists'", 'symmetrical': 'False', 'to': "orm['core.Work']"})
},
'core.work': {
'Meta': {'object_name': 'Work'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'openlibrary_id': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000'})
}
}
complete_apps = ['core']

View File

@ -232,6 +232,9 @@ class Work(models.Model):
if ebook_format == None or ebook.format == ebook_format:
return ebook
return None
def wished_by(self):
return User.objects.filter(wishlist__works__in=[self])
def __unicode__(self):
return self.title
@ -301,8 +304,11 @@ class Wishlist(models.Model):
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='profile')
tagline = models.CharField(max_length=140, blank=True)
pic_url = models.URLField(blank=True)
home_url = models.URLField(blank=True)
twitter_id = models.CharField(max_length=15, blank=True)
facebook_id = models.PositiveIntegerField(null=True)
librarything_id = models.CharField(max_length=31, blank=True)
goodreads_user_id = models.CharField(max_length=32, null=True, blank=True)
goodreads_user_name = models.CharField(max_length=200, null=True, blank=True)
@ -312,3 +318,24 @@ class UserProfile(models.Model):
from regluit.core import signals
from regluit.payment.manager import PaymentManager
from social_auth.signals import pre_update
from social_auth.backends.facebook import FacebookBackend
from social_auth.backends.twitter import TwitterBackend
def facebook_extra_values(sender, user, response, details, **kwargs):
facebook_id = response.get('id')
user.profile.facebook_id = facebook_id
user.profile.pic_url = 'http://graph.facebook.com/' + facebook_id + '/picture'
user.profile.save()
return True
def twitter_extra_values(sender, user, response, details, **kwargs):
twitter_id = response.get('screen_name')
user.profile.twitter_id = twitter_id
user.profile.pic_url = user.social_auth.get(provider='twitter').extra_data['profile_image_url']
user.profile.save()
return True
pre_update.connect(facebook_extra_values, sender=FacebookBackend)
pre_update.connect(twitter_extra_values, sender=TwitterBackend)

25
core/userlists.py Normal file
View File

@ -0,0 +1,25 @@
#put logic for retrieving userlists here
import random
from django.contrib.auth.models import User
from regluit.core.models import Work
def other_users(user, how_many):
# do something more sophisitcated sometime later
count = User.objects.all().count()
if count <= how_many :
user_list = User.objects.all()[0: count]
else :
slice = random.random() * (count - how_many)
user_list = User.objects.all()[slice: slice+how_many]
return user_list
def supporting_users(work, how_many):
# do something more sophisitcated sometime later
count = work.wished_by().count()
if count <= how_many :
user_list = work.wished_by()[0: count]
else :
slice = random.random() * (count - how_many)
user_list = work.wished_by()[slice: slice+how_many]
return user_list

View File

@ -1,10 +1,15 @@
#!/bin/bash
# put this in one of root's crontabs and it'll refresh and restart regluit
# this script is used by jenkins to remotely update a regluit instance
# for it to work the jenkins user's public ssh key needs to be in the
# authorized key for the machine running the regluit instance
# you can then put something like this in a post build configuration
# ssh ubuntu@please.unglueit.com "/opt/regluit/deploy/update-regluit"
cd /opt/regluit
sudo -u ubuntu -c "git pull"
sudo -u ubuntu /usr/bin/git pull
source ENV/bin/activate
django-admin.py syncdb --migrate --settings regluit.settings.prod
sudo /etc/init.d/apache2 restart
sudo /etc/init.d/celeryd restart
touch /opt/regluit/deploy/last-update

View File

@ -1,22 +1,23 @@
from django import forms
from django.db import models
from regluit.core.models import UserProfile
from regluit.core.models import UserProfile, RightsHolder
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
from decimal import Decimal as D
class RightsHolderForm(forms.ModelForm):
class Meta:
model = RightsHolder
class ProfileForm(forms.ModelForm):
clear_facebook=forms.BooleanField(required=False)
clear_twitter=forms.BooleanField(required=False)
class Meta:
model = UserProfile
exclude = 'user'
fields = 'tagline', 'librarything_id', 'home_url', 'clear_facebook', 'clear_twitter'
widgets = {
'tagline': forms.Textarea(attrs={'cols': 35, 'rows': 4}),
'twitter_id': forms.TextInput(attrs={'label': 'Twitter Handle', 'maxlength': 16}),
}
def clean_twitter_id(self):
twitter_id=self.cleaned_data['twitter_id']
return twitter_id.lstrip('@')
class UserData(forms.Form):
username = forms.RegexField(
@ -48,4 +49,4 @@ class CampaignPledgeForm(forms.Form):
class GoodreadsShelfLoadingForm(forms.Form):
goodreads_shelf_name = forms.CharField(widget=forms.Select(choices=(
('all','all'),
)))
)))

View File

@ -0,0 +1,9 @@
{% extends "basedocumentation.html" %}
{% block doccontent %}
<h1>Admin Users Only</h1>
<p>This function is only available to Unglue.it administration.</p>
{% endblock %}

View File

@ -3,6 +3,7 @@
{% url privacy as privacyurl %}
{% url regluit.frontend.views.edit_user as editurl %}
{% url rightsholders as rhtoolsurl %}
{% url faq as faqurl %}
<html>
<head>
@ -41,7 +42,7 @@
<li class="first"><a href="{% url auth_login %}?next={% firstof request.path '/' %}"><span>Sign In</span></a></li>
{% endif %}
<li><a href="/stub/tour"><span>Tour</span></a></li>
<li><a href="/stub/FAQ"><span>FAQs</span></a></li>
<li><a href="{{faqurl}}"><span>FAQs</span></a></li>
<li><a href="/stub/Help"><span>Help</span></a></li>
{% if not user.is_authenticated %}
<li class="last"><a href="{% url registration_register %}"><span>sign up</span></a></li>

View File

@ -17,7 +17,17 @@
<li class="parent">
<a href="#"><span>Ungluers</span></a>
<ul class="menu level2">
<li class="first"><a href="/stub/list_of_ungluers"><span>List of ungluers</span></a></li>
{% for ungluer in ungluers %}
<li class="first"><a href="{% url supporter supporter_username=ungluer %}">
<span class="ungluer-pic">
{% if ungluer.profile.pic_url %}
<img src="{{ungluer.profile.pic_url}}" height="30" width="30" alt="{{ungluer}}" title="{{ungluer}}"/>
{% else %}
<img src="/static/images/header/avatar.png" height="30" width="30" alt="Generic Ungluer Avatar" />
{% endif %}
</span><span class="ungluer-name">{{ungluer}}</span>
</a></li>
{% endfor %}
</ul>
</li>
</ul>

View File

@ -0,0 +1,18 @@
{% extends "basedocumentation.html" %}
{% block title %} FAQ {% endblock %}
{% block doccontent %}
<h1>FAQ</h1>
<h2>Ungluer FAQ- Stub</h2>
<dl>
<dt>How much does a book cost?</dt>
<dd>The author or publisher set a price for giveing the book to the world. Once you and your fellow ungluers raise enough money to meet that price, the Unglued ebook is available at no charge, for everyone, everywhere!</dd>
<dt>Are the unglued ebooks compatible with my reader?</dt>
<dd>Unglued ebooks are distributed with NO DRM, so they'll work on Kindle, iPad, Kobo, Mac, Windows, Linux... you get the idea.</dd>
{% endblock %}

View File

@ -1,8 +1,17 @@
{% extends "basedocumentation.html" %}
{% block title %}Tools for Rightsholders {% endblock %}
{% block doccontent %}
<h1>unglue.it tools for rightsholders</h1>
<h1>unglue.it Tools for Rightsholders</h1>
{% if request.user.rights_holder %}
<h2>Rights Holders That You Administer</h2>
{% for rights_holder in request.user.rights_holder.all %}
<h3>Name: {{ rights_holder.rights_holder_name }}</h3>
<p>PSA #: {{ rights_holder.id }}<br/>
contact email: {{ rights_holder.email }}<br/>
</p>
{% endfor %}
{% endif %}
<h2>Rightsholder FAQ/How to launch a campaign</h2>

View File

@ -0,0 +1,22 @@
{% extends "basedocumentation.html" %}
{% block doccontent %}
<h1>Rights Holder Admin</h1>
<h2> Create New Rights Holder </h2>
<form method="POST" action="#">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" name="submit" value="Create" id="submit">
</form>
</form>
<h2> Accepted Rights Holders </h2>
{% for rights_holder in rights_holders %}
<h3>{{ rights_holder.rights_holder_name }}</h3>
PSA #: {{ rights_holder.id }}<br/>
email: {{ rights_holder.email }}<br/>
owner: <a href="{% url supporter supporter_username=rights_holder.owner %}">{{ rights_holder.owner }}</a><br/>
{% endfor %}
{% endblock %}

View File

@ -45,13 +45,11 @@
<a href="#"><img src="{{ result.image }}" alt="{{ result.title }}" title="{{ result.title }}" /></a>
</div>
<div class="listview book-name">
<span>
{{ result.title }}
</span>
<div class="title">
<a href="/workstub/{{ result.urltitle }}/{{ result.urlimage }}/{{ result.urlauthor }}/{{ result.googlebooks_id }}">{{ result.title }}</a>
</div>
<div class="listview author {{ result.author }}">{{ result.author }}</div>
</div>
<div class="listview author">
<span id="{{ result.author }}">{{ result.author }}</span>
</div>
{% if request.user.is_anonymous %}
<div class="listview create-account">
<span>Add to Wishlist</span>
@ -66,7 +64,7 @@
</div>
{% endif %}
<div class="listview booklist-status">
<span class="booklist-status-text">Status: In Progress</span>
<span class="booklist-status-label">Status:&nbsp;</span><span class="booklist-status-text">{{ result.last_campaign_status }}</span>
</div>
<div class="listview icons">
<span class="booklist-status-img">
@ -75,12 +73,12 @@
</div>
<div class="listview ebooks">
{% if result.epub %}
<span class="boolist-ebook">
<span class="listview boolist-ebook">
<a href="{{ result.epub }}">epub</a>
</span>
{% endif %}
{% if result.pdf %}
<span class="boolist-ebook">
<span class="listview boolist-ebook">
<a href="{{ result.pdf }}">pdf</a>
</span>
{% endif %}

View File

@ -0,0 +1,29 @@
{% extends "base.html" %}
{% block content %}
<div id="js-topsection">
<div class="js-main">
<h1>Subjects</h1>
<p>
Below is a list of subjects for books that users have added to
wishlists. It is here primarily to show what subjects are present
in the database to guide further development. You can order by the
<a href="{% url subjects %}">subject name</a> or by the
<a href="{% url subjects %}?order=count">number</a> of editions
with that subject.
</p>
<p>
<ul>
{% for subject in subjects %}
<li>{{ subject.name }} ({{ subject.editions__count }})</li>
{% endfor %}
</ul>
</p>
</div>
</div>
{% endblock %}

View File

@ -22,17 +22,7 @@ To do:
create topsection file for inclusion in multiple contexts, if needed
figure out how to configure date display
decide if we're even including date joined in profile
add support for userpics
crop/resize? other infrastructure we need? can we pull from twitter/fb?
add support for twitter/fb/other links?
part of user profile? can I just add to db model?
loosely coupled vs actually integrated with signin
canonicalize -- user enters cut/paste link vs username
Goodreads & Librarything support
If people lack homepage, etc., do we have greyed-out icons or no icons?
if greyed-out, can they add in place by clicking on them?
make sure we have the profile settings we need
resurrect add/remove functionality
Goodreads
be sure words display correctly
do I need both add-wishlist and remove-wishlist classes? do they differ?
better alignment on I am ungluing & badges
@ -66,7 +56,11 @@ how do I integrate the your wishlist thing with the tabs thing?
</div>
{% endifequal %}
<div class="user-block2">
<img class="user-avatar" src="/static/images/header/avatar.png" height="50" width="50" alt="User avatar" title="User avatar" />
{% if supporter.profile.pic_url %}
<img class="user-avatar" src="{{ supporter.profile.pic_url }}" height="50" width="50" alt="Picture of {{ supporter }}" title="{{ supporter }}" />
{% else %}
<img class="user-avatar" src="/static/images/header/avatar.png" height="50" width="50" alt="Generic Ungluer Avatar" title="Ungluer" />
{% endif %}
<span class="user-name"><a href="#">{{ supporter.username }}</a></span>
<span class="user-date">{{ date }}</span>
<span class="user-short-info">{{ supporter.profile.tagline }}</span>
@ -78,20 +72,33 @@ how do I integrate the your wishlist thing with the tabs thing?
<img src="/static/images/header/icon-home.png" alt="{{ supporter }}'s Homepage" title="{{ supporter }}'s Homepage" />
</a>
{% endif %}
<a href="#"><img src="/static/images/header/icon-facebook.png" alt="{{ supporter }}'s Facebook" title="{{ supporter }}'s Facebook" /></a>
{% if supporter.profile.twitter_id %}
<a href="https://twitter.com/#!/{{ supporter.profile.twitter_id }}">
<img src="/static/images/header/icon-twitter.png" alt="{{ supporter }}'s Twitter" title="{{ supporter }}'s Twitter" />
</a>
{% if supporter.profile.facebook_id %}
<a href="http://www.facebook.com/profile.php?id={{supporter.profile.facebook_id}}">
<img src="/static/images/header/icon-facebook.png" alt="{{ supporter }}'s Facebook" title="{{ supporter }}'s Facebook" />
</a>
{% endif %}
<a href="#"><img src="/static/images/header/icon-google.png" alt="google" title="google" /></a>
<a href="#"><img src="/static/images/header/icon-group.png" alt="group" title="group" /></a></div>
{% if supporter.profile.twitter_id %}
<a href="https://twitter.com/#!/{{ supporter.profile.twitter_id }}">
<img src="/static/images/header/icon-twitter.png" alt="{{ supporter }}'s Twitter" title="{{ supporter }}'s Twitter" />
</a>
{% endif %}
{% if supporter.profile.goodreads_user_link %}
<a href="{{supporter.profile.goodreads_user_link}}">
<img src="/static/images/header/icon-goodreads.png" alt="{{ supporter }}'s page on GoodReads" title="{{ supporter }}'s page on GoodReads" />
</a>
{% endif %}
{% if supporter.profile.librarything_id %}
<a href="http://www.librarything.com/profile/{{ supporter.profile.librarything_id }}">
<img src="/static/images/header/icon-librarything.png" alt="{{ supporter }}'s page on LibraryThing" title="{{ supporter }}'s page on LibraryThing" />
</a>
{% endif %}
</div>
</div>
<div class="user-block3">
<div class="user-block">
<span class="rounded"><span class="blue">{{ backed }}</span></span>
<span class="rounded"><span class="orange">{{ backing }}</span></span>
<span class="rounded"><span class="grey">{{ wished }}</span></span>
<span class="rounded"><span class="blue" {% ifequal request.user supporter %}title="I've unglued {{ backed }} books."{% else %}title="{{ supporter }} has unglued {{ backed }} books."{% endifequal %}>{{ backed }}</span></span>
<span class="rounded"><span class="orange" {% ifequal request.user supporter %}title="I'm supporting {{ backing }} books."{% else %}title="{{ supporter }} is supporting {{ backing }} books."{% endifequal %}>{{ backing }}</span></span>
<span class="rounded"><span class="grey" {% ifequal request.user supporter %}title="I'm wishing for {{ wished }} books."{% else %}title="{{ supporter }} is wishing for {{ wished }} books."{% endifequal %}>{{ wished }}</span></span>
</div>
<span class="user-status-title">I am ungluing</span>
</div>
@ -113,12 +120,33 @@ how do I integrate the your wishlist thing with the tabs thing?
<div class="block block2">
<h3 class="title">Links</h3>
<div class="check-list">
<label>Your homepage URL:</label>
<label>Add your homepage URL:</label>
{{ profile_form.home_url }}{{ profile_form.home_url.errors }}
</div>
<div class="check-list">
<label>Your Twitter handle:</label>
{{ profile_form.twitter_id }}{{ profile_form.twitter_id.errors }}
{% if supporter.profile.twitter_id %}
<a href="{% url socialauth_associate_begin backend='twitter' %}">Update your Twitter connection</a> <br/> or disconnect Twitter: {{ profile_form.clear_twitter }}
{% else %}
<a href="{% url socialauth_associate_begin backend='twitter' %}">Connect your Twitter account</a> to Unglue.it
{% endif %}
</div>
<div class="check-list">
{% if supporter.profile.facebook_id %}
<a href="{% url socialauth_associate_begin backend='facebook' %}">Update your Facebook connection</a> <br/> or disconnect Facebook: {{ profile_form.clear_facebook }}
{% else %}
<a href="{% url socialauth_associate_begin backend='facebook' %}">Connect your Facebook account</a> to Unglue.it
{% endif %}
</div>
<div class="check-list">
{% if user.profile.goodreads_user_id %}
<a href="{{goodreads_auth_url}}">Update your GoodReads connection</a>
{% else %}
<a href="{{goodreads_auth_url}}">Connect your GoodReads account</a> to Unglue.it
{% endif %}
</div>
<div class="check-list">
<label>Add Your LibraryThing User ID:</label>
{{ profile_form.librarything_id }}{{ profile_form.librarything_id.errors }}
</div>
</div>
<div class="block block3">
@ -259,12 +287,10 @@ how do I integrate the your wishlist thing with the tabs thing?
<a href="#"><img src="{{ work.cover_image_thumbnail }}" alt="Book name" title="book name" /></a>
</div>
<div class="listview book-name">
<span>
<div class="title">
<a href="{% url work work.id %}">{{ work.title }}</a>
</span>
</div>
<div class="listview author">
<span class="{{ work.author }}">{{ work.author }}</span>
</div>
<div class="listview author {{ work.author }}">{{ work.author }}</div>
</div>
{% ifequal supporter request.user %}
<div class="listview remove-wishlist">
@ -295,12 +321,12 @@ how do I integrate the your wishlist thing with the tabs thing?
</div>
<div class="listview ebooks">
{% if work.first_epub %}
<span class="boolist-ebook">
<span class="listview boolist-ebook">
<a href="{{ work.first_epub.url }}">epub</a>
</span>
{% endif %}
{% if work.first_pdf %}
<span class="boolist-ebook">
<span class="listview boolist-ebook">
<a href="{{ work.first_pdf.url }}">pdf</a>
</span>
{% endif %}

View File

@ -1,8 +1,6 @@
{% extends "base.html" %}
{% block title %}
Campaign for WORK TITLE GOES HERE
{% endblock %}
&#8212; Campaign for {{ work.title }}
{% block extra_head %}
<link type="text/css" rel="stylesheet" href="/static/css/campaign.css" />
@ -61,10 +59,26 @@ Campaign for WORK TITLE GOES HERE
<div class="jsmodule rounded">
<div class="jsmod-content">
{% if work.last_campaign %}
{% if work.last_campaign_status == 'ACTIVE' %}
Campaign in Progress: <br />${{ work.last_campaign.current_total }}/${{ work.last_campaign.target }}
{% else %}{% if work.last_campaign_status == 'SUCCESSFUL' %}
Unglued on {{ work.last_campaign.deadline|date:"M j, Y"}}! <br />${{ work.last_campaign.current_total }} raised of ${{ work.last_campaign.target }} goal
{% else %}{% if work.last_campaign_status == 'INITIALIZED' %}
Campaign starting soon<br />&nbsp;
{% else %}{% if work.last_campaign_status == 'SUSPENDED' %}
Campaign suspended. <br />See <a href="/faq">FAQ</a>.
{% else %}{% if work.last_campaign_status == 'WITHDRAWN' %}
Campaign withdrawn. <br />See <a href="/faq">FAQ</a>.
{% else %}{% if work.wished_by.count == 1 %}
{{ work.wished_by.count }} Ungluer is WISHING<br />&nbsp;
{% else %}
XX Ungluers <br /> are WISHING
{% endif %}
{{ work.wished_by.count }} Ungluers are WISHING<br />&nbsp;
{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}{% endif %}
{% else %}{% if work.wished_by.count == 1 %}
{{ work.wished_by.count }} Ungluer is WISHING<br />&nbsp;
{% else %}
{{ work.wished_by.count }} Ungluers are WISHING<br />&nbsp;
{% endif %}{% endif %}
</div>
</div>
{% include "explore.html" %}
@ -89,10 +103,15 @@ Campaign for WORK TITLE GOES HERE
</div>
</div>
{% if work.last_campaign %}
<div class="pledged-info"><div class="pledged-group">{{ work.last_campaign.supporters.count }} Ungluers have pledged ${{ work.last_campaign.current_total }}</div><div class="status"><img src="/static/images/images/icon-book-37by25-{{ work.percent_unglued }}.png" /></div></div>
<div class="pledged-info"><div class="pledged-group">{% if work.last_campaign.supporters.count == 1 %}{{ work.last_campaign.supporters.count }} 1 Ungluer has{% else %} {{ work.last_campaign.supporters.count }} Ungluers have {% endif %}pledged ${{ work.last_campaign.current_total }}</div><div class="status"><img src="/static/images/images/icon-book-37by25-{{ work.percent_unglued }}.png" /></div></div>
<div class="btn_support"><form action="{% url pledge work_id=work.id %}" method="get"><input type="submit" value="Support"/></form></div>
{% else %}
<div class="pledged-info"><div class="pledged-group">XX Ungluers have wished for this Work</div><div class="status"><img src="/static/images/images/icon-book-37by25-{{ work.percent_unglued }}.png" /></div></div>
<div class="pledged-info"><div class="pledged-group">
{% if work.wished_by.count == 1 %}
{{ work.wished_by.count }} Ungluer has
{% else %}
{{ work.wished_by.count }} Ungluers have
{% endif %}wished for this Work</div><div class="status"><img src="/static/images/images/icon-book-37by25-{{ work.percent_unglued }}.png" /></div></div>
<div class="btn_support">Add/drop from wishlist</div>
{% endif %}
</div>
@ -147,7 +166,8 @@ Campaign for WORK TITLE GOES HERE
<h3 class="jsmod-title"><span>Share</span></h3>
<div class="jsmod-content">
<ul class="social menu">
<li class="facebook first"><a href="#"><span>Facebook</span></a></li>
<li class="facebook first"><a
href="https://www.facebook.com/sharer/sharer.php?src=bm&u=http://{{ request.META.HTTP_HOST }}{{ request.path }}"><span>Facebook</span></a></li>
<li class="twitter"><a href="#"><span>Twitter</span></a></li>
<li class="lasts email"><a href="#"><span>Email</span></a></li>
</ul>

View File

@ -0,0 +1,97 @@
{% extends "base.html" %}
{% block title %}
&#8212; {{ title }}
{% endblock %}
{% block extra_head %}
<link type="text/css" rel="stylesheet" href="/static/css/campaign.css" />
<script type="text/javascript" src="/static/js/wishlist.js"></script>
{% endblock %}
{% block content %}
<div id="main-container">
<div class="js-main">
<div id="js-leftcol">
<div class="jsmodule rounded">
<div class="jsmod-content">
0 Ungluers are WISHING<br />&nbsp;
</div>
</div>
{% include "explore.html" %}
</div>
<div id="js-maincol">
<div class="js-maincol-inner">
<div class="content-block">
<div class="book-detail">
<div class="book-detail-img">
<a href="#"><img src="http://{{ imagebase }}/{{ image }}" alt="{{ title }}" title="{{ title }}" width="131" height="192" /></a>
</div>
<div class="book-detail-info">
<h2 class="book-name">{{ title }}</h2>
<h3 class="book-author">{{ author }}</h3>
<div class="find-book">
<label>Find it here</label>
<!-- todo: these should be a real thing -->
<div class="find-link">
<a class="find-google" href="#"><img src="/static/images/icons/google.png" align="" title="" /></a>
<a class="find-group" href="#"><img src="/static/images/icons/group.png" align="" title="" /></a>
</div>
</div>
<div class="pledged-info"><div class="pledged-group">0 Ungluers have pledged $0</div><div class="status"><img src="/static/images/images/icon-book-37by25-0.png" /></div></div>
</div>
</div>
<div id="tabs" class="content-block-heading">
</div>
<div class="content-block-content">
<div id="tabs-1" class="tabs">
<div class="tabs-content">
{% if request.user.is_anonymous %}
<div class="create-account"><p>No one has wishlisted this yet.&nbsp;&nbsp;<b><span>Be the first.</span></b></p>
</div>
{% else %}
<div class="add-wishlist"><p>No one has wishlisted this yet.&nbsp;&nbsp;<b><span id="{{ googlebooks_id }}">Be the first.</span></b></p>
</div>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
<div id="js-rightcol">
<div class="js-rightcol-pad rounded">
<div class="jsmodule">
<h3 class="jsmod-title"><span>Share</span></h3>
<div class="jsmod-content">
<ul class="social menu">
<li class="facebook first"><a href="#"><span>Facebook</span></a></li>
<li class="twitter"><a href="#"><span>Twitter</span></a></li>
<li class="lasts email"><a href="#"><span>Email</span></a></li>
</ul>
</div>
</div>
{% if work.last_campaign %}
<div class="jsmodule">
<h3 class="jsmod-title"><span>Support</span></h3>
<div class="jsmod-content">
<ul class="support menu">
{% for premium in premiums %}
<li class="{% if forloop.first %}first{% else %}{% if forloop.last %}last{% endif %}{% endif %}">
<a href="{% url pledge work_id=work.id %}?premium_id={{premium.id}}">
<span class="menu-item-price">${{ premium.amount }}</span>
<span class="menu-item-desc">{{ premium.description }}</span>
{% ifequal premium.type 'CU' %}<span class="custom-premium">exclusive!</span>{% endifequal %}
</a></li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -17,6 +17,9 @@ urlpatterns = patterns(
name="privacy"),
url(r"^rightsholders/$", TemplateView.as_view(template_name="rhtools.html"),
name="rightsholders"),
url(r"^rh_admin/$", "rh_admin", name="rh_admin"),
url(r"^faq/$", TemplateView.as_view(template_name="faq.html"),
name="faq"),
url(r"^wishlist/$", "wishlist", name="wishlist"),
url(r"^campaigns/$", ListView.as_view(
model=Campaign,template_name="campaign_list.html", context_object_name="campaign_list")),
@ -28,9 +31,10 @@ urlpatterns = patterns(
url(r"^goodreads/clear_wishlist/$","clear_wishlist", name="clear_wishlist"),
url(r"^stub/", "stub", name="stub"),
url(r"^work/(?P<work_id>\d+)/$", "work", name="work"),
url(r"^workstub/(?P<title>.+)/(?P<imagebase>.+)/(?P<image>.+)/(?P<author>.+)/(?P<googlebooks_id>.+)/$", "workstub", name="workstub"),
url(r"^setup/work/(?P<work_id>\d+)/$", "work", {'action':'setup_campaign'}, name="setup_campaign"),
url(r"^pledge/(?P<work_id>\d+)/$", "pledge", name="pledge"),
url(r"^celery/clear/$","clear_celery_tasks", name="clear_celery_tasks")
url(r"^celery/clear/$","clear_celery_tasks", name="clear_celery_tasks"),
url(r"^subjects/$", "subjects", name="subjects")
)

View File

@ -1,7 +1,7 @@
import logging
from decimal import Decimal as D
from django.db.models import Q
from django.db.models import Q, Count
from django.conf import settings
from django.contrib.auth.models import User
from django.core.urlresolvers import reverse
@ -23,9 +23,10 @@ import re
from regluit.core import tasks
from regluit.core import models, bookloader
from regluit.core import userlists
from regluit.core.search import gluejar_search
from regluit.core.goodreads import GoodreadsClient
from regluit.frontend.forms import UserData, ProfileForm, CampaignPledgeForm, GoodreadsShelfLoadingForm
from regluit.frontend.forms import UserData, ProfileForm, CampaignPledgeForm, GoodreadsShelfLoadingForm, RightsHolderForm
from regluit.payment.manager import PaymentManager
from regluit.payment.parameters import TARGET_TYPE_CAMPAIGN
@ -36,6 +37,9 @@ logger = logging.getLogger(__name__)
from regluit.payment.models import Transaction
import urllib
from re import sub
def home(request):
if request.user.is_authenticated():
return HttpResponseRedirect(reverse('supporter',
@ -57,8 +61,27 @@ def work(request, work_id, action='display'):
if action == 'setup_campaign':
return render(request, 'setup_campaign.html', {'work': work})
else:
return render(request, 'work.html', {'work': work, 'premiums': premiums})
return render(request, 'work.html', {'work': work, 'premiums': premiums, 'ungluers': userlists.supporting_users(work, 5)})
def workstub(request, title, imagebase, image, author, googlebooks_id, action='display'):
premiums = None
title = urllib.unquote_plus(title)
imagebase = urllib.unquote_plus(imagebase)
image = urllib.unquote_plus(image)
author = urllib.unquote_plus(author)
return render(request, 'workstub.html', {'title': title, 'image': image, 'imagebase': imagebase, 'author': author, 'googlebooks_id': googlebooks_id, 'premiums': premiums, 'ungluers': userlists.other_users(supporter, 5)})
def subjects(request):
order = request.GET.get('order')
subjects = models.Subject.objects.all()
subjects = subjects.annotate(Count('editions'))
if request.GET.get('order') == 'count':
subjects = subjects.order_by('-editions__count')
else:
subjects = subjects.order_by('name')
return render(request, 'subjects.html', {'subjects': subjects})
def pledge(request,work_id):
work = get_object_or_404(models.Work, id=work_id)
@ -77,6 +100,25 @@ def pledge(request,work_id):
return render(request,'pledge.html',{'work':work,'campaign':campaign, 'premiums':premiums, 'form':form})
def rh_admin(request):
if not is_admin(request.user):
return render(request, "admins_only.html")
if request.method == 'POST':
form = RightsHolderForm(data=request.POST)
if form.is_valid():
form.save()
else:
form = RightsHolderForm()
rights_holders = models.RightsHolder.objects.all()
context = { 'request': request, 'rights_holders': rights_holders, 'form': form }
return render(request, "rights_holders.html", context)
def is_admin(user):
for name,email in settings.ADMINS :
if email == user.email :
return True
return False
def supporter(request, supporter_username, template_name):
supporter = get_object_or_404(User, username=supporter_username)
wishlist = supporter.wishlist
@ -117,6 +159,12 @@ def supporter(request, supporter_username, template_name):
if request.method == 'POST':
profile_form = ProfileForm(data=request.POST,instance=profile_obj)
if profile_form.is_valid():
if profile_form.cleaned_data['clear_facebook'] or profile_form.cleaned_data['clear_twitter'] :
if profile_form.cleaned_data['clear_facebook']:
profile_obj.facebook_id=0
if profile_form.cleaned_data['clear_twitter']:
profile_obj.twitter_id=""
profile_obj.save()
profile_form.save()
else:
profile_form= ProfileForm(instance=profile_obj)
@ -132,6 +180,7 @@ def supporter(request, supporter_username, template_name):
"date": date,
"shared_works": shared_works,
"profile_form": profile_form,
"ungluers": userlists.other_users(supporter, 5 )
}
return render(request, template_name, context)
@ -163,17 +212,27 @@ def search(request):
wishlist = request.user.wishlist
editions = models.Edition.objects.filter(work__wishlists__in=[wishlist])
googlebooks_ids = [e['googlebooks_id'] for e in editions.values('googlebooks_id')]
ungluers = userlists.other_users(request.user, 5)
# if the results is on their wishlist flag it
for result in results:
if result['googlebooks_id'] in googlebooks_ids:
result['on_wishlist'] = True
else:
result['on_wishlist'] = False
else:
ungluers = userlists.other_users(None, 5)
# also urlencode some parameters we'll need to pass to workstub in the title links
# needs to be done outside the if condition
for result in results:
result['urlimage'] = urllib.quote_plus(sub('^https?:\/\/','', result['image']).encode("utf-8"), safe='')
result['urlauthor'] = urllib.quote_plus(result['author'].encode("utf-8"), safe='')
result['urltitle'] = urllib.quote_plus(result['title'].encode("utf-8"), safe='')
context = {
"q": q,
"results": results,
"ungluers": ungluers
}
return render(request, 'search.html', context)

View File

@ -172,7 +172,7 @@ SOCIAL_AUTH_ENABLED_BACKENDS = ['google', 'facebook', 'twitter']
SOCIAL_AUTH_ASSOCIATE_BY_MAIL = True
SOCIAL_AUTH_NEW_USER_REDIRECT_URL = '/accounts/edit/'
FACEBOOK_EXTENDED_PERMISSIONS = ['email']
TWITTER_EXTRA_DATA = [('profile_image_url', 'profile_image_url')]
LOGIN_URL = "/accounts/login/"
LOGIN_REDIRECT_URL = "/"

View File

@ -6,6 +6,9 @@ TEMPLATE_DEBUG = DEBUG
ADMINS = (
('Ed Summers', 'ehs@pobox.com'),
('Raymond Yee', 'rdhyee+ungluebugs@gluejar.com'),
('Eric Hellman', 'eric@gluejar.com'),
('Andromeda Yelton', 'andromeda@gluejar.com'),
('Rights Admin', 'rights@gluejar.com'),
)
MANAGERS = ADMINS
@ -68,6 +71,16 @@ PAYPAL_GLUEJAR_EMAIL = ""
PAYPAL_TEST_RH_EMAIL = "rh1_1317336251_biz@gluejar.com"
PAYPAL_TEST_NONPROFIT_PARTNER_EMAIL = ""
# Goodreads API
GOODREADS_API_KEY = "vfqIO6QAhBVvlxt6hAzZJg"
GOODREADS_API_SECRET = "57tq4MpyJ15Hgm2ToZQQFWJ7vraZzOAqHLckWRXQ"
# Freebase credentials
FREEBASE_USERNAME = ''
FREEBASE_PASSWORD = ''
# send celery log to Python logging
CELERYD_HIJACK_ROOT_LOGGER = False
BASE_URL = 'http://0.0.0.0/'
# use redis for production queue
@ -75,3 +88,5 @@ BROKER_TRANSPORT = "redis"
BROKER_HOST = "localhost"
BROKER_PORT = 6379
BROKER_VHOST = "0"

View File

@ -36,32 +36,43 @@ div.book-list.listview div.book-thumb {
float: left;
}
div.book-list.listview div.book-name {
width: 260px;
width: 235px;
margin-right: 10px;
background: url("../images/booklist/booklist-vline.png") right center no-repeat;
background: url("/static/images/booklist/booklist-vline.png") right center no-repeat;
float: left;
overflow: hidden;
}
div.book-list.listview div.book-name span {
div.book-list.listview div.book-name .title {
display: block;
line-height: normal;
height: 43px;
line-height: 43px;
overflow: hidden;
height: 19px;
line-height: 19px;
padding-bottom: 5px;
font-weight: bold;
}
div.book-list.listview div.book-name .listview.author {
overflow: hidden;
display: block;
line-height: normal;
height: 19px;
line-height: 19px;
}
div.book-list.listview div.add-wishlist, div.book-list.listview div.remove-wishlist {
margin-right: 10px;
padding-right: 10px;
background: url("../images/booklist/booklist-vline.png") right center no-repeat;
width: 136px;
background: url("/static/images/booklist/booklist-vline.png") right center no-repeat;
float: left;
}
div.book-list.listview div.add-wishlist a, div.book-list.listview div.remove-wishlist a {
font-weight: normal;
color: #3d4e53;
text-transform: none;
background: url("../images/booklist/add-wishlist.png") left center no-repeat;
background: url("/static/images/booklist/add-wishlist.png") left center no-repeat;
padding-left: 20px;
}
div.book-list.listview div.booklist-status {
width: 110px;
margin-right: 7px;
float: left;
}
@ -183,9 +194,6 @@ ul.navigation li a:hover, ul.navigation li.active a {
*/
}
.listview.author {
display: none;
}
.listview.icons {
position: absolute;
right: 31px;
@ -210,3 +218,6 @@ div.content-block-content {
.listview.panelback, .listview.panelback div {
display: none;
}
.listview.boolist-ebook a {
color: #3d4e53;
}

View File

@ -92,7 +92,7 @@
.panelview.add-wishlist {
display: none;
}
.panelview.book-name, .panelview.author {
.panelview.book-name div {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
line-height: 16px;
@ -128,6 +128,9 @@
padding: 10px 10px 0 0;
width: 24px;
}
.panelview.boolist-ebook a {
display: none;
}
/* switch to/from hover state when jquery swaps class names */
span.panelview.panelback.side1, span.panelview.panelback.side1 div {
display: visible;
@ -185,9 +188,9 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background: "/static/images/book-panel/book_icon.png) no-repeat 10% center";
padding: 0px 0px 0px 30px;
color: #73a334;
background: url("/static/images/book-panel/book_icon.png") no-repeat 10% center;
}
.read_itbutton a:hover {
text-decoration: none;
@ -211,9 +214,9 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background: none;
padding: 0px 0px 0px 15px;
color: #73a334;
background: none;
}
.read_itbutton_fail span:hover {
text-decoration: none;
@ -224,6 +227,7 @@ div.panelview.side2 > div {
padding: 0px;
margin: 15px 0 15px 0;
vertical-align: baseline;
background-image: url("/static/images/book-panel/add_wish_icon.png");
}
.add_towish a {
line-height: 40px;
@ -233,7 +237,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url("/static/images/book-panel/add_wish_icon.png");
padding: 8px 5px 8px 21px;
color: #FFFFFF;
border-top-width: 1px;
@ -272,6 +275,7 @@ div.panelview.side2 > div {
padding: 0px;
margin: 15px 0 0px 0;
vertical-align: baseline;
background-image: url("/static/images/book-panel/more_icon.png") no-repeat 10% center;
}
.moreinfo a {
line-height: 40px;
@ -281,7 +285,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url("/static/images/book-panel/more_icon.png");
padding: 8px 42px 8px 21px;
color: #FFFFFF;
border-top-width: 1px;
@ -315,7 +318,7 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url(/static/images/book-panel/unglue_icon.png);
background-image: url("/static/images/book-panel/unglue_icon.png");
padding: 5px 0px 0px 20px;
color: #3d4e53;
text-align: right;
@ -338,7 +341,7 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url(/static/images/book-panel/add_gray.png);
background-image: url("/static/images/book-panel/add_gray.png");
padding: 8px 0px;
padding-left: 20px;
color: #3d4e53;
@ -373,7 +376,7 @@ div.panelview.side2 > div {
.moreinfo2 a {
line-height: 40px;
font-size: 12px;
background-image: url(/static/images/book-panel/gray_more_info.png);
background-image: url("/static/images/book-panel/gray_more_info.png");
background-repeat: no-repeat;
background-position: left center;
padding: 8px 35px;

View File

@ -226,7 +226,6 @@ div.content-block-content {
}
.book-name {
color: #3d4e53;
font-weight: bold;
}
.book-author {
color: #6994a3;
@ -248,11 +247,15 @@ div.content-block-content {
height: 25px;
display: block;
}
/* Do I even still need this?
.book-status span.percent99{ background:url(../images/images/icon-book1.png) 0 0 no-repeat;}
.book-status span.percent60{ background:url(../images/images/icon-book2.png) 0 0 no-repeat;}
.book-status span.percent22{ background:url(../images/images/icon-book3.png) 0 0 no-repeat;}
.book-status span.percent7{ background:url(../images/images/icon-book4.png) 0 0 no-repeat;}
.book-status span.percent62{ background:url(../images/images/icon-book5.png) 0 0 no-repeat;}
.book-status span.percent21{ background:url(../images/images/icon-book6.png) 0 0 no-repeat;}
*/
#toggle-list {
filter: alpha(opacity=100);
-moz-opacity: 1;
-khtml-opacity: 1;
opacity: 1;
}
#toggle-panel {
filter: alpha(opacity=100);
-moz-opacity: 0.2;
-khtml-opacity: 0.2;
opacity: 0.2;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
static/images/images/icon-book-37by25-0.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
static/images/images/icon-book-37by25-1.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 462 B

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
static/images/images/icon-book-37by25-2.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 B

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
static/images/images/icon-book-37by25-3.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 B

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
static/images/images/icon-book-37by25-4.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 481 B

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
static/images/images/icon-book-37by25-5.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 481 B

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
static/images/images/icon-book-37by25-6.png Executable file → Normal file

Binary file not shown.

Before

Width:  |  Height:  |  Size: 461 B

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -3,8 +3,12 @@ which overrides display: none in the stylesheet. Sneaky! */
$(document).ready(function(){
$('#toggle-list').click(function(){
$('.panelview').addClass("listview").removeClass("panelview");
$j(this).css({opacity: 1});
$('#toggle-panel').css({opacity: .2});
});
$('#toggle-panel').click(function(){
$('.listview').addClass("panelview").removeClass("listview");
$j(this).css({opacity: 1});
$('#toggle-list').css({opacity: .2});
});
});

View File

@ -27,34 +27,45 @@ div.book-list.listview{
float: left;
}
&.book-name {
width:260px;
width:235px;
margin-right:10px;
background:url("../images/booklist/booklist-vline.png") right center no-repeat;
background:url("@{image-base}booklist/booklist-vline.png") right center no-repeat;
float: left;
overflow: hidden;
span {
.title {
display:block;
line-height:normal;
.height(43px);
}
overflow: hidden;
.height(19px);
padding-bottom: 5px;
font-weight:bold;
}
.listview.author {
overflow: hidden;
display:block;
line-height:normal;
.height(19px);
}
}
&.add-wishlist, &.remove-wishlist {
margin-right: 10px;
padding-right: 10px;
background:url("../images/booklist/booklist-vline.png") right center no-repeat;
width: 136px;
background:url("@{image-base}booklist/booklist-vline.png") right center no-repeat;
float: left;
a {
font-weight:normal;
color:@text-blue;
text-transform: none;
background:url("../images/booklist/add-wishlist.png") left center no-repeat;
background:url("@{image-base}booklist/add-wishlist.png") left center no-repeat;
padding-left:20px;
}
}
&.booklist-status {
width: 110px;
margin-right:7px;
float: left;
}
@ -197,10 +208,6 @@ ul.navigation li a:hover, ul.navigation li.active a {
}
}
.listview.author {
display: none;
}
.listview.icons {
position: absolute;
right: 31px;
@ -226,4 +233,8 @@ div.content-block-content {
.listview.panelback, .listview.panelback div {
display: none;
}
.listview.boolist-ebook a {
color: @text-blue;
}

View File

@ -42,9 +42,8 @@
border: 1px solid #81bb38;
}
.readit_inner (@image, @padding) {
.readit_inner (@padding) {
.greenpanelactionitems(10px);
background: @image;
padding:0px 0px 0px @padding;
color:@dark-green;
@ -53,7 +52,7 @@
}
}
.banners (@image, @right, @bottom) {
.banners (@right, @bottom) {
width:130px;
height:30px;
padding:0px;
@ -62,7 +61,6 @@
a {
.greenpanelactionitems(left);
background-image: url(@image);
padding:8px @right 8px 21px;
color:#FFFFFF;
.greenpanelactionborders;
@ -125,7 +123,7 @@
}
}
.panelview.book-name, .panelview.author {
.panelview.book-name div {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
line-height:16px;
@ -169,6 +167,10 @@
}
}
.panelview.boolist-ebook a {
display: none;
}
/* switch to/from hover state when jquery swaps class names */
span.panelview.panelback.side1, span.panelview.panelback.side1 div {
@ -214,7 +216,8 @@ div.panelview.side2 > div {
.read_itbutton {
.readit;
a {
.readit_inner("/static/images/book-panel/book_icon.png) no-repeat 10% center", 30px);
.readit_inner(30px);
background: url("@{image-base}book-panel/book_icon.png") no-repeat 10% center;
}
}
@ -222,13 +225,16 @@ div.panelview.side2 > div {
.readit;
span {
.readit_inner(none, 15px);
.readit_inner(15px);
background: none;
}
}
.add_towish {
.banners("/static/images/book-panel/add_wish_icon.png", 5px, 15px);
.banners(5px, 15px);
background-image: url("@{image-base}book-panel/add_wish_icon.png");
}
.white_text {
@ -252,7 +258,8 @@ div.panelview.side2 > div {
}
.moreinfo {
.banners("/static/images/book-panel/more_icon.png", 42px, 0px);
.banners(42px, 0px);
background-image: url("@{image-base}book-panel/more_icon.png") no-repeat 10% center;
}
@ -269,7 +276,7 @@ div.panelview.side2 > div {
}
.Unglue_itbutton a{
.greenpanelactionitems(2px);
background-image: url(/static/images/book-panel/unglue_icon.png);
background-image: url("@{image-base}book-panel/unglue_icon.png");
padding:5px 0px 0px 20px;
color:@text-blue;
text-align:right;
@ -287,7 +294,7 @@ text-decoration:none;
}
.add_towish2 a{
.greenpanelactionitems(left);
background-image: url(/static/images/book-panel/add_gray.png);
background-image: url("@{image-base}book-panel/add_gray.png");
padding:8px 0px;
padding-left:20px;
color:@text-blue;
@ -318,7 +325,7 @@ text-decoration:none;
.moreinfo2 a{
line-height:40px;
font-size:12px;
background-image: url(/static/images/book-panel/gray_more_info.png);
background-image: url("@{image-base}book-panel/gray_more_info.png");
background-repeat: no-repeat;
background-position: left center;
padding:8px 35px;

View File

@ -66,42 +66,63 @@ div.book-list.listview div.book-thumb {
float: left;
}
div.book-list.listview div.book-name {
width: 260px;
width: 235px;
margin-right: 10px;
background: url("../images/booklist/booklist-vline.png") right center no-repeat;
background: url("/static/images/booklist/booklist-vline.png") right center no-repeat;
float: left;
overflow: hidden;
}
div.book-list.listview div.book-name span {
div.book-list.listview div.book-name .title {
display: block;
line-height: normal;
height: 43px;
line-height: 43px;
height: 43px;
line-height: 43px;
height: 43px;
line-height: 43px;
height: 43px;
line-height: 43px;
height: 43px;
line-height: 43px;
height: 43px;
line-height: 43px;
overflow: hidden;
height: 19px;
line-height: 19px;
height: 19px;
line-height: 19px;
height: 19px;
line-height: 19px;
height: 19px;
line-height: 19px;
height: 19px;
line-height: 19px;
height: 19px;
line-height: 19px;
padding-bottom: 5px;
font-weight: bold;
}
div.book-list.listview div.book-name .listview.author {
overflow: hidden;
display: block;
line-height: normal;
height: 19px;
line-height: 19px;
height: 19px;
line-height: 19px;
height: 19px;
line-height: 19px;
height: 19px;
line-height: 19px;
height: 19px;
line-height: 19px;
height: 19px;
line-height: 19px;
}
div.book-list.listview div.add-wishlist, div.book-list.listview div.remove-wishlist {
margin-right: 10px;
padding-right: 10px;
background: url("../images/booklist/booklist-vline.png") right center no-repeat;
width: 136px;
background: url("/static/images/booklist/booklist-vline.png") right center no-repeat;
float: left;
}
div.book-list.listview div.add-wishlist a, div.book-list.listview div.remove-wishlist a {
font-weight: normal;
color: #3d4e53;
text-transform: none;
background: url("../images/booklist/add-wishlist.png") left center no-repeat;
background: url("/static/images/booklist/add-wishlist.png") left center no-repeat;
padding-left: 20px;
}
div.book-list.listview div.booklist-status {
width: 110px;
margin-right: 7px;
float: left;
}
@ -273,9 +294,6 @@ ul.navigation li a:hover, ul.navigation li.active a {
*/
}
.listview.author {
display: none;
}
.listview.icons {
position: absolute;
right: 31px;
@ -315,6 +333,9 @@ div.content-block-content {
.listview.panelback, .listview.panelback div {
display: none;
}
.listview.boolist-ebook a {
color: #3d4e53;
}
.header-text {
height: 36px;
line-height: 36px;
@ -428,7 +449,7 @@ div.content-block-content {
.panelview.add-wishlist {
display: none;
}
.panelview.book-name, .panelview.author {
.panelview.book-name div {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
line-height: 16px;
@ -464,6 +485,9 @@ div.content-block-content {
padding: 10px 10px 0 0;
width: 24px;
}
.panelview.boolist-ebook a {
display: none;
}
/* switch to/from hover state when jquery swaps class names */
span.panelview.panelback.side1, span.panelview.panelback.side1 div {
display: visible;
@ -571,7 +595,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background: "/static/images/book-panel/book_icon.png) no-repeat 10% center";
padding: 0px 0px 0px 30px;
color: #73a334;
line-height: 40px;
@ -588,9 +611,9 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background: "/static/images/book-panel/book_icon.png) no-repeat 10% center";
padding: 0px 0px 0px 30px;
color: #73a334;
background: url("/static/images/book-panel/book_icon.png") no-repeat 10% center;
}
.read_itbutton a:hover {
text-decoration: none;
@ -663,7 +686,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background: none;
padding: 0px 0px 0px 15px;
color: #73a334;
line-height: 40px;
@ -680,9 +702,9 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background: none;
padding: 0px 0px 0px 15px;
color: #73a334;
background: none;
}
.read_itbutton_fail span:hover {
text-decoration: none;
@ -701,6 +723,7 @@ div.panelview.side2 > div {
padding: 0px;
margin: 15px 0 15px 0;
vertical-align: baseline;
background-image: url("/static/images/book-panel/add_wish_icon.png");
}
.add_towish a {
line-height: 40px;
@ -717,7 +740,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url("/static/images/book-panel/add_wish_icon.png");
padding: 8px 5px 8px 21px;
color: #FFFFFF;
border-top-width: 1px;
@ -754,7 +776,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url("/static/images/book-panel/add_wish_icon.png");
padding: 8px 5px 8px 21px;
color: #FFFFFF;
border-top-width: 1px;
@ -808,6 +829,7 @@ div.panelview.side2 > div {
padding: 0px;
margin: 15px 0 0px 0;
vertical-align: baseline;
background-image: url("/static/images/book-panel/more_icon.png") no-repeat 10% center;
}
.moreinfo a {
line-height: 40px;
@ -824,7 +846,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url("/static/images/book-panel/more_icon.png");
padding: 8px 42px 8px 21px;
color: #FFFFFF;
border-top-width: 1px;
@ -861,7 +882,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url("/static/images/book-panel/more_icon.png");
padding: 8px 42px 8px 21px;
color: #FFFFFF;
border-top-width: 1px;
@ -925,7 +945,7 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url(/static/images/book-panel/unglue_icon.png);
background-image: url("/static/images/book-panel/unglue_icon.png");
padding: 5px 0px 0px 20px;
color: #3d4e53;
text-align: right;
@ -955,7 +975,7 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url(/static/images/book-panel/add_gray.png);
background-image: url("/static/images/book-panel/add_gray.png");
padding: 8px 0px;
padding-left: 20px;
color: #3d4e53;
@ -998,7 +1018,7 @@ div.panelview.side2 > div {
.moreinfo2 a {
line-height: 40px;
font-size: 12px;
background-image: url(/static/images/book-panel/gray_more_info.png);
background-image: url("/static/images/book-panel/gray_more_info.png");
background-repeat: no-repeat;
background-position: left center;
padding: 8px 35px;
@ -1782,7 +1802,6 @@ div.content-block-content {
}
.book-name {
color: #3d4e53;
font-weight: bold;
}
.book-author {
color: #6994a3;
@ -1804,14 +1823,19 @@ div.content-block-content {
height: 25px;
display: block;
}
/* Do I even still need this?
.book-status span.percent99{ background:url(../images/images/icon-book1.png) 0 0 no-repeat;}
.book-status span.percent60{ background:url(../images/images/icon-book2.png) 0 0 no-repeat;}
.book-status span.percent22{ background:url(../images/images/icon-book3.png) 0 0 no-repeat;}
.book-status span.percent7{ background:url(../images/images/icon-book4.png) 0 0 no-repeat;}
.book-status span.percent62{ background:url(../images/images/icon-book5.png) 0 0 no-repeat;}
.book-status span.percent21{ background:url(../images/images/icon-book6.png) 0 0 no-repeat;}
*/.header-text {
#toggle-list {
filter: alpha(opacity=100);
-moz-opacity: 1;
-khtml-opacity: 1;
opacity: 1;
}
#toggle-panel {
filter: alpha(opacity=100);
-moz-opacity: 0.2;
-khtml-opacity: 0.2;
opacity: 0.2;
}
.header-text {
height: 36px;
line-height: 36px;
display: block;
@ -1924,7 +1948,7 @@ div.content-block-content {
.panelview.add-wishlist {
display: none;
}
.panelview.book-name, .panelview.author {
.panelview.book-name div {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
line-height: 16px;
@ -1960,6 +1984,9 @@ div.content-block-content {
padding: 10px 10px 0 0;
width: 24px;
}
.panelview.boolist-ebook a {
display: none;
}
/* switch to/from hover state when jquery swaps class names */
span.panelview.panelback.side1, span.panelview.panelback.side1 div {
display: visible;
@ -2067,7 +2094,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background: "/static/images/book-panel/book_icon.png) no-repeat 10% center";
padding: 0px 0px 0px 30px;
color: #73a334;
line-height: 40px;
@ -2084,9 +2110,9 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background: "/static/images/book-panel/book_icon.png) no-repeat 10% center";
padding: 0px 0px 0px 30px;
color: #73a334;
background: url("/static/images/book-panel/book_icon.png") no-repeat 10% center;
}
.read_itbutton a:hover {
text-decoration: none;
@ -2159,7 +2185,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background: none;
padding: 0px 0px 0px 15px;
color: #73a334;
line-height: 40px;
@ -2176,9 +2201,9 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background: none;
padding: 0px 0px 0px 15px;
color: #73a334;
background: none;
}
.read_itbutton_fail span:hover {
text-decoration: none;
@ -2197,6 +2222,7 @@ div.panelview.side2 > div {
padding: 0px;
margin: 15px 0 15px 0;
vertical-align: baseline;
background-image: url("/static/images/book-panel/add_wish_icon.png");
}
.add_towish a {
line-height: 40px;
@ -2213,7 +2239,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url("/static/images/book-panel/add_wish_icon.png");
padding: 8px 5px 8px 21px;
color: #FFFFFF;
border-top-width: 1px;
@ -2250,7 +2275,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url("/static/images/book-panel/add_wish_icon.png");
padding: 8px 5px 8px 21px;
color: #FFFFFF;
border-top-width: 1px;
@ -2304,6 +2328,7 @@ div.panelview.side2 > div {
padding: 0px;
margin: 15px 0 0px 0;
vertical-align: baseline;
background-image: url("/static/images/book-panel/more_icon.png") no-repeat 10% center;
}
.moreinfo a {
line-height: 40px;
@ -2320,7 +2345,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url("/static/images/book-panel/more_icon.png");
padding: 8px 42px 8px 21px;
color: #FFFFFF;
border-top-width: 1px;
@ -2357,7 +2381,6 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url("/static/images/book-panel/more_icon.png");
padding: 8px 42px 8px 21px;
color: #FFFFFF;
border-top-width: 1px;
@ -2421,7 +2444,7 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url(/static/images/book-panel/unglue_icon.png);
background-image: url("/static/images/book-panel/unglue_icon.png");
padding: 5px 0px 0px 20px;
color: #3d4e53;
text-align: right;
@ -2451,7 +2474,7 @@ div.panelview.side2 > div {
font-weight: bold;
text-decoration: none;
text-transform: uppercase;
background-image: url(/static/images/book-panel/add_gray.png);
background-image: url("/static/images/book-panel/add_gray.png");
padding: 8px 0px;
padding-left: 20px;
color: #3d4e53;
@ -2494,7 +2517,7 @@ div.panelview.side2 > div {
.moreinfo2 a {
line-height: 40px;
font-size: 12px;
background-image: url(/static/images/book-panel/gray_more_info.png);
background-image: url("/static/images/book-panel/gray_more_info.png");
background-repeat: no-repeat;
background-position: left center;
padding: 8px 35px;

View File

@ -1,5 +1,12 @@
@import "variables.less";
.opacity (@op) {
filter:alpha(opacity=@op);
-moz-opacity:@op/100;
-khtml-opacity:@op/100;
opacity:@op/100;
}
.block-inner {
padding-right:10px;
}
@ -264,7 +271,6 @@ div.content-block-content {
.book-name {
color:@text-blue;
font-weight:bold;
}
.book-author {
@ -292,11 +298,10 @@ div.content-block-content {
}
/* Do I even still need this?
.book-status span.percent99{ background:url(../images/images/icon-book1.png) 0 0 no-repeat;}
.book-status span.percent60{ background:url(../images/images/icon-book2.png) 0 0 no-repeat;}
.book-status span.percent22{ background:url(../images/images/icon-book3.png) 0 0 no-repeat;}
.book-status span.percent7{ background:url(../images/images/icon-book4.png) 0 0 no-repeat;}
.book-status span.percent62{ background:url(../images/images/icon-book5.png) 0 0 no-repeat;}
.book-status span.percent21{ background:url(../images/images/icon-book6.png) 0 0 no-repeat;}
*/
#toggle-list {
.opacity(100);
}
#toggle-panel {
.opacity(20);
}