Merging master -> fps

pull/1/head
Jason 2012-05-15 16:16:39 -04:00
commit 7a38bdf91c
126 changed files with 1729 additions and 898 deletions

1
.gitignore vendored
View File

@ -9,3 +9,4 @@ ENV
build
deploy/last-update
logs/*
celerybeat.pid

View File

@ -0,0 +1,26 @@
from django.core.management.base import BaseCommand
from regluit.payment.parameters import TRANSACTION_STATUS_ACTIVE
from regluit.core import models
from django.db.models import Q, F
class Command(BaseCommand):
help = "Do some integrity checks on our Payments"
def handle(self, **options):
print "number of Campaigns", models.Campaign.objects.count()
print "number of active Campaigns", models.Campaign.objects.filter(status='ACTIVE').count()
for campaign in models.Campaign.objects.filter(status='ACTIVE'):
print stats_for_active_campaign(campaign)
def stats_for_active_campaign(campaign):
# might need to calculate 'number of users with more than 1 ACTIVE transaction (should be 0)'
# set([t.user for t in c.transaction_set.filter(status='Active')]) - set(userlists.supporting_users(c.work,1000))
# everyone with an ACTIVE pledge should have the work on his/her wishlist
# set([w.user for w in c.work.wishlists.all()])
# set([t.user for t in campaign.transaction_set.filter(status=TRANSACTION_STATUS_ACTIVE)]) - set([w.user for w in c.work.wishlists.all()])
return {'name': campaign.name,
'work':campaign.work,
'number of ACTIVE transactions':campaign.transaction_set.filter(status=TRANSACTION_STATUS_ACTIVE).count(),
'number of users with ACTIVE transactions': len(set([t.user for t in campaign.transaction_set.filter(status=TRANSACTION_STATUS_ACTIVE)])),
'total amount of pledges in ACTIVE transactions': sum([t.amount for t in campaign.transaction_set.filter(status=TRANSACTION_STATUS_ACTIVE)]),
}

View File

@ -0,0 +1,12 @@
from django.core.management.base import BaseCommand
from regluit.core.models import Key
class Command(BaseCommand):
help = "set a core.models.Key with name value"
args = "<name> <value>"
def handle(self, name, value, **options):
(k, created) = Key.objects.get_or_create(name=name)
k.value = value
k.save()

View File

@ -0,0 +1,225 @@
# 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 'Edition.cover_image'
db.add_column('core_edition', 'cover_image', self.gf('django.db.models.fields.URLField')(max_length=200, null=True), keep_default=False)
def backwards(self, orm):
# Deleting field 'Edition.cover_image'
db.delete_column('core_edition', 'cover_image')
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'}),
'details': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'edition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'campaigns'", 'null': 'True', 'to': "orm['core.Edition']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'left': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '14', 'decimal_places': '2'}),
'license': ('django.db.models.fields.CharField', [], {'default': "'CC BY-NC-ND'", 'max_length': '255'}),
'managers': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'campaigns'", 'symmetrical': 'False', 'to': "orm['auth.User']"}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True'}),
'paypal_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
'status': ('django.db.models.fields.CharField', [], {'default': "'INITIALIZED'", 'max_length': '15', 'null': 'True'}),
'target': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '14', 'decimal_places': '2'}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'campaigns'", 'to': "orm['core.Work']"})
},
'core.campaignaction': {
'Meta': {'object_name': 'CampaignAction'},
'campaign': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'actions'", 'to': "orm['core.Campaign']"}),
'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'timestamp': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '15'})
},
'core.celerytask': {
'Meta': {'object_name': 'CeleryTask'},
'active': ('django.db.models.fields.NullBooleanField', [], {'default': 'True', 'null': 'True', 'blank': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 5, 10, 21, 14, 9, 194687)', 'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.CharField', [], {'max_length': '2048', 'null': 'True'}),
'function_args': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
'function_name': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'task_id': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tasks'", 'null': 'True', 'to': "orm['auth.User']"})
},
'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']"}),
'status': ('django.db.models.fields.CharField', [], {'default': "'pending'", 'max_length': '7'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'claim'", 'to': "orm['auth.User']"}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'claim'", 'to': "orm['core.Work']"})
},
'core.ebook': {
'Meta': {'object_name': 'Ebook'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'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.URLField', [], {'max_length': '1024'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'})
},
'core.edition': {
'Meta': {'object_name': 'Edition'},
'cover_image': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True'}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'public_domain': ('django.db.models.fields.NullBooleanField', [], {'null': 'True', 'blank': 'True'}),
'publication_date': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True'}),
'publisher': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
'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.identifier': {
'Meta': {'unique_together': "(('type', 'value'),)", 'object_name': 'Identifier'},
'edition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'identifiers'", 'null': 'True', 'to': "orm['core.Edition']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
'value': ('django.db.models.fields.CharField', [], {'max_length': '31'}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'identifiers'", 'to': "orm['core.Work']"})
},
'core.key': {
'Meta': {'object_name': 'Key'},
'encrypted_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
},
'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']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'limit': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'type': ('django.db.models.fields.CharField', [], {'max_length': '2'})
},
'core.rightsholder': {
'Meta': {'object_name': 'RightsHolder'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'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'})
},
'core.subject': {
'Meta': {'ordering': "['name']", 'object_name': 'Subject'},
'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', [], {'unique': 'True', 'max_length': '200'}),
'works': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'subjects'", 'symmetrical': 'False', 'to': "orm['core.Work']"})
},
'core.userprofile': {
'Meta': {'object_name': 'UserProfile'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'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.waswork': {
'Meta': {'object_name': 'WasWork'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'moved': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}),
'was': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Work']"})
},
'core.wishes': {
'Meta': {'object_name': 'Wishes', 'db_table': "'core_wishlist_works'"},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'source': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'}),
'wishlist': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Wishlist']"}),
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'wishes'", 'to': "orm['core.Work']"})
},
'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', 'through': "orm['core.Wishes']", 'to': "orm['core.Work']"})
},
'core.work': {
'Meta': {'ordering': "['title']", 'object_name': 'Work'},
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'default': "''", 'null': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'language': ('django.db.models.fields.CharField', [], {'default': "'en'", 'max_length': '2'}),
'num_wishes': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'openlibrary_lookup': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000'})
}
}
complete_apps = ['core']

View File

@ -9,6 +9,7 @@ from notification import models as notification
from django.db import models
from django.db.models import Q, get_model
from django.contrib.auth.models import User
from django.contrib.sites.models import Site
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
@ -211,7 +212,7 @@ class Campaign(models.Model):
self.save()
ungluers = self.work.wished_by()
notification.queue(ungluers, "wishlist_active", {'campaign':self, 'active_claim':active_claim}, True)
notification.queue(ungluers, "wishlist_active", {'campaign':self, 'site': Site.objects.get_current()}, True)
return self
@ -254,14 +255,26 @@ class Campaign(models.Model):
return translist
def effective_premiums(self):
"""returns the available premiums for the Campaign including any default premiums"""
"""returns the available premiums for the Campaign including any default premiums"""
q = Q(campaign=self) | Q(campaign__isnull=True)
return Premium.objects.filter(q).exclude(type='XX').order_by('amount')
def custom_premiums(self):
"""returns only the active custoe premiums for the Campaign """
"""returns only the active custom premiums for the Campaign"""
return Premium.objects.filter(campaign=self).filter(type='CU')
@property
def rightsholder(self):
"""returns the name of the rights holder for an active or initialized campaign"""
try:
if self.status=='ACTIVE' or self.status=='INITIALIZED':
q = Q(status='ACTIVE') | Q(status='INITIALIZED')
rh = self.work.claim.filter(q)[0].rights_holder.rights_holder_name
return rh
except:
pass
return ''
class Identifier(models.Model):
# olib, ltwk, goog, gdrd, thng, isbn, oclc, olwk, olib, gute, glue
type = models.CharField(max_length=4, null=False)
@ -348,15 +361,19 @@ class Work(models.Model):
def cover_image_small(self):
try:
return self.preferred_edition.cover_image_small()
if self.preferred_edition.cover_image_small():
return self.preferred_edition.cover_image_small()
except IndexError:
return "/static/images/generic_cover_larger.png"
pass
return "/static/images/generic_cover_larger.png"
def cover_image_thumbnail(self):
try:
return self.preferred_edition.cover_image_thumbnail()
if self.preferred_edition.cover_image_thumbnail():
return self.preferred_edition.cover_image_thumbnail()
except IndexError:
return "/static/images/generic_cover_larger.png"
pass
return "/static/images/generic_cover_larger.png"
def author(self):
# note: if you want this to be a real list, use distinct()
@ -510,10 +527,11 @@ class Subject(models.Model):
class Edition(models.Model):
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=1000)
publisher = models.CharField(max_length=255, null=True)
publication_date = models.CharField(max_length=50, null=True)
public_domain = models.NullBooleanField(null=True)
publisher = models.CharField(max_length=255, null=True, blank=True)
publication_date = models.CharField(max_length=50, null=True, blank=True)
public_domain = models.NullBooleanField(null=True, blank=True)
work = models.ForeignKey("Work", related_name="editions", null=True)
cover_image = models.URLField(null=True, blank=True)
def __unicode__(self):
if self.isbn_13:
@ -526,13 +544,17 @@ class Edition(models.Model):
return "%s (GLUE %s) %s" % (self.title, self.id, self.publisher)
def cover_image_small(self):
if self.googlebooks_id:
if self.cover_image:
return self.cover_image
elif self.googlebooks_id:
return "https://encrypted.google.com/books?id=%s&printsec=frontcover&img=1&zoom=5" % self.googlebooks_id
else:
return ''
def cover_image_thumbnail(self):
if self.googlebooks_id:
if self.cover_image:
return self.cover_image
elif self.googlebooks_id:
return "https://encrypted.google.com/books?id=%s&printsec=frontcover&img=1&zoom=1" % self.googlebooks_id
else:
return ''

View File

@ -80,9 +80,9 @@ def create_notice_types(app, created_models, verbosity, **kwargs):
notification.create_notice_type("wishlist_price_drop", _("Campaign Price Drop"), _("An ungluing campaign you're interested in has a reduced target."), default = 1)
notification.create_notice_type("wishlist_unglued_book_released", _("Unglued Book!"), _("A book you wanted is now available to be downloaded.'"))
notification.create_notice_type("pledge_you_have_pledged", _("Thanks For Your Pledge!"), _("Your ungluing pledge has been entered."))
notification.create_notice_type("pledge_status_change", _("Your Pledge Has Been Modified"), _("Your ungluing plegde has been modified."))
notification.create_notice_type("pledge_status_change", _("Your Pledge Has Been Modified"), _("Your ungluing pledge has been modified."))
notification.create_notice_type("pledge_charged", _("Your Pledge has been Executed"), _("You have contributed to a successful ungluing campaign."))
notification.create_notice_type("rights_holder_created", _("Agreement Accepted"), _("You become a verified Unglue.it rights holder."))
notification.create_notice_type("rights_holder_created", _("Agreement Accepted"), _("You have become a verified Unglue.it rights holder."))
notification.create_notice_type("rights_holder_claim_approved", _("Claim Accepted"), _("A claim you've entered has been accepted."))
signals.post_syncdb.connect(create_notice_types, sender=notification)
@ -122,3 +122,72 @@ def notify_successful_campaign(campaign, **kwargs):
# successful_campaign -> send notices
successful_campaign.connect(notify_successful_campaign)
# The notification templates need some context; I'm making a note of that here
# This can be removed as the relevant functions are written
# PLEDGE_CHARGED:
# 'site': (site)
# 'amount': (amount supporter's card will be charged)
# 'premium': (premium requested by the supporter)
# 'work': (campaign.work)
# 'payment_processor': (the payment processor)
# PLEDGE_CHANGE_STATUS:
# 'site': (site)
# 'campaign'
# 'amount': (amount supporter's card will be charged)
# 'premium': (premium requested by the supporter)
# RIGHTS_HOLDER_CLAIM_APPROVED:
# 'site': (site)
# 'claim': (claim)
# RIGHTS_HOLDER_CREATED: (no context needed)
# note -- it might be that wishlist_near_target and wishlist_near_deadline would
# both be triggered at about the same time -- do we want to prevent supporters
# from getting both within a small time frame? if so which supersedes?
# WISHLIST_NEAR_DEADLINE:
# 'site': (site)
# 'campaign': (the campaign)
# 'pledged': (true if the supporter has pledged, false otherwise)
# 'amount': (amount the supporter has pledged; only needed if pledged is true)
# WISHLIST_NEAR_TARGET:
# 'site': (site)
# 'campaign': (the campaign)
# 'pledged': (true if the supporter has pledged, false otherwise)
# 'amount': (amount the supporter has pledged; only needed if pledged is true)
# WISHLIST_PREMIUM_LIMITED_SUPPLY:
# (note we should not send this to people who have already claimed this premium)
# should we only send this to people who haven't pledged at all, or whose pledge
# is smaller than the amount of this premium? (don't want to encourage people to
# lower their pledge)
# the text assumes there is only 1 left -- if we're going to send at some other
# threshhold this will need to be revised
# 'campaign': (campaign)
# 'premium': (the premium in question)
# 'site': (site)
# WISHLIST_PRICE_DROP:
# 'campaign'
# 'pledged': (true if recipient has pledged to campaign, otherwise false)
# 'amount': (amount recipient has pledged, only needed if pledged=True)
# 'site'
# WISHLIST_SUCCESSFUL:
# 'pledged'
# 'campaign'
# 'site'
# WISHLIST_UNSUCCESSFUL:
# 'campaign'
# 'site'
# WISHLIST_UPDATED:
# I'd like to provide the actual text of the update in the message but I don't think
# we can reasonably do that, since campaign.description may contain HTML and we are
# sending notifications in plaintext. If we can send the update information in the
# email, though, let's do that.
# 'campaign'
# 'site'
# WISHLIST_WORK_CLAIMED
# does this trigger when someone claims a work, or when the claim is approved?
# I've written the text assuming it is the latter (sending notifications on the
# former seems too sausage-making, and might make people angry if they get
# notifications about claims they believe are false). If it's the former, the
# text should be revisited.
# 'claim'
# 'site'
# 'rightsholder' (the name of the rightsholder)

View File

@ -51,14 +51,19 @@ def fac(n, sleep_interval=None):
sleep(sleep_interval)
return res
from django.core import mail
from django.core.mail import get_connection
from django.core.mail.message import EmailMessage
@task
def send_mail_task(subject, message, from_email, recipient_list,
fail_silently=False, auth_user=None, auth_password=None,
connection=None):
"""a task to drop django.core.mail.send_mail into """
return mail.send_mail(subject, message, from_email, recipient_list, fail_silently, auth_user, auth_password, connection)
connection = connection or get_connection(username=auth_user,
password=auth_password,
fail_silently=fail_silently)
return EmailMessage(subject, message, from_email, recipient_list,
connection=connection, headers = {'Reply-To': from_email }).send()
from notification.engine import send_all

View File

@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDUHnCa4vMrf8jXiGE6Cdi09ayOxfR75HNookwxuo988COKAjbIUN9UP0FVB7QctunAHJLB4r64fzhKfvg0Qr1CYppY/T6et71UMNl3UcSB3aamBRP/Q5jVOIdlQZ24LihX73riVWn8dTlrqXTtsQFjpBIP2rbFj4LZJYcpqMWbDx8bMqJzgGDPYOM2jeXiQDMgBGbO1qSjnp/hjLA7QraiUx4DOpL8cD6y9zu4iij5cACE2eGwe0a48AZ4v4h5WwTCvlXcm9IexThrTiiBOI59m7PDVloyEsHFxdIW1Z/Wo/CwG7zoIuwn0s71v8pISArmskYhukTh6w8wKcMHb5ND andromeda.yelton@gmail.com

View File

@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwSKUGp7uLUH4JSmqP4aSB8VvxNfMsvo4HUpYK0u5a58FJElZP8/fjXAhzpFACLiZJT2c8rDMIIgXRvqv/VU0tcGKqBOSbBfLj5LIGenjIafdxspPvKucV0RC0G6aNbR0s/EGLHWRJzcJuDUyt2MT7BVSjua9hHy+dv1XhgaIKjHA6y2SrGAnD+WGJa3zAoowBL+kmqHHYzvZtdqxLuhdqY/KKlOjR7n8PmqbWoZalKllAKeIvEEnYFOu8cqo9VdAIapHPahMJOpFX2/R9l9HQ1ph65190PS0UJgd7OIzNjM+94bldUmPP/R2tHGPlfGek7Ef4KxhgjsFtBFeLLmdww== eric@hellman.net

View File

@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCpXC0Q97hd24vAF0ljQzuznY7rZMvvhW20QRz9pSutRYCDJH7LBht723loRk5frUY9UAdg58b8OXSXZ5tKIBTPb59MDBGxmfoaNF3njxt1/uur5HsqN0puvvdwjG23h3hJwkHp9acUF83Xjy3D0Pfzk+UEoZwLC+07s19Y+romlPuumSTgWdySf2OM8/jPSkFXVsdvNNoSjh0FhKq1myFILUeoIPHn/IcBdfseGWgkHV2WUzLpJNKTLbPxaLmnfCyQMkdTRXGPmhXvBNc4hinbTtANQQ1ePr7qq+4tghvBJx6pHBgmUqTcxxTor+t+8JmN3fzdSmvWgS90mrOHQ+XB jakace@gmail.com

20
fabfile.py vendored
View File

@ -16,6 +16,10 @@ def rydev():
env.hosts = ['ec2-107-21-211-134.compute-1.amazonaws.com']
env.user = 'ubuntu'
def fps_key_local():
""" """
pass
def update_prod():
"""Updates the production serve by running /opt/regluit/deploy/update-prod"""
with cd("/opt/regluit"):
@ -55,8 +59,18 @@ def ecdsa():
run("""ssh-keygen -f /etc/ssh/ssh_host_ecdsa_key.pub -l""")
def ssh_fingerprint():
"""display ssh fingerprint of /home/ubuntu/.ssh/id_rsa.pub on remote machine"""
run ("""ssh-keygen -l -f /home/ubuntu/.ssh/id_rsa.pub""")
"""display ssh fingerprint of /etc/ssh/ssh_host_rsa_key.pub on remote machine"""
run ("""ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub""")
def set_key_ry(name,value):
"""ry-dev is configured differently!"""
with cd("/home/ubuntu"):
run("""source /home/ubuntu/.virtualenvs/regluit/bin/activate; django-admin.py set_key {0} {1} --settings=regluit.settings.me""".format(name, value))
def set_key(name, value):
"""set encrypted key via the remote Django command -- works for web1, just, please"""
with cd("/opt/regluit"):
run("""source ENV/bin/activate; django-admin.py set_key {0} "{1}" --settings=regluit.settings.me""".format(name, value))
def ssh_fingerprint2():
# http://stackoverflow.com/a/6682934/7782
@ -73,7 +87,7 @@ def public_key_from_private_key():
def email_addresses():
"""list email addresses in unglue.it"""
with cd("/opt/regluit"):
run("""source ENV/bin/activate; echo "import django; print ', '.join([u.email for u in django.contrib.auth.models.User.objects.all() ]); quit()" | django-admin.py shell_plus --settings=regluit.settings.prod""")
run("""source ENV/bin/activate; echo "import django; print ', '.join([u.email for u in django.contrib.auth.models.User.objects.all() ]); quit()" | django-admin.py shell_plus --settings=regluit.settings.me""")
def selenium():
"""setting up selenium to run in the background on RY's laptop"""

View File

@ -3,6 +3,7 @@ from django import forms
from django.db import models
from django.contrib.auth.models import User
from django.conf import settings
from django.conf.global_settings import LANGUAGES
from django.core.validators import validate_email
from django.utils.translation import ugettext_lazy as _
from django.forms.widgets import RadioSelect
@ -21,6 +22,31 @@ import logging
logger = logging.getLogger(__name__)
class EditionForm(forms.ModelForm):
add_author = forms.CharField(max_length=500, required=False)
add_subject = forms.CharField(max_length=200, required=False)
isbn_13 = forms.RegexField(
label=_("ISBN"),
max_length=13,
regex=r'^97[89]\d\d\d\d\d\d\d\d\d\d$',
required = True,
help_text = _("13 digits, no dash."),
error_messages = {
'invalid': _("This value must be 13 digits, starting with 978 or 979."),
'required': _("Yes, we need an ISBN."),
}
)
language = forms.ChoiceField(choices=LANGUAGES)
description = forms.CharField( required=False, widget= forms.Textarea(attrs={'cols': 80, 'rows': 2}))
class Meta:
model = Edition
exclude = 'created', 'work'
widgets = {
'title': forms.TextInput(attrs={'size': 40}),
'add_author': forms.TextInput(attrs={'size': 30}),
'add_subject': forms.TextInput(attrs={'size': 30}),
}
class EbookForm(forms.ModelForm):
class Meta:
model = Ebook
@ -178,7 +204,7 @@ def getManageCampaignForm ( instance, data=None, *args, **kwargs ):
error_messages={'required': 'You must enter the email associated with your Paypal account.'},
)
target = forms.DecimalField( min_value= D(settings.UNGLUEIT_MINIMUM_TARGET), error_messages={'required': 'Please specify a target price.'} )
edition = forms.ModelChoiceField(get_queryset(), widget=RadioSelect(),empty_label='no edition selected')
edition = forms.ModelChoiceField(get_queryset(), widget=RadioSelect(),empty_label='no edition selected',required = False,)
minimum_target = settings.UNGLUEIT_MINIMUM_TARGET
latest_ending = (timedelta(days=int(settings.UNGLUEIT_LONGEST_DEADLINE)) + now()).date
@ -293,7 +319,6 @@ class CampaignAdminForm(forms.Form):
class EmailShareForm(forms.Form):
recipient = forms.EmailField(error_messages={'required': 'Please specify a recipient.'})
sender = forms.EmailField(widget=forms.HiddenInput())
subject = forms.CharField(max_length=100, error_messages={'required': 'Please specify a subject.'})
message = forms.CharField(widget=forms.Textarea(), error_messages={'required': 'Please include a message.'})
# allows us to return user to original page by passing it as hidden form input

View File

@ -8,6 +8,7 @@
{% url about as abouturl %}
{% url press as pressurl %}
{% url rh_admin as adminurl %}
{% url new_edition '' '' as editionurl %}
{% load truncatechars %}
<html>
@ -79,7 +80,7 @@
{% if is_preview %}
<div class="preview_top">
Welcome to the alpha version of Unglue.it. This site is a preview of our full functionality; some things (including pledging) aren't turned on yet. If something seems broken or confusing -- or if you find something you love! -- please give us <a href="/feedback">feedback</a>. Thank you for your interest, and have fun.
Welcome to the almost-beta version of Unglue.it. Want to help us with a test campaign? <a href="https://unglue.it/work/82028/">Here it is.</a> Please try to break it, and then send us <a href="/feedback">feedback</a>. Thank you! Real campaigns coming Thursday at noon. See you then.
</div>
{% endif %}
{% block topsection %}{% endblock %}
@ -107,6 +108,7 @@ Welcome to the alpha version of Unglue.it. This site is a preview of our full f
<li><a href="{{termsurl}}">Terms of Use</a></li>
{% if user.is_staff %}
<li><a href="{{adminurl}}">Unglue.it Administration</a></li>
<li><a href="{{editionurl}}">Create New Editions</a></li>
{% endif %}
</ul>
</div>

View File

@ -45,6 +45,7 @@ $j("#js-leftcol").ready(function() {
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,3 +1,4 @@
{% load humanize %}
{% with work.first_ebook as first_ebook %}
{% with work.last_campaign.supporters as supporters %}
{% with work.cover_image_thumbnail as thumbnail %}
@ -19,13 +20,13 @@
{% else %}{% if status == 'SUCCESSFUL' %}
<b>UNGLUED!</b>
<p><b>On:</b> {{ deadline|date:"M d, Y" }}</p>
<p><b>Raised:</b> {{ work.last_campaign.current_total }}</p>
<p><b>Raised:</b> {{ work.last_campaign.current_total|intcomma }}</p>
</div>
<div class="read_itbutton">{% if first_ebook %}<a href="{{ work.ebooks.0.url }}">{% endif %}Read it Now</a></div>
{% else %}{% if status == 'ACTIVE' %}
<b>UNGLUE IT!</b>
<p><b>${{ work.last_campaign.current_total }}</b> raised</p><p><b>${{ work.last_campaign.target }}</b> needed</p>
<p><b>${{ work.last_campaign.current_total|intcomma }}</b> raised</p><p><b>${{ work.last_campaign.target|intcomma }}</b> needed</p>
<p>by {{ deadline|date:"M d, Y" }}</p>
</div>
<div class="read_itbutton pledge"><a href="/pledge/{{work.id}}">Support</a></div>
@ -74,7 +75,11 @@
{% comment %}status of book vis-a-vis user's wishlist{% endcomment %}
{% if works and activetab %}
<div class="moreinfo add-wishlist">
<span id="p{{ googlebooks_id }}">Add&nbsp;to&nbsp;Wishlist</span>
{% if on_search_page %}
<span class="gb_id" id="p{{ googlebooks_id }}">Add&nbsp;to&nbsp;Wishlist</span>
{% else %}
<span class="work_id" id="p{{ work.id }}">Add&nbsp;to&nbsp;Wishlist</span>
{% endif %}
</div>
{% else %}
{% if request.user.id in supporters %}
@ -96,7 +101,11 @@
</div>
{% else %}
<div class="moreinfo add-wishlist">
<span id="p{{ googlebooks_id }}">Add&nbsp;to&nbsp;Wishlist</span>
{% if on_search_page %}
<span class="gb_id" id="p{{ googlebooks_id }}">Add&nbsp;to&nbsp;Wishlist</span>
{% else %}
<span class="work_id" id="p{{ work.id }}">Add&nbsp;to&nbsp;Wishlist</span>
{% endif %}
</div>
{% endif %}{% endif %}{% endifequal %}{% endif %}{% endif %}
@ -130,13 +139,17 @@
</div>
{% else %}
<div class="listview panelfront side1 add-wishlist">
<span id="l{{ googlebooks_id }}">Add to Wishlist</span>
{% if on_search_page %}
<span class="gb_id" id="l{{ googlebooks_id }}">Add to Wishlist</span>
{% else %}
<span class="work_id" id="l{{ work.id }}">Add to Wishlist</span>
{% endif %}
</div>
{% endif %}{% endif %}{% endifequal %}{% endif %}
<div class="listview panelfront side1 booklist-status">
{% if not is_preview %}
{% ifequal status "ACTIVE" %}
<span class="booklist-status-text" style="width: 190px"><b>${{ work.last_campaign.current_total }}</b> raised of <b>${{ work.last_campaign.target }}</b> goal</span>
<span class="booklist-status-text" style="width: 190px"><b>${{ work.last_campaign.current_total|intcomma }}</b> raised of <b>${{ work.last_campaign.target|intcomma }}</b> goal</span>
{% else %}{% if status == "INITIALIZED" %}
<span class="booklist-status-label">Status:&nbsp;</span><span class="booklist-status-text">Coming soon!</span>
{% else %}

View File

@ -1,4 +1,5 @@
{% extends "base.html" %}
{% load humanize %}
{% url privacy as privacyurl %}
{% block extra_head %}
@ -24,7 +25,7 @@
<h2>Campaign: {{campaign.name}}</h2>
<!-- url for work: -->
<p>Work: <a href="{% url work work_id=campaign.work.id %}">{{campaign.work}}</a></p>
<p>Target: {{campaign.target}}</p>
<p>Target: {{campaign.target|intcomma}}</p>
<p>Deadline: {{campaign.deadline}}</p>
<p>Status: {{campaign.status}}</p>
<p>ISBN: {{campaign.work.first_isbn_13}} </p>
@ -32,7 +33,7 @@
<p>Embed a widget:</p>
<textarea rows="2" cols="80">&lt;iframe src="{{base_url}}/api/widget/{{campaign.work.first_isbn_13}}/" width="152" height="325" frameborder="0"&gt;</iframe></textarea>
<p>PayPal receiver: {{campaign.paypal_receiver}}</p>
<p>Current total (pledged/authorized): {{campaign.current_total}}</p>
<p>Current total (pledged/authorized): {{campaign.current_total|intcomma}}</p>
<form method="POST" action="{% url campaign_by_id pk=campaign.id %}" onsubmit="test()">
{% csrf_token %}
{{form.as_p}}

View File

@ -100,7 +100,6 @@ location.hash = "#2";
{% endwith %}{% endwith %}{% endwith %}{% endwith %}
</div>
{% endfor %}
<br>
<div class="pagination content-block-heading tabs-1">
{% get_pages %}
{% for page in pages %}

View File

@ -0,0 +1,4 @@
I just pledged to unglue one of my favorite books, "{{ work.title }}", on Unglue.it:
https://{{site}}{% url work work.id %}.
If enough of us pledge to unglue this book, the creator will be paid and the ebook will become free to everyone on earth. Will you join me?

View File

@ -0,0 +1,3 @@
I'm ungluing books on Unglue.it.
Together we're paying creators and making ebooks free to everyone on earth. Join me! https://unglue.it/

View File

@ -0,0 +1,4 @@
Help me unglue one of my favorite books, "{{ work.title }}" on Unglue.it:
https://{{site}}{% url work work.id %}
If enough of us pledge to unglue this book, the creator will be paid and the ebook will become free to everyone on earth.

View File

@ -0,0 +1,4 @@
Help me unglue one of my favorite books, "{{ work.title }}" on Unglue.it:
https://{{site}}{% url work work.id %}
If enough of us wishlist this book, Unglue.it may start a campaign to pay the creator and make the ebook free to everyone on earth.

View File

@ -7,7 +7,7 @@
<dl>
<dt class="background: #8dc63f; color: white; font-weight: bold;">Help! My question isn't covered in the FAQs!</dt>
<dd>Please email us at <a href="mailto:support@gluejar.com">support@gluejar.com</a>. Especially during our alpha phase, we want to make sure everything on the site runs as smoothly as possible. Thanks for helping us do that.</dd>
<dd>Please email us at <a href="mailto:support@gluejar.com">support@gluejar.com</a>. We want to make sure everything on the site runs as smoothly as possible. Thanks for helping us do that.</dd>
</dl>
{% if location == 'basics' or location == 'faq' %}
<h3>Basics</h3>
@ -16,7 +16,7 @@
<dl>
<dt>What is Unglue.it?</dt>
<dd><a href="/">Unglue.it</a> is a a place for individuals and institutions to join together to give their favorite ebooks to the world. We work with rights holders to decide on fair compensation for releasing a free, legal edition of their traditionally published books, under <a href="http://creativecommons.org">Creative Commons</a> licensing. Then everyone chips in to raise that sum. When the threshold is reached, we pay the rights holders; they issue an unglued digital edition; and you're free to read and share it, with everyone, on the device of your choice, worldwide.</dd>
<dd><a href="/">Unglue.it</a> is a a place for individuals and institutions to join together to give their favorite ebooks to the world. We work with rights holders to decide on fair compensation for releasing a free, legal edition of their already-published books, under <a href="http://creativecommons.org">Creative Commons</a> licensing. Then everyone pledges toward that sum. When the threshold is reached (and not before), we collect the pledged funds and we pay the rights holders. They issue an unglued digital edition; you're free to read and share it, with everyone, on the device of your choice, worldwide.</dd>
<a id="crowdfunding"></a><dt>What is Crowdfunding?</dt>
@ -26,7 +26,7 @@ In other words, crowdfunding is working together to support something you love.
<dt>What does it cost?</dt>
<dd>Unglue.it is free to join. Most of the things you can do here -- discovering books, adding them them to your wishlist, commenting, sharing -- are free too. If you choose to support a campaign, you may pledge whatever amount you're comfortable with.<br /><br />
<dd>Unglue.it is free to join. Most of the things you can do here -- discovering books, adding them them to your wishlist, commenting, sharing -- are free too. If you choose to support a campaign, you may pledge whatever amount you're comfortable with. Your credit card will only be charged if the campaign reaches its goal price.<br /><br />
If you're a rights holder, starting campaigns is free, too. You only pay Unglue.it if your campaign succeeds. For the basics on campaigns, see the FAQ on <a href="/faq/campaigns/">Campaigns</a>; for more details, see the <a href="/faq/rightsholders/">FAQ for Rights Holders</a>.</dd>
@ -38,11 +38,9 @@ To fund a campaign, you'll need a valid credit card. To start a campaign, you'l
<dt>Does Unglue.it own the copyright of unglued books?</dt>
<dd>No. When you unglue a book, the copyright stays with its current owner.<br /><br />
<dd>No. When you unglue a book, the copyright stays with its current owner. A <a href="http://creativecommons.org">Creative Commons</a> license is a licensing agreement. As with other licensing agreements, it grants certain rights to others but does not affect the status of the copyright.<br /><br />
Ungluing involves licensing rights, just like traditional publishing transactions. We use <a href="http://creativecommons.org">Creative Commons</a> licenses to make ebooks available to the world while respecting and protecting copyright.<br /><br />
If you are a copyright holder, you will retain your copyright when you unglue a book. CC licenses are non-exclusive, so you also retain the right to enter into separate licensing agreements. You can read more about these licenses at the <a href="http://wiki.creativecommons.org/Frequently_Asked_Questions">Creative Commons FAQ</a>.</dd>
Therefore, if you are a copyright holder, you retain your copyright when you unglue a book. Creative Commons licenses are non-exclusive, so you also retain the right to enter into separate licensing agreements. This means you may still, if you have the rights, sell print and electronic versions of your work and license derivative works such as translations and films. You can read more about these licenses at the <a href="http://wiki.creativecommons.org/Frequently_Asked_Questions">Creative Commons FAQ</a>.</dd>
<dt>If I'm a rights holder and I unglue my book, does that mean I can never make money from it again?</dt>
@ -52,32 +50,39 @@ For some examples of how authors and publishers have made free ebooks work for t
<dt>Why do rights holders want to unglue their books?</dt>
<dd>Lots of reasons! Unglued ebooks may be part of a marketing strategy to publicize other books or increase the value of an author's brand. Or they may be books that are no longer selling through conventional channels, and ungluing them is a low-risk way to get some extra value out of them. Or ungluing provides a simple digital strategy that pays for itself. Or the books may have been written to advance a cause, add to the public conversation, or increase human knowledge. Or maybe the author wants to leave a legacy that enriches everyone, now and in the future. After all, books succeed by having readers.</dd>
<dd>
Lots of reasons:<br /><br />
To publicize their other books, gain new fans, or otherwise increase the value of an author's brand.<br /><br />
To get income from books that are no longer in print.<br /><br />
To have a digital strategy that pays for itself, even if they don't have expertise in producing ebooks.<br /><br />
To advance a cause, add to the public conversation, or increase human knowledge.<br /><br />
To leave a legacy that enriches everyone, now and in the future.
</dd>
<dt>Does Unglue.it publish books? Can I self-publish here?</dt>
<dd>No. Unglue.it dedicated to licensing works to the public commons, not publishing them or owning rights. We work for books that have been published in other ways. We are NOT a publisher ourselves.</dd>
<dd>No. Unglue.it dedicated to licensing works to the public commons, not publishing them or owning rights. We work for books that have been published in other ways. We are not a publisher ourselves.</dd>
<dt>What's a rights holder? How can I tell if I'm one?</dt>
<dd>A rights holder is the person (or entity) that holds the legal right to copy, distribute, or sell a book in some way. There may be one entity with all the rights to a work, or the rights may be split up among different entities: for example, one who publishes the print edition in the United States, another who publishes the print edition in the EU, another who holds electronic rights, et cetera. For ungluing purposes, the rights holder is an entity who has uncontested worldwide commercial rights to a work.<br /><br />
<dd>A rights holder is the person (or entity) that holds the legal right to copy, distribute, or sell a book in some way. There may be one entity with all the rights to a work, or the rights may be split up among different entities: for example, one who publishes the print edition in the United States, another who publishes the print edition in the EU, another who holds electronic rights, et cetera. For ungluing purposes, the rights holder is the entity who has uncontested worldwide commercial rights to a work.<br /><br />
If you have written a book and not signed any contracts about it, you hold all the rights. If you have signed a contract with a publisher to produce, distribute, publish, or sell your work in a particular format or a particular territory, whether or not you still hold rights depends on the language of that contract. We encourage you to check your contracts. It may be in your interest to explore launching an Unglue.it campaign jointly with your publisher.<br /><br />
If you haven't written a book but you have had business or family relationships with someone who has, it's possible that you are a rights holder (for instance, you may have inherited rights from the author's estate, or your company may have acquired them during a merger). Again, this all depends on the specific language of your contracts. We encourage you to read them closely. Unglue.it cannot provide legal advice.<br /><br />
If you believe you are a rights holder and would like to discuss ungluing your works, please contact us at <a href="mailto:rights@gluejar.com">rights@gluejar.com</a>.</dd>
<dt>I know a book that should be unglued.</dt>
<dd>Great! Find it in our database (using the search box above) and add it to your wishlist, so we know it should be on our list, too. You can also contact us at <a href="mailto:rights@gluejar.com">rights@gluejar.com</a></dd>
<dd>Great! Find it in our database (using the search box above) and add it to your wishlist, so we know it should be on our list, too. And encourage your friends to add it to their wishlists. The more wishlists a book is on, the more appealing it is for rights holders to launch an ungluing campaign. You can also contact us at <a href="mailto:rights@gluejar.com">rights@gluejar.com</a>.</dd>
<dt>I know a book that should be unglued, and I own the commercial rights.</dt>
<dd>Fabulous! Please refer to the FAQ <a href="/faq/rightsholders/">for Rights Holders</a> and then contact us at <a href="mailto:rights@gluejar.com">rights@gluejar.com</a>.</dd>
<dd>Fabulous! Please refer to the <a href="/faq/rightsholders/">FAQ for Rights Holders</a> and then contact us at <a href="mailto:rights@gluejar.com">rights@gluejar.com</a>. Let's talk.</dd>
<dt>Is there a widget that can be put on my own site to share my favorite books or campaigns?</dt>
<dd>Yes! Every book page has an "Embed" option. Click that and copy/paste the HTML code wherever you like.</dd>
<dt>What is Open Access or Creative Commons versus PD?</dt>
<dt>What is Open Access versus Creative Commons versus public domain?</dt>
<dd>Eric Hellman has written a series of articles about how Open Access can apply to ebooks. The first is <a href="http://go-to-hellman.blogspot.com/2011/04/open-access-ebooks-part-1.html">on his blog</a>.</dd>
</dl>
{% endif %}
@ -86,7 +91,7 @@ If you believe you are a rights holder and would like to discuss ungluing your w
<dl>
<dt>I forgot my password. What do I do?</dt>
<dd>
There's a <a href="/accounts/password/reset/">forgot your password</a> link at the bottom of the <a href="/accounts/login/">sign in page</a>. Enter the email address you use for your account and we'll send you an email to help you reset your password.
Click on this <a href="/accounts/password/reset/">forgot your password</a> link (you can also find it at the bottom of the <a href="/accounts/login/">sign in page</a>). Enter the email address you use for your account and we'll send you an email to help you reset your password.
</dd>
<dt>I never received an activation email after I signed up, or my activation email isn't working. What do I do?</dt>
@ -94,40 +99,36 @@ There's a <a href="/accounts/password/reset/">forgot your password</a> link at t
<dt>How do I connect my Twitter, Facebook, GoodReads, and/or LibraryThing accounts? How can I link to my personal web site?</dt>
<dd>Click on "My Profile" near the top of your user profile page. (If you're logged in, your profile page is <a href="/">here</a>.) Some new options will appear. You can enter your personal URL and your LibraryThing username here. There are one-click options to connect your Twitter, Facebook, and GoodReads accounts. (You'll be asked to log in to those accounts, if you aren't logged in already.) Make sure to click on "Save Settings".</dd>
<dd>Click on "My Profile" near the top of your user profile page. (If you're logged in, your profile page is <a href="/">here</a>.) Some new options will appear. You can enter your personal URL and your LibraryThing username here. There are one-click options to connect your Twitter, Facebook, and GoodReads accounts. (You'll be asked to log in to those accounts, if you aren't logged in already.) Make sure to click "Save Settings".</dd>
<dt>Why should I connect those accounts?</dt>
<dd>If you connect your Facebook or Twitter accounts, we'll use your user pics from those sites for your avatar here. If you connect LibraryThing or GoodReads, you can import your books there onto your wishlist here, using the My Profile area. And we'll display book-specific and you-specific links to those sites for you.</dd>
<dd>If you connect your Facebook or Twitter accounts, we'll use your user pics from those sites for your avatar here. If you connect to LibraryThing or GoodReads, you can import your books there onto your wishlist here, using the My Profile area. And we'll display book-specific and you-specific links to those sites for you.</dd>
<dt>I don't want to connect my accounts. Do I have to?</dt>
<dd>Nope.</dd>
<dt>How can I change my profile name or password?</dt>
<dt>How can I change my profile name or password, or the email address associated with my account?</dt>
<dd>At the bottom of every page there's a link to an <a href="/accounts/edit/">account editing page</a> where you can change your profile name and password.</dd>
<dd>At the bottom of every page there's a link to an <a href="/accounts/edit/">account editing page</a> where you can change your profile name, password, and email.</dd>
{% comment %}
We have no functionality for these at this time. Should we?
<dt>How can I change the email address associated with my account?</dt>
<dd>TBA</dd>
We have no functionality for this at this time. Should we?
<dt>How do I delete my account?</dt>
<dd>TBA</dd>
{% endcomment %}
<dt>How do I unsubscribe from or adjust which emails I receive?</dt>
<dt>How do I subscribe to, or unsubscribe from, emails I receive from Unglue.it?</dt>
<dd>We're in the process of building out our notification system, including ways for you to control which notifications you receive, but we haven't finished that yet.<br /><br />
<dd>Make sure you're logged in and go to the <a href="/notification/settings">Notification Settings</a> page.<br /><br />
If you receive our newsletter, there's a link at the bottom of every message to manage your preferences. If you don't and would like to, you can <a href="http://eepurl.com/fKLfI">sign up here</a>.
</dd>
<dt>Is my personal information shared?</dt>
<dd>Short version: no. You may share information with Rights Holders so they can deliver premiums to you, but this is not required. For the long version, please read our <a href="/privacy/">privacy policy</a>.
<dd>Short version: no. You may share information with Rights Holders so they can deliver premiums to you, but this is not required. We do use third-party providers to support some of our business functions, but they are only allowed to use your information in order to enable your use of the service. For the long version, please read our <a href="/privacy/">privacy policy</a>.
</dl>
{% endif %}
{% if sublocation == 'company' or sublocation == 'all' %}
@ -135,11 +136,11 @@ If you receive our newsletter, there's a link at the bottom of every message to
<dl>
<dt>How can I contact Unglue.it?</dt>
<dd>For support requests, <a href="mailto:support@gluejar.com">support@gluejar.com</a>. For general inquiries, use our Ask Questions Frequently account, <a href="mailto:aqf@gluejar.com">aqf@gluejar.com</a>. For rights inquiries, <a href="mailto:rights@gluejar.com">rights@gluejar.com</a>.</dd>
<dd>For support requests, <a href="mailto:support@gluejar.com">support@gluejar.com</a>. For general inquiries, use our Ask Questions Frequently account, <a href="mailto:aqf@gluejar.com">aqf@gluejar.com</a>. For rights inquiries, <a href="mailto:rights@gluejar.com">rights@gluejar.com</a>. Media requests, <a href="mailto:press@gluejar.com">press@gluejar.com</a></dd>
<dt>Who is Unglue.it?</dt>
<dd>We are a small group that believes strongly that ebooks can make the world richer in new and diverse ways, and that we all benefit from the hard work of their creators. We come from the worlds of entrepreneurship, linked data, physics, publishing, education, and library science, to name a few. You can learn more about us at our personal home pages (linked above) or <a href="http://gluejar.com/team">the team page</a> of our corporate site.</dd>
<dd>We are a small group that believes strongly that ebooks can make the world richer in new and diverse ways, and that we all benefit from the hard work of their creators. We come from the worlds of entrepreneurship, linked data, physics, publishing, education, and library science, to name a few. You can learn more about us at our <a href="/about">about page</a> or our Unglue.it supporter profiles: <a href="{% url supporter 'eric' %}">Eric Hellman</a>, <a href="{% url supporter 'AmandaM' %}">Amanda Mecke</a>, <a href="{% url supporter 'rdhyee' %}">Raymond Yee</a>, and <a href="{% url supporter 'andromeda' %}">Andromeda Yelton</a>.</dd>
<dt>Are you a non-profit company?</dt>
@ -147,7 +148,7 @@ If you receive our newsletter, there's a link at the bottom of every message to
<dt>Why does Unglue.it exist?</dt>
<dd>Because legal stickiness means you can't reliably lend or share your ebooks, borrow them from the library, or read them on the device of your choice. Because -- like public radio -- ebooks are expensive to create but cheap to distribute, so covering their fixed costs and reasonable profit up front can be an appealing system for authors, publishers, readers, and libraries. Because we all have books we love so much we'd like to give them to the world.</dd>
<dd>Because legal stickiness means you can't reliably lend or share your ebooks, borrow them from the library, or read them on the device of your choice. Because -- like public radio -- ebooks are expensive to create but cheap to distribute, so covering their fixed costs and reasonable profit up front can be an appealing system for authors, publishers, readers, and libraries. Because we all have books we love so much we want to give them to the world.</dd>
</dl>
{% endif %}
{% endif %}
@ -167,7 +168,7 @@ These need to be put in proper order. Also this should be broken down into the
<dt>How can I claim a work for which I am the rights holder?</dt>
<dd>On every book page there is a Details tab. If you have a signed Platform Services Agreement on file, one of the options on the Details tab will be "Claim This Work". If you represent more than one rights holder, choose the correct one for this work and click "Claim".<br /><br />If you expect to see that and do not, either we do not have a PSA from you yet, or we have not yet verified and filed it. Please contact us at <a href="mailto:rights@gluejar.com">rights@gluejar.com</a>.</dd>
<dd>On every book page there is a Rights tab. If you have a signed Platform Services Agreement on file, one of the options on the Rights tab will be "Claim This Work". If you represent more than one rights holder, choose the correct one for this work and click "Claim".<br /><br />If you expect to see that and do not, either we do not have a PSA from you yet, or we have not yet verified and filed it. Please contact us at <a href="mailto:rights@gluejar.com">rights@gluejar.com</a>.</dd>
<dt>Why should I claim my works?</dt>
@ -190,11 +191,11 @@ If you want to find an interesting campaign and don't have a specific book in mi
<dl>
<dt>Can a campaign be edited after launching?</dt>
<dd>Yes. In fact, rights holders are encouraged to update their supporters about the progress of the campaign. (For an example of exceptionally successful updates, check out <a href="http://www.kickstarter.com/projects/599092525/the-order-of-the-stick-reprint-drive/posts">Rich Burlew's Kickstarter campaign</a>, which grossed over a million dollars, in part because of his frequent and creative communication and improvements to the rewards being offered.) Note that the campaign's deadline cannot be changed and its threshold may not be increased.</dd>
<dd>Yes. In fact, rights holders are encouraged to update their supporters about the progress of the campaign. (For an example of exceptionally successful updating, check out <a href="http://www.kickstarter.com/projects/599092525/the-order-of-the-stick-reprint-drive/posts">Rich Burlew's Kickstarter campaign</a>, which grossed over a million dollars, in part because of his frequent and creative communication and improvements to the rewards being offered.) Note that the campaign's deadline cannot be changed and its threshold may not be increased, though it may be lowered.</dd>
<dt>Can campaigns be edited after funding is completed?</dt>
<dd>Yes. Again, while the deadline and threshold cannot be changed, rights holders are encouraged to add thank-you messages for supporters and update them on the progress of ebook conversion (if needed).</dd>
<dd>Yes. Again, while the deadline cannot be changed and the threshold cannot be increased, rights holders are encouraged to add thank-you messages for supporters and update them on the progress of ebook conversion (if needed).</dd>
<dt>What is a campaign page?</dt>
@ -204,17 +205,17 @@ If you want to find an interesting campaign and don't have a specific book in mi
{% if sublocation == 'supporting' or sublocation == 'all' %}
<h4>Supporting Campaigns</h4>
<dl>
<dt>How do I pledge? Do I need a PayPal account?</dt>
<dt>How do I pledge? Do I need an Amazon account?</dt>
<dd>There's a Support button on all campaign pages, or you can just click on the premium you'd like to receive. You'll be asked to select your premium and specify your pledge amount, and then you'll be taken to PayPal to complete the transaction. While you may certainly use your PayPal account if you have one, you do not need one; you can use your credit card normally.</dd>
<dd>There's a Support button on all campaign pages, or you can just click on the premium you'd like to receive. You'll be asked to select your premium and specify your pledge amount, and then you'll be taken to Amazon to complete the transaction. While you may certainly use your Amazon account if you have one, you do not need one; you can use your credit card normally.</dd>
<dt>When will I be charged?</dt>
<dd>In most cases, your account will be charged by the end of the next business day after the success of a campaign. If a campaign doesn't succeed, you won't be charged.</dd>
<dd>In most cases, your account will be charged by the end of the next business day after a campaign succeeds. If a campaign doesn't succeed, you won't be charged.</dd>
<dt>What if I want to change or cancel a pledge?</dt>
<dd>You can modify your pledge by going to the book's page and clicking on the "Change Pledge" button. (The "Support" button you clicked on to make a pledge is replaced by the "Change Pledge" button after you pledge.)</dd>
<dd>You can modify your pledge by going to the book's page and clicking on the "Modify Pledge" button. (The "Support" button you clicked on to make a pledge is replaced by the "Modify Pledge" button after you pledge.)</dd>
<dt>What happens to my pledge if a campaign does not succeed?</dt>
@ -258,7 +259,7 @@ Rights holders are encouraged to offer additional premiums to engage supporters'
<dt>Is there a minimum or maximum for how much a premium can cost?</dt>
<dd>There's a $1 minimum and a $2000 maximum (this is the largest transaction we can authorize through PayPal).</dd>
<dd>There's a $1 minimum and a $2000 maximum (due to transaction size limits imposed by our payment processor).</dd>
</dl>
{% endif %}
{% endif %}
@ -277,13 +278,17 @@ What does this mean for you? If you're a book lover, you can read unglued ebook
Unglued ebooks are a win-win solution for readers, libraries, and authors, publishers.
</dd>
<dt>Is the unglued ebook edition the same as one of the existing editions?</dt>
<dd>Not necessarily. Sometimes the existing editions include content that we can't get the rights to include in the unglued ebook, especially cover art or illustrations. Sometimes the unglued ebook edition will have improvements, like copy-editing fixes or bonus features. These differences, if any, will be specified in the Rights tab of the campaign page. In addition, all unglued ebooks include acknowledgements of supporters and information on their Creative Commons license.</dd>
<dt>How much does a book cost?</dt>
<dd>The author or publisher set a price for giving 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>
<dd>The author or publisher sets a price for giving 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>Will Unglue.it have campaigns for all kinds of books?</dt>
<dd>Yes. You choose what books to wishlist and what books to support. Your passion will drive the campaigns. We aim to host campaigns for diverse subjects genres, from romance novels to poetry, from history to medicine, from the lectures of famous scentists to your favorite chapter book when you were 8 years old.</dd>
<dd>Yes. You choose what books to wishlist and what books to support. Your passion will drive the campaigns. We aim to host campaigns for diverse subjects and genres, from romance novels to poetry, from history to medicine, from the lectures of famous scentists to your favorite chapter book when you were 8 years old.</dd>
<dt>Will you raise money for books already for sale as an ebook?</dt>
@ -305,23 +310,24 @@ Unglued ebooks are a win-win solution for readers, libraries, and authors, publi
{% if sublocation == 'using' or sublocation == 'all' %}
<h4>Using Your Unglued Ebook</h4>
<dl>
<dt>What can I do, legally, with an unglued ebook? What can I NOT do?</dt>
<dd>All unglued ebooks are released under a Creative Commons license. Unless otherwise specified for specific books, we use the <a href="creativecommons.org/licenses/by-nc-nd/3.0/">Creative Commons Attribution-NonCommercial-NoDerivatives license (CC BY-NC-ND) license</a>. The specific Creative Commons license is chosen by the rights holder. <br /><br />
<dt>What can I do, legally, with an unglued ebook? What can I <I>not</I> do?</dt>
<dd>All unglued ebooks are released under a Creative Commons license. Unless otherwise indicated for specific books, we use the <a href="creativecommons.org/licenses/by-nc-nd/3.0/">Creative Commons Attribution-NonCommercial-NoDerivatives license (CC BY-NC-ND) license</a>. The rights holder chooses which Creative Commons license to apply.<br /><br />
This means that you <b>can</b>: make copies; keep them for as long as you like; shift them to other formats (like .mobi or PDF); share them with friends or on the internet; download them for free.<br /><br />
Creative Commons licenses mean that you <b>can</b>: make copies; keep them for as long as you like; shift them to other formats (like .mobi or PDF); share them with friends or on the internet; download them for free.<br /><br />
Under NC (non-commercial) licenses, you <b>cannot</b>: sell them, or otherwise use them commercially, without permission from the rights holder.<br /><br />
Under NC (non-commercial) licenses, you <b>cannot</b>: sell unglued ebooks, or otherwise use them commercially, without permission from the rights holder.<br /><br />
Under ND (no derivatives) licenses, you <b>cannot</b>: make derivative works, such as translations or movies, without permission from the rights holder; <br /><br />
Under all CC licenses, you <b>cannot</b>: remove the author's name from the book, or otherwise pass it off as someone else's work; or remove or change the CC license.</dd>
Under all CC licenses (except CC0), you <b>cannot</b>: remove the author's name from the book, or otherwise pass it off as someone else's work; or remove or change the CC license.</dd>
<dt>What does non-commercial mean under Creative Commons?</dt>
<dd>Creative Commons doesn't define "commercial" very well. So as part of the Unglue.it process, ungluing rights holders agree that "For purposes of interpreting the CC License, Rights Holder agrees that 'non-commercial' use shall include, without limitation, distribution by a commercial entity without charge for access to the Work."</dd>
<dd>Creative Commons doesn't define "commercial" thoroughly (though it's worth reading what <a href="http://wiki.creativecommons.org/FAQ#Does_my_use_violate_the_NonCommercial_clause_of_the_licenses.3F">they have to say on the topic</a>). So as part of the Unglue.it process, ungluing rights holders agree that "For purposes of interpreting the CC License, Rights Holder agrees that 'non-commercial' use shall include, without limitation, distribution by a commercial entity without charge for access to the Work."<br /><br />
Unglue.it can't provide legal advice about how to interpret Creative Commons licenses, and we encourage you to read about the licenses yourself and, if necessary, seek qualified legal advice.</dd>
<dt>Are the unglued ebooks compatible with my device? Do I need to own an ereader, like a Kindle or a Nook, to read them?</dt>
<dd>Unglued ebooks are distributed with NO DRM, so they'll work on Kindle, iPad, Kobo, Nook, Android, Mac, Windows, Linux... you get the idea. Whether you have an ereader, a tablet, a desktop or laptop computer, or a smartphone, there are reading apps that work for you. Ebook editions issued through unglue.it will be available in EPUB, MOBI, and/or PDF to make it easy for you. If the format available today don't work in the future, anyone will be able to shift unglued books to a formats that will continue to work for our chldren's children. </dd>
<dd>Unglued ebooks are distributed with NO DRM, so they'll work on Kindle, iPad, Kobo, Nook, Android, Mac, Windows, Linux... you get the idea. Whether you have an ereader, a tablet, a desktop or laptop computer, or a smartphone, there are reading apps that work for you. Ebook editions issued through Unglue.it will be available in ePub format. If this format doesn't work for you, today or in the future, you are welcome to shift unglued books to one that does, and to copy and distribute it in that format.</dd>
<dt>Do I need to have a library card to read an unglued ebook?</dt>
@ -329,7 +335,7 @@ Under all CC licenses, you <b>cannot</b>: remove the author's name from the boo
<dt>How long do I have to read my unglued book? When does it expire?</dt>
<dd>It doesn't! You may keep it as long as you like. There's no need to return it, and it won't stop working after some deadline.</dd>
<dd>It doesn't! You may keep it as long as you like. There's no need to return it, and it won't stop working after some deadline. You own it.</dd>
<dt>I love my unglued ebook and I want to loan it to my friends. Can I?</dt>
@ -338,7 +344,7 @@ Just don't sell, adapt, or abridge it without checking the license. All unglued
<dt>Will I be able to dowload an unglued ebook directly from Unglue.it?</dt>
<dd>Unglue.it will provide links to places where you can find unglued and public domain ebooks. We will not host them ourselves. We encourage you to look for them at bookstores, libraries, literary blogs, social reading sites, and all kinds of places people go to read and talk about books. You don't need our permission to host a free unglued ebook on your own site.</dd>
<dd>Unglue.it will provide links to places where you can find unglued and public domain ebooks (look at the book's page for specifics). We will not host them ourselves. We encourage you to look for them at bookstores, libraries, literary blogs, social reading sites, and all kinds of places people go to read and talk about books. You don't need our permission to host a free unglued ebook on your own site.</dd>
</dl>
{% endif %}
{% if sublocation == 'copyright' or sublocation == 'all' %}
@ -354,13 +360,13 @@ Just don't sell, adapt, or abridge it without checking the license. All unglued
Unglue.it signs agreements assuring the copyright status of every work we unglue, so you can be confident when reading and sharing an unglued ebook.</dd>
<dt>Unglue.it lists a book that I know is already CC licensed or available in the public domain. How can I get the link included?</dt>
<dt>Unglue.it lists a book that I know is already Creative Commons licensed or available in the public domain. How can I get the link included?</dt>
<dd>If you are logged in to Unglue.it, the "Details" page for every work lists the edition we know about. There a link for every edition that you can use to tell us about CC or public domain douwnloads.</dd></dl>
<dd>If you are logged in to Unglue.it, the "Rights" page for every work lists the edition we know about. There a link for every edition that you can use to tell us about Creative Commons or public domain downloads. We do require that these books be hosted at certain known, reputable repositories: Internet Archive, Wikisources, Hathi Trust, Project Gutenberg, or Google Books.</dd></dl>
{% endif %}
{% endif %}
{% if location == 'rightsholders' %}
{% if location == 'rightsholders' or location == 'faq' %}
<h3>For Rights Holders</h3>
{% if sublocation == 'authorization' or sublocation == 'all' %}
<h4>Becoming Authorized</h4>
@ -385,7 +391,7 @@ Unglue.it signs agreements assuring the copyright status of every work we unglue
<dd>Yes! It's entirely up to you. Each Campaign is for a individual title and a separate fundraising goal.</dd>
<dt>Can raise any amount of money I want?</dt>
<dt>Can I raise any amount of money I want?</dt>
<dd>You can set any goal that you want in a Campaign. Unglue.it cannot guarantee that a goal will be reached.</dd>
@ -398,11 +404,11 @@ We strongly encourage you to include video. You can upload it to YouTube and em
<dt>What should I offer as premiums?</dt>
<dd>In addition to the required set of Unglue.it premiums, you're encouraged to sweeten the deal for your supporters by offering special premiums. Think about things that uniquely represent yourself or the work, that are appealing, and that you can deliver quickly and within your budget. For example, authors could consider offering skype sessions as premiums for libraries or schools that might want to plan an event around the unglued book.</dd>
{% comment %}
<dt>What can be offered as a premium? What items are prohibited as premiums?</dt>
<dd>TBA</dd>
{% endcomment%}
<dd>You can offer anything you are capable of delivering, so long as it is not illegal or otherwise restricted in the United States. For instance, your premiums may not include alcohol, drugs, or firearms. For full details, consult our <a href="/terms/">Terms of Use</a>.</dd>
<dt>Who is responsible for making sure a rights holder delivers premiums?</dt>
<dd>The rights holder.</dd>
@ -432,19 +438,20 @@ We strongly encourage you to include video. You can upload it to YouTube and em
<dd>We're developing a social media toolkit for rights holders. Please tell us what you think should be in it so we can serve you better: <a href="mailto:support@gluejar.com">support@gluejar.com</a>. In the meantime we're happy to help you one-on-one, at the same address.</dd>
<dt>Can I contact my supporters directly?</dt>
<dd>We will not provide you contact information, except as needed to fulfill premiums after successful campaigns. Supporters may voluntarily disclose certain contact information (such as Twitter handles) on their profile pages. We encourage you to be thoughtful in your use of this information. Supporters have likely provided it as a way to connect with other like-minded people, not as a marketing tool, so please engage with it in that spirit.</dd>
<dd>We will not provide you contact information, except as needed to fulfill premiums after successful campaigns. Supporters may voluntarily disclose certain contact information (such as Twitter handles) on their profile pages. We encourage you to be thoughtful in your use of this information. Supporters have likely provided it as a way to connect with other like-minded people, not as a marketing tool, so please engage with it in that spirit.<br /><br />
If you are running a campaign, any updates to that campaign will be automatically emailed to your supporters, unless they have opted out of receiving those notifications. We encourage you to use campaign page updates to engage and recognize your supporters.</dd>
<dt>How do I get feedback from supporters or fans about my campaign?</dt>
<dd>Ask them!<br /><br />
Also, pay attention to places they're talking about your campaign. This might be the Comments tab, a hashtag on Twitter, the comments section of your blog, a forum on your web site, your Facebook page, et cetera. Read these spaces regularly to see what people are saying, and to participate in the conversation.</dd>
Also, pay attention to places they're talking about your campaign. This might be the Comments tab, a hashtag on Twitter, the comments section of your blog, a forum on your web site, your Facebook page, et cetera. You can use your campaign pitch to point them to these spaces, too. Read them regularly to see what people are saying, and to participate in the conversation.</dd>
<dt>How do I share my campaign?</dt>
<dd>On every campaign page, you can generate a widget that you can embed wherever you like. There are also links to share the page via email and social networks.<br /><br />
<dd>On every campaign page, you can generate an HTML widget that you can embed wherever you like. It will automatically be updated with your campaign's progress. There are also links to share the page via email and social networks. <br /><br />
Have other ways you want to share? Your own blog, newsletter, or social media presence? Your friends, and their friends? Media contacts? Go for it!<br /><br />
Have other ways you want to share? Your own blog, newsletter, or social media presence? Your friends, and their friends? Professional associations? Media contacts? Go for it!<br /><br />
Need more ideas? We're happy to work with rights holders personally to craft a campaign strategy.</dd>
@ -460,9 +467,9 @@ Need more ideas? We're happy to work with rights holders personally to craft a
{% if sublocation == 'conversion' or sublocation == 'all' %}
<h4>Ebook Conversion</h4>
<dl>
<dt>I am a copyright holder. Do I need to already have a digital file for a book I want to nominate for a pledge drive?</dt>
<dt>I am a copyright holder. Do I need to already have a digital file for a book I want to unglue?</dt>
<dd>No. You may run campaigns for any of your books, even those that exist only in print copies or are out of print. Any print book can be scanned to create a digital file that can then become an ePub unglued ebook.</dd>
<dd>No. You may run campaigns for any of your books, even those that exist only in print copies or are out of print. Any print book can be scanned to create a digital file that can then become an ePub-format unglued ebook.</dd>
<dt>Will Unglue.it scan the books and produce ePub files?</dt>
@ -470,13 +477,20 @@ Need more ideas? We're happy to work with rights holders personally to craft a
<dt>Will Unglue.it raise money to help pay for conversion costs?</dt>
<dd>Yes. Your campaign target should include conversion costs.</dd>
<dd>Your campaign target should include conversion costs.</dd>
{% endif %}
{% if sublocation == 'funding' or sublocation == 'all' %}
<h4>Funding</h4>
<dt>Is a PayPal account required to launch a campaign?</dt>
<dd>At this time, Unglue.it requires that rights holders have PayPal accounts as it will simplify the process of paying you when a campaign succeeds. </dd>
<dt>Is an Amazon account required to launch a campaign?</dt>
<dd>No. When Unglue.it receives funds pledged through Amazon, we can cut a check to rights holders when a campaign succeeds.</dd>
<dt>Why does this FAQ mention both Amazon and Paypal? Who's the payment processor?</dt>
<dd>For more information on Unglue.it's decision-making process with regard to payment processors, please read <a href="http://blog.unglue.it/2012/05/03/unglue-it-payment-options-amazon-vs-paypal/">our blog post on Amazon and Paypal</a>.</dd>
<dt>Are a funding goal and deadline required?</dt>
<dd>Yes.</dd>
@ -488,11 +502,11 @@ Need more ideas? We're happy to work with rights holders personally to craft a
<dt>Are contributions refundable?</dt>
<dd>No. Once a campaign to which you have pledged succeeds, your credit card will be charged the full amount of your pledge nonrefundably. However, you will not be charged until, and unless, the campaign succeeds. Before that time you may modify or cancel your pledge without charge.</dd>
<dd>Unglue.it cannot refund contributions. Once a campaign succeeds, supporters' credit cards will be charged the full amount of their pledge nonrefundably. However, they will not be charged until, and unless, the campaign succeeds. Before that time they may modify or cancel their pledges without charge.</dd>
<dt>What if an ungluer contests a charge?</dt>
<dd>Unglue.it uses Paypal for payment and Paypal users may contest charges. Unglue.it is not liable for this and rights holders are liable for any chargebacks. We encourage rights holders to provide clear, timely communication to their supporters throughout the campaign to ensure they remember what they pledged to and why.</dd>
<dd>Ungluers may contest charges, either with the payment processor or with their credit card issuer. Unglue.it is not liable for this and rights holders are liable for any chargebacks. We encourage rights holders to provide clear, timely communication to their supporters throughout the campaign to ensure they remember what they pledged to and why.</dd>
<dt>What happens if a supporter's credit card is declined?</dt>
@ -508,29 +522,35 @@ Need more ideas? We're happy to work with rights holders personally to craft a
<dt>After a campaign succeeds, when and how will I be paid?</dt>
<dd>After we reach the threshold price Unglue.it will issue you a closing memo, which will cover your gross and net proceeds. Supporters' money will be put in escrow (through PayPal) until you deliver an ePub file meeting Unglue.it's quality standards, at which point payment will be released to you via your PayPal account. If Unglue.it does not receive a suitable ePub file within 90 days, we will deduct conversion costs from your funds and release the rest to you.</dd>
<dd>After we reach the threshold price Unglue.it will issue you a closing memo, which will cover your gross and net proceeds. Unglue.it will hold the proceeds until you deliver an ePub file meeting Unglue.it's quality standards, at which point Unglue.it will send you a check. If Unglue.it does not receive a suitable ePub file within 90 days, we will deduct conversion costs from your funds and release the rest to you.</dd>
<dt>What happens if my campaign reaches its funding goal before its deadline? Can campaigns raise more money than their goal?</dt>
<dd>Campaigns are scheduled to close at midnight eastern time of the day when they hit their funding threshold. They may continue accruing funding up to that time, including funds over their goal.</dd>
<dd>Campaigns are scheduled to close at midnight Eastern (US) time of the day when they hit their funding threshold. They may continue to accrue pledges up to that time, including funding past their goal.</dd>
<dt>What happens if my campaign doesn't reach its funding goal by its deadline?</dt>
<dd>The campaign ends. Supporters' credit cards are not charged, so you are not paid, and not obligated to release an unglued ebook.<br /><br />
If you're concerned a campaign may not reach its goal you have several options. You can lower the target price to a level more likely to succeed. Or you are welcome to run a second campaign at a later time, perhaps with a different goal, duration, and publicity strategy. We'd be happy to consult with you about this.</dd>
<dt>What fees does Unglue.it charge?</dt>
<dd>When a campaign succeeds, Unglue.it will deduct a 6% commission on the funds raised. PayPal also charges a small percentage fee on each transaction. If you do not have a suitable ePub version of your book available, you will also need to cover conversion costs; please price this into your goal for a campaign. Details are spelled out in the Platform Services Agreement that rights holders must sign before launching an Unglue.it campaign.</dd>
<dd>When a campaign succeeds, Unglue.it will deduct a 6% commission on the funds raised. Our payment processor also charges a small percentage fee on each transaction, plus (where relevant) currency conversion costs. If you do not have a suitable ePub version of your book available, you will also need to cover ebook conversion costs; please price this into your goal for a campaign. Details are spelled out in the Platform Services Agreement that rights holders must sign before launching an Unglue.it campaign.</dd>
<dt>Does it cost money to start a campaign on Unglue.it?</dt>
<dd>No.</dd>
<dt>Will PayPal send me a 1099-K tax form?</dt>
<dt>Will I receive a 1099-K tax form?</dt>
<dd>Yes, Unglue.it will issue you one as required by law.</dd>
<dd>Paypal issues 1099-K tax forms as required by law.</dd>
</dl>
{% endif %}
{% if sublocation == 'rights' or sublocation == 'all' %}
<h4>Rights</h4>
<dl>
<dt>If I am an author with my book still in print, can I still start a Campaign to unglue it?</dt>
<dt>If I am an author with my book still in print, can I still start a campaign to unglue it?</dt>
<dd>This depends entirely on your original contract with your publisher. You should seek independent advice about your royalty clauses and the "Subsidiary Rights" clauses of your contract. The Authors' Guild provides guidance for its members.</dd>
@ -542,17 +562,17 @@ Need more ideas? We're happy to work with rights holders personally to craft a
<dd>We can't interpret your particular contract regarding subsidiary rights and your ability to use a Creative Commons license. Please seek qualified independent advice regarding the terms of your contract. In any event, you will also want the author to cooperate with you on a successful fundraising campaign, and you can work together to meet the warranties of the PSA.</dd>
<dt>Is the copyright holder the same as a Rights Holder?</dt>
<dt>Are the copyright holder, and the rights holder who is eligible to start an Unglue.it campaign, the same person?</dt>
<dd>Not necessarily. If you are the author and copyright holder but have a contract with a publisher, the publisher may be the authorized Rights Holder with respect to commercial rights, and they may be able to sign a licensing agreement on your behalf. Again, you must get advice about your individual contract, especially subsidiary rights clauses and exclusivity.</dd>
<dt>Can I offer a book to be Unglued even if I cannot include all the illustrations from the print edition?</dt>
<dt>Can I offer a book to be unglued even if I cannot include all the illustrations from the print edition?</dt>
<dd>Yes. If permission to reprint cannot not be obtained for items such as photographs, drawings, color plates, as well as quotations from lyrics and poetry, we can produce an unglued edition which leaves them out. You must indicate the difference between the editions on your Campaign page.</dd>
<dt>What impact does ungluing a book have on the rights status of my other editions?</dt>
<dd>The Creative Commons licenses are non-exclusive. They will apply only to the unglued edition, not to the print, audio, or any other editions. They does not affect the rights status of those other editions. If you use the no-derivative, non commercial license (CC BY-NC-ND), no one else may sell your book or make derivatives unless you give them permission to do so.</dd>
<dd>The Creative Commons licenses are non-exclusive. They will apply only to the unglued edition, not to the print, audio, or any other editions. They does not affect the rights status of those other editions. If you use the no-derivative, noncommercial license (CC BY-NC-ND), no one else may sell your book or make derivatives unless you give them permission to do so.</dd>
<dt>Can an Unglued Ebook be issued only in the US?</dt>

View File

@ -6,35 +6,35 @@
<li class="first parent">
<span class="faq">How do I pledge?</span>
<span class="menu level2 answer">
Enter your pledge amount and select a premium. (You may select a premium at any level up to and including the amount you pledge.) After you click Pledge, you'll be directed through PayPal to complete the transaction.
Enter your pledge amount and select a premium. (You may select a premium at any level up to and including the amount you pledge.) After you click Pledge, you'll be directed through Amazon to complete the transaction.
</span>
</li>
<li class="parent">
<span class="faq">What happens after I pledge?</span>
<span class="faq">Do I need an Amazon account to pledge?</span>
<span class="menu level2 answer">
TBA
No. While you can use yours if you have one, any major credit card will do.
</span>
</li>
<li class="parent">
<span class="faq">When will I be charged?</span>
<span class="menu level2 answer">
If this campaign succeeds, you'll be charged at TBA. If it does not, your pledge will expire on {{ campaign.deadline }} and you will not be charged.
If this campaign reaches its target price, you'll be charged at that time. If it does not, your pledge will expire on {{ campaign.deadline }} (Eastern US time) and you will not be charged.
</span>
</li>
<li class="parent">
<span class="faq">What if I want to change my pledge?</span>
<span class="menu level2 answer">
You can change or cancel your pledge at any time before the campaign ends. This will be the campaign's deadline ({{ campaign.deadline }}) or midnight (Eastern US time) on the day the campaign succeeds, whichever comes first.
You can change or cancel your pledge at any time before the campaign ends. This will be the campaign's deadline ({{ campaign.deadline }}) or midnight (Eastern US time) on the day the campaign succeeds, whichever comes first. Go to <a href="{% url work work.id %}">this book's page</a> and click on the Modify Pledge button.
</span>
</li>
<li class="last parent">
<span class="faq">How and when will I receive my premiums?</span>
<span class="menu level2 answer">
TBA
If the campaign succeeds and you requested a special premium, we will disclose to the rights holder your email address and any premiums you requested. The rights holder will then be in touch with you about how your premiums will be fulfilled. If you asked to be listed in the acknowledgements, this will be part of the unglued ebook, which should be emailed to you within 90 days of the close of the campaign.
</span>
</li>

View File

@ -3,64 +3,18 @@
<div class="jsmod-content">
<ul class="menu level1">
{% comment %}
What happens after I pledge?/What kinds of communications should I expect?
privacy foo
how do I pledge?
when will I be charged?
("if this project is successfully funded, your credit card will be charged on {timestamp}" --gotta ask raymond about that)
what if I want to change my pledge?
("you can change or cancel any time before {timeline}")
how and when will I receive them
("when your reward is ready, {project creators} will send you a survey via email to request any info needed...")
{% endcomment %}
<li class="first parent">
<a href="#"><span>How do I pledge?</span></a>
<ul class="menu level2">
<li class="first">Enter your pledge amount and select a premium. (You may select a premium at any level up to and including the amount you pledge.)
</li>
</ul>
<span class="faq">If I change my mind, can I un-cancel?</span>
<span class="menu level2 answer">
No, but you are welcome to make a new pledge. </span>
</li>
<li class="parent {% if location != 'basics' %}collapse{% endif %}">
<a href="/faq/basics/"><span>Basics</span></a>
<ul class="menu level2">
<li class="first"><a href="/faq/basics/howitworks"><span>How it Works</span></a></li>
<li><a href="/faq/basics/account"><span>Your Account</span></a></li>
<li class="last"><a href="/faq/basics/company/"><span>The Company</span></a></li>
</ul>
</li>
<li class="parent {% if location != 'campaigns' %}collapse{% endif %}">
<a href="/faq/campaigns/"><span>Campaigns</span></a>
<ul class="menu level2">
<li class="first"><a href="/faq/campaigns/overview"><span>Overview</span></a></li>
<li><a href="/faq/campaigns/funding"><span>Funding</span></a></li>
<li class="last"><a href="/faq/campaigns/premiums"><span>Premiums</span></a></li>
</ul>
</li>
<li class="parent {% if location != 'unglued_ebooks' %}collapse{% endif %}">
<a href="/faq/unglued_ebooks/"><span>Unglued Ebooks</span></a>
<ul class="menu level2">
<li class="first"><a href="/faq/unglued_ebooks/general"><span>General Questions</span></a></li>
<li><a href="/faq/unglued_ebooks/using"><span>Using Your Unglued Ebook</span></a></li>
<li class="last"><a href="/faq/unglued_ebooks/copyright"><span>Ungluing and Copyright</span></a></li>
</ul>
</li>
<li class="parent {% if location != 'rightsholders' %}collapse{% endif %}">
<a href="/faq/rightsholders/"><span>For Rights Holders</span></a>
<ul class="menu level2">
<li class="first"><a href="/faq/rightsholders/authorization"><span>Becoming Authorized</span></a></li>
<li><a href="/faq/rightsholders/campaigns"><span>Launching Campaigns</span></a></li>
<li><a href="/faq/rightsholders/publicity"><span>Publicizing Campaigns</span></a></li>
<li><a href="/faq/rightsholders/conversion"><span>Ebook Conversion</span></a></li>
<li class="last"><a href="/faq/rightsholders/rights/"><span>Rights</span></a></li>
</ul>
</li>
<li class="last parent">
<span class="faq">Will the rights holder be notified that I have cancelled my pledge?</span>
<span class="menu level2 answer">
Not, although your name will stop appearing in the list of people who have pledged to the campaign.
</span>
</li>
</ul>
</div>

View File

@ -1,29 +0,0 @@
<div class="jsmodule">
<h3 class="jsmod-title"><span>FAQs</span></h3>
<div class="jsmod-content">
<ul class="menu level1">
<li class="first parent">
<span class="faq">How will I know if the campaign succeeds?</span>
<span class="menu level2 answer">
We'll email you (from accounts@gluejar.com). You can also keep track of the campaign's progress from your <a href="{% url supporter user.username %}">supporter page</a> or from the campaign page for <a href="{% url work work.id %}">{{ work.title }}</a>.
</span>
</li>
<li class="parent">
<span class="faq">What kind of communications should I expect?</span>
<span class="menu level2 answer">
TBA
</span>
</li>
<li class="last parent">
<span class="faq">How and when will I receive my premiums?</span>
<span class="menu level2 answer">
TBA
</span>
</li>
</ul>
</div>
</div>

View File

@ -29,12 +29,15 @@
<div class="movingrightalong"></div>
<div class="quicktour"><span class="highlight">Unglue.it offers a win-win solution: Crowdfunding.</span> We run pledge campaigns for books; you chip in. When, together, we've reached the goal, we'll reward the book's creators and issue an unglued ebook.</div>
<div class="movingrightalong"></div>
<div class="quicktour last"><a href="https://creativecommons.org/">Creative Commons</a> licensing means everyone, everywhere can read and share the unglued book - freely and legally. <span class="highlight">You've given your favorite book to the world.</span></div>
<div class="quicktour last"><a href="https://creativecommons.org/">Creative Commons</a> licensing means everyone, everywhere can read and share the unglued book - freely and legally. <span class="highlight">You've given your favorite book to the world.</span>
{% if suppress_search_box %}
<div class="signup" id="highlighter">Sign up below. <img src="/static/images/landingpage/signmeup-arrow.png" alt="sign up below"></div>
{% else %}
{% if not user.is_authenticated %}
<div class="spacer"><div class="signuptoday"><a href="{% url registration_register %}">Sign up today</a></div></div>
{% endif %}
{% endif %}
</div>
</div>
</div>
</div>

View File

@ -1,4 +1,5 @@
{% extends "basedocumentation.html" %}
{% load humanize %}
{% block title %}Campaign Management{% endblock %}
@ -78,7 +79,7 @@ Please fix the following before launching your campaign:
<div class="pledged-info">
<div class="pledged-group">
{{ work.last_campaign.supporters.count }} Ungluers have pledged ${{ work.last_campaign.current_total }}
{{ work.last_campaign.supporters.count }} Ungluers have pledged ${{ work.last_campaign.current_total|intcomma }}
</div>
<div class="status">
<img src="/static/images/images/icon-book-37by25-{{ work.percent_unglued }}.png" title="book list status" alt="book list status" />
@ -109,8 +110,14 @@ Please fix the following before launching your campaign:
<form action="#" method="POST">
{% csrf_token %}
<h3>Select the edition</h3>
<p> Please choose the edition that most closely matches the edition to be unglued:
<p> Please choose the edition that most closely matches the edition to be unglued:</p>
{{ form.edition.errors }}{{ form.edition }}
{% if campaign.edition %}
<p>You can edit the campaign's <a href="{% url rh_edition work.id campaign.edition.id %}">preferred edition</a>.</p>
{% else %}
<p>If none of the existing editions matches what you want to release, you can <a href="{% url rh_edition work.id '' %}">create a new edition</a>.</p>
{% endif %}
<h3>Make Your Pitch</h3>
<p>This will be displayed in the Campaign tab for your work. It's your main pitch to supporters. It should include:</p>
<ul class="terms">
@ -145,7 +152,7 @@ Please fix the following before launching your campaign:
{% ifnotequal campaign_status 'ACTIVE' %}
<h3>Target Price</h3>
<p> This is the target price for your campaign. Once you launch the campaign, you won't be able to increase it. The <i>mimimum</i> target is ${{form.minimum_target}} .</p>
<p> This is the target price for your campaign. Once you launch the campaign, you won't be able to increase it. The <i>mimimum</i> target is ${{form.minimum_target|intcomma}} .</p>
{{ form.target.errors }}{{ form.target }}
<h3>License being offered</h3>
<p> This is the license you are offering to use once the campaign succeeds. For more info on the licenses you can use, see <a href="http://creativecommons.org/licenses">Creative Commons: About the Licenses</a>.</p>
@ -158,23 +165,20 @@ Please fix the following before launching your campaign:
{% else %}
<h3>Target Price</h3>
<p>The current target price for your campaign is <b>${{ campaign.target }}</b>. Since your campaign is active, you may lower, but not raise, this target.</p>
<p>The current target price for your campaign is <b>${{ campaign.target|intcomma }}</b>. Since your campaign is active, you may lower, but not raise, this target.</p>
${{ form.target.errors }}{{ form.target }}
<h3>License being offered</h3>
<p>If your campaign succeeds, you will be offering your ebook under a <b>{{ campaign.license }}</b> license.</p>
{{ form.license.errors }}<span style="display: none">{{ form.license }}</span>
<h3>Ending date</h3>
<p>The ending date of your campaign is <b>{{ campaign.deadline }}</b>. Your campaign will conclude on this date or when you meet your target price, whichever is earlier. You may not change the ending date of an active campaign.</p>
{{ form.deadline.errors }}<span style="display: none">{{ form.deadline }}</span>
{% endifnotequal %}
{% comment %}
<!-- not enforcing this while using Amazon payments -->
<h3>Paypal collection address</h3>
<p> If your campaign succeeds, the funds raised (less commission and fees) will be deposited in a paypal account bearing this email address.</p>
<p>{{ form.paypal_receiver.errors }}{{ form.paypal_receiver }}</p>
{% endcomment %}
{% ifequal campaign_status 'ACTIVE' %}
<div class="yikes">When you click this button, your changes will be visible to supporters immediately. Make sure to proofread!</div><br />
@ -196,10 +200,10 @@ Please fix the following before launching your campaign:
<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=campaign.work.id %}?premium_id={{premium.id}}">
<span class="menu-item-price">${{ premium.amount }}</span>
<i>
<span class="menu-item-price">${{ premium.amount|intcomma }}</span>
<span class="menu-item-desc">{{ premium.description }}</span>
</a>
</i>
{% if premium.type %}<span class="custom-premium"> <br />Type: {{ premium.get_type_display }}</span>{% endif %}
{% ifnotequal premium.limit 0 %}<br />Limit: {{ premium.limit }}{% endifnotequal %}
{% ifequal premium.type 'CU' %}<br />Deactivate? <input type="checkbox" name="premium_id" value="{{ premium.id }}" />{% endifequal %}
@ -207,10 +211,12 @@ Please fix the following before launching your campaign:
{% endfor %}
</ul>
{% if campaign.custom_premiums.count %}
<input type="submit" name="inactivate" value="Inactivate Checked Premiums" />
<input type="submit" name="inactivate" value="Deactivate Checked Premiums" />
{% endif %}
</form>
</div>
<h4>Editing premiums</h4>
<p>At this time, you can't edit a premium you've created. But you can deactivate a premium and add a new one to replace it. So be sure to double-check your spelling before adding it.</p>
<h4>Add a custom premium for this campaign</h4>
<form action="#" method="POST">
{% csrf_token %}
@ -239,7 +245,7 @@ Please fix the following before launching your campaign:
<div id="launchme"><a href="#" class="manage">Launch Campaign</a></div>
{% else %}
<p>Please make sure you've entered your campaign's description, target, deadline, and premiums, and previewed your campaign, before launching.</p>
<p>Please make sure you've selected your campaign's edition and entered its description, target, deadline, and premiums, and previewed your campaign, before launching.</p>
{% endif %}
</div>

View File

@ -0,0 +1,58 @@
{% extends "basedocumentation.html" %}
{% block extra_extra_head %}
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/themes/ui-lightness/jquery-ui.css" type="text/css" media="screen">
{{ form.media.css }}
<script type="text/javascript" src="{{ jquery_home }}"></script>
<script type="text/javascript" src="{{ jquery_ui_home }}" ></script>
{{ form.media.js }}
{% endblock %}
{% block doccontent %}
{% if edition.pk %}
<h2>Edit Edition {{edition.pk}}</h2>
{% else %}
<h2>Create New Edition</h2>
{% endif %}
<form method="POST" action="#">
{% csrf_token %}
{{ form.work }}
<div>
Title: {{ form.title.errors }}{{ form.title }}<br />
Authors:<ul>
{% if edition.pk and edition.authors %}
{% for author in edition.authors.all %}
<li>{{ author.name }}</li>
{% endfor %}
{% endif %}
{% for author in edition.new_author_names %}
<li>{{ author }}<input type="hidden" name="new_author" value="{{ author }}" /></li>
{% endfor %}
</ul>
Add an Author: {{ form.add_author.errors }}{{ form.add_author }}
<input type="submit" name="add_author_submit" value="Add Author" id="submit_author"><br />
Language: {{ form.language.errors }}{{ form.language }}<br />
ISBN: {{ form.isbn_13.errors }}{{ form.isbn_13 }}<br />
Description: <br />{{ form.description.errors }}{{ form.description }}<br />
Publisher: {{ form.publisher.errors }}{{ form.publisher }}<br />
Publish Date: {{ form.publication_date.errors }}{{ form.publication_date }}<br />
Public Domain?: {{ form.public_domain.errors }}{{ form.public_domain }}<br />
Subjects:<ul>
{% if edition.work.subjects %}
{% for subject in edition.work.subjects.all %}
<li>{{ subject.name }}</li>
{% endfor %}
{% endif %}
{% for new_subject in edition.new_subjects %}
<li>{{ new_subject }}<input type="hidden" name="new_subject" value="{{ new_subject }}" /></li>
{% endfor %}
</ul>
Add a Subject: {{ form.add_subject.errors }}{{ form.add_subject }}
<input type="submit" name="add_subject_submit" value="Add Subject" id="submit_subject"><br />
Cover Image (Small): {{ form.cover_image.errors }}{{ form.cover_image }}{{ form.cover_image.help_text }}<br />
</div>
<input type="submit" name="create_new_edition" value="{% if edition.pk %}Save Edits{% else %}Create Edition{% endif %}" id="submit">
</form>
{% endblock %}

View File

@ -1,6 +1,6 @@
We thought you might like to know, there are new comments for a book you have commented on.
We thought you might like to know there are new comments for a book you have commented on.
{{ comment.user.username }} on {{ comment.content_object.title }}
{{ comment.user.username }} on {{ comment.content_object.title }}:
{{ comment.comment }}

View File

@ -2,18 +2,20 @@
{% with comment.user as user %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work id %}?tab=2"><img src="{{ comment.content_object.cover_image_small }}" alt="cover image for {{ comment.content_object.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work id %}?tab=2"><img src="{{ comment.content_object.cover_image_small }}" alt="cover image for {{ comment.content_object.title }}" /></a>
</div>
<div class="comments_graphical">
<span><a href="{% url supporter supporter_username=user %}">{{ comment.user.username }}</a> has made a comment on <a href="{% url work id %}?tab=2">{{ comment.content_object.title }}</a>.</span>
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
<span><a href="{% url supporter supporter_username=user %}">{{ comment.user.username }}</a> has made a comment on <a href="{% url work id %}?tab=2">{{ comment.content_object.title }}</a></span>
</div>
<div class="comments_textual">
{{ comment.comment|linebreaksbr }}
</div>
<div class="comments_textual">
{{ comment.comment|linebreaksbr }}
</div>
</div>
{% endwith %}

View File

@ -1,4 +1,4 @@
{{ comment.user.username }} on {{ comment.content_object.title }}
{{ comment.user.username }} on {{ comment.content_object.title }}:
{{ comment.comment }}

View File

@ -7,20 +7,18 @@ Using this template will allow notices.css to apply to all notices for a uniform
{% endcomment %}
<div class="comments clearfix">
<div class="comments_book">
{% comment %}
Your cover image goes here. e.g.:
<a href="{% url work work.id %}"><img src="{{ comment.content_object.cover_image_small }}" alt="cover image for {{ work.title }}" /></a>
modify as needed for your local context variables
{% endcomment %}
</div>
<div class="comments_info">
<div class="comments_info clearfix">
<div class="comments_book">
{% comment %}
Your cover image goes here. e.g.:
<a href="{% url work work.id %}"><img src="{{ comment.content_object.cover_image_small }}" alt="cover image for {{ work.title }}" /></a>
modify as needed for your local context variables
{% endcomment %}
</div>
<div class="comments_graphical">
{% comment %}
This is where you put graphics-oriented header info for the notice.
Examples include user avatars and campaign status icons.
Some text is OK.
This is where you put your headline.
Brief text, graphics-oriented info like user avatars and campaign status icons.
e.g.:
<a href="{% url supporter supporter_username=user %}">
{% if supporter.profile.pic_url %}
@ -32,11 +30,12 @@ Using this template will allow notices.css to apply to all notices for a uniform
<span><a href="{% url supporter supporter_username=user %}">{{ comment.user.username }}</a> on <a href="{% url work id %}?tab=2">{{ comment.content_object.title }}</a></span>
{% endcomment %}
</div>
<div class="comments_textual">
{% comment %}
This is where you put the textual part of your message.
Examples include the text of comments, details about credit card charges, etc.
{% endcomment %}
</div>
</div>
<div class="comments_textual">
{% comment %}
This is where you put the textual part of your message.
Examples include the text of comments, details about credit card charges, etc.
{% endcomment %}
</div>
</div>

View File

@ -1,7 +1,17 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
{% load humanize %}Congratulations!
You will be also something.
Thanks to you and other ungluers, {{ work.title }} will be released to the world in an unglued ebook edition. {{ payment_processor }} will now charge your credit card.
Pledge Summary
Amount pledged: {{ amount|intcomma }}
Premium: {{ premium }}
We will notify you when the unglued ebook is available for you to read. If you've requested special premiums, the rights holder, {{ campaign.rightsholder }}, will be in touch with you via email to request any information needed to deliver your premium.
If you'd like to visit the project page, click here:
http://{{site.domain}}{% url work work.id %}
Thank you again for your support.
{{ campaign.rightsholder }} and the Unglue.it team
Give ebooks to the world; give income to authors and publishers. Unglue.it.

View File

@ -1,19 +1,10 @@
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
</div>
<div class="comments_info">
<div class="comments_graphical">
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work work.id %}"><img src="{{ work.cover_image_small }}" alt="cover image for {{ work.title }}" /></a>
</div>
<div class="comments_textual">
<p>
text comments
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
<div class="comments_graphical">
Hooray! The campaign for {{ work.title }} has succeeded. Your credit card will be charged ${{ amount }}. Thank you again for your help.
</div>
</div>
</div>

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
Thanks to you, the campaign for {{campaign.work.title}} has succeeded!

View File

@ -1,7 +1,14 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
{% load humanize %}You have modified a pledge that you had previously made to the campaign to unglue {{ campaign.work.title }}
You will be also something.
Your new pledge summary
Amount pledged: {{ amount|intcomma }}
Premium: {{ premium }}
Give ebooks to the world; give income to authors and publishers. Unglue.it.
If you increased your earlier pledge (thanks!), you will also be receiving an email from Amazon confirming this. If you decreased an earlier pledge, you will not receive a confirmation email from Amazon. If you log in to your Amazon Payments account you will still see an authorization to Unglue.it for the entire amount of your earlier pledge, but never fear -- we'll only charge the amount of your new pledge, not the full authorization.
If you'd like to visit the project page, click here:
http://{{site.domain}}{% url work work.id %}
Thank you again for your support.
{{ campaign.rightsholder }} (rights holder for {{ campaign.work.title }}) and the Unglue.it team

View File

@ -1,19 +1,19 @@
{% with campaign.work.title as title %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}"><img src="{{ campaign.work.cover_image_small }}" alt="cover image for {{ title }}" /></a>
</div>
<div class="comments_graphical">
Your pledge for the campaign to unglue {{ title }} has been modified.
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
</div>
<div class="comments_textual">
<p>
text comments
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
<div class="comments_textual">
Your new pledge is as follows:<br />
Amount: ${{ amount }}<br />
Premium: {{ premium.description }}<br />
Thank you for your continued support of {{ title }}.
</div>
</div>
{% endwith %}

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
Your pledge has been modified for {{ work.title}}

View File

@ -1,7 +1,27 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
{% load humanize %}{% with work.title as title %}{% with site.domain as domain %}{% with work.id as work_id %}Thank you, {{ transaction.user.username }}! You have pledged to unglue {{ title }}. If this campaign successfully raises ${{ campaign.target|intcomma }} by {{ campaign.deadline|date:"M d Y" }}, this book will be released in an unglued ebook edition for all to enjoy.
You will be also something.
Pledge summary
Amount pledged: ${{ transaction.amount|intcomma }}
Premium: {{ transaction.premium.description }}
Give ebooks to the world; give income to authors and publishers. Unglue.it.
You can help even more by sharing this campaign with your friends.
Facebook: https://www.facebook.com/sharer.php?u=http://{{ domain }}{% url work work_id %}
Twitter: https://twitter.com/intent/tweet?url=http://{{ domain }}{% url work work_id %}&text=I%27m%20ungluing%20{{ title|urlencode }}%20at%20%40unglueit.%20Join%20me%21"
You can also embed a widget for {{ title }} in your web site by copy/pasting the following:
<iframe src="https://{{ domain }}/api/widget/{{ work.first_isbn_13 }}/" width="152" height="325" frameborder="0"></iframe>
Or the best idea: talk about it with those you love. We'll need lots of help from lots of people to make this a success.
If you want to change your pledge, just use the button at http://{{ domain }}{% url work work_id %}
If you have any problems with your pledge, don't hesitate to contact us at support@gluejar.com
Thanks for being part of Unglue.it.
{{ campaign.rightsholder }} (rights holder for {{ title }}) and the Unglue.it team
{% endwith %}
{% endwith %}
{% endwith %}

View File

@ -1,19 +1,27 @@
{% load humanize %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work work.id %}?tab=2"><img src="{{ work.cover_image_thumbnail }}" alt="cover image for {{ work.title }}" /></a>
</div>
<div class="comments_graphical">
You've just pledged ${{ transaction.amount|intcomma }} to <a href="{% url work work.id %}">{{ work.title }}</a>.
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
<div class="comments_textual">
<p>Thank you, {{transaction.user.username}}!</p>
<p>You've just pledged ${{ transaction.amount|intcomma }} to <a href="{% url work work.id %}">{{ work.title }}</a>. If it reaches its goal of ${{ campaign.target|intcomma }} by {{ campaign.deadline|date:"M d Y"}}, it will be unglued for all to enjoy.</p>
<p>You can help even more by sharing this campaign with your friends!</p>
</div>
<div class="comments_textual">
<ul>
<a href="{% url emailshare 'pledge' %}?next={% url work work.id|urlencode:"" %}"><li>Email it!</li></a>
<a href="https://twitter.com/intent/tweet?url=http://{{ site.domain }}{% url work work.id|urlencode:"" %}&text=I%20just%20pledged%20to%20unglue%20{{ work.title|urlencode }}%20at%20%40unglueit.%20Will%20you%20join%20me%3F"><li>Tweet it!</li></a>
<a href="https://www.facebook.com/sharer.php?u=http://{{ site.domain }}{% url work work.id|urlencode:"" %}"><li>Share it on Facebook.</li></a>
<li>Best idea: talk about it with those you love.</li>
</ul>
<p>
text comments
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
<p>Thanks for being part of Unglue.it.</p>
<p>The unglue.it team.</p>
</div>
</div>

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
Thank you for supporting {{ work.title }} at Unglue.it!

View File

@ -1,7 +1,13 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
Congratulations! Your claim to {{ claim.work }} on Unglue.it has been approved.
You will be also something.
You are now free to run a campaign to unglue your work. If you're logged in, you will see the option to open a campaign at https://{{ site.domain }}/rightsholders . (You can also find this page by clicking on "Rights Holder Tools" at the bottom of any Unglue.it page.)
Give ebooks to the world; give income to authors and publishers. Unglue.it.
To run a campaign, you'll need to select a target price and a deadline. You'll also need to write a pitch. This will appear in the Description tab on your book's page (https://{{ site.domain }}{% url work claim.work.id %}). Think about who your book's audience is, and remind them why they love this book -- your pitch is not a catalog page! We encourage video, audio, and links to make your pitch come alive. Feel free to email us (rights@gluejar.com) if you need any help with this.
You should also come up with some custom premiums to reward ungluers for supporting your book. Again, we can help you if you need ideas for what these should be or how to price them.
Finally, think about how you're going to publicize your campaign: social media, newsletters, media contacts, professional organizations, et cetera. Have a plan for how to reach out to these potential supporters before you launch your campaign. Your supporters' sense of connection with you and your book is key to your campaign's success. Again, email us if you'd like help.
We're thrilled to be working with you.
The Unglue.it team

View File

@ -1,19 +1,14 @@
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work claim.work.id %}"><img src="{{ claim.work.cover_image_small }}" alt="cover image for {{ claim.work.title }}" /></a>
</div>
<div class="comments_graphical">
Congratulations! Your claim to {{ claim.work.title }} has been approved.
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
</div>
<div class="comments_textual">
<p>
text comments
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
<div class="comments_textual">
You are now free to run campaigns for this work. See your email for full details. Then get started on the <a href="/rightsholders/">rights holder tools page</a> (also available through a link at the bottom of every page). Contact us if you need any help.
</div>
</div>

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
Congratulations! Your claim to {{ claim.work }} has been approved.

View File

@ -1,7 +1,11 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
Congratulations! Your Platform Services Agreement has been accepted and you're now an official Unglue.it rights holder.
You will be also something.
Here's what to do next. Find your book(s) on Unglue.it. On the Rights tab of the book page, you'll now see an option to claim the book. Do this. We'll follow up. Once we've approved your claim, you'll be able to run campaigns for the book.
Give ebooks to the world; give income to authors and publishers. Unglue.it.
If your book isn't listed in Google Books (which powers our search), you won't be able to find it at Unglue.it. That's okay. You can submit your books for inclusion in Google's search results: http://books.google.com/googlebooks/publishers.html . We can also create a custom page for you; just notify us.
You can also start thinking ahead about what you'd like your campaigns to look like and how you'd like to publicize them. Some good things to brainstorm: your campaign pitch; any photos or video you can include; compelling premiums you might be able to offer; what you want your target to be and how long you think your campaign should last; and how to share your campaign with your social networks (online and off) and media contacts.
Need help with any of this? We'd be delighted. Email us at rights@gluejar.com. We're thrilled to be working with you.
The Unglue.it team

View File

@ -1,19 +1,5 @@
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
</div>
<div class="comments_info">
<div class="comments_graphical">
</div>
<div class="comments_textual">
<p>
text comments
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
<div class="comments_info clearfix">
Congratulations! You are now an approved rights holder on Unglue.it. For your next step, find your works in our database and claim them (under the Rights tab). See your email for more details.
</div>
</div>

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
Congratulations! You're now a confirmed rights holder on Unglue.it.

View File

@ -1,13 +1,13 @@
Congratulations, you wished for it, and now there is an active Campaign for {{ campaign.work.title }} to be unglued. If ungluers like you pledge {{ campaign.target }} by {{ campaign.deadline }}, this book will be released under a Creative Commons license for everyone to enjoy.
{% load humanize %}Congratulations, you wished for it, and now there is an active Campaign for {{ campaign.work.title }} to be unglued. If ungluers like you pledge {{ campaign.target|intcomma }} by {{ campaign.deadline }}, this book will be released under a Creative Commons license for everyone to enjoy.
You can help!
Pledge toward ungluing. {% url pledge work_id=campaign.work.id %}
Pledge toward ungluing. https://{{ site.domain }}{% url pledge work_id=campaign.work.id %}
Tell your friends -- there are handy share options on the campaign page. There's even a widget you can put on your blog or home page. {% url work campaign.work.id %}
Tell your friends -- there are handy share options on the campaign page. There's even a widget you can put on your blog or home page. https://{{ site.domain }}{% url work campaign.work.id %}
Join the discussion: share why you love {{ campaign.work.title }} and the world will too. {% url work campaign.work.id %}?tab=2
Join the discussion: share why you love {{ campaign.work.title }} and the world will too. https://{{ site.domain }}{% url work campaign.work.id %}?tab=2
Thank you!
{{ active_claim.rights_holder.rights_holder_name }} (rights holder for {{ campaign.work.title }}) and the Unglue.it Team
{{ campaign.rightsholder }} (rights holder for {{ campaign.work.title }}) and the Unglue.it Team

View File

@ -1,20 +1,23 @@
{% load humanize %}
{% with campaign.work.id as id %}
{% with campaign.work.title as title %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work id %}"><img src="{{ campaign.work.cover_image_small }}" alt="cover image for {{ title }}" /></a>
</div>
<div class="comments_info">
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work id %}"><img src="{{ campaign.work.cover_image_small }}" alt="cover image for {{ title }}" /></a>
</div>
<div class="comments_graphical">
<span>The rights holder, {{ active_claim.rights_holder.rights_holder_name }}, has launched a campaign for <a href="{% url work id %}">{{ title }}</a>!</span>
</div>
<div class="comments_textual">
<div>Congratulations! You wished for a campaign, and here it is. If ungluers like you pledge {{ campaign.target }} by {{ campaign.deadline|date:"M d, Y" }}, <I>{{ title }}</i> will be released under a <a href="http://creativecommons.org">Creative Commons</a> license for all to enjoy.</div>
<div>You can help! <a href="{% url pledge work_id=id %}">Pledge</a> any amount, and use the sharing options on the <a href="{% url work id %}">campaign page</a> to tell your friends.</a></div>
</div>
</div>
<div class="comments_textual">
<div>Congratulations! You wished for a campaign, and here it is. If ungluers like you pledge {{ campaign.target|intcomma }} by {{ campaign.deadline|date:"M d, Y" }}, <I>{{ title }}</i> will be released under a <a href="http://creativecommons.org">Creative Commons</a> license for all to enjoy.</div>
<div>You can help! <a href="{% url pledge work_id=id %}">Pledge</a> any amount, and use the sharing options on the <a href="{% url work id %}">campaign page</a> to tell your friends.</a></div>
</div>
</div>
{% endwith %}

View File

@ -1,6 +1,9 @@
We thought you might like to know, there are new comments for a book on your wishlist.
{{ comment.user.username }} on {{ comment.content_object.title }}
{{ comment.user.username }} has commented on {{ comment.content_object.title }}:
{{ comment.comment }}
To change your email preferences, visit https://unglue.it/notification/settings/
The Unglue.it team

View File

@ -2,17 +2,17 @@
{% with comment.user as user %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work id %}?tab=2"><img src="{{ comment.content_object.cover_image_small }}" alt="cover image for {{ comment.content_object.title }}" /></a>
</div>
<div class="comments_info">
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work id %}?tab=2"><img src="{{ comment.content_object.cover_image_small }}" alt="cover image for {{ comment.content_object.title }}" /></a>
</div>
<div class="comments_graphical">
<span><a href="{% url supporter supporter_username=user %}">{{ comment.user.username }}</a> has made a comment on <a href="{% url work id %}?tab=2">{{ comment.content_object.title }}</a></span>
</div>
<div class="comments_textual">
{{ comment.comment|linebreaksbr }}
</div>
</div>
<div class="comments_textual">
{{ comment.comment|linebreaksbr }}
</div>
</div>

View File

@ -1 +1 @@
{{ comment.user.username }} has commented on {{ comment.content_object.title }}
{{ comment.user.username }} has commented on {{ comment.content_object.title }} at Unglue.it

View File

@ -1,19 +1,41 @@
{% comment %}
Note: this is NOT intended to render notices
This is a model to use as a base for notice.html templates.
Copy/paste from here to your desired notice.html and fill in the specific content.
Using this template will allow notices.css to apply to all notices for a uniform style.
{% endcomment %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
{% comment %}
Your cover image goes here. e.g.:
<a href="{% url work work.id %}"><img src="{{ comment.content_object.cover_image_small }}" alt="cover image for {{ work.title }}" /></a>
modify as needed for your local context variables
{% endcomment %}
</div>
<div class="comments_graphical">
{% comment %}
This is where you put your headline.
Brief text, graphics-oriented info like user avatars and campaign status icons.
e.g.:
<a href="{% url supporter supporter_username=user %}">
{% if supporter.profile.pic_url %}
<img class="user-avatar" src="{{ comment.user.profile.pic_url }}" height="50" width="50" alt="Picture of {{ comment.user }}" title="{{ comment.user }}" />
{% else %}
<img class="user-avatar" src="/static/images/header/avatar.png" height="50" width="50" alt="Generic Ungluer Avatar" title="Ungluer" />
{% endif %}
</a>
<span><a href="{% url supporter supporter_username=user %}">{{ comment.user.username }}</a> on <a href="{% url work id %}?tab=2">{{ comment.content_object.title }}</a></span>
{% endcomment %}
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
</div>
<div class="comments_textual">
<p>
text comments
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
<div class="comments_textual">
{% comment %}
This is where you put the textual part of your message.
Examples include the text of comments, details about credit card charges, etc.
{% endcomment %}
</div>
</div>

View File

@ -1,7 +1,25 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
{% load humanize %}{% if campaign.left > 0 %} The campaign to unglue a book you've wishlisted, {{ campaign.work.title}}, is almost out of time. We need to raise ${{ campaign.left|intcomma }} more by {{ campaign.deadline }} in order to give this book to the world.
You will be also something.
{% if pledged %}
Your pledge of {{ amount|intcomma }} is helping {{ campaign.work.title }} to reach its goal, but we can only unglue this book if the campaign succeeds. You can help your pledge go farther by sharing the campaign (https://{{ site.domain }}{% url work work_id=campaign.work.id %}) with your friends through your favorite media: tweet, Facebook, Tumblr, blog, G+, Pinterest, email, carrier pigeon, or good old-fashioned conversation.
{% else %}
We need your pledge to reach this target. Any amount helps. You can chip in towards giving this book to the world at https://{{ site.domain }}{% url pledge work_id=campaign.work.id %} .
Give ebooks to the world; give income to authors and publishers. Unglue.it.
You can also help by sharing the campaign (https://{{ site.domain }}{% url work work_id=campaign.work.id %}) with your friends through your favorite media: tweet, Facebook, Tumblr, blog, G+, Pinterest, email, carrier pigeon, or good old-fashioned conversation.
{% endif %}
Thank you!
{% else %}
The campaign to unglue a book you've wishlisted, {{ campaign.work.title}}, is on track to succeed! It has met its target price of {{ campaign.target|intcomma }} and will close soon.
{% if pledged %}
Your pledge of ${{ amount|intcomma }} is helping us give this book to the world. Thank you! When the campaign closes, we'll be in touch about how and when you'll receive your premiums.
{% else %}
If you wanted to support this campaign, this is your last chance. Pledge by midnight (Eastern US time) if you want to help the campaign or receive any premiums: https://{{ site.domain }}{% url pledge work_id=campaign.work.id %}
{% endif %}
Thanks to ungluers like you, we'll soon be able to give this book to the world together. Hooray!
{% endif %}
{{ campaign.rightsholder }} and the Unglue.it team

View File

@ -1,19 +1,29 @@
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}"><img src="{{ campaign.work.cover_image_small }}" alt="cover image for {{ campaign.work.title }}" /></a>
</div>
<div class="comments_graphical">
The campaign for {{ campaign.work.title }} is almost over.
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
<div class="comments_textual">
The campaign for {{ campaign.work.title }} will end on {{ campaign.deadline }}. It needs ${{ campaign.left }} more before it can be unglued for all to enjoy.<br /><br />
</div>
<div class="comments_textual">
{% if pledged %}
Your pledge is helping us reach that goal. Will you help again by sharing this campaign with your friends?
{% else %}
You can help us give this book to the world by <a href="{% url pledge work_id=campaign.work.id %}">pledging</a> or by sharing this campaign with your friends.
{% endif %}
<p>
text comments
</p>
<ul>
<a href="{% url emailshare 'pledge' %}?next={% url work campaign.work.id|urlencode:"" %}"><li>Email it!</li></a>
<a href="https://twitter.com/intent/tweet?url=http://{{ site.domain }}{% url work campaign.work.id|urlencode:"" %}&text=Help%20me%20give%20{{ campaign.work.title|urlencode }}%20to%20the%20world%20at%20%40unglueit"><li>Tweet it!</li></a>
<a href="https://www.facebook.com/sharer.php?u=http://{{ site.domain }}{% url work campaign.work.id|urlencode:"" %}"><li>Share it on Facebook.</li></a>
<li>Best idea: talk about it with those you love.</li>
</ul><br />
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
Thank you!
</div>
</div>

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
{{campaign.work.title}} is running out of time

View File

@ -1,7 +1,13 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
{% load humanize %}The campaign to unglue a book you've wishlisted, {{ campaign.work.title}}, is close to succeeding! We only need to raise ${{ campaign.left|intcomma }} more by {{ campaign.deadline }} in order to give this book to the world.
You will be also something.
{% if pledged %}
Your pledge of {{ amount|intcomma }} is helping {{ campaign.work.title }} to reach its goal, but we can only unglue this book if the campaign succeeds. You can tip the balance by sharing the campaign (https://{{ site.domain }}{% url work work_id=campaign.work.id %}) with your friends through your favorite media: tweet, Facebook, Tumblr, blog, G+, Pinterest, email, carrier pigeon, or good old-fashioned conversation.
{% else %}
We need your pledge to reach this target. Any amount helps. You can chip in towards giving this book to the world at https://{{ site.domain }}{% url pledge work_id=campaign.work.id %} .
Give ebooks to the world; give income to authors and publishers. Unglue.it.
You can also help by sharing the campaign (https://{{ site.domain }}{% url work work_id=campaign.work.id %}) with your friends through your favorite media: tweet, Facebook, Tumblr, blog, G+, Pinterest, email, carrier pigeon, or good old-fashioned conversation.
{% endif %}
Thank you!
{{ campaign.rightsholder }} and the Unglue.it team

View File

@ -1,19 +1,30 @@
{% load humanize %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}"><img src="{{ campaign.work.cover_image_small }}" alt="cover image for {{ campaign.work.title }}" /></a>
</div>
<div class="comments_graphical">
<img src="/static/images/images/icon-book-37by25-{{ campaign.work.percent_unglued }}.png" alt="almost-unglued icon" title="almost-unglued icon" />
<span>The campaign to unglue a book you've wishlisted, {{ campaign.work.title}}, is close to succeeding!</span>
{% endcomment %}
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
<div class="comments_textual">
{% if pledged %}
Your pledge is helping us reach the campaign's target price of {{ campaign.target }}. Will you help again by sharing this campaign with your friends?
{% else %}
You can help us give this book to the world by <a href="{% url pledge work_id=campaign.work.id %}">pledging</a> or by sharing this campaign with your friends.
{% endif %}
</div>
<div class="comments_textual">
<ul>
<a href="{% url emailshare 'pledge' %}?next={% url work campaign.work.id|urlencode:"" %}"><li>Email it!</li></a>
<a href="https://twitter.com/intent/tweet?url=http://{{ site.domain }}{% url work campaign.work.id|urlencode:"" %}&text=Help%20me%20give%20{{ campaign.work.title|urlencode }}%20to%20the%20world%20at%20%40unglueit"><li>Tweet it!</li></a>
<a href="https://www.facebook.com/sharer.php?u=http://{{ site.domain }}{% url work campaign.work.id|urlencode:"" %}"><li>Share it on Facebook.</li></a>
<li>Best idea: talk about it with those you love.</li>
</ul><br />
<p>
text comments
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
Thank you!
</div>
</div>

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
The campaign for {{campaign.work.title}} has almost succeeded!

View File

@ -1,7 +1,8 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
{% load humanize %}Did you want one of the limited-edition premiums for the campaign to unglue {{ campaign.work.title }}? This is your last chance -- there's only one left!
You will be also something.
Premium: {{ premium.description }}
Minimum pledge: {{ premium.amount|intcomma }}
Give ebooks to the world; give income to authors and publishers. Unglue.it.
If you'd like to claim the last one, pledge here: https://{{ site.domain }}{% url pledge work_id=campaign.work.id %}
{{ campaign.rightsholder }} (rights holder for {{ campaign.work.title }}) and the Unglue.it team

View File

@ -1,19 +1,20 @@
{% load humanize %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}"><img src="{{ campaign.work.cover_image_small }}" alt="cover image for {{ campaign.work.title }}" /></a>
</div>
<div class="comments_graphical">
It's your last chance to claim one of the limited edition premiums for the campaign to unglue {{ campaign.work.title }}!
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
<div class="comments_textual">
Did you want one of the limited-edition premiums for the campaign to unglue {{ campaign.work.title }}? This is your last chance -- there's only one left!
</div>
<div class="comments_textual">
Premium: {{ premium.description }}
Minimum pledge: {{ premium.amount|intcomma }}
<p>
text comments
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
If you'd like to claim the last one, pledge here: https://{{ site.domain }}{% url pledge work_id=campaign.work.id %}
</div>
</div>

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
Last chance for a limited-edition premium for {{campaign.work.title}}

View File

@ -1,7 +1,13 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
{% load humanize %}Good news! The rights holder, {{ campaign.rightsholder }}, has lowered the target price to ${{ campaign.target|intcomma }} for {{ campaign.work.title }}. Now we only need to raise ${{ campaign.left|intcomma }} by {{ campaign.deadline }} in order to give this book to the world.
You will be also something.
{% if pledged %}
Your pledge of {{ amount|intcomma }} is now going even farther toward helping {{ campaign.work.title }} to reach its goal. Still, we can only unglue this book if the campaign succeeds. You can help by sharing the campaign (https://{{ site.domain }}{% url work work_id=campaign.work.id %}) with your friends through your favorite media: tweet, Facebook, Tumblr, blog, G+, Pinterest, email, carrier pigeon, or good old-fashioned conversation.
{% else %}
The target may be lower, but we still need your help to reach it. Pledges of any amount help. You can chip in towards giving this book to the world at https://{{ site.domain }}{% url pledge work_id=campaign.work.id %} .
Give ebooks to the world; give income to authors and publishers. Unglue.it.
You can also help by sharing the campaign (https://{{ site.domain }}{% url work work_id=campaign.work.id %}) with your friends through your favorite media: tweet, Facebook, Tumblr, blog, G+, Pinterest, email, carrier pigeon, or good old-fashioned conversation.
{% endif %}
Thank you!
{{ campaign.rightsholder }} and the Unglue.it team

View File

@ -1,19 +1,30 @@
{% with campaign.work.id as work_id %}
{% with campaign.work.title as title %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work work_id %}"><img src="{{ campaign.work.cover_image_small }}" alt="cover image for {{ title }}" /></a>
</div>
<div class="comments_graphical">
Good news! The rights holder, {{ campaign.rightsholder }}, has lowered the target price to ${{ campaign.target|intcomma }} for {{ title }}.
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
<div class="comments_textual">
{% if pledged %}
Your pledge of {{ amount|intcomma }} is now going even farther toward helping {{ title }} to reach its goal. Still, we can only unglue this book if the campaign succeeds. You can help again by sharing this campaign:
{% else %}
The target may be lower, but we still need your help to reach it. Pledges of any amount help. You can chip in towards giving this book to the world at https://{{ site.domain }}{% url pledge work_id=work_id %} . You can also help by sharing this campaign:
{% endif %}
</div>
<div class="comments_textual">
<ul>
<a href="{% url emailshare 'pledge' %}?next={% url work work_id|urlencode:"" %}"><li>Email it!</li></a>
<a href="https://twitter.com/intent/tweet?url=http://{{ site.domain }}{% url work work_id|urlencode:"" %}&text=I%20just%20pledged%20to%20unglue%20{{ title|urlencode }}%20at%20%40unglueit.%20Will%20you%20join%20me%3F"><li>Tweet it!</li></a>
<a href="https://www.facebook.com/sharer.php?u=http://{{ site.domain }}{% url work work_id|urlencode:"" %}"><li>Share it on Facebook.</li></a>
<li>Best idea: talk about it with those you love.</li>
</ul>
<p>
text comments
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
</div>
</div>
{% endwith %}
{% endwith %}

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
It just got easier to unglue {{campaign.work.title}}!

View File

@ -1,7 +1,12 @@
Congratulations! You wished for it and pledged for it, and now the Campaign
for {{ campaign.work.title}} (http://{{site.domain}}{% url work campaign.work.id %}?tab=2) has succeeded.
{% if pledged %}Congratulations! You pledged toward{% else %}Hooray! You wished for{% endif %} it, and now the campaign
for {{ campaign.work.title}} (http://{{site.domain}}{% url work campaign.work.id %}) has succeeded.
You will notified when an Unglued ebook edition is available, within 90 days.
{% if pledged %}
You will be receiving notification about your Campaign Premium(s) for {{ campaign.work.title}} directly from the RIGHTS HOLDER.
If necessary to provide you with any premiums you requested, {{ campaign.rightsholder }} will be contacting you.
{% endif%}
Give ebooks to the world; give income to authors and publishers. Unglue.it.
Thank you for your support.
{{ campaign.rightsholder }} (rights holder for {{ campaign.work.title }} and the Unglue.it team

View File

@ -1,24 +1,17 @@
{% with campaign.work.title as title %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work work.id %}"><img src="{{ campaign.work.cover_image_small }}" alt="cover image for {{ title }}" /></a>
</div>
<div class="comments_graphical">
Hooray! We're going to give {{ title }} to the world!
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
</div>
<div class="comments_textual">
<p>Congratulations! You wished for it and pledged for it, and now the Campaign
for <a href="{% url work campaign.work.id %}?tab=2">{{ campaign.work.title}}</a> has succeeded.
You will notified when an Unglued ebook edition is
available, within 90 days.</p>
<p>You will be receiving notification about your Campaign
Premium(s) for <a href="{% url work campaign.work.id %}?tab=2">{{ campaign.work.title}}</a> directly from the RIGHTS HOLDER.
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
<div class="comments_textual">
A book on your wishlist, {{ title }}, has met its goal price of {{ campaign.target }}, thanks to the support of ungluers like you. Unglue.it and the book's rights holder, {{ campaign.rightsholder }}, will be converting it to an unglued ebook edition and making it available for all the world to enjoy. If you've asked us to in your <a href="/notification/settings/">notification settings</a>, we'll tell you when the unglued ebook is ready.<br /><br />
Thank you again!
</div>
</div>
{% endwith %}

View File

@ -1,8 +1,8 @@
{% if work.last_campaign_status == 'SUCCESSFUL' %}
Great News, {{user.username}}! {{ work.title }}, which you have supported on Unglue.it, is now available for download as an Unglued Ebook.
Great news, {{ user.username }}! {{ work.title }}, which you have supported on Unglue.it, is now available for download as an Unglued Ebook.
</p>
{% else %}
Good News, {{user.username}}! {{ work.title }} which is on your wishlist is available for download as a {{ work.ebooks.0.get_rights_display }} ebook.
Good News, {{ user.username }}! {{ work.title }}, which is on your wishlist, is available for download as a {{ work.ebooks.0.get_rights_display }} ebook.
{% if work.ebooks.0.user %}
We'd like to thank Ungluer {{work.ebooks.0.user}} for adding the link(s).
@ -31,6 +31,4 @@ If you have any problems with these ebook files, please don't hesitate to let us
Thanks,
Your Tireless Unglue.it Staff
Give ebooks to the world; give income to authors and publishers. Unglue.it
The Unglue.it team

View File

@ -1,68 +1,76 @@
{% load truncatechars %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work work.id %}"><img src="{{ work.cover_image_small }}" alt="cover image for {{ work.title }}" /></a>
</div>
{% comment %}
Note: this is NOT intended to render notices
<div class="comments_info">
This is a model to use as a base for notice.html templates.
Copy/paste from here to your desired notice.html and fill in the specific content.
Using this template will allow notices.css to apply to all notices for a uniform style.
{% endcomment %}
<div class="comments clearfix">
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work work.id %}"><img src="{{ work.cover_image_small }}" alt="cover image for {{ work.title }}" /></a>
</div>
<div class="comments_graphical">
<span><a href="{% url work work.id %}">{{ work.title }}</a> is now available for download</span>
</div>
<div class="comments_textual">
{% if work.last_campaign_status == 'SUCCESSFUL' %}
<p>
Great News! <a href="{% url work work.id %}">{{ work.title }}</a> which you have supported is now available for download as an Unglued Ebook.
</p>
{% else %}
<p>
Good News! <a href="{% url work work.id %}">{{ work.title }}</a> which is on your wishlist is available for download as a {{ work.ebooks.0.get_rights_display }} ebook.
</p>
{% if work.ebooks.0.user %}
<p>
We'd like to thank Ungluer {{work.ebooks.0.user}} for adding the link(s).
</p>
{% endif %}
{% endif %}
<p>Here are the files available for download:</p>
<table>
<tr>
<th>File type</th>
<th>License</th>
<th>Host Site</th>
<th>URL</th>
</tr>
{% for ebook in work.ebooks %}
<tr>
<td>{{ ebook.get_format_display }}</td>
<td>{{ ebook.get_rights_display }}</td>
<td>{{ ebook.provider }}</td>
<td><a href="{{ ebook.url }}">{{ ebook.url|truncatechars:30 }}</a></td>
</tr>
{% endfor %}
</div>
</table>
<div class="comments_textual">
{% if work.last_campaign_status == 'SUCCESSFUL' %}
<p>
Great News! <a href="{% url work work.id %}">{{ work.title }}</a> which you have supported is now available for download as an Unglued Ebook.
</p>
{% else %}
<p>
Good News! <a href="{% url work work.id %}">{{ work.title }}</a> which is on your wishlist is available for download as a {{ work.ebooks.0.get_rights_display }} ebook.
</p>
{% if work.ebooks.0.user %}
<p>
We'd like to thank Ungluer {{work.ebooks.0.user}} for adding the link(s).
</p>
{% endif %}
{% endif %}
<p>
{% if work.ebooks.0.rights == 'PD-US' %}
A public domain ebook belongs to all of us. You can do anything you like with it.
{% else %}
The Creative Commons licensing terms for the ebook allow you to redistribute the files under the specified license terms. There's no DRM.
{% endif %}
</p>
<p>
{% if work.last_campaign_status == 'SUCCESSFUL' %}
If you have any problems with this unglued ebook, please don't hesitate to let us know at support@gluejar.com. And if you love being able to give this ebook for free to all of your friends, please consider supporting other ebooks for ungluing.
{% else %}
If you have any problems with these ebook files, please don't hesitate to let us know at support@gluejar.com. For example, if the file isn't what it says it is, or if the licensing or copyright status is misrepresented, we want to know as soon as possble.
{% endif %}
</p>
<p>
Thanks,
</p>
<p>
<p>Here are the files available for download:</p>
<table>
<tr>
<th>File type</th>
<th>License</th>
<th>Host Site</th>
<th>URL</th>
</tr>
{% for ebook in work.ebooks %}
<tr>
<td>{{ ebook.get_format_display }}</td>
<td>{{ ebook.get_rights_display }}</td>
<td>{{ ebook.provider }}</td>
<td><a href="{{ ebook.url }}">{{ ebook.url|truncatechars:30 }}</a></td>
</tr>
{% endfor %}
Your Tireless Unglue.it Staff
</p>
</div>
</table>
<p>
{% if work.ebooks.0.rights == 'PD-US' %}
A public domain ebook belongs to all of us. You can do anything you like with it.
{% else %}
The <a href="https://creativecommons.org/licenses">Creative Commons licensing terms</a> for the ebook allow you to redistribute the files under the specified license terms. There's no DRM. Consult <a href="https://creativecommons.org/licenses">CreativeCommons.org</a> for more details.
{% endif %}
</p>
<p>
{% if work.last_campaign_status == 'SUCCESSFUL' %}
If you have any problems with this unglued ebook, please don't hesitate to let us know at <a href="mailto:support@gluejar.com">support@gluejar.com</a>. And if you love being able to give this ebook for free to all of your friends, please consider supporting other ebooks for ungluing.
{% else %}
If you have any problems with these ebook files, please don't hesitate to let us know at <a href="mailto:support@gluejar.com">support@gluejar.com</a>. For example, if the file isn't what it says it is, or if the licensing or copyright status is misrepresented, we want to know as soon as possble.
{% endif %}
</p>
<p>
Thank you!
</p>
<p>
The Unglue.it team
</p>
</div>
</div>

View File

@ -1 +1 @@
{{work.title}} is available for download!
{{ work.title }} is available for download!

View File

@ -1,7 +1,9 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
Alas. The campaign to unglue {{ campaign.work.title}} (http://{{site.domain}}{% url work campaign.work.id %}) has not succeeded.
You will be also something.
If you pledged toward this work, your pledge will expire shortly and your credit card will not be charged, nor will you receive any premiums.
Give ebooks to the world; give income to authors and publishers. Unglue.it.
Still want to give {{ campaign.work.title }} to the world? Don't despair. Keep it on your wishlist and tell everyone why you love this book. The rights holder, {{ campaign.rightsholder }}, may run a campaign with different terms in the future. With your help, we may yet be able to unglue {{ campaign.work.title }}.
Thank you for your support.
{{ campaign.rightsholder }} (rights holder for {{ campaign.work.title }} and the Unglue.it team

View File

@ -1,19 +1,20 @@
{% with campaign.work.title as title %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}"><img src="{{ campaign.work.cover_image_small }}" alt="cover image for {{ title }}" /></a>
</div>
<div class="comments_graphical">
Alas. The campaign to unglue {{ title }} did not succeed.
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
<div class="comments_textual">
If you pledged toward this work, your pledge will expire shortly and your credit card will not be charged, nor will you receive any premiums.
</div>
<div class="comments_textual">
Still want to give {{ title }} to the world? Don't despair. Keep it on your wishlist and tell everyone why you love this book. The rights holder, {{ campaign.rightsholder }}, may run a campaign with different terms in the future. With your help, we may yet be able to unglue {{ title }}.
<p>
text comments
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
Thank you for your support.
</div>
</div>
{% endwith %}

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
Alas: the campaign for {{ campaign.work.title }} has not succeeded

View File

@ -1,7 +1,3 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
There's new information about a work on your wishlist! {{ campaign.rightsholder }}, the rights holder for {{ campaign.work.title}}, has updated the campaign. See the details at http://{{site.domain}}{% url work campaign.work.id %}.
You will be also something.
Give ebooks to the world; give income to authors and publishers. Unglue.it.
{{ campaign.rightsholder }} and the Unglue.it team

View File

@ -1,19 +1,12 @@
{% with campaign.work.title as title %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
</div>
<div class="comments_info">
<div class="comments_graphical">
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}"><img src="{{ campaign.work.cover_image_small }}" alt="cover image for {{ title }}" /></a>
</div>
<div class="comments_textual">
<p>
text comments
</p>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
<div class="comments_graphical">
The rights holder, {{ campaign.rightsholder }}, has updated the campaign to unglue {{ title }}. For details, see the <a href="{% url work campaign.work.id %}">campaign page</a>.
</div>
</div>
</div>
{% endwith %}

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
Update: Campaign to unglue {{campaign.work.title}}

View File

@ -1,7 +1,9 @@
Message! About {{ campaign.work.title}}
(http://{{site.domain}}{% url work campaign.work.id %}?tab=2) something.
You will something.
Hooray! A rights holder, {{ rightsholder }}, has claimed {{ claim.work.title }}, a work on your wishlist at Unglue.it.
You will be also something.
What does this mean for you? Rights holders are the people who are legally authorized to license works. This means they're the only people who can run campaigns on Unglue.it.
Give ebooks to the world; give income to authors and publishers. Unglue.it.
{{ rightsholder }} may be running a campaign soon, or later, but isn't obligated to. Want to make that campaign happen? Leave a comment (http://{{site.domain}}{% url work campaign.work.id %}?tab=2) and tell your friends: make sure {{ rightsholder }} knows how much you want to give this book to the world.
Thanks for your help!
{{ rightsholder }} and the Unglue.it team

View File

@ -1,19 +1,31 @@
{% with claim.work.id as work_id %}
{% with claim.work.title as title %}
<div class="comments clearfix">
<div class="comments_book">
<a href="{% url work campaign.work.id %}?tab=2"><img src="{{ campaign.work.cover_image_thumbnail }}" alt="cover image for {{ campaign.work.title }}" /></a>
<div class="comments_info clearfix">
<div class="comments_book">
<a href="{% url work work_id %}"><img src="{{ claim.work.cover_image_small }}" alt="cover image for {{ title }}" /></a>
</div>
<div class="comments_graphical">
Hooray! {{ rightsholder }} is now an approved rights holder for {{ title }}.
</div>
</div>
<div class="comments_info">
<div class="comments_graphical">
<div class="comments_textual">
What does this mean for you? Rights holders are the people who are legally authorized to license works. This means they're the only people who can run campaigns on Unglue.it.
</div>
<div class="comments_textual">
{{ rightsholder }} may be running a campaign soon, or later, but isn't obligated to. Want to make that campaign happen? <a href="http://{{site.domain}}{% url work work_id %}?tab=2">Leave a comment</a> and tell your friends:
<p>
text comments
</p>
<ul>
<a href="{% url emailshare 'pledge' %}?next={% url work work_id|urlencode:"" %}"><li>Email it!</li></a>
<a href="https://twitter.com/intent/tweet?url=http://{{ site.domain }}{% url work work_id|urlencode:"" %}&text=I%20just%20pledged%20to%20unglue%20{{ title|urlencode }}%20at%20%40unglueit.%20Will%20you%20join%20me%3F"><li>Tweet it!</li></a>
<a href="https://www.facebook.com/sharer.php?u=http://{{ site.domain }}{% url work work_id|urlencode:"" %}"><li>Share it on Facebook.</li></a>
<li>Best idea: talk about it with those you love.</li>
</ul>
<p class="classname">Give ebooks to the world; give income to authors and publishers. Unglue.it</p>
</div>
Make sure {{ rightsholder }} knows how much you want to give this book to the world.
Thanks for your help!
</div>
</div>
{% endwith %}
{% endwith %}

View File

@ -1 +1 @@
blurb for {{campaign.work.title}}
A rights holder has claimed {{campaign.work.title}} at Unglue.it

View File

@ -1,4 +1,5 @@
{% extends "basepledge.html" %}
{% load humanize %}
{% block title %}Pledge{% endblock %}
@ -6,11 +7,17 @@
<link type="text/css" rel="stylesheet" href="/static/css/campaign.css" />
<link type="text/css" rel="stylesheet" href="/static/css/pledge.css" />
<script type="text/javascript" src="/static/js/prefill_pledge.js"></script>
<script type="text/javascript">
var $j = jQuery.noConflict();
//give pledge box focus
$j(function() {
$j('#id_preapproval_amount').focus();
});
</script>
{% endblock %}
{% block doccontent %}
<div style="height:15px";></div>
<div style="height:15px"></div>
<div class="book-detail">
<div id="book-detail-img">
<a href="#"><img src="{{ work.cover_image_thumbnail }}" alt="{{ work.title }}" title="{{ work.title }}" width="131" height="192" /></a>
@ -29,14 +36,14 @@
<div class="jsmodule rounded pledge">
<div class="jsmod-content">
${{ work.last_campaign.target }} needed by<br />
${{ work.last_campaign.target|intcomma }} needed by<br />
{{ work.last_campaign.deadline }}
</div>
</div>
<div class="pledged-info">
<div class="pledged-group">
{{ work.last_campaign.supporters.count }} Ungluers have pledged ${{ work.last_campaign.current_total }}
{{ work.last_campaign.supporters.count }} Ungluers have pledged ${{ work.last_campaign.current_total|intcomma }}
</div>
<div class="status">
<img src="/static/images/images/icon-book-37by25-{{ work.percent_unglued }}.png" title="book list status" alt="book list status" />
@ -45,11 +52,17 @@
</div>
</div>
<div class="jsmodule rounded">
<div class="jsmodule rounded clearfix">
<div class="jsmod-content">
{% if faqmenu == 'modify' %}
<p>You have pledged ${{preapproval_amount}}. If you would like to modify your pledge, please use the following form.</p>
<div class="modify_notification clearfix"><h4>You've already pledged to this campaign:</h4>
<div>
Amount: ${{preapproval_amount|intcomma}}.<br />
Your premium: {% if premium_description %}{{ premium_description }}{% else %}You did not request a premium for this campaign.{% endif %}<br/>
</div>
<br /> You can modify your pledge below.
</div>
{% endif %}
{% comment %}
@ -66,27 +79,30 @@
{{ form.anonymous.label_tag }}: {{ form.anonymous.errors }}{{ form.anonymous }}
{% endcomment %}
<div class="pledge_amount premium_level">Choose your premium:</div>
<ul class="support menu" id="premiums_list">
{% for premium in premiums %}
{% if premium.limit == 0 or premium.limit > premium.premium_count %}
<label for="premium_{{premium.id}}">
{% for premium_item in premiums %}
{% if premium_item.limit == 0 or premium_item.limit > premium_item.premium_count %}
<li class="{% if forloop.first %}first{% else %}{% if forloop.last %}last{% endif %}{% endif %}">
<input type="radio" name="premium_id" id="premium_{{premium.id}}" value="{{premium.id}}" {% ifequal request.REQUEST.premium_id premium.id|stringformat:"s" %}checked="checked"{% endifequal %} />
<label for="premium_{{premium_item.id}}">
<input type="radio" name="premium_id" id="premium_{{premium_item.id}}" value="{{premium_item.id}}" {% ifequal request.REQUEST.premium_id premium_item.id|stringformat:"s" %}checked="checked"{% else %} {% ifequal premium_id premium_item.id %}checked="checked"{% endifequal %}{% endifequal %}/>
<span class="menu-item-price">
${{ premium.amount }}
${{ premium_item.amount|intcomma }}
</span>
<span class="menu-item-desc">
{{ premium.description }} {% ifnotequal premium.limit 0 %}<br /> Only {{ premium.premium_remaining }} remaining! {% endifnotequal %}
{{ premium_item.description }} {% ifnotequal premium_item.limit 0 %}<br /> Only {{ premium_item.premium_remaining }} remaining! {% endifnotequal %}
</span>
</a></li></label>
</label></li>
{% endif %}
{% endfor %}
</ul>
<input type="submit" {% if faqmenu == 'modify' %}value="Modify Pledge"{% else %}value="Pledge"{% endif %} id="pledgesubmit" />
<input type="submit" {% if faqmenu == 'modify' %}value="Modify Pledge"{% else %}value="Pledge Now"{% endif %} id="pledgesubmit" />
</form>
</div>
</div>
{% if faqmenu == 'modify' %}<div class="spacer"></div><div>We hope you won't, but of course you're also free to <a href="{% url pledge_cancel %}?tid={{ tid }}">cancel your pledge</a>.</div>{% endif %}
{% endblock %}

View File

@ -1,4 +1,5 @@
{% extends "basepledge.html" %}
{% load humanize %}
{% block title %}Pledge Cancelled{% endblock %}
@ -9,13 +10,21 @@
{% block doccontent %}
{% if transaction %}
<div>You were about to pledge ${{transaction.amount}} to <a href="{% url work work.id %}">{{work.title}}</a> but hit the cancel link.
Naturally, we won't be charging your PayPal account for this campaign unless you give permission.</div>
<div>However, the campaign can definitely make use of your pledge -- so won't you reconsider?</div>
<div>You <a href="{{try_again_url}}">can finish the pledge transaction</a>.</div>
<div>You've asked to cancel your pledge of ${{ transaction.amount|intcomma }} to <a href="{% url work work.id %}">{{ work.title }}</a> Did you mean to do this?</div>
<div class="btn_support">Yes, cancel my pledge</div><div class="btn_support">Whoops, don't cancel!</div>
{% comment %}
"Yes" should trigger whatever functionality we need to complete cancellation -- may differ depending on whether we've hit the back button from Amazon or the cancel-my-pledge link in pledge_modify.
Similarly. "Whoops" should use {{ try_again_url }} if we're coming out of Amazon, and should be a link back to the work page otherwise.
Not sure whether these want to be input buttons for forms, links, javascript, or what -- make them be whichever they need; I have applicable styling in any case. Will retrofit that.
This suggests we may need an if condition to determine which route we've come from since they may have different context (e.g. try_again_url I suspect only applies if we've come by way of the payment processor).
{% endcomment %}
{% else %}
<div>We're sorry; we can't figure out which transaction you're talking about. If you meant to cancel a pledge, please go to the book's page and hit the Modify link.</div>
<div>We're sorry; we can't figure out which transaction you're talking about. If you meant to cancel a pledge (though we hope you don't!), please go to the book's page and hit the Modify Pledge button.</div>
{% endif %}
{% endblock %}

View File

@ -1,4 +1,5 @@
{% extends "basepledge.html" %}
{% load humanize %}
{% block title %}Pledge Completed{% endblock %}
@ -23,24 +24,21 @@
<script type="text/javascript" src="/static/js/embed.js"></script>
{% endblock %}
{% comment %}
this page needs to be laid out/styled
we need the share options and also something like the home page slide show to give people entry points back into the content
{% endcomment %}
{% block doccontent %}
<div class="clearfix">
<h2 class="thank-you">Thank you!</h2>
<p class="pledge_complete">You've just pledged ${{ transaction.amount }} to <a href="{% url work work.id %}">{{ work.title }}</a>. If it reaches its goal of ${{ campaign.target }} by {{ campaign.deadline|date:"M d Y"}}, it will be unglued for all to enjoy.</p>
<p class="pledge_complete">You've just pledged ${{ transaction.amount|intcomma }} to <a href="{% url work work.id %}">{{ work.title }}</a>. If it reaches its goal of ${{ campaign.target|intcomma }} by {{ campaign.deadline|date:"M d Y"}}, it will be unglued for all to enjoy.</p>
<p class="pledge_complete">You can help even more by sharing this campaign with your friends:</p>
<div id="widgetcode">Copy/paste this into your site:<br /><textarea rows="7" cols="22">&lt;iframe src="https://{{request.META.HTTP_HOST}}/api/widget/{{work.first_isbn_13}}/" width="152" height="325" frameborder="0"&gt;&lt;/iframe&gt;</textarea></div>
<ul class="social menu pledge">
<a href="https://www.facebook.com/sharer.php?u={% url work work.id|urlencode:"" %}"><li class="facebook first"><span>Facebook</span></li></a>
<a href="https://twitter.com/intent/tweet?url={% url work work.id|urlencode:"" %}&amp;text=I%20just%20pledged%20to%20unglue%20{{ work.title|urlencode }}%20at%20%40unglueit.%20Will%20you%20join%20me%3F"><li class="twitter"><span>Twitter</span></li></a>
<a href="{% url emailshare %}?next={% url work work.id|urlencode:"" %}"><li class="email"><span>Email</span></li></a>
{% with site.domain as domain %}
<a href="https://www.facebook.com/sharer.php?u=http://{{ site.domain }}{% url work work.id|urlencode:"" %}"><li class="facebook first"><span>Facebook</span></li></a>
<a href="https://twitter.com/intent/tweet?url=http://{{ site.domain }}{% url work work.id|urlencode:"" %}&amp;text=I%20just%20pledged%20to%20unglue%20{{ work.title|urlencode }}%20at%20%40unglueit.%20Will%20you%20join%20me%3F"><li class="twitter"><span>Twitter</span></li></a>
{% endwith %}
<a href="{% url emailshare 'pledge' %}?next={% url work work.id|urlencode:"" %}"><li class="email"><span>Email</span></li></a>
<a href="#" id="embed"><li class="embed"><span>Embed</span></li></a>
</ul>
</div>

View File

@ -29,6 +29,11 @@
<a id="latest"></a><h2>Latest Press</h2>
<div class="pressarticles">
<div>
<a href="http://beyondthebookcast.com/free-e-books-is-gluejars-mission/">BTB #296: Free E-books Is Gluejars Mission</a><br />
Beyond the Book (Copyright Clearance Center) - May 3, 2012<br />
Listen to Eric Hellman explain the Unglue.it model in this podcast.
</div>
<div>
<a href="http://pubwest.org/endsheet-2/a-new-approach-for-backlist-titles/">A New Approach for Backlist Titles</a><br />
PubWest Endsheet - Spring 2012
@ -37,10 +42,6 @@
<a href="http://americanlibrariesmagazine.org/solutions-and-services/unglueit">Solutions and Services: Unglue.it</a><br />
American Libraries - February 14, 2012
</div>
<div>
<a href="http://www.teleread.com/copy-right/web-site-hopes-to-unglue-e-book-versions-of-copyrighted-books-thorugh-crowdfunding/">Web site hopes to unglue e-book versions of copyrighted books through crowdfunding</a><br />
TeleRead - January 31, 2012
</div>
</div>
<a id="overview"></a><h2>Overview</h2>
@ -125,6 +126,19 @@ For more background, read our president Eric Hellman's thoughts on <a href="http
<a id="blogs"></a><h2>Blog Coverage (Highlights)</h2>
<div class="pressarticles">
<div>
<a href="http://beyondthebookcast.com/free-e-books-is-gluejars-mission/">BTB #296: Free E-books Is Gluejars Mission</a><br />
Beyond the Book (Copyright Clearance Center) - May 3, 2012<br />
Listen to Eric Hellman explain the Unglue.it model in this podcast.
</div>
<div>
<a href="http://www.techdirt.com/blog/innovation/articles/20120422/04463518597/re-inventing-public-libraries-digital-age.shtml">Re-Inventing Public Libraries For The Digital Age</a><br />
Innovation (Techdirt) - May 3, 2012
</div>
<div>
<a href="http://www.lecturalab.org/story/Unglueit-la-plataforma-de-crowfunding-para-liberar-libros-ser-lanzada-en-mayo_3151">Unglue.it, la plataforma de crowfunding para liberar libros, será lanzada en mayo</a> <I>(Spanish)</I><br />
I+D de la Lectura - April 28, 2012
</div>
<div>
<a href="http://plan3t.info/2012/02/08/unglue-it-was-ware-wenn/">Unglue.it: Was wäre, wenn…</a> <I>(German)</I><br />
Plan3t Info - February 8, 2012
@ -219,7 +233,7 @@ For more background, read our president Eric Hellman's thoughts on <a href="http
</div>
<div class="outer">
<div><a href="/static/images/search_listview.png"><img src="/static/images/search_listview_thumb.png" class="screenshot" alt="screenshot" /></a></div>
<div class="text"><p>300 ppi screenshot of a search result page, powered by Google Books. Users can add books to their wishlist with one click, or click through for more information. Books with active campaigns display a progress meter. Books that are already unglued or in the public domain link to freely available copies.</p></div>
<div class="text"><p>300 ppi screenshot of a search result page, powered by Google Books. Users can add books to their wishlist with one click, or click through for more information. Books with active campaigns display a progress meter. Where possible, books that are already unglued or in the public domain link to freely available copies.</p></div>
</div>
<div class="outer">
<div><a href="/static/images/search_panelview.png"><img src="/static/images/search_panelview_thumb.png" class="screenshot" alt="screenshot" /></a></div>

View File

@ -148,7 +148,7 @@ Needs to be written. What would you find helpful in a social media toolkit? <a
<p>Here are the standard rewards:</p>
<ul class="terms">
<li><em>Any level</em> &#8212; The unglued ebook delivered to your inbox</li>
<li><em>Any level ($1 minimum)</em> &#8212; The unglued ebook delivered to your inbox</li>
<li><em>$25</em> &#8212; Your username under "supporters" in the acknowledgements section</li>
<li><em>$50</em> &#8212; Your name &amp; profile link under "benefactors"</li>
<li><em>$100</em> &#8212; Your name, profile link, &amp; profile tagline under "bibliophiles"</li>

View File

@ -71,8 +71,9 @@ $j(document).ready(function() {
{% with work.googlebooks_id as googlebooks_id %}
{% with work.last_campaign_status as status %}
{% with work.last_campaign.deadline as deadline %}
{% with 'yes' as on_search_page %}
{% include "book_panel.html" %}
{% endwith %}{% endwith %}{% endwith %}
{% endwith %}{% endwith %}{% endwith %}{% endwith %}
</div>
{% empty %}
<h2>Sorry, couldn't find that!</h2>

View File

@ -1,3 +1,4 @@
{% load humanize %}
<div class="jsmodule">
<div class="jsmod-content">
<ul class="menu level1">
@ -5,9 +6,9 @@
stuff about stuff.
will contain campaign info. maybe a cover image. (small.)
{% comment %}
<p class="pledge_complete">You just pledged ${{transaction.amount}} to <a href="{% url work work.id %}">{{work.title}}</a>.</p>
<p class="pledge_complete">If the campaign reaches its target of ${{campaign.target}} by {{campaign.deadline|date:"F d, Y"}},
your PayPal account will be charged ${{transaction.amount}}.</p>
<p class="pledge_complete">You just pledged ${{transaction.amount|intcomma}} to <a href="{% url work work.id %}">{{work.title}}</a>.</p>
<p class="pledge_complete">If the campaign reaches its target of ${{campaign.target|intcomma}} by {{campaign.deadline|date:"F d, Y"}},
your PayPal account will be charged ${{transaction.amount|intcomma}}.</p>
note: campaign (image, title, rights holder, deadline, maybe target)
pledge amount

View File

@ -13,7 +13,7 @@
{% block doccontent %}
<h2>Unglue.it Draft Terms of Use</h2>
<p>Date of last revision: December 16, 2011</p>
<p>Date of last revision: May 14, 2012</p>
<a href="#acceptance">Acceptance of Terms</a><br />
<a href="#registration">Registration</a><br />
@ -37,39 +37,40 @@
<a id="acceptance"><h3>Acceptance of Terms</h3></a>
<p>Welcome to Unglue.it, the website and online service of Gluejar, Inc. (the “Company”, "Unglue.it" "we," or "us"). Unglue.it is a crowd funding platform that facilitates the distribution and licensing of copyrighted literary works. The holder(s) of rights to a copyrighted literary work (the “Rights Holder”) can use the Unglue.it Service to accept and collect contributions in exchange for the release of the work, in digital form, under a Creative Commons License. Persons who wish to contribute (“Supporters”) towards the fundraising goal set by the Rights Holder can do so using Unglue.it. The mechanism by which Rights Holders collect contributions from Supporters using the Service is known as an “Unglue.it Campaign.”
<p>Welcome to Unglue.it, the website and online service of Gluejar, Inc. (the “Company”, "Unglue.it" "we," or "us"). Unglue.it is a crowd funding platform that facilitates the distribution and licensing of copyrighted literary works. The holder(s) of rights to a copyrighted literary work (the “Rights Holder”) can use the Unglue.it Service to accept and collect contributions in exchange for the release of the work, in digital form, under a Creative Commons License. Persons who wish to contribute (“Supporters”) towards the Campaign Goal set by the Rights Holder can do so using Unglue.it. The mechanism by which Rights Holders collect Contributions from Supporters using the Service is known as an “Unglue.it Campaign.” </p>
This terms of use agreement (the "Agreement") governs your use of the web site and the service owned and operated by Gluejar (collectively with the site, the “Service”). This Agreement also incorporates the Privacy Policy available at <a href="https://Unglue.it/privacy">Unglue.it/privacy</a>, and all other operating rules, policies and procedures that may be published from time to time on the Site by Company, each of which is incorporated by reference and each of which may be updated by Company from time to time without notice to you. In addition, some services offered through the Service may be subject to additional terms promulgated by Company from time to time; your use of such services is subject to those additional terms, which are incorporated into these Terms of Use by this reference. By using this site in any manner, you agree to be bound by this Agreement, whether or not you are a registered user of our Service.</p>
<p>This terms of use agreement (the "Agreement") governs the use of the Unglue.it website (the “Website”) and the service owned and operated by Gluejar (collectively with the Website, the “Service”) by all persons and/or entities who visit the Website and/or use the Service (“you”.) This Agreement also incorporates the Privacy Policy available at <a href="https://Unglue.it/privacy">Unglue.it/privacy</a>, and all other operating rules, policies and procedures that may be published from time to time on the Website by Company, each of which is incorporated by reference and each of which may be updated by Company from time to time. You accept Companys posting of any changes to this Agreement on the Website as sufficient notice of such change. In addition, some services offered through the Service may be subject to additional terms promulgated by Company from time to time, which may be posted on the Website or sent to you via email or otherwise; your use of such services is subject to those additional terms, which are incorporated into these Terms of Use by this reference. By using this site in any manner, you agree to be bound by this Agreement, whether or not you are a registered user of our Service.
</p>
<a id="registration"><h3>Registration</h3></a>
<p>You do not have to register an account in order to visit Unglue.it. To access certain features of the Service, though, including wishlisting and pledging, you will need to register with Unglue.it. You shall not (i) select or use as a Username a name of another person with the intent to impersonate that person; (ii) use as a Username a name subject to any rights of a person other than you without appropriate authorization; or (iii) use as a Username a name that is otherwise offensive, vulgar or obscene. Company reserves the right to refuse registration of, or cancel a Username and domain in its sole discretion. You are solely responsible for activity that occurs on your account and shall be responsible for maintaining the confidentiality of your Company password. You shall never use another users account without such other users express permission. You will immediately notify Company in writing of any unauthorized use of your account, or other account related security breach of which you are aware.</p>
<p>You do not have to register an account in order to visit Unglue.it. To access certain features of the Service, however, including wishlisting and pledging, you will need to register with Unglue.it. You shall not (i) select or use as a Username a name of another person with the intent to impersonate that person; (ii) use as a Username a name subject to any rights of a person other than you without appropriate authorization; or (iii) use as a Username a name that is otherwise offensive, vulgar or obscene. Company reserves the right to refuse registration of, or cancel a Username and domain in its sole discretion. You are solely responsible for activity that occurs on your account and shall be responsible for maintaining the confidentiality of your Company password. You shall never use another users account without such other users express permission. You will immediately notify Company in writing of any unauthorized use of your account, or other account related security breach of which you are aware.</p>
<a id="use"><h3>Use of the Service</h3></a>
<p>Except as allowed by a Platform Services Agreement for Rights Holders, the Service is provided only for your personal, non-commercial use. You are responsible for all of your activity in connection with the Service.</p>
<p>Except as allowed by a Platform Services Agreement for Rights Holders, the Service is provided only for your personal, non-commercial use. You are solely responsible for all of your activity in connection with the Service and for any consequences (whether or not intended) of your posting or uploading of any material on the Website.</p>
<p>By way of example, and not as a limitation, you shall not (and shall not permit any third party to) use the Service in order to:</p>
<ul class="terms">
<li>violate anyones right of privacy;</li>
<li>act in any way that might give rise to civil or criminal liability;</li>
<li>infringe any patent, trademark, trade secret, copyright, right of publicity or other right of any other person or entity or violates any law or contractual duty;</li>
<li>harass, threaten, or otherwise annoy anyone.</li>
<li>harass, threaten, bully or otherwise cause any other person to fear for their safety.</li>
</ul>
<p>Additionally, you shall not interfere with the proper working of the Service or any activities conducted on the Service or take any action that imposes or may impose (as determined by Company in its sole discretion) an unreasonable or disproportionately large load on Companys (or its third party providers) infrastructure.</p>
<a id="content"><h3>Content and License</h3></a>
<p>Some areas of the Service may allow you to post feedback, comments, questions, and other information. Any such postings, together with Campaigns, constitute "User Content." You are solely responsible for your User Content that you upload, publish, display, or otherwise make available (hereinafter, "post") on the Service, and you agree that we are only acting as a passive conduit for your online distribution and publication of your User Content. Unglue.it does not endorse, control, or have ownership rights to User Content. By posting User Content, you:</p>
<p>Some areas of the Service may allow you to post feedback, comments, questions, and other information. Any such postings, together with Campaigns, constitute "User Content." You are solely responsible for your User Content that you upload, publish, display, or otherwise make available (hereinafter, "post") on the Service, and you agree that we are only acting as a passive conduit for your online distribution and publication of your User Content. Unglue.it does not endorse, control, or have ownership rights to User Content. By posting User Content, :</p>
<ul class="terms">
<li>acknowledge that you may be identified publicly by your Username in association with any such User Content;</li>
<li>grant the Company a worldwide, non-exclusive, perpetual, irrevocable, royalty-free, fully paid, sublicensable and transferable license to use, edit, modify, reproduce, distribute, prepare derivative works of, display, perform, and otherwise fully exploit the User Content in connection with the Service and Companys (and its successors' and assigns') business, including without limitation for promoting and redistributing part or all of the Site (and derivative works thereof) or the Service in any media formats and through any media channels (including, without limitation, third party websites). You also hereby do and shall grant each user of the Service a non-exclusive license to access your User Content through the Service, and to use, edit, modify, reproduce, distribute, prepare derivative works of, display and perform such User Content solely for personal, non-commercial use. For clarity, the foregoing license grant to Company does not affect your other ownership or license rights in your User Content, including the right to grant additional licenses to the material in your User Content, unless otherwise agreed in writing;</li>
<li>represent and warrant, and can demonstrate to Companys full satisfaction upon request that you (i) own or otherwise control all rights to all content in your User Content, or that the content in such User Content is in the public domain or subject to an appropriate license (e.g. Creative Commons), (ii) you have full authority to act on behalf of any and all owners of any right, title or interest in and to any content in your User Content to use such content as contemplated by these Terms of Use and to grant the license rights set forth above, (iii) you have the permission to use the name and likeness of each identifiable individual person and to use such individuals identifying or personal information as contemplated by these Terms of Use; and (iv) you are authorized to grant all of the aforementioned rights to the User Submissions to Company and all users of the Service;</li>
<li>agree to pay all royalties and other amounts owed to any person or entity due to your posting of any User Content to the Service;</li>
<li>warrant that the use or other exploitation of such User Content by Company and use or other exploitation by users of the Site and Service as contemplated by this Agreement will not infringe or violate the rights of any third party, including without limitation any privacy rights, publicity rights, copyrights, contract rights, or any other intellectual property or proprietary rights; and</li>
<li>understand that Company shall have the right to delete, edit, modify, reformat, excerpt, or translate any materials, content or information submitted by you; and that all information publicly posted or privately transmitted through the Site is the sole responsibility of the person from which such content originated and that Company will not be liable for any errors or omissions in any content; and that Company cannot guarantee the identity of any other users with whom you may interact in the course of using the Service.</li>
<li>you acknowledge that you may be identified publicly by your Username in association with any such User Content;</li>
<li>you grant the Company a worldwide, non-exclusive, perpetual, irrevocable, royalty-free, fully paid, sublicensable and transferable license to use, edit, modify, reproduce, distribute, prepare derivative works of, display, perform, and otherwise fully exploit the User Content in connection with the Service and Companys (and its successors' and assigns') business, including without limitation for promoting and redistributing part or all of the Site (and derivative works thereof) or the Service in any media formats and through any media channels (including, without limitation, third party websites). You also hereby do and shall grant each user of the Service a non-exclusive license to access your User Content through the Service, and to use, edit, modify, reproduce, distribute, prepare derivative works of, display and perform such User Content solely for personal, non-commercial use. For clarity, the foregoing license grant to Company does not affect your other ownership or license rights in your User Content, including the right to grant additional licenses to the material in your User Content, unless otherwise agreed in writing;</li>
<li>you represent and warrant, and can demonstrate to Companys full satisfaction upon request that you (i) own or otherwise control all rights to all content in your User Content, or that the content in such User Content is in the public domain or subject to an appropriate license (e.g. Creative Commons), (ii) you have full authority to act on behalf of any and all owners of any right, title or interest in and to any content in your User Content to use such content as contemplated by these Terms of Use and to grant the license rights set forth above, (iii) you have the permission to use the name and likeness of each identifiable individual person and to use such individuals identifying or personal information as contemplated by this Agreement; and (iv) you are authorized to grant all of the aforementioned rights to the User Submissions to Company and all users of the Service;</li>
<li>you agree to pay any and all license fees, royalties and other compensation payable to any person or entity due to your posting of any User Content to the Service;</li>
<li>you warrant that the use or other exploitation of such User Content by Company and use or other exploitation by users of the Site and Service as contemplated by this Agreement will not infringe or violate the rights of any third party, including without limitation any privacy rights, publicity rights, copyrights, contract rights, or any other intellectual property or proprietary rights; and</li>
<li>you understand that Company shall have the right to delete, edit, modify, reformat, excerpt, or translate any materials, content or information submitted by you; and that all information publicly posted or privately transmitted through the Site is the sole responsibility of the person from which such content originated and that Company will not be liable for any errors or omissions in any content; and that Company cannot guarantee the identity of any other users with whom you may interact in the course of using the Service.</li>
</ul>
<p>You acknowledge that all Content accessed by you using the Service is at your own risk and you will be solely responsible for any damage or loss resulting therefrom.</p>
@ -80,47 +81,47 @@ This terms of use agreement (the "Agreement") governs your use of the web site a
<a id="fundraising"><h3>Campaigns: Fund-Raising and Commerce</h3></a>
<p>Unglue.it is a venue for fund-raising and commerce. Unglue.it allows certain users ("Rights Holders") to list campaigns and raise funds from other users ("Supporters"). All funds are collected for Rights Holders by third party payment processors such as Amazon Payments or Paypal. </p>
<p>Unglue.it is a venue for fund-raising and commerce. Unglue.it allows Rights Holders to list Campaigns and receive Contributions from Supporters. All funds are collected for Rights Holders by third party payment processors such as Amazon Payments or Paypal. </p>
<p>Unglue.it shall not be liable for your interactions with any organizations and/or individuals found on or through the Service. This includes, but is not limited to, delivery of goods and services, and any other terms, conditions, warranties or representations associated with campaigns on Unglue.it. Unglue.it is not responsible for any damage or loss incurred as a result of any such dealings. All dealings are solely between you and such organizations and/or individuals. Unglue.it is under no obligation to become involved in disputes between Supporters and Rights Holders, or between site members and any third party. In the event of a dispute, you release Unglue.it, its officers, employees, agents and successors in rights from claims, damages and demands of every kind, known or unknown, suspected or unsuspected, disclosed or undisclosed, arising out of or in any way related to such disputes and our Service.</p>
<a id="supporting"><h3>Supporting a Campaign</h3></a>
<p>Joining Unglue.it is free. However, Unglue.it may provide you the opportunity to make Donations or Pledges (collectively, Contributions) to Campaigns on the Service. You may contribute to any active Campaign in any amount you choose, subject to limitation imposed by payment processors such as PayPal or Amazon Payments. You may contribute to as many Campaigns as you like.</p>
<p>Becoming a member of Unglue.it is free of charge. However, Unglue.it may provide you the opportunity to make donations or pledges (collectively, “Contributions”) to Campaigns listed on the Service. You may contribute to any active Campaign in any amount you choose, subject to limitation imposed by payment processors such as PayPal or Amazon Payments. You may contribute to as many Campaigns as you like. By making a pledge, you authorize Company to collect the amount pledged from your designated account without further notice or authorization once a Campaign Goal is reached, at which time a pledge becomes a donation. </p>
<p>It is solely your choice to contribute to a Campaign. You understand that making a Contribution to a Project does not give you any rights in or to that Campaign or its associated work(s), including without limitation any ownership, control, or distribution rights. You understand that the Rights Holder shall be free to solicit other funding for the Campaign, enter into contracts for the Campaign, and otherwise direct the Campaign in its sole discretion. You further understand that nothing in this Agreement or otherwise limits Unglue.it's right to enter into agreements or business relationships relating to Campaigns. Unglue.it does not guarantee that any Campaigns goal will be met. Any Rewards offered to you are between you and the Rights Holder only, and Unglue.it does not guarantee that Rewards will be delivered or satisfactory to you. You understand that your pledge may be declined at Unglue.it's sole discretion. Unglue.it does not warrant the use of any Campaign funding or the outcome of any Campaign.</p>
<p>You are not required to contribute to any Campaign. You understand that making a Contribution to a Campaign does not give you any rights in or to that Campaign or its associated work(s), including without limitation any ownership, control, or distribution rights. You understand that the Rights Holder shall be free to collect other Contributions to the Campaign, enter into contracts with third parties in connection with the Campaign, and otherwise direct the Campaign in its sole discretion without any notice to you. You further understand that nothing in this Agreement or otherwise limits Company's right to enter into agreements or business relationships relating to Campaigns or to the literary works that are the subject of Campaigns (“Subject Works.”) Unglue.it does not guarantee that any Campaigns goal will be met. As part of a Campaign, Rights Holders may offer As part of a Campaign, Rights Holders may offer you thank-you gifts, perks, rewards or other signs of gratitude (“Premiums.”) Any Premiums offered to you are between you and the Rights Holder only, and Unglue.it does not guarantee that Rewards will be delivered or satisfactory to you. You understand that your pledge may be declined by Company, by the Payment Processor (defined below) or by the Rights Holder at their sole discretion. Unglue.it makes no representations whatsoever in connection with the use of any Contributions or the outcome of any Campaign.</p>
<p>Donations to Campaigns are nonrefundable. Under certain circumstances Unglue.it may, but is under no obligation to, seek the refund of Campaign Funding if a Rights Holder misrepresents the Campaign or misuses the funds. In the event of a suspended or withdrawn campaign, Pledges will be allowed to expire according to their original time limits. If a suspended campaign is resolved and reactivated within a Pledges time limit, that Pledge will remain active.</p>
<p>Once a Contribution is made, it is nonrefundable. In the event of a suspended or withdrawn campaign, pledges will be allowed to expire according to their original time limits. If a suspended campaign is resolved and reactivated within a pledges time limit, that pledge will remain active.</p>
<p>You acknowledge and agree that all your Contributions are between you, the Rights Holder, and the Processor only, and that Unglue.it is not responsible for Contribution transactions, including without limitation any personal or payment information you provide to the Processor. </p>
<p>You acknowledge and agree that all your Contributions are between you, the Rights Holder, and the Processor only, and that Unglue.it is not responsible for Contribution transactions, including without limitation any personal or payment information you provide to the Processor.</p>
<p>Unglue.it makes no representations regarding the deductibility of any Contribution for tax purposes. Please consult your tax advisor for more information.</p>
<p>Unglue.it is not a registered charity and Contributions are not charitable donations for tax purposes. Company makes no representations whatsoever regarding the tax deductibility of any Contribution. You are encouraged consult your tax advisor in connection with your Contribution.</p>
<p>You acknowledge and understand that the Company uses third party payment processing services to collect the Contributions from you and/or for the distribution of Contributions to the Rights Holder or otherwise pursuant to the terms of this Agreement (a “Payment Processor.”) and that your Pledge may be subject to terms and conditions imposed on you by the Payment Processor. The Company reserves the right, in its sole discretion, to select Payment Processors for this purpose. </p>
<p>You acknowledge and understand that the Company uses third party payment processing services, such as Paypal or Amazon Payments, to collect the Contributions from you and/or for the distribution of Contributions to the Rights Holder or otherwise pursuant to the terms of this Agreement (a “Payment Processor”) and that your Contribution may be subject to terms and conditions imposed on you by the Payment Processor. The Company reserves the right, in its sole discretion, to select Payment Processors for this purpose and/or to change the Payment Processor without notice to you. </p>
<p>You understand that funds pledged are not debited from the your account until the Unglue.it Campaign to which the Supporter has contributed has concluded and the Campaign Goal has been met. You further appreciate that Rights Holders act in reliance on your pledge in determining whether their Campaign Goal has been met. You agree to maintain a sufficient balance in the account from which your Pledge is to be paid to cover the full amount of the pledged Contribution at the conclusion of a successful Unglue.it Campaign.</p>
<p>You understand that funds pledged are not debited from your account until the Unglue.it Campaign to which the Supporter has contributed has concluded and the Campaign Goal has been met. You further appreciate that Rights Holders act in reliance on your pledge in determining whether their Campaign Goal has been met. You agree to maintain a sufficient balance in the account from which your donation is to be paid to cover the full amount of the pledged Contribution at the conclusion of a successful Unglue.it Campaign.</p>
<p>Rights Holders may offer perks, rewards or other signs of gratitude (“Premiums”) to its Supporters. You understand that the Service is simply a platform for the conduct of Unglue.it Campaigns. When you make a pledge, and/or request a Premium using the Service, the Rights Holder is solely responsible for delivery of any and all goods and services, and any other terms, conditions, warranties or representations made to the Supporter in connection with an Unglue.it Campaign (“Fulfillment.”) You hereby release the Company and its officers, employees, agents, licensees and assignees from any and all loss, damage or other liability that may arise out of the Supporters participation in an Unglue.it Campaign based on insufficient Fulfillment or otherwise.</p>
<p>You understand that the Service is simply a platform for the conduct of Unglue.it Campaigns. When you make a pledge, and/or request a Premium using the Service or otherwise, the Rights Holder is solely responsible for delivery of any and all Premiums, goods and services, and any other terms, conditions, warranties or representations made to the Supporter in connection with an Unglue.it Campaign (“Fulfillment.”) You hereby release the Company and its officers, employees, agents, licensees and assignees from any and all loss, damage or other liability that may arise out of the Supporters participation in an Unglue.it Campaign based on insufficient Fulfillment or otherwise.</p>
<p>You understand and agree that delivery of a Premium, and/or distribution of an Creative Commons licensed work, may not occur until a period of time after the conclusion of a successful Unglue.it Campaign. Such a delay may occur, for example, when production or conversion of the Premium or digital work is not completed before the conclusion of the campaign.</p>
<p>You understand and agree that delivery of a Premium, and/or distribution of a Creative Commons licensed work, may not occur until a period of time after the conclusion of a successful Unglue.it Campaign. Such a delay may occur, for example, when production or conversion of the Premium or digital work is not completed before the conclusion of the campaign.</p>
<p>You authorize the Company to hold funds for up to ninety (90) days following the conclusion of an Unglue.it Campaign, pending proof of fulfillment by the Rights Holder.</p>
<a id="rightsholders"><h3>Campaigns: Additional Terms for Rights Holders</h3></a>
<p>
The Company's mission is to make copyrighted literary works ("Works") freely and readily available to all who wish to read them in digital form, while ensuring that authors, publishers and other copyright owners are compensated for their efforts and investment in creating and developing the Works. </p>
The Company's mission is to make copyrighted literary works freely and readily available to all who wish to read them in digital form, while ensuring that authors, publishers and other copyright owners are compensated for their efforts and investment in creating and developing such works. </p>
<p>The Company invites and encourages Rights Holders to propose Works for Creative Commons licensing via Unglue.it Campaigns. Rights Holders have to apply to the Company to initiate campaigns and, upon acceptance, the Rights Holder must enter into a Platform Services Agreement with the Company prior to starting an Unglue.it Campaign.</p>
<p>Rights Holders who have executed a Platform Services Agreement may claim works and may initiate and conduct campaigns, as described in the Rights Holder Tools page at ( <a href="http://unglue.it/rightsholders/">http://unglue.it/rightsholders/</a>.</p>
<p>Rights Holders who have executed a Platform Services Agreement may claim works and may initiate and conduct Campaigns as described in the Rights Holder Tools page at <a href="http://unglue.it/rightsholders/">http://unglue.it/rightsholders/</a>.</p>
<p>There is no charge for Rights Holders to participate in Unglue.it. However, the company will withhold a Sales Commission of 6% of gross aggregate Contributions upon the completion of a successful campaign. The Rights Holder is responsible for providing a Standard Ebook File at their own expense, as described in a Platform Services Agreement. </p>
<p>There is no charge for Rights Holders to launch and fund a Campaign using the Service. However, the Company will withhold a “Sales Commission” of 6% of gross aggregate Contributions upon the completion of a successful Campaign. The Rights Holder is responsible for providing a Standard Ebook File at their own expense, as described in a Platform Services Agreement. </p>
<p>The Rights Holder hereby authorizes the Company to use the Service to display and market the Subject Work, to collect Contributions or cause Contributions to be collected from Supporters on behalf of the Rights Holder, and to retain, reserve and/or distribute the Contributions to the Rights Holder, to the Company, to Designated Vendors (as defined below) or otherwise pursuant to the terms of this Agreement. </p>
<p>The Rights Holder acknowledges and understands that the Company uses one or more third party payment processing services to collect Contributions and/or for the distribution of Contributions to the Rights Holder or otherwise pursuant to the terms of this Agreement (the “Payment Processor.”) The Company reserves the right, in its sole discretion, to select Payment Processors for this purpose and to change Payment Processors at any time, with or without notice to the Rights Holder. The Rights Holder hereby consents to any and all modifications of any of the terms and conditions of this Agreement as may be required or requested by the Payment Processor from time to time as a condition of continuing service to the Company or otherwise. The Rights Holder understands and agrees that the Company may hold funds for up to 90 days following the conclusion of an Unglue.it Campaign, pending proof of fulfillment by the Rights Holder, and that Payment Processors may withhold funds for various reasons according to their own terms of service.</p>
<p>The Payment Processors used at this time are Paypal and Amazon Payments. Rights Holders must have a Paypal account and agree to Paypal's terms and conditions. </p>
<p>Paypal is one of the Payment Processors that the Company may use from time to time as part of the Service. In order to launch a Campaign, Rights Holders must have a Paypal account and agree to Paypal's terms and conditions. </p>
<p>The duration of any single Unglue.it Campaign shall be determined by the Rights Holder, provided that no single Unglue.it Campaign shall be longer than one hundred eighty (180) days.</p>
@ -130,7 +131,7 @@ The Company's mission is to make copyrighted literary works ("Works") freely and
<p>The Standard Ebook File as referenced in the Platform Service Agreement shall meet the following set of criteria:</p>
<ul class="terms">
<li>Unless otherwise permitted in writing by Unglue.it, the file shall use the EPUB standard format format according to best pactice at time of submission. Exceptions will be made for content requiring more page layout than available in prevailing EPUB implementations.</li>
<li>Unless otherwise permitted in writing by Unglue.it, the file shall use the EPUB standard format format according to best practice at time of submission. Exceptions will be made for content requiring more page layout than available in prevailing EPUB implementations.</li>
<li>The file shall be compliant where ever reasonable with the QED inspection checklist specified at <a href="http://www.publishinginnovationawards.com/featured/qed">http://www.publishinginnovationawards.com/featured/qed </a> </li>
<li>The file should have no more than 0.2 typographical or scanning errors per page of English text.</li>
<li>The file shall contain front matter which includes the following:
@ -146,17 +147,17 @@ The Company's mission is to make copyrighted literary works ("Works") freely and
<li>Any graphics which must be excluded from the released ebook shall be specified in the description given in the campaign.
</ul>
<p>To provide Confirmation of Fulfillment and become eligible to receive funds raised in a successful campaign, the Rights Holder shall make either make available to the Company a Standard Ebook File for the work, or the Rights Holder shall designate a third party vendor from a list of vendors approved by the Company (the “Designated Vendor”) to create the Converted eBook at a rate that has been established between the Designated Vendor and the Rights Holder (the “Conversion Cost.”) The Rights Holder shall provide the Company with written notice of the name and contact information for the Designated Vendor, the Conversion Cost, and any supporting documentation or other verification as may be reasonably requested by the Company.</p>
<p>To provide confirmation of Fulfillment and become eligible to receive Contributions made in a successful Campaign, the Rights Holder shall make either make available to the Company a Standard Ebook File for the work, or the Rights Holder shall designate a third party vendor from a list of vendors approved by the Company (the “Designated Vendor”) to create the Converted eBook at a rate that has been established between the Designated Vendor and the Rights Holder (the “Conversion Cost.”) The Rights Holder shall provide the Company with written notice of the name and contact information for the Designated Vendor, the Conversion Cost, and any supporting documentation or other verification as may be reasonably requested by the Company.</p>
<p>In the event that the Company releases Supporter information to the Rights Holder, or invites Supporters to share such information with the Rights Holder, Rights Holders agree to treat such information in a manner consistent with the Companys <a href="http://unglue.it/privacy/">Privacy Policy</a>.</p>
<p>Once an Unglue.it Campaign has been launched, neither the Subject Work nor any of the Premiums may be revoked or modified, except that either may be supplemented provided that the Digital License Fee is not increased. The Rights Holder understands that any Pledge may be declined for any reason or for no reason at the sole discretion of the Company.</p>
<p>Once an Unglue.it Campaign has been launched, neither the Subject Work nor any of the Premiums may be revoked or modified, except that either may be supplemented provided that the Digital License Fee is not increased. The Rights Holder understands that a pledge does not become a donation, and that no pledged monies are collected from Supporters, until the Campaign Goal is reached. The Rights Holder further understands that any pledge may be declined or any donation returned or recovered for any reason or for no reason at the sole discretion of the Company and/or the Payment Processor.</p>
<p>Contributions shall not be collected by the Company from Supporters until the Campaign is successfully completed and the Campaign Goal met or exceeded. In the event that any of the promised Contributions cannot be collected by the Company or its Payment Processor after the date of the successful conclusion of the Campaign, the Rights Holder understands that neither the Company nor the Payment Processor shall have any obligation whatsoever in connection with the collection of such monies. The Rights Holder understands and knowingly accepts the risk that the actual Contributions collected or capable of collection may be less than the total Contributions promised by the Supporters individually or in the aggregate. The Rights Holder understands that it is obligated to release the Converted eBook and to ship the promised Premiums even if the actual Contributions collected are less than the Campaign Goal.</a>
<p>Contributions shall not be collected by the Company from Supporters until the Campaign is successfully completed and the Campaign Goal met or exceeded. In the event that any of the promised Contributions cannot be collected by the Company or its Payment Processor after the date of the successful conclusion of the Campaign, the Rights Holder understands that neither the Company nor the Payment Processor shall have any obligation whatsoever in connection with the collection of such monies. The Rights Holder understands and knowingly accepts the risk that the actual Contributions collected or capable of collection may be less than the total Contributions promised by the Supporters individually or in the aggregate. The Rights Holder understands that it is obligated to release the Converted eBook and to ship the promised Premiums even if the actual Contributions collected are less than the Campaign Goal.</p>
<p>Immediately upon the date of the conclusion of a successful Unglue.it Campaign, the Rights Holder agrees to and hereby does grant to the Company the right (but not the obligation) to place the Subject Work in the Internet Archive [archive.org] or such other open digital libraries as the Company may select in its sole discretion, and to distribute the Subject Work on the Website, whether directly or indirectly, provided that the copyright notice and mark of the applicable CC License is at all times clearly displayed in association with the Subject Work.</p>
<p>Rights Holders are responsible for paying all fees and applicable taxes associated with their use of the site. In the event a listing is removed from the Service for violating the Terms of Use, all fees paid will be non-refundable, unless in its sole discretion Unglue.it determines that a refund is appropriate.</p>
<p>Rights Holders are solely responsible for paying all fees and applicable taxes associated with their use of the Service. No Sales Commission will be refunded for any reason, even in the event that a Campaign is removed from the Website by the Company. </p>
<p>Rights Holders may initiate refunds at their own discretion. Unglue.it is not responsible for issuing refunds for funds that have been collected by Rights Holders.</p>
@ -164,24 +165,24 @@ The Company's mission is to make copyrighted literary works ("Works") freely and
<ol>
<li> any transaction fees deducted or otherwise charged to the Company by the Payment Processor;</li>
<li> any transaction fees deducted or other charges imposed by the Rights Holders respective banks, credit card companies or other financial institutions in connection with the Contributions;</li>
<li> the Companys sales commission as set at the start of the Campaign</li>
<li> reimbursement of the Companys actual costs for production of a Standard Ebook File for the Subject Work, in the event that no Confirmation of Fulfillment is timely delivered to the Company;</li>
<li> the Conversion Costs, to be paid by the Company directly to the Designated Vendor upon delivery of the Converted eBook; in the event that the Rights Holder has designated a conversion vendor </li>
<li> the Companys Sales Commission as set at the start of the Campaign</li>
<li> reimbursement of the Companys actual costs for production of a Standard Ebook File for the Subject Work, in the event that no confirmation of Fulfillment is timely delivered to the Company;</li>
<li> any Conversion Costs payable to any Designated Vendor. </li>
</ol>
<p>Though Unglue.it cannot be held liable for the actions of a Rights Holder, Rights Holders are nevertheless wholly responsible for fulfilling obligations both implied and stated in any campaign listing they create. Unglue.it reserves the right to cancel a campaign, refund all associated members' payments, and cancel all associated members pledges at any time for any reason. Unglue.it reserves the right to cancel, interrupt, suspend, or remove a campaign listing at any time for any reason.</p>
<p>Though Unglue.it cannot be held liable for the actions of a Rights Holder, Rights Holders are nevertheless wholly responsible for fulfilling obligations both implied and stated in any Campaign listing they create. Unglue.it reserves the right to cancel a Campaign, refund any or all Contributions, and cancel any or all Supporters pledges at any time for any reason. Unglue.it reserves the right to cancel, interrupt, suspend, or remove a Campaign listing at any time for any reason.</p>
<p>Notwithstanding anything to the contrary set forth in or implied by this Agreement, all payment obligations undertaken by the Company in connection with any Campaign are expressly subject to the Platform Services Agreement entered into between the Rights Holder and the Company. </p>
<p> The Company may suspend or terminate the account of any Rights Holder at any time in the event that the Company determines, in its sole discretion, that (i) the Rights Holders use of the Service is in violation of this Agreement; (ii) the Rights Holder is in breach of any of its representations, warrantees or obligations under this Agreement; (iii) the Company receives a complaint from a third party alleging that the Rights Holders use of the Service does or will result in copyright infringement or breach of contract.</p>
<p> The Company may suspend or terminate the account of any Rights Holder at any time in the event that the Company determines, in its sole discretion, that (i) the Rights Holders use of the Service is in violation of this Agreement; (ii) the Rights Holder is in breach of any of its representations, warrantees or obligations under this Agreement or the Platform Services Agreement; (iii) the Company receives a complaint from a third party alleging that the Rights Holders use of the Service does or will result in copyright infringement or breach of contract.</p>
<a id="termination"><h3>Termination</h3></a>
<p>The Company may immediately terminate this Agreement at its sole discretion at any time upon written notice to the email address you have provided if you have registered, or without notice otherwise. Upon termination, you agree that the Company may immediately deactivate your account and bar you from accessing any portions of the Service requiring an account. If you wish to terminate your account, you may do so by following the instructions on the Site. Any fees paid hereunder are non-refundable. All provisions of the Terms of Use which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability.</p>
<p>The Company may immediately terminate this Agreement in its sole discretion at any time. Upon termination, you agree that the Company may immediately de-activate your account and bar you from accessing any portions of the Service requiring an account. If you wish to terminate your account, you may do so by following the instructions on the Website. Any fees and Sales Commissions paid pursuant to this Agreement prior to termination are non-refundable. All provisions of this Agreement which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability.</p>
<a id="modification"><h3>Modification of Terms</h3></a>
<p>The Company may modify this Agreement from time to time, and your continued use of the Service constitutes your acceptance of any and all modifications. The Company will attempt to notify you of substantial modifications by posting a notice on Unglue.it or by sending you an email.</p>
<p>The Company may modify this Agreement from time to time, and your continued use of the Service constitutes your acceptance of any and all modifications.The posting of a notice on the Website, amending the terms of this Agreement as set forth on the Website, or sending you an email informing you of the change will constitute sufficient notice of such modification.</p>
<a id="warranty"><h3>Warranty Disclaimer</h3></a>
@ -195,15 +196,15 @@ The Company's mission is to make copyrighted literary works ("Works") freely and
<a id="governinglaw"><h3>Governing Law</h3></a>
<p>This Agreement is governed by and shall be interpreted and construed according to the laws of the United States with respect to copyright law and the laws of New York with regard to all other matters, without regard to conflict of laws rules to the contrary. At Gluejars option, any controversy or claim arising out of or related to this Agreement or breach thereof, shall be settled by arbitration administered by the American Arbitration Association in accordance with its Commercial Arbitration Rules, and judgment on the award rendered by the arbitrator(s) may be entered in any court having jurisdiction thereof. If Gluejar elects to settle any controversy or claim in court rather than through arbitration, then the dispute shall be subject to the exclusive jurisdiction of the applicable federal and state courts located in New York state, and the Parties hereby consent to such jurisdiction.</p>
<p>This Agreement is governed by and shall be interpreted and construed according to the laws of the United States with respect to copyright law and the laws of New York with regard to all other matters, without regard to conflict of laws rules to the contrary. At Gluejars option, any controversy or claim arising out of or related to this Agreement or breach thereof, shall be settled by arbitration administered by the American Arbitration Association in accordance with its Commercial Arbitration Rules, and judgment on the award rendered by the arbitrator(s) may be entered in any court having jurisdiction thereof. If Gluejar elects to settle any controversy or claim in court rather than through arbitration, then the dispute shall be subject to the exclusive jurisdiction of the applicable federal and state courts located in New York state, and you hereby consent to such jurisdiction.</p>
<a id="giraffes"><h3>Indemnification</h3></a>
<p>You agree to indemnify, defend and hold harmless the Company and its affiliates, agents, officers, directors, and employees from any and all liability, loss, claims, damages, costs, and/or actions (including attorneys fees) arising from your use of the Service, including claims or penalties with respect to such withholding taxes, labor or employment requirements with respect to any Campaign funds paid to you.</p>
<p>You agree to indemnify, defend and hold harmless the Company and its affiliates, agents, officers, directors, and employees from any and all liability, loss, claims, damages, costs, and/or actions (including attorneys fees) arising from your use of the Service, including claims or penalties with respect to such withholding taxes, labor or employment requirements with respect to any Contributions paid to you.</p>
<a id="international"><h3>International</h3></a>
<p>The Service is controlled and operated from its facilities in the United States. Unglue.it makes no representations that the Service is appropriate or available for use in other locations. If you access the Service from other locations, you do so at your own initiative and are solely responsible for compliance with local law.</p>
<p>The Service is controlled and operated from its facilities in the United States. Unglue.it makes no representations that the Service is appropriate or available for use in other locations. If you access the Service from other locations, you do so at your own risk and are solely responsible for compliance with local law.</p>
<a id="integration"><h3>Integration and Severability</h3></a>
@ -221,8 +222,9 @@ The Company's mission is to make copyrighted literary works ("Works") freely and
<li>a statement by you that the above information in your notice is accurate and, under penalty of perjury, that you are the copyright owner or authorized to act on the copyright owner's behalf.</li>
</ul>
<p>The Unglue.it Copyright Agent can be reached as follows:</p>
Unglue.it Copyright Agent<br />
<p>The Unglue.it DMCA Agent can be reached as follows:</p>
Name: Eric Hellman<br />
Unglue.it DMCA Agent<br />
Gluejar, Inc.<br />
41 Watchung Plaza, #132<br />
Montclair, NJ 07042<br />
@ -230,10 +232,8 @@ USA<br />
dmca@gluejar.com<br />
<p>If you believe that a Campaign on the site does or will result in infringement of copyright even though you are not authorized to act on behalf of the copyright holder, please follow the relevant steps above.</p>
<a id="notice"><h3>Electronic Delivery/Notice Policy and Your Consent</h3></a>
<p>Unglue.it may provide notifications, whether such notifications are required by law or are for marketing or other business related purposes, to you via email notice, written or hard copy notice, or through conspicuous posting of such notice on our website. By using the Service, you consent to receive such communications.</p>
<p>Unglue.it may provide notifications, whether such notifications are required by law or are for marketing or other business related purposes, to you via email notice, written or hard copy notice, or through conspicuous posting of such notice on the website. By using the Service, you consent to receive such communications.</p>
<a id="miscellaneous"><h3>Miscellaneous</h3></a>

View File

@ -89,7 +89,6 @@
{% endwith %}{% endwith %}{% endwith %}
</div>
{% endfor %}
<br>
<div class="pagination content-block-heading tabs-1">
{% get_pages %}
{% for page in pages %}

View File

@ -1,5 +1,6 @@
{% extends "base.html" %}
{% load comments %}
{% load humanize %}
{% block title %}&#151; {% if work.last_campaign_status == 'ACTIVE' %}Campaign to unglue {% endif %}{{ work.title }}{% endblock %}
{% block extra_css %}
@ -51,6 +52,7 @@ $j(document).ready(function(){
{% block content %}
{% with work.last_campaign_status as status %}
{% with work.id as work_id %}
<div id="main-container">
<div class="js-main">
<div id="js-leftcol">
@ -62,11 +64,11 @@ $j(document).ready(function(){
{% else %}{% if work.last_campaign and not is_preview %}
{% if status == 'ACTIVE' %}
Unglue it! <br />
${{ work.last_campaign.current_total }}/${{ work.last_campaign.target }} <br />
${{ work.last_campaign.current_total|intcomma }}/${{ work.last_campaign.target|intcomma }} <br />
Ending {{ countdown }}
{% else %}
{% if 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
Unglued on {{ work.last_campaign.deadline|date:"M j, Y"}}! <br />${{ work.last_campaign.current_total|intcomma }} raised of ${{ work.last_campaign.target|intcomma }} goal
{% else %}{% if status == 'INITIALIZED' %}
Campaign starting soon
{% else %}{% if status == 'SUSPENDED' %}
@ -122,9 +124,9 @@ $j(document).ready(function(){
</div>
{% if status == 'ACTIVE' %}
{% if pledged %}
<div class="btn_support modify"><form action="{% url pledge_modify work_id=work.id %}" method="get"><input type="submit" value="Modify Pledge" /></form></div>
<div class="btn_support modify"><form action="{% url pledge_modify work_id %}" method="get"><input type="submit" value="Modify Pledge" /></form></div>
{% else %}
<div class="btn_support"><form action="{% url pledge work_id=work.id %}" method="get"><input type="submit" value="Support" /></form></div>
<div class="btn_support"><form action="{% url pledge work_id %}" method="get"><input type="submit" value="Support" /></form></div>
{% endif %}
{% endif %}
</div>
@ -156,15 +158,16 @@ $j(document).ready(function(){
<div class="find-book">
<label>Find it:</label>
<div class="find-link">
{% if work.googlebooks_id %}
<a id="find-google" href="{{ work.googlebooks_url }}"><img src="/static/images/supporter_icons/googlebooks_square.png" title="Find on Google Books" alt="Find on Google Books" /></a>
<a rel="nofollow" class="find-openlibrary" href="{% url work_openlibrary work.id %}"><img src="/static/images/supporter_icons/openlibrary_square.png" title="Find on OpenLibrary" alt="Find on OpenLibrary" /></a>
{% endif %}
<a rel="nofollow" class="find-openlibrary" href="{% url work_openlibrary work_id %}"><img src="/static/images/supporter_icons/openlibrary_square.png" title="Find on OpenLibrary" alt="Find on OpenLibrary" /></a>
{% if not request.user.is_anonymous %}
{% if request.user.profile.goodreads_user_link %}
<a rel="nofollow" class="find-goodreads" href="{% url work_goodreads work.id %}"><img src="/static/images/supporter_icons/goodreads_square.png" title="Find on GoodReads" alt="Find on GoodReads" /></a>
<a rel="nofollow" class="find-goodreads" href="{% url work_goodreads work_id %}"><img src="/static/images/supporter_icons/goodreads_square.png" title="Find on GoodReads" alt="Find on GoodReads" /></a>
{% endif %}
{% if request.user.profile.librarything_id %}
<a rel="nofollow" class="find-librarything" href="{% url work_librarything work.id %}"><img src="/static/images/supporter_icons/librarything_square.png" title="Find on LibraryThing" alt="Find on LibraryThing" /></a>
<a rel="nofollow" class="find-librarything" href="{% url work_librarything work_id %}"><img src="/static/images/supporter_icons/librarything_square.png" title="Find on LibraryThing" alt="Find on LibraryThing" /></a>
{% endif %}
{% endif %}
</div>
@ -182,7 +185,7 @@ $j(document).ready(function(){
{% else %}
{{ work.last_campaign.supporters.count }} Ungluers have
{% endif %}
pledged ${{ work.last_campaign.current_total }}<br />toward a ${{ work.last_campaign.target }} goal
pledged ${{ work.last_campaign.current_total|intcomma }}<br />toward a ${{ work.last_campaign.target|intcomma }} goal
{% else %}
{% if wishers == 1 %}
1 Ungluer has
@ -196,7 +199,7 @@ $j(document).ready(function(){
<div class="btn_wishlist" id="wishlist_actions">
{% if request.user.is_anonymous %}
<div class="create-account">
<span title="{% url work work.id %}">Login to Add</span>
<span title="{% url work work_id %}">Login to Add</span>
</div>
{% else %}{% if request.user.id in work.last_campaign.supporters %}
<div class="add-wishlist">
@ -204,11 +207,11 @@ $j(document).ready(function(){
</div>
{% else %}{% if work in request.user.wishlist.works.all %}
<div class="remove-wishlist-workpage">
<span id="w{{ work.id }}">Remove This</span>
<span id="w{{ work_id }}">Remove This</span>
</div>
{% else %}
<div class="add-wishlist">
<span id="w{{ work.googlebooks_id }}">Add to Wishlist</span>
<span class="work_id" id="w{{ work_id }}">Add to Wishlist</span>
</div>
{% endif %}{% endif %}{% endif %}
</div>
@ -275,7 +278,7 @@ $j(document).ready(function(){
{{ claim.rights_holder.rights_holder_name }}
{% endif %}
{% endfor %}
, has agreed to release <i>{{work.title}}</i> to the world as a Creative Commons licensed ebook ({{ work.last_campaign.license }}) if ungluers can join together to raise ${{ work.last_campaign.target }} by {{ work.last_campaign.deadline }}.
, has agreed to release <i>{{work.title}}</i> to the world as a Creative Commons licensed ebook ({{ work.last_campaign.license }}) if ungluers can join together to raise ${{ work.last_campaign.target|intcomma }} by {{ work.last_campaign.deadline }}.
You can help!</p>
<h4>Last campaign details</h4>
@ -319,6 +322,10 @@ $j(document).ready(function(){
{% endif %}
<h4>Editions</h4>
{% if user.is_staff %}
<div><a href="{% url new_edition work_id edition.id %}">Create a new edition for this work</a><br /><br /></div>
{% endif %}
{% if alert %}<div class="alert"><b>Ebook Contribution:</b><br />{{ alert }}</div>{% endif %}
{% for edition in editions %}
<div class="editions">{% if edition.googlebooks_id %}<div class="image"><img src="{{ edition.cover_image_small }}" title="edition cover" alt="edition cover" /></div>{% endif %}
@ -330,6 +337,9 @@ $j(document).ready(function(){
{% if edition.oclc %}
OCLC: <a href="http://www.worldcat.org/oclc/{{ edition.oclc }}">{{ edition.oclc }}</a><br />
{% endif %}
{% if user.is_staff %}
<a href="{% url new_edition work_id edition.id %}">Edit this edition</a><br />
{% endif %}
{% if edition.googlebooks_id %}
See <a href="https://encrypted.google.com/books?id={{ edition.googlebooks_id }}">this edition on Google Books</a>
{% endif %}
@ -355,6 +365,7 @@ $j(document).ready(function(){
</form>
</div>
{% endifnotequal %}{% endif %}
{% endfor %}
</div>
</div>
@ -371,7 +382,7 @@ $j(document).ready(function(){
<ul class="social menu">
<a href="https://www.facebook.com/sharer.php?u={{request.build_absolute_uri|urlencode:"" }}"><li class="facebook first"><span>Facebook</span></li></a>
<a href="https://twitter.com/intent/tweet?url={{request.build_absolute_uri|urlencode:"" }}&amp;text=I%27m%20ungluing%20{{ work.title|urlencode }}%20at%20%40unglueit.%20Join%20me%21"><li class="twitter"><span>Twitter</span></li></a>
{% if request.user.is_authenticated %}<a href="{% url emailshare %}?next={{request.build_absolute_uri|urlencode:""}}"><li class="email"><span>Email</span></li></a>{% endif %}
{% if request.user.is_authenticated %}<a href="{% url emailshare '' %}?next={{request.build_absolute_uri|urlencode:""}}"><li class="email"><span>Email</span></li></a>{% endif %}
<a href="#" id="embed"><li class="embed"><span>Embed</span></li></a>
</ul>
<div id="widgetcode">Copy/paste this into your site:<br /><textarea rows="7" cols="22">&lt;iframe src="https://{{request.META.HTTP_HOST}}/api/widget/{{work.first_isbn_13}}/" width="152" height="325" frameborder="0"&gt;&lt;/iframe&gt;</textarea></div>
@ -382,16 +393,29 @@ $j(document).ready(function(){
<h3 class="jsmod-title"><span>Support</span></h3>
<div class="jsmod-content">
<ul class="support menu">
{% for premium in premiums %}
{% if premium.limit == 0 or premium.limit > premium.premium_count %}
<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>
{% ifnotequal premium.limit 0 %}<br /> Only {{ premium.premium_remaining }} remaining! {% endifnotequal %}
</a></li>
{% if pledged %}
{% for premium in premiums %}
{% if premium.limit == 0 or premium.limit > premium.premium_count %}
<li class="{% if forloop.first %}first{% else %}{% if forloop.last %}last{% endif %}{% endif %}">
<a href="{% url pledge_modify work_id %}?premium_id={{premium.id}}">
<span class="menu-item-price">${{ premium.amount|intcomma }}</span>
<span class="menu-item-desc">{{ premium.description }}</span>
{% ifnotequal premium.limit 0 %}<br /> Only {{ premium.premium_remaining }} remaining! {% endifnotequal %}
</a></li>
{% endif %}
{% endfor %}
{% else %}
{% for premium in premiums %}
{% if premium.limit == 0 or premium.limit > premium.premium_count %}
<li class="{% if forloop.first %}first{% else %}{% if forloop.last %}last{% endif %}{% endif %}">
<a href="{% url pledge work_id %}?premium_id={{premium.id}}">
<span class="menu-item-price">${{ premium.amount|intcomma }}</span>
<span class="menu-item-desc">{{ premium.description }}</span>
{% ifnotequal premium.limit 0 %}<br /> Only {{ premium.premium_remaining }} remaining! {% endifnotequal %}
</a></li>
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
</ul>
</div>
</div>
@ -401,4 +425,5 @@ $j(document).ready(function(){
</div>
</div>
{% endwith %}
{% endwith %}
{% endblock %}

View File

@ -30,12 +30,13 @@
{% if facet == 'recommended' %}
<div id="block-intro-text"><span class="special-user-name">Staff Picks</span></div>
</div>
<div class="user-block2"><span class="user-short-info">Here are the books {% for staffer in unglue_staff %}{% if not forloop.last %}<a href="{% url supporter '{{ staffer }}' %}">{{ staffer }}</a>, {% else %} and <a href="{% url supporter '{{ staffer }}' %}">{{ staffer }}</a>{% endif %}{% endfor %} are loving lately.</span>
<div class="user-block2"><span class="user-short-info">Here are the books <a href="{% url supporter 'AmandaM' %}">Amanda</a>, <a href="{% url supporter 'andromeda' %}">Andromeda</a>, <a href="{% url supporter 'eric' %}">Eric</a>, and <a href="{% url supporter 'rdhyee' %}">Raymond</a> are loving lately.</span>
</div>
<div class="user-block3 recommended">
{% for staffer in unglue_staff %}
<img class="user-avatar" src="{{ staffer.profile.pic_url }}" height="50" width="50" alt="Picture of {{ supporter }}" title="{{ supporter }}" />
{% endfor %}
<a href="{% url supporter 'AmandaM' %}"><img class="user-avatar" src="https://si0.twimg.com/profile_images/1801686082/image_normal.jpg" height="50" width="50" alt="Picture of Amanda" title="Amanda" /></a>
<a href="{% url supporter 'andromeda' %}"><img class="user-avatar" src="https://si0.twimg.com/profile_images/611713549/andromeda_by_molly_color_normal.jpg" height="50" width="50" alt="Picture of Andromeda" title="Andromeda" /></a>
<a href="{% url supporter 'eric' %}"><img class="user-avatar" src="https://graph.facebook.com/1009077800/picture" height="50" width="50" alt="Picture of Eric" title="Eric" /></a>
<a href="{% url supporter 'RaymondYee' %}"><img class="user-avatar" src="https://graph.facebook.com/1229336/picture" height="50" width="50" alt="Picture of Raymond" title="Raymond" /></a>
</div>
{% else %}
<div id="block-intro-text"><span class="special-user-name">{{ facet|capfirst }}</span></div>
@ -110,7 +111,6 @@
{% endwith %}{% endwith %}{% endwith %}
</div>
{% endfor %}
<br>
<div class="pagination content-block-heading tabs-1">
{% get_pages %}
{% for page in pages %}
@ -128,7 +128,6 @@
{% endwith %}{% endwith %}{% endwith %}
</div>
{% endfor %}
<br>
<div class="pagination content-block-heading tabs-2">
{% get_pages %}
{% for page in pages %}
@ -146,7 +145,6 @@
{% endwith %}{% endwith %}{% endwith %}
</div>
{% endfor %}
<br>
<div class="pagination content-block-heading tabs-3">
{% get_pages %}
{% for page in pages %}

View File

@ -22,6 +22,7 @@ urlpatterns = patterns(
name="terms"),
url(r"^rightsholders/$", "rh_tools", name="rightsholders"),
url(r"^rightsholders/campaign/(?P<id>\d+)/$", "manage_campaign", name="manage_campaign"),
url(r"^rightsholders/edition/(?P<work_id>\d*)/(?P<edition_id>\d*)$", "new_edition",{'by': 'rh'}, name="rh_edition"),
url(r"^rightsholders/claim/$", "claim", name="claim"),
url(r"^rh_admin/$", "rh_admin", name="rh_admin"),
url(r"^campaign_admin/$", "campaign_admin", name="campaign_admin"),
@ -44,6 +45,8 @@ urlpatterns = patterns(
url(r"^work/(?P<work_id>\d+)/librarything/$", "work_librarything", name="work_librarything"),
url(r"^work/(?P<work_id>\d+)/goodreads/$", "work_goodreads", name="work_goodreads"),
url(r"^work/(?P<work_id>\d+)/openlibrary/$", "work_openlibrary", name="work_openlibrary"),
url(r"^new_edition/(?P<work_id>)(?P<edition_id>)$", "new_edition", name="new_edition"),
url(r"^new_edition/(?P<work_id>\d*)/(?P<edition_id>\d*)$", "new_edition", name="new_edition"),
url(r"^googlebooks/(?P<googlebooks_id>.+)/$", "googlebooks", name="googlebooks"),
url(r"^pledge/(?P<work_id>\d+)/$", login_required(PledgeView.as_view()), name="pledge"),
url(r"^pledge/cancel/$", login_required(PledgeCancelView.as_view()), name="pledge_cancel"),
@ -55,7 +58,7 @@ urlpatterns = patterns(
url('^404testing/$', direct_to_template, {'template': '404.html'}),
url('^500testing/$', direct_to_template, {'template': '500.html'}),
url('^robots.txt$', direct_to_template, {'template': 'robots.txt', 'mimetype': 'text/plain'}),
url(r"^emailshare/$", "emailshare", name="emailshare"),
url(r"^emailshare/(?P<action>\w*)/?$", "emailshare", name="emailshare"),
url(r"^feedback/$", "feedback", name="feedback"),
url(r"^feedback/thanks/$", TemplateView.as_view(template_name="thanks.html")),
url(r"^press/$", TemplateView.as_view(template_name="press.html"),

View File

@ -22,6 +22,7 @@ from django.core.exceptions import ObjectDoesNotExist
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.contrib.comments import Comment
from django.contrib.sites.models import Site
from django.db.models import Q, Count, Sum
from django.forms import Select
from django.forms.models import modelformset_factory
@ -37,7 +38,7 @@ from django.shortcuts import render, render_to_response, get_object_or_404
from django.utils.http import urlencode
from django.utils.translation import ugettext_lazy as _
from regluit.core import tasks
from regluit.core.tasks import send_mail_task
from regluit.core.tasks import send_mail_task, emit_notifications
from regluit.core import models, bookloader, librarything
from regluit.core import userlists
from regluit.core.search import gluejar_search
@ -45,7 +46,7 @@ from regluit.core.goodreads import GoodreadsClient
from regluit.frontend.forms import UserData, UserEmail, ProfileForm, CampaignPledgeForm, GoodreadsShelfLoadingForm
from regluit.frontend.forms import RightsHolderForm, UserClaimForm, LibraryThingForm, OpenCampaignForm
from regluit.frontend.forms import getManageCampaignForm, DonateForm, CampaignAdminForm, EmailShareForm, FeedbackForm
from regluit.frontend.forms import EbookForm, CustomPremiumForm, EditManagersForm
from regluit.frontend.forms import EbookForm, CustomPremiumForm, EditManagersForm, EditionForm
from regluit.payment.manager import PaymentManager
from regluit.payment.models import Transaction
from regluit.payment.parameters import TARGET_TYPE_CAMPAIGN, TARGET_TYPE_DONATION, PAYMENT_TYPE_AUTHORIZATION
@ -54,6 +55,7 @@ from regluit.payment.paypal import Preapproval
from regluit.core import goodreads
from tastypie.models import ApiKey
from regluit.payment.models import Transaction
from notification import models as notification
logger = logging.getLogger(__name__)
@ -89,7 +91,7 @@ def slideshow(max):
def next(request):
if request.COOKIES.has_key('next'):
response = HttpResponseRedirect(urllib.unquote(request.COOKIES['next']))
response = HttpResponseRedirect(urllib.unquote(urllib.unquote(request.COOKIES['next'])))
response.delete_cookie('next')
return response
else:
@ -135,15 +137,13 @@ def work(request, work_id, action='display'):
editions = [campaign.edition]
else:
editions = work.editions.all().order_by('-publication_date')
if action == 'preview':
work.last_campaign_status = 'ACTIVE'
try:
pledged = campaign.transactions().filter(user=request.user, status="ACTIVE")
except:
pledged = None
countdown = ""
if work.last_campaign_status == 'ACTIVE':
if work.last_campaign_status() == 'ACTIVE':
time_remaining = campaign.deadline - now()
if time_remaining.days:
countdown = "in %s days" % time_remaining.days
@ -153,6 +153,8 @@ def work(request, work_id, action='display'):
countdown = "in %s minutes" % time_remaining.seconds/60
else:
countdown = "right now"
if action == 'preview':
work.last_campaign_status = 'ACTIVE'
try:
pubdate = work.publication_date[:4]
@ -218,6 +220,107 @@ def work(request, work_id, action='display'):
'countdown': countdown,
})
def new_edition(request, work_id, edition_id, by=None):
if not request.user.is_authenticated() :
return render(request, "admins_only.html")
# if the work and edition are set, we save the edition and set the work
language='en'
description=''
title=''
if work_id:
try:
work = models.Work.objects.get(id = work_id)
except models.Work.DoesNotExist:
try:
work = models.WasWork.objects.get(was = work_id).work
except models.WasWork.DoesNotExist:
raise Http404
language=work.language
description=work.description
title=work.title
else:
work=None
if not request.user.is_staff :
if by == 'rh' and work is not None:
if not request.user in work.last_campaign().managers.all():
return render(request, "admins_only.html")
else:
return render(request, "admins_only.html")
if edition_id:
try:
edition = models.Edition.objects.get(id = edition_id)
except models.Work.DoesNotExist:
raise Http404
if work:
edition.work = work
language=edition.work.language
description=edition.work.description
else:
edition = models.Edition()
if work:
edition.work = work
if request.method == 'POST' :
edition.new_author_names=request.POST.getlist('new_author')
edition.new_subjects=request.POST.getlist('new_subject')
if request.POST.has_key('add_author_submit'):
new_author_name = request.POST['add_author'].strip()
try:
author= models.Author.objects.get(name=new_author_name)
except models.Author.DoesNotExist:
author=models.Author.objects.create(name=new_author_name)
edition.new_author_names.append(new_author_name)
form = EditionForm(instance=edition, data=request.POST)
elif request.POST.has_key('add_subject_submit'):
new_subject = request.POST['add_subject'].strip()
try:
author= models.Subject.objects.get(name=new_subject)
except models.Subject.DoesNotExist:
author=models.Subject.objects.create(name=new_subject)
edition.new_subjects.append(new_subject)
form = EditionForm(instance=edition, data=request.POST)
else:
form = EditionForm(instance=edition, data=request.POST)
if form.is_valid():
form.save()
if not work:
work= models.Work(title=form.cleaned_data['title'],language=form.cleaned_data['language'],description=form.cleaned_data['description'])
work.save()
edition.work=work
edition.save()
else:
work.description=form.cleaned_data['description']
work.title=form.cleaned_data['title']
work.save()
models.Identifier.get_or_add(type='isbn', value=form.cleaned_data['isbn_13'], edition=edition, work=work)
for author_name in edition.new_author_names:
try:
author= models.Author.objects.get(name=author_name)
except models.Author.DoesNotExist:
author=models.Author.objects.create(name=author_name)
author.editions.add(edition)
for subject_name in edition.new_subjects:
try:
subject= models.Subject.objects.get(name=subject_name)
except models.Subject.DoesNotExist:
subject=models.Subject.objects.create(name=subject_name)
subject.works.add(work)
work_url = reverse('work', kwargs={'work_id': edition.work.id})
return HttpResponseRedirect(work_url)
else:
form = EditionForm(instance=edition, initial={
'language':language,
'isbn_13':edition.isbn_13,
'description':description,
'title': title
})
return render(request, 'new_edition.html', {
'form': form, 'edition': edition
})
def manage_campaign(request, id):
campaign = get_object_or_404(models.Campaign, id=id)
campaign.not_manager=False
@ -358,10 +461,6 @@ class WorkListView(ListView):
counts['wished'] = context['works_wished'].count()
context['counts'] = counts
if (self.kwargs['facet'] == 'recommended'):
unglue_staff = models.User.objects.filter(is_staff=True)
context['unglue_staff'] = unglue_staff
return context
class UngluedListView(ListView):
@ -430,13 +529,24 @@ class PledgeView(FormView):
form_class = self.get_form_class()
form = form_class()
return self.render_to_response(self.get_context_data(form=form))
context_data = self.get_context_data(form=form)
# if there is already an active campaign pledge for user, redirect to the pledge modify page
if context_data.get('redirect_to_modify_pledge'):
work = context_data['work']
return HttpResponseRedirect(reverse('pledge_modify', args=[work.id]))
else:
return self.render_to_response(context_data)
def get_context_data(self, **kwargs):
"""set up the pledge page"""
# the following should be true since PledgeModifyView.as_view is wrapped in login_required
assert self.request.user.is_authenticated()
user = self.request.user
context = super(PledgeView, self).get_context_data(**kwargs)
work = get_object_or_404(models.Work, id=self.kwargs["work_id"])
campaign = work.last_campaign()
if campaign:
@ -468,8 +578,17 @@ class PledgeView(FormView):
except IndexError:
pubdate = 'unknown'
context.update({'redirect_to_modify_pledge':False, 'work':work,'campaign':campaign, 'premiums':premiums, 'form':form, 'premium_id':premium_id, 'faqmenu': 'pledge', 'pubdate':pubdate})
# check whether the user already has an ACTIVE transaction for the given campaign.
# if so, we should redirect the user to modify pledge page
# BUGBUG: but what about Completed Transactions?
transactions = campaign.transactions().filter(user=user, status=TRANSACTION_STATUS_ACTIVE)
if transactions.count() > 0:
context.update({'redirect_to_modify_pledge':True})
else:
context.update({'redirect_to_modify_pledge':False})
context.update({'work':work,'campaign':campaign, 'premiums':premiums, 'form':form, 'premium_id':premium_id, 'faqmenu': 'pledge', 'pubdate':pubdate})
return context
def form_valid(self, form):
@ -505,8 +624,11 @@ class PledgeView(FormView):
# the recipients of this authorization is not specified here but rather by the PaymentManager.
# set the expiry date based on the campaign deadline
expiry = campaign.deadline + timedelta( days=settings.PREAPPROVAL_PERIOD_AFTER_CAMPAIGN )
paymentReason = "Unglue.it Pledge for {0}".format(campaign.name)
t, url = p.authorize('USD', TARGET_TYPE_CAMPAIGN, preapproval_amount, expiry=expiry, campaign=campaign, list=None, user=user,
return_url=return_url, cancel_url=cancel_url, anonymous=anonymous, premium=premium)
return_url=return_url, cancel_url=cancel_url, anonymous=anonymous, premium=premium,
paymentReason=paymentReason)
else: # embedded view -- which we're not actively using right now.
# embedded view triggerws instant payment: send to the partnering RH
receiver_list = [{'email':settings.PAYPAL_NONPROFIT_PARTNER_EMAIL, 'amount':preapproval_amount}]
@ -564,8 +686,10 @@ class PledgeModifyView(FormView):
# preapproval_amount, premium_id (which we don't have stored yet)
if transaction.premium is not None:
premium_id = transaction.premium.id
premium_description = transaction.premium.description
else:
premium_id = None
premium_description = None
# is there a Transaction for an ACTIVE campaign for this
# should make sure Transaction is modifiable.
@ -580,7 +704,7 @@ class PledgeModifyView(FormView):
form_class = self.get_form_class()
form = form_class(initial=data)
context.update({'work':work,'campaign':campaign, 'premiums':premiums, 'form':form,'preapproval_amount':preapproval_amount, 'premium_id':premium_id, 'faqmenu': 'modify'})
context.update({'work':work,'campaign':campaign, 'premiums':premiums, 'form':form,'preapproval_amount':preapproval_amount, 'premium_id':premium_id, 'premium_description': premium_description, 'faqmenu': 'modify', 'tid': transaction.id})
return context
@ -624,7 +748,9 @@ class PledgeModifyView(FormView):
assert transaction.type == PAYMENT_TYPE_AUTHORIZATION and transaction.status == TRANSACTION_STATUS_ACTIVE
p = PaymentManager(embedded=self.embedded)
status, url = p.modify_transaction(transaction=transaction, amount=preapproval_amount, premium=premium)
paymentReason = "Unglue.it Pledge for {0}".format(campaign.name)
status, url = p.modify_transaction(transaction=transaction, amount=preapproval_amount, premium=premium,
paymentReason=paymentReason)
logger.info("status: {0}, url:{1}".format(status, url))
@ -722,6 +848,11 @@ class PledgeCompleteView(TemplateView):
context["faqmenu"] = "complete"
context["works"] = works
context["works2"] = works2
context["site"] = Site.objects.get_current()
# generate notices with same context used for user page
notification.queue([transaction.user], "pledge_you_have_pledged", {'transaction': transaction, 'campaign': campaign, 'site': context['site'], 'work': work}, True)
emit_notifications.delay()
return context
@ -1063,11 +1194,11 @@ def supporter(request, supporter_username, template_name):
works = worklist[:4]
works2 = worklist[4:8]
# default to showing the Active tab if there are active campaigns, else show Wishlist
# default to showing the Active tab if there are active campaigns, else show Wishlist
if backing > 0:
activetab = "#2"
activetab = "#2"
else:
activetab = "#3"
activetab = "#3"
date = supporter.date_joined.strftime("%B %d, %Y")
@ -1658,13 +1789,13 @@ def work_goodreads(request, work_id):
return HttpResponseRedirect(url)
@login_required
def emailshare(request):
def emailshare(request, action):
if request.method == 'POST':
form=EmailShareForm(request.POST)
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
sender = '%s via Unglue.it <%s>'%(request.user.username, request.user.email)
recipient = form.cleaned_data['recipient']
send_mail_task.delay(subject, message, sender, [recipient])
try:
@ -1674,41 +1805,32 @@ def emailshare(request):
return HttpResponseRedirect(next)
else:
sender = request.user.email
try:
next = request.GET['next']
if "pledge" in request.path:
work_id = next.split('=')[1]
book = models.Work.objects.get(pk=int(work_id))
title = book.title
message = "I just pledged to unglue one of my favorite books, "+title+", on Unglue.it: http://unglue.it/work/"+work_id+". If enough of us pledge to unglue this book, the creator will be paid and the ebook will become free to everyone on earth. Will you join me?"
subject = "Help me unglue "+title
work_id = next.split('/')[-2]
work_id = int(work_id)
work = models.Work.objects.get(pk=work_id)
if action == 'pledge':
message = render_to_string('emails/i_just_pledged.txt',{'request':request,'work':work,'site': Site.objects.get_current()})
subject = "Help me unglue "+work.title
else:
work_id = next.split('/')[-2]
work_id = int(work_id)
book = models.Work.objects.get(pk=work_id)
title = book.title
# if title requires unicode let's ignore it for now
try:
title = ', '+str(title)+', '
except:
title = ' '
try:
status = book.last_campaign().status
status = work.last_campaign().status
except:
status = None
# customize the call to action depending on campaign status
if status == 'ACTIVE':
message = 'Help me unglue one of my favorite books'+title+'on Unglue.it: http://unglue.it/'+next+'. If enough of us pledge to unglue this book, the creator will be paid and the ebook will become free to everyone on earth.'
message = render_to_string('emails/pledge_this.txt',{'request':request,'work':work,'site': Site.objects.get_current()})
else:
message = 'Help me unglue one of my favorite books'+title+'on Unglue.it: http://unglue.it'+next+'. If enough of us wishlist this book, Unglue.it may start a campaign to pay the creator and make the ebook free to everyone on earth.'
message = render_to_string('emails/wish_this.txt',{'request':request,'work':work,'site': Site.objects.get_current()})
subject = 'Come see one of my favorite books on Unglue.it'
form = EmailShareForm(initial={'sender': sender, 'next':next, 'subject': subject, 'message': message})
form = EmailShareForm(initial={ 'next':next, 'subject': subject, 'message': message})
except:
next = ''
form = EmailShareForm(initial={'sender': sender, 'next':next, 'subject': 'Come join me on Unglue.it', 'message':"I'm ungluing books on Unglue.it. Together we're paying creators and making ebooks free to everyone on earth. Join me! http://unglue.it"})
form = EmailShareForm(initial={'next':next, 'subject': 'Come join me on Unglue.it', 'message':render_to_string('emails/join_me.txt',{'request':request,'site': Site.objects.get_current()})})
return render(request, "emailshare.html", {'form':form})

View File

@ -49,6 +49,18 @@ AMAZON_OPERATION_TYPE_PAY = 'PAY'
AMAZON_OPERATION_TYPE_REFUND = 'REFUND'
AMAZON_OPERATION_TYPE_CANCEL = 'CANCEL'
# load FPS_ACCESS_KEY and FPS_SECRET_KEY from the database if possible
try:
from regluit.core.models import Key
FPS_ACCESS_KEY = Key.objects.get(name="FPS_ACCESS_KEY").value
FPS_SECRET_KEY = Key.objects.get(name="FPS_SECRET_KEY").value
logger.info('Successful loading of FPS_*_KEYs')
except Exception, e:
FPS_ACCESS_KEY = ''
FPS_SECRET_KEY = ''
logger.info('EXCEPTION: unsuccessful loading of FPS_*_KEYs: {0}'.format(e))
def ProcessIPN(request):
'''
@ -82,7 +94,7 @@ def ProcessIPN(request):
uri = request.build_absolute_uri()
parsed_url = urlparse.urlparse(uri)
connection = FPSConnection(settings.FPS_ACCESS_KEY, settings.FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
connection = FPSConnection(FPS_ACCESS_KEY, FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
# Check the validity of the IPN
resp = connection.verify_signature("%s://%s%s" %(parsed_url.scheme,
@ -373,7 +385,7 @@ class Pay( AmazonRequest ):
The pay function generates a redirect URL to approve the transaction
'''
def __init__( self, transaction, return_url=None, cancel_url=None, amount=None):
def __init__( self, transaction, return_url=None, cancel_url=None, amount=None, paymentReason=""):
try:
logging.debug("Amazon PAY operation for transaction ID %d" % transaction.id)
@ -382,7 +394,7 @@ class Pay( AmazonRequest ):
self.original_return_url = return_url
return_url = settings.BASE_URL + reverse('AmazonPaymentReturn')
self.connection = FPSConnection(settings.FPS_ACCESS_KEY, settings.FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
self.connection = FPSConnection(FPS_ACCESS_KEY, FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
receiver_list = []
receivers = transaction.receiver_set.all()
@ -406,7 +418,7 @@ class Pay( AmazonRequest ):
'validityExpiry': str(int(time.mktime(expiry.timetuple()))), # use the preapproval date by default
}
self.url = self.connection.make_url(return_url, "Test Payment", "MultiUse", str(amount), **data)
self.url = self.connection.make_url(return_url, paymentReason, "MultiUse", str(amount), **data)
logging.debug("Amazon PAY redirect url was: %s" % self.url)
@ -440,7 +452,7 @@ class Pay( AmazonRequest ):
class Preapproval(Pay):
def __init__( self, transaction, amount, expiry=None, return_url=None, cancel_url=None):
def __init__( self, transaction, amount, expiry=None, return_url=None, cancel_url=None, paymentReason=""):
# set the expiration date for the preapproval if not passed in. This is what the paypal library does
now_val = now()
@ -451,7 +463,7 @@ class Preapproval(Pay):
transaction.save()
# Call into our parent class
Pay.__init__(self, transaction, return_url=return_url, cancel_url=cancel_url, amount=amount)
Pay.__init__(self, transaction, return_url=return_url, cancel_url=cancel_url, amount=amount, paymentReason=paymentReason)
class Execute(AmazonRequest):
@ -467,7 +479,7 @@ class Execute(AmazonRequest):
logging.debug("Amazon EXECUTE action for transaction id: %d" % transaction.id)
# Use the boto class top open a connection
self.connection = FPSConnection(settings.FPS_ACCESS_KEY, settings.FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
self.connection = FPSConnection(FPS_ACCESS_KEY, FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
self.transaction = transaction
# BUGBUG, handle multiple receivers! For now we just send the money to ourselves
@ -558,7 +570,7 @@ class PaymentDetails(AmazonRequest):
logging.debug("Amazon PAYMENTDETAILS API for transaction id: %d" % transaction.id)
# Use the boto class top open a connection
self.connection = FPSConnection(settings.FPS_ACCESS_KEY, settings.FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
self.connection = FPSConnection(FPS_ACCESS_KEY, FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
self.transaction = transaction
if not transaction.preapproval_key:
@ -639,7 +651,7 @@ class CancelPreapproval(AmazonRequest):
logging.debug("Amazon CANCELPREAPPROVAL api called for transaction id: %d" % transaction.id)
# Use the boto class top open a connection
self.connection = FPSConnection(settings.FPS_ACCESS_KEY, settings.FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
self.connection = FPSConnection(FPS_ACCESS_KEY, FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
self.transaction = transaction
global_params = {"OverrideIPNURL": settings.BASE_URL + reverse('HandleIPN', args=["amazon"])}
@ -694,7 +706,7 @@ class RefundPayment(AmazonRequest):
logging.debug("Amazon REFUNDPAYMENT API called for transaction id: %d", transaction.id)
# Use the boto class top open a connection
self.connection = FPSConnection(settings.FPS_ACCESS_KEY, settings.FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
self.connection = FPSConnection(FPS_ACCESS_KEY, FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
self.transaction = transaction
if not transaction.preapproval_key:
@ -748,7 +760,7 @@ class PreapprovalDetails(AmazonRequest):
logging.debug("Amazon PREAPPROVALDETAILS API called for transaction id: %d", transaction.id)
# Use the boto class top open a connection
self.connection = FPSConnection(settings.FPS_ACCESS_KEY, settings.FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
self.connection = FPSConnection(FPS_ACCESS_KEY, FPS_SECRET_KEY, host=settings.AMAZON_FPS_HOST)
self.transaction = transaction

View File

@ -389,7 +389,7 @@ class PaymentManager( object ):
'''
transactions = Transaction.objects.filter(campaign=campaign, status=TRANSACITON_STATUS_ACTIVE)
transactions = Transaction.objects.filter(campaign=campaign, status=TRANSACTION_STATUS_ACTIVE)
for t in transactions:
result = self.cancel_transaction(t)
@ -538,7 +538,9 @@ class PaymentManager( object ):
logger.info("Cancel Transaction " + str(transaction.id) + " Failed with error: " + p.error_string())
return False
def authorize(self, currency, target, amount, expiry=None, campaign=None, list=None, user=None, return_url=None, cancel_url=None, anonymous=False, premium=None):
def authorize(self, currency, target, amount, expiry=None, campaign=None, list=None, user=None,
return_url=None, cancel_url=None, anonymous=False, premium=None,
paymentReason="unglue.it Pledge"):
'''
authorize
@ -554,6 +556,7 @@ class PaymentManager( object ):
cancel_url: url to send supporter to if support hits cancel while in middle of PayPal transaction
anonymous: whether this pledge is anonymous
premium: the premium selected by the supporter for this transaction
paymentReason: a memo line that will show up in the Payer's Amazon (and Paypal?) account
return value: a tuple of the new transaction object and a re-direct url. If the process fails,
the redirect url will be None
@ -588,7 +591,7 @@ class PaymentManager( object ):
return_url = urlparse.urljoin(settings.BASE_URL, return_path)
method = getattr(t.get_payment_class(), "Preapproval")
p = method(t, amount, expiry, return_url=return_url, cancel_url=cancel_url)
p = method(t, amount, expiry, return_url=return_url, cancel_url=cancel_url, paymentReason=paymentReason)
# Create a response for this
envelope = p.envelope()
@ -616,7 +619,9 @@ class PaymentManager( object ):
logger.info("Authorize Error: " + p.error_string())
return t, None
def modify_transaction(self, transaction, amount, expiry=None, anonymous=None, premium=None, return_url=None, cancel_url=None):
def modify_transaction(self, transaction, amount, expiry=None, anonymous=None, premium=None,
return_url=None, cancel_url=None,
paymentReason=None):
'''
modify
@ -628,6 +633,7 @@ class PaymentManager( object ):
premium: new premium selected; if None, then keep old value
return_url: the return URL after the preapproval(if needed)
cancel_url: the cancel url after the preapproval(if needed)
paymentReason: a memo line that will show up in the Payer's Amazon (and Paypal?) account
return value: True if successful, False otherwise. An optional second parameter for the forward URL if a new authorhization is needed
'''
@ -665,7 +671,8 @@ class PaymentManager( object ):
return_url,
cancel_url,
transaction.anonymous,
premium)
premium,
paymentReason)
if t and url:
# Need to re-direct to approve the transaction

View File

@ -404,8 +404,9 @@ class PaypalEnvelopeRequest:
return None
class Pay( PaypalEnvelopeRequest ):
def __init__( self, transaction, return_url=None, cancel_url=None):
def __init__( self, transaction, return_url=None, cancel_url=None, paymentReason=""):
#BUGBUG: though I'm passing in paymentReason (to make it signature compatible with Amazon, it's not being wired in properly yet)
try:
headers = {
@ -786,7 +787,9 @@ class RefundPayment(PaypalEnvelopeRequest):
class Preapproval( PaypalEnvelopeRequest ):
def __init__( self, transaction, amount, expiry=None, return_url=None, cancel_url=None):
def __init__( self, transaction, amount, expiry=None, return_url=None, cancel_url=None, paymentReason=""):
# BUGBUG: though I'm passing in paymentReason (to make it signature compatible with Amazon, it's not being wired in properly yet)
try:

View File

@ -104,6 +104,7 @@ INSTALLED_APPS = (
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.comments',
'django.contrib.humanize',
'south',
'django_extensions',
'regluit.frontend',
@ -256,7 +257,6 @@ EBOOK_NOTIFICATIONS_JOB = {
# by default, in common, we don't turn any of the celerybeat jobs on -- turn them on in the local settings file
# set -- sandbox or production Amazon FPS?
AMAZON_FPS_HOST = "fps.sandbox.amazonaws.com"
#AMAZON_FPS_HOST = "fps.amazonaws.com"

View File

@ -68,14 +68,6 @@ GOOGLE_BOOKS_API_KEY = ''
# Payment processor switch
PAYMENT_PROCESSOR = 'amazon'
# Amazon credentials (for fps)
AWS_ACCESS_KEY = ''
AWS_SECRET_ACCESS_KEY = ''
# Amazon FPS Credentials
FPS_ACCESS_KEY = ''
FPS_SECRET_KEY = ''
# set -- sandbox or production Amazon FPS?
AMAZON_FPS_HOST = "fps.sandbox.amazonaws.com"
#AMAZON_FPS_HOST = "fps.amazonaws.com"

View File

@ -22,6 +22,7 @@ DATABASES = {
'PASSWORD': 'forgetn0t',
'HOST': 'justdb.cboagmr25pjs.us-east-1.rds.amazonaws.com',
'PORT': '',
'TEST_CHARSET': 'utf8'
}
}
@ -125,9 +126,10 @@ CELERYBEAT_SCHEDULE['report_new_ebooks'] = EBOOK_NOTIFICATIONS_JOB
CELERYBEAT_SCHEDULE['emit_notifications'] = EMIT_NOTIFICATIONS_JOB
# Amazon credentials (for fps)
AWS_ACCESS_KEY = ''
AWS_SECRET_ACCESS_KEY = ''
# set -- sandbox or production Amazon FPS?
AMAZON_FPS_HOST = "fps.sandbox.amazonaws.com"
#AMAZON_FPS_HOST = "fps.amazonaws.com"
# if settings/local.py exists, import those settings -- allows for dynamic generation of parameters such as DATABASES
try:

View File

@ -129,6 +129,9 @@ CELERYBEAT_SCHEDULE['emit_notifications'] = EMIT_NOTIFICATIONS_JOB
AWS_ACCESS_KEY = ''
AWS_SECRET_ACCESS_KEY = ''
# choice of payment processor
PAYMENT_PROCESSOR = 'paypal'
# if settings/local.py exists, import those settings -- allows for dynamic generation of parameters such as DATABASES
try:
from regluit.settings.local import *

View File

@ -91,7 +91,7 @@ CELERYD_HIJACK_ROOT_LOGGER = False
# BASE_URL is a hard-coding of the domain name for site and used for PayPal IPN
# Next step to try https
BASE_URL = 'http://unglueit.com'
BASE_URL = 'http://unglue.it'
# use redis for production queue
BROKER_TRANSPORT = "redis"
@ -124,6 +124,10 @@ STATIC_ROOT = '/var/www/static'
#CELERYBEAT_SCHEDULE['emit_notifications'] = EMIT_NOTIFICATIONS_JOB
CELERYBEAT_SCHEDULE['report_new_ebooks'] = EBOOK_NOTIFICATIONS_JOB
# set -- sandbox or production Amazon FPS?
#AMAZON_FPS_HOST = "fps.sandbox.amazonaws.com"
AMAZON_FPS_HOST = "fps.amazonaws.com"
# if settings/local.py exists, import those settings -- allows for dynamic generation of parameters such as DATABASES
try:
from regluit.settings.local import *

Some files were not shown because too many files have changed in this diff Show More