From 2da4ba6f961173a4a93384b1cf5fd3ae5265ab46 Mon Sep 17 00:00:00 2001 From: Andromeda Yelton Date: Fri, 31 Aug 2012 13:41:16 -0400 Subject: [PATCH 01/28] starting a notification for RHs when their books are wished for --- core/models.py | 3 +- core/signals.py | 73 ++++--------------- .../notification/new_wisher/full.txt | 4 + .../notification/new_wisher/notice.html | 9 +++ .../notification/new_wisher/notice.txt | 3 + .../notification/new_wisher/short.txt | 1 + 6 files changed, 35 insertions(+), 58 deletions(-) create mode 100644 frontend/templates/notification/new_wisher/full.txt create mode 100644 frontend/templates/notification/new_wisher/notice.html create mode 100644 frontend/templates/notification/new_wisher/notice.txt create mode 100644 frontend/templates/notification/new_wisher/short.txt diff --git a/core/models.py b/core/models.py index 48c83777..a6dd3940 100755 --- a/core/models.py +++ b/core/models.py @@ -819,7 +819,8 @@ class Wishlist(models.Model): w = Wishes.objects.get(wishlist=self,work=work) except: Wishes.objects.create(source=source,wishlist=self,work=work) - work.update_num_wishes() + work.update_num_wishes() + wishlist_added.send(sender=self, work=work, supporter=self.user) def remove_work(self, work): w = Wishes.objects.filter(wishlist=self, work=work) diff --git a/core/signals.py b/core/signals.py index 880c438e..3c2711f0 100644 --- a/core/signals.py +++ b/core/signals.py @@ -97,6 +97,7 @@ def create_notice_types(app, created_models, verbosity, **kwargs): notification.create_notice_type("rights_holder_claim_approved", _("Claim Accepted"), _("A claim you've entered has been accepted.")) notification.create_notice_type("wishlist_unsuccessful_amazon", _("Campaign shut down"), _("An ungluing campaign that you supported had to be shut down due to an Amazon Payments policy change.")) notification.create_notice_type("pledge_donation_credit", _("Donation Credit Balance"), _("You have a donation credit balance")) + notification.create_notice_type("new_wisher", _("New wisher"), _("Someone new has wished for a book that you're the rightsholder for")) signals.post_syncdb.connect(create_notice_types, sender=notification) @@ -213,60 +214,18 @@ def handle_wishlist_unsuccessful_amazon(campaign, **kwargs): amazon_suspension.connect(handle_wishlist_unsuccessful_amazon) -# The notification templates need some context; I'm making a note of that here -# This can be removed as the relevant functions are written -# 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) \ No newline at end of file +wishlist_added = Signal(providing_args=["supporter", "work"]) + +def handle_wishlist_added(supporter, work, **kwargs): + """send notification to confirmed rights holder when someone wishes for their work""" + claim = work.claim.filter(status="active") + if claim: + notification.queue([claim.user], "new_wisher", { + 'supporter': supporter, + 'work': work + }, True) + + from regluit.core.tasks import emit_notifications + emit_notifications.delay() + +wishlist_added.connect(handle_wishlist_added) diff --git a/frontend/templates/notification/new_wisher/full.txt b/frontend/templates/notification/new_wisher/full.txt new file mode 100644 index 00000000..56b6fe04 --- /dev/null +++ b/frontend/templates/notification/new_wisher/full.txt @@ -0,0 +1,4 @@ +{{ supporter }} has wished for a work you hold rights to, {{ work.title }}. Hooray! There are now {{ work.num_wishes }} people wishing for this work. + + +The Unglue.it team \ No newline at end of file diff --git a/frontend/templates/notification/new_wisher/notice.html b/frontend/templates/notification/new_wisher/notice.html new file mode 100644 index 00000000..0a11d20c --- /dev/null +++ b/frontend/templates/notification/new_wisher/notice.html @@ -0,0 +1,9 @@ +{% extends "notification/notice_template.html" %} + +{% block comments_book %} + cover image for {{ work.title }} +{% endblock %} + +{% block comments_graphical %} + {{ supporter }} has wished for a work you hold rights to, {{ work.title }}. Hooray! +{% endblock %} \ No newline at end of file diff --git a/frontend/templates/notification/new_wisher/notice.txt b/frontend/templates/notification/new_wisher/notice.txt new file mode 100644 index 00000000..ebd00571 --- /dev/null +++ b/frontend/templates/notification/new_wisher/notice.txt @@ -0,0 +1,3 @@ +{{ supporter }} has wished for a work you hold rights to, {{ work.title }}. Hooray! There are now {{ work.num_wishes }} people wishing for this work. + + diff --git a/frontend/templates/notification/new_wisher/short.txt b/frontend/templates/notification/new_wisher/short.txt new file mode 100644 index 00000000..9233e50b --- /dev/null +++ b/frontend/templates/notification/new_wisher/short.txt @@ -0,0 +1 @@ +Someone new has wished for your work at Unglue.it \ No newline at end of file From 1383d4b1f4ea7aa01372956975616967ea819a65 Mon Sep 17 00:00:00 2001 From: eric Date: Thu, 20 Sep 2012 17:48:54 -0400 Subject: [PATCH 02/28] update description of rewards --- frontend/templates/rh_tools.html | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/frontend/templates/rh_tools.html b/frontend/templates/rh_tools.html index 67b17aea..61f23c2f 100644 --- a/frontend/templates/rh_tools.html +++ b/frontend/templates/rh_tools.html @@ -144,14 +144,13 @@ Needs to be written. What would you find helpful in a social media toolkit? Rewards -

Campaigns have rewards as a way to thank supporters. unglue.it includes a standard set of rewards in all campaigns. You are encouraged to add additional sweeteners to motivate people to contribute.

+

Campaigns have rewards as a way to thank supporters. unglue.it includes a standard set of acknowledgement rewards in all campaigns. You are strongly encouraged to add additional sweeteners to motivate people to contribute- these are given special prominence on the campaign page.

-

Here are the standard rewards:

+

Here are the standard acknowledgement rewards, which automatically combine with your customized rewards, so a $30 reward will include the $25 standard acknowledgement reward:

    -
  • Any level ($1 minimum) — The unglued ebook delivered to your inbox
  • -
  • $25 — Your username under "supporters" in the acknowledgements section
  • -
  • $50 — Your name & profile link under "benefactors"
  • -
  • $100 — Your name, profile link, & profile tagline under "bibliophiles"
  • +
  • $25 and above — Your username under "supporters" in the acknowledgements section
  • +
  • $50 and above — Your name & profile link under "benefactors"
  • +
  • $100 and above — Your name, profile link, & profile tagline under "bibliophiles"

More Questions

From 5d7e6a39bd4d170e098119ef7b2d8041d669b7b9 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 21 Sep 2012 12:10:13 -0400 Subject: [PATCH 03/28] managers can clone UNSUCCESSFUL Campaigns, and can only manage INITIALIZED and ACTIVE ones. [#36192903][#30068227] --- core/models.py | 26 ++++++++++++++ frontend/forms.py | 3 ++ frontend/templates/rh_tools.html | 59 +++++++++++++++++++++----------- frontend/views.py | 18 ++++++++-- 4 files changed, 83 insertions(+), 23 deletions(-) diff --git a/core/models.py b/core/models.py index 60e492ef..5ddf3925 100755 --- a/core/models.py +++ b/core/models.py @@ -210,6 +210,32 @@ class Campaign(models.Model): except: return u"Campaign %s (no associated work)" % self.name + def clone(self): + if self.clonable(): + old_managers= self.managers.all() + self.pk = None + self.status = 'INITIALIZED' + self.deadline = date_today() + timedelta(days=int(settings.UNGLUEIT_LONGEST_DEADLINE)) + self.created = None + self.name = 'copy of %s' % self.name + self.activated = None + self.save() + self.managers=old_managers + new_premiums= self.premiums.filter(type='CU') + for premium in new_premiums: + premium.pk=None + premium.created = None + premium.campaign = self + premium.save() + else: + return None + + def clonable(self): + if self.status == 'UNSUCCESSFUL' and self.work.last_campaign().id==self.id: + return True + else: + return False + @property def launchable(self): may_launch=True diff --git a/frontend/forms.py b/frontend/forms.py index 83f1c263..202b171a 100644 --- a/frontend/forms.py +++ b/frontend/forms.py @@ -164,6 +164,9 @@ class UserData(forms.Form): return username raise forms.ValidationError(_("Your username is already "+username)) +class CloneCampaignForm(forms.Form): + campaign_id = forms.IntegerField(required = True, widget = forms.HiddenInput) + class OpenCampaignForm(forms.ModelForm): managers = AutoCompleteSelectMultipleField( OwnerLookup, diff --git a/frontend/templates/rh_tools.html b/frontend/templates/rh_tools.html index 61f23c2f..2c465b40 100644 --- a/frontend/templates/rh_tools.html +++ b/frontend/templates/rh_tools.html @@ -20,10 +20,10 @@ Any questions not covered here? Please email us at
rights@gluejar.com. -{% if request.user.campaigns.all %} +{% if campaigns %}

Campaigns You Manage

- {% for campaign in request.user.campaigns.all %} + {% for campaign in campaigns %}
Work: {{campaign.work.title }}
@@ -32,9 +32,20 @@ Any questions not covered here? Please email us at Manage This Campaign -
+ {% if campaign.status = 'ACTIVE' or campaign.status = 'INITIALIZED' %} +
+ Manage This Campaign +
+ {% endif %} + {% if campaign.clone_form %} +
+
+ {% csrf_token %} + {{ campaign.clone_form }}{{ campaign.clone_form.errors }} + +
+
+ {% endif %}
{% endfor %} @@ -51,7 +62,7 @@ Any questions not covered here? Please email us at {% csrf_token %}

Name the Campaign: {{ claim.campaign_form.name }}{{ claim.campaign_form.name.errors }}

@@ -67,20 +78,28 @@ Any questions not covered here? Please email us at
-
- Name: Your campaign, "{{ campaign.name }}", is {{ campaign.status }}
- Created: {{ campaign.created }}
- Manager(s): {% for user in campaign.managers.all %}
{{ user.username }} {% endfor %} -
{% csrf_token %} - Add/Remove Managers: {{ campaign.edit_managers_form.managers }}{{ campaign.edit_managers_form.managers.errors }} - -
-
- {% if request.user in campaign.managers.all %} -
- Manage This Campaign -
- {% endif %} + {% if campaign.status = 'ACTIVE' or campaign.status = 'INITIALIZED' %} +
+ Name: Your campaign, "{{ campaign.name }}", is {{ campaign.status }}
+ Created: {{ campaign.created }}
+ Manager(s): {% for user in campaign.managers.all %} {{ user.username }} {% endfor %} +
{% csrf_token %} + Add/Remove Managers: {{ campaign.edit_managers_form.managers }}{{ campaign.edit_managers_form.managers.errors }} + +
+
+ {% if request.user in campaign.managers.all %} +
+ Manage This Campaign +
+ {% endif %} + {% else %} +
+ Name: Your campaign, "{{ campaign.name }}", is {{ campaign.status }}
+ Created: {{ campaign.created }}
+ Manager(s): {% for user in campaign.managers.all %} {{ user.username }} {% endfor %} +
+ {% endif %} {% endfor %} {% endif %} diff --git a/frontend/views.py b/frontend/views.py index 6a0c3a44..420205b3 100755 --- a/frontend/views.py +++ b/frontend/views.py @@ -48,7 +48,7 @@ from regluit.frontend.forms import UserData, UserEmail, ProfileForm, CampaignPle 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, EditionForm, PledgeCancelForm -from regluit.frontend.forms import getTransferCreditForm, CCForm +from regluit.frontend.forms import getTransferCreditForm, CCForm, CloneCampaignForm from regluit.payment.manager import PaymentManager from regluit.payment.models import Transaction, Account from regluit.payment.parameters import TRANSACTION_STATUS_ACTIVE, TRANSACTION_STATUS_COMPLETE, TRANSACTION_STATUS_CANCELED, TRANSACTION_STATUS_ERROR, TRANSACTION_STATUS_FAILED, TRANSACTION_STATUS_INCOMPLETE, TRANSACTION_STATUS_NONE, TRANSACTION_STATUS_MODIFIED @@ -1152,7 +1152,7 @@ def rh_tools(request): claim.campaigns = claim.work.campaigns.all() else: claim.campaigns = [] - claim.can_open_new=True + claim.can_open_new=False if claim.work.last_campaign_status in ['ACTIVE','INITIALIZED'] else True for campaign in claim.campaigns: if campaign.status in ['ACTIVE','INITIALIZED']: claim.can_open_new=False @@ -1177,7 +1177,19 @@ def rh_tools(request): claim.campaign_form = OpenCampaignForm(data={'work': claim.work, 'name': claim.work.title, 'userid': request.user.id, 'managers_1': request.user.id}) else: claim.can_open_new=False - return render(request, "rh_tools.html", {'claims': claims ,}) + campaigns = request.user.campaigns.all() + new_campaign = None + for campaign in campaigns: + if campaign.clonable(): + if request.method == 'POST' and request.POST.has_key('c%s-campaign_id'% campaign.id): + clone_form= CloneCampaignForm(data=request.POST, prefix = 'c%s' % campaign.id) + if clone_form.is_valid(): + new_campaign= campaign.clone() + else: + campaign.clone_form= CloneCampaignForm(initial={'campaign_id':campaign.id}, prefix = 'c%s' % campaign.id) + if new_campaign: + campaigns=campaigns.list().append(new_campaign) + return render(request, "rh_tools.html", {'claims': claims ,'campaigns': campaigns}) def rh_admin(request): if not request.user.is_authenticated() : From 40a5b0935975376b08bab79345d6fdd5f78a5d84 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 21 Sep 2012 12:32:32 -0400 Subject: [PATCH 04/28] rh_tools now shows campaign totals by campaign [#16581715] --- core/models.py | 5 ++++- frontend/templates/rh_tools.html | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/models.py b/core/models.py index 5ddf3925..4d993fff 100755 --- a/core/models.py +++ b/core/models.py @@ -219,6 +219,7 @@ class Campaign(models.Model): self.created = None self.name = 'copy of %s' % self.name self.activated = None + self.update_left() self.save() self.managers=old_managers new_premiums= self.premiums.filter(type='CU') @@ -367,7 +368,9 @@ class Campaign(models.Model): @property def supporters_count(self): # avoid transmitting the whole list if you don't need to; let the db do the count. - return self.transactions().filter(status=TRANSACTION_STATUS_ACTIVE).values_list('user', flat=True).distinct().count() + active = self.transactions().filter(status=TRANSACTION_STATUS_ACTIVE).values_list('user', flat=True).distinct().count() + complete = self.transactions().filter(status=TRANSACTION_STATUS_COMPLETE).values_list('user', flat=True).distinct().count() + return active+complete def transaction_to_recharge(self, user): """given a user, return the transaction to be recharged if there is one -- None otherwise""" diff --git a/frontend/templates/rh_tools.html b/frontend/templates/rh_tools.html index 2c465b40..faaadf38 100644 --- a/frontend/templates/rh_tools.html +++ b/frontend/templates/rh_tools.html @@ -30,7 +30,8 @@ Any questions not covered here? Please email us at Campaign: {{ campaign.name }}
Campaign status: {{ campaign.status }}
- Created: {{ campaign.created }} + Created: {{ campaign.created }}
+ ${{ campaign.current_total }} pledged of ${{ campaign.target }}, {{ campaign.supporters_count }} supporters {% if campaign.status = 'ACTIVE' or campaign.status = 'INITIALIZED' %}
@@ -98,6 +99,8 @@ Any questions not covered here? Please email us at Created: {{ campaign.created }}
Manager(s): {% for user in campaign.managers.all %}
{{ user.username }} {% endfor %} +
+ ${{ campaign.current_total }} pledged of ${{ campaign.target }}, {{ campaign.supporters_count }} supporters
{% endif %} From d39b098cc1e2244ba7933e23b4c32d9d6f136839 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 21 Sep 2012 13:08:54 -0400 Subject: [PATCH 05/28] [#36197947] revised description of "paypal" email address --- frontend/templates/manage_campaign.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/frontend/templates/manage_campaign.html b/frontend/templates/manage_campaign.html index 33c36a6b..1d310093 100644 --- a/frontend/templates/manage_campaign.html +++ b/frontend/templates/manage_campaign.html @@ -208,10 +208,9 @@ Please fix the following before launching your campaign: {{ form.deadline.errors }}{{ form.deadline }} {% endifnotequal %} -

Paypal collection address

-

Enter the email address associated with your PayPal account.

+

e-mail contact address

+

Enter the email address where notifications about this campaign should be sent. If your campaign succeeds, this email needs to work if you want to get paid!

-

We don't support PayPal yet; if your campaign succeeds we'll be paying you by check. However, we've applied PayPal for a merchant account, and should that application be approved PayPal expects us to have this information.

{{ form.paypal_receiver.errors }}{{ form.paypal_receiver }}

{% ifequal campaign_status 'ACTIVE' %} From b6862cad3dad4c59765e68de111d11e1d855a842 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 21 Sep 2012 13:54:59 -0400 Subject: [PATCH 06/28] fix copying the premiums [#36192903] --- core/models.py | 3 ++- frontend/views.py | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/core/models.py b/core/models.py index 4d993fff..9323cf32 100755 --- a/core/models.py +++ b/core/models.py @@ -213,6 +213,7 @@ class Campaign(models.Model): def clone(self): if self.clonable(): old_managers= self.managers.all() + new_premiums= self.premiums.filter(type='CU') self.pk = None self.status = 'INITIALIZED' self.deadline = date_today() + timedelta(days=int(settings.UNGLUEIT_LONGEST_DEADLINE)) @@ -222,12 +223,12 @@ class Campaign(models.Model): self.update_left() self.save() self.managers=old_managers - new_premiums= self.premiums.filter(type='CU') for premium in new_premiums: premium.pk=None premium.created = None premium.campaign = self premium.save() + return self else: return None diff --git a/frontend/views.py b/frontend/views.py index 420205b3..d08182b1 100755 --- a/frontend/views.py +++ b/frontend/views.py @@ -1184,11 +1184,9 @@ def rh_tools(request): if request.method == 'POST' and request.POST.has_key('c%s-campaign_id'% campaign.id): clone_form= CloneCampaignForm(data=request.POST, prefix = 'c%s' % campaign.id) if clone_form.is_valid(): - new_campaign= campaign.clone() + campaign.clone() else: campaign.clone_form= CloneCampaignForm(initial={'campaign_id':campaign.id}, prefix = 'c%s' % campaign.id) - if new_campaign: - campaigns=campaigns.list().append(new_campaign) return render(request, "rh_tools.html", {'claims': claims ,'campaigns': campaigns}) def rh_admin(request): From bd77dc063870591ca40a7739361ef393bd6f7f23 Mon Sep 17 00:00:00 2001 From: eric Date: Fri, 21 Sep 2012 22:23:17 -0400 Subject: [PATCH 07/28] Download page: Added format icons, alt text to images and source for non-unglued ebooks --- frontend/templates/download.html | 34 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/frontend/templates/download.html b/frontend/templates/download.html index b5b038e5..7090bd49 100644 --- a/frontend/templates/download.html +++ b/frontend/templates/download.html @@ -19,13 +19,13 @@

Read the unglued edition!

{% for ebook in unglued_ebooks %} - {% with ebook.url as url %} - - {{ ebook.format }} - {% ifequal ebook.format 'mobi' %} (use for Kindle){% endifequal %} - {% ifequal ebook.format 'epub' %} (use for Nook, Apple, Sony){% endifequal %} - {% if not forloop.last %}

{% endif %} - {% endwith %} + + {{ ebook.rights}} + {{ ebook.format }} + {{ ebook.format }} + {% ifequal ebook.format 'mobi' %} (use for Kindle){% endifequal %} + {% ifequal ebook.format 'epub' %} (use for Nook, Apple, Sony){% endifequal %} + {% if not forloop.last %}

{% endif %} {% endfor %}
@@ -38,13 +38,13 @@

Freely available editions

{% endif %} {% for ebook in other_ebooks %} - {% with ebook.url as url %} - - {{ ebook.format }} - {% ifequal ebook.format 'mobi' %} (use for Kindle){% endifequal %} - {% ifequal ebook.format 'epub' %} (use for Nook, Apple, Sony){% endifequal %} - {% if not forloop.last %}

{% endif %} - {% endwith %} + + {{ ebook.rights}} + {{ ebook.format }} at {{ebook.provider}} + {{ ebook.format }} at {{ebook.provider}} + {% ifequal ebook.format 'mobi' %} (use for Kindle){% endifequal %} + {% ifequal ebook.format 'epub' %} (use for Nook, Apple, Sony){% endifequal %} + {% if not forloop.last %}

{% endif %} {% endfor %} {% endif %} @@ -65,7 +65,7 @@
{% endif %}

Android devices

- +
  • Download the free Aldiko app.
  • @@ -77,7 +77,7 @@ {% endcomment %}

    iOS devices

    - + {% comment %}test{% endcomment %}

    PC, Mac, or Linux

    - +
    • Download the free Calibre app.
    • Download your book from this page using your device's web browser.
    • From 376dbdac37dab379fe493e5539773afac2d96f29 Mon Sep 17 00:00:00 2001 From: eshellman Date: Sat, 22 Sep 2012 13:00:17 -0300 Subject: [PATCH 08/28] Update core/models.py added comment to Campaign.clone method --- core/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/core/models.py b/core/models.py index 9323cf32..16181f42 100755 --- a/core/models.py +++ b/core/models.py @@ -211,6 +211,7 @@ class Campaign(models.Model): return u"Campaign %s (no associated work)" % self.name def clone(self): + """use a previous UNSUCCESSFUL campaign's data as the basis for a new campaign""" if self.clonable(): old_managers= self.managers.all() new_premiums= self.premiums.filter(type='CU') From 44ed8fdfcf90fcb4c9bfd8c54a0fdf6e2b6c9406 Mon Sep 17 00:00:00 2001 From: thatandromeda Date: Mon, 24 Sep 2012 11:52:30 -0300 Subject: [PATCH 09/28] stop referring to acknowledgements as rewards to avoid confusing people --- frontend/templates/rh_tools.html | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/frontend/templates/rh_tools.html b/frontend/templates/rh_tools.html index faaadf38..aaa47ccc 100644 --- a/frontend/templates/rh_tools.html +++ b/frontend/templates/rh_tools.html @@ -160,19 +160,19 @@ Any questions not covered here? Please email us at Send us feedback. -

      Rewards

      -

      Campaigns have rewards as a way to thank supporters. unglue.it includes a standard set of acknowledgement rewards in all campaigns. You are strongly encouraged to add additional sweeteners to motivate people to contribute- these are given special prominence on the campaign page.

      +

      Campaigns can have rewards as a way to motivate and thank supporters. You are strongly encouraged to add rewards - they are given special prominence on the campaign page.

      -

      Here are the standard acknowledgement rewards, which automatically combine with your customized rewards, so a $30 reward will include the $25 standard acknowledgement reward:

      +

      What should you add as rewards? Anything you think you can reasonably deliver that will get supporters excited about the book. For example: other books, whether electronic or physical; artwork or multimedia relating to the book, its author, or its themes; in-person or online chats with the author; memorabilia.

      + +

      Acknowledgements

      +

      Here are the standard acknowledgements. These automatically combine with your rewards. For example, if you offer a $30 reward, ungluers who pledge $30 will receive the $25 acknowledgement as well.

        -
      • $25 and above — Your username under "supporters" in the acknowledgements section
      • -
      • $50 and above — Your name & profile link under "benefactors"
      • -
      • $100 and above — Your name, profile link, & profile tagline under "bibliophiles"
      • +
      • Any amount — The unglued ebook
      • +
      • $25 and above — Their name in the acknowledgements section under "supporters"
      • +
      • $50 and above — Their name & profile link under "benefactors"
      • +
      • $100 and above — Their name, profile link, & a dedication under "bibliophiles"

      More Questions

      From 38d115e5a151dd852de38343c60c878cc12c6aef Mon Sep 17 00:00:00 2001 From: Andromeda Yelton Date: Tue, 25 Sep 2012 10:53:23 -0400 Subject: [PATCH 10/28] no longer need readmill script since we're pulling send script directly --- frontend/templates/work.html | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/templates/work.html b/frontend/templates/work.html index 96f606f1..cd215f8c 100644 --- a/frontend/templates/work.html +++ b/frontend/templates/work.html @@ -14,7 +14,6 @@ -