refactored launchable into campaign model. fixed date camparison bug. moved target and deadline limits to settings file

pull/1/head
eric 2011-11-23 21:41:06 -05:00
parent 3671b0a182
commit d5bae40c00
4 changed files with 37 additions and 39 deletions

View File

@ -1,11 +1,11 @@
import random
import datetime
from decimal import Decimal
from django.db import models
from django.db.models import Q
from django.contrib.auth.models import User
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
import regluit
@ -85,13 +85,28 @@ class Campaign(models.Model):
amazon_receiver = models.CharField(max_length=100, blank=True)
work = models.ForeignKey("Work", related_name="campaigns", null=False)
managers = models.ManyToManyField(User, related_name="campaigns", null=False)
problems = []
def __unicode__(self):
try:
return u"Campaign for %s" % self.work.title
except:
return u"Campaign %s (no associated work)" % self.name
@property
def launchable(self):
may_launch=True
if self.status != 'INITIALIZED':
self.problems.append(_('A campaign must initialized properly before it can be launched'))
may_launch = False
if self.target < Decimal(settings.UNGLUEIT_MINIMUM_TARGET):
self.problems.append(_('A campaign may not be launched with a target less than $%s' % settings.UNGLUEIT_MINIMUM_TARGET))
may_launch = False
if self.deadline.date()-datetime.date.today() > datetime.timedelta(days=int(settings.UNGLUEIT_LONGEST_DEADLINE)):
self.problems.append(_('The chosen closing date is more than %s days from now' % settings.UNGLUEIT_LONGEST_DEADLINE))
may_launch = False
return may_launch
@property
def status(self):
"""Returns the status of the campaign
@ -124,7 +139,7 @@ class Campaign(models.Model):
def activate(self):
status = self.status
if status != 'INITIALIZED':
raise UnglueitError('Campaign needs to be initialized in order to be activated')
raise UnglueitError(_('Campaign needs to be initialized in order to be activated'))
self.activated = datetime.datetime.utcnow()
self.save()
return self
@ -132,7 +147,7 @@ class Campaign(models.Model):
def suspend(self, reason):
status = self.status
if status != 'ACTIVE':
raise UnglueitError('Campaign needs to be active in order to be suspended')
raise UnglueitError(_('Campaign needs to be active in order to be suspended'))
self.suspended = datetime.datetime.utcnow()
self.suspended_reason = reason
self.save()
@ -141,7 +156,7 @@ class Campaign(models.Model):
def withdraw(self, reason):
status = self.status
if status != 'ACTIVE':
raise UnglueitError('Campaign needs to be active in order to be withdrawn')
raise UnglueitError(_('Campaign needs to be active in order to be withdrawn'))
self.withdrawn = datetime.datetime.utcnow()
self.withdrawn_reason = reason
self.save()
@ -151,7 +166,7 @@ class Campaign(models.Model):
"""Change campaign status from SUSPENDED to ACTIVE. We may want to track reason for resuming and track history"""
status = self.status
if status != 'SUSPENDED':
raise UnglueitError('Campaign needs to be suspended in order to be resumed')
raise UnglueitError(_('Campaign needs to be suspended in order to be resumed'))
self.suspended = None
self.suspended_reason = None
self.save()
@ -245,18 +260,18 @@ class Work(models.Model):
return self.first_ebook('epub')
def first_pdf_url(self):
try:
url = self.first_ebook('pdf').url
return url
try:
url = self.first_ebook('pdf').url
return url
except:
return None
return None
def first_epub_url(self):
try:
url = self.first_ebook('epub').url
return url
try:
url = self.first_ebook('epub').url
return url
except:
return None
return None
def first_ebook(self, ebook_format=None):
for ebook in Ebook.objects.filter(edition__work=self,

View File

@ -102,7 +102,7 @@ class ManageCampaignForm(forms.ModelForm):
label=_("email address to collect Paypal funds"),
max_length=100,
)
target = forms.DecimalField( min_value= D('1000.00') )
target = forms.DecimalField( min_value= D('0.00') )
class Meta:
model = Campaign
fields = 'description', 'details', 'target', 'deadline', 'paypal_receiver'

View File

@ -89,13 +89,9 @@ def manage_campaign(request, id):
if (not request.user.is_authenticated) or (not request.user in campaign.managers.all()):
campaign.not_manager=True
return render(request, 'manage_campaign.html', {'campaign': campaign})
problems = []
campaign.problems = []
alerts = []
campaign.savable = True
if campaign.status == 'INITIALIZED':
campaign.launchable = True
else:
campaign.launchable = False
if request.method == 'POST':
campaign.pretarget=campaign.target
campaign.predeadline=campaign.deadline
@ -103,23 +99,6 @@ def manage_campaign(request, id):
if form.is_valid():
# might be a good idea to move this code to the model
# general constraints
if form.cleaned_data['target'] < D('1000'):
problems.append(_('The minimum target to launch a campaign is 1000'))
campaign.launchable = False
if form.cleaned_data['deadline'].date()-datetime.date.today() > datetime.timedelta(days=180):
problems.append(_('The chosen closing date is more than 6 months away'))
campaign.launchable = False
if campaign.status == 'ACTIVE':
#special constraints on active campaigns
# can't increase target
if campaign.pretarget < campaign.target:
problems.append(_('The fundraising target for an ACTIVE campaign cannot be increased.'))
campaign.savable = False
# can't change deadline
if campaign.deadline != campaign.predeadline:
problems.append(_('The closing date for an ACTIVE campaign cannot be changed.'))
campaign.savable = False
if campaign.savable:
form.save()
alerts.append(_('Campaign data has been saved'))
@ -132,7 +111,7 @@ def manage_campaign(request, id):
alerts.append(_('Campaign has NOT been launched'))
else:
form= ManageCampaignForm(instance=campaign)
return render(request, 'manage_campaign.html', {'campaign': campaign, 'form':form, 'problems': problems, 'alerts': alerts})
return render(request, 'manage_campaign.html', {'campaign': campaign, 'form':form, 'problems': campaign.problems, 'alerts': alerts})
def googlebooks(request, googlebooks_id):
try:

View File

@ -198,3 +198,7 @@ import djcelery
djcelery.setup_loader()
TEST_RUNNER = 'djcelery.contrib.test_runner.run_tests'
# unglue.it parameters
UNGLUEIT_MINIMUM_TARGET = '1000' # in US Dollars
UNGLUEIT_LONGEST_DEADLINE = '180' # number of days allowed for a campaign