refactored launchable into campaign model. fixed date camparison bug. moved target and deadline limits to settings file
parent
3671b0a182
commit
d5bae40c00
|
@ -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,
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue