regluit/core/models.py

177 lines
6.2 KiB
Python
Raw Normal View History

from django.db import models
from django.db.models import Q
from django.contrib.auth.models import User
from decimal import Decimal
import datetime
class UnglueitError(RuntimeError):
pass
class Campaign(models.Model):
created = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=500, null=False)
description = models.CharField(max_length=10000, null=False)
target = models.DecimalField(max_digits=14, decimal_places=2)
2011-09-16 02:05:47 +00:00
deadline = models.DateTimeField(null=False)
2011-10-07 21:17:54 +00:00
activated = models.DateTimeField(null=True)
suspended = models.DateTimeField(null=True)
withdrawn = models.DateTimeField(null=True)
supended_reason = models.CharField(max_length=10000, null=True)
withdrawn_reason = models.CharField(max_length=10000, null=True)
paypal_receiver = models.CharField(max_length=100, null=True)
amazon_receiver = models.CharField(max_length=100, null=True)
work = models.ForeignKey("Work", related_name="campaigns")
def __unicode__(self):
try:
return u"Campaign for %s" % self.work.title
except:
return u"Campaign %s (no associated work)" % self.name
2011-10-07 21:17:54 +00:00
def status(self):
"""Returns the status of the campaign
"""
now = datetime.datetime.utcnow()
2011-10-07 21:17:54 +00:00
if self.activated is None:
return 'INITIALIZED'
else:
if self.suspended is not None:
return 'SUSPENDED'
elif self.withdrawn is not None:
return 'WITHDRAWN'
elif self.deadline < now:
# calculate the total amount of money pledged/authorized
p = PaymentManager()
current_total = p.query_campaign(campaign=self,summary=True)
if current_total >= self.target:
return 'SUCCESSFUL'
else:
return 'UNSUCCESSFUL'
else:
return 'ACTIVE'
def activate(self):
status = self.status()
if status != 'INITIALIZED':
raise UnglueitError('Campaign needs to be initialized in order to be activated')
else:
# should check whether name, description, work in place
if (self.name is None) or (self.description is None):
raise UnglueitError('Campaign name or description needs to be initialized in order to be activated')
try:
work = self.work
except:
raise UnglueitError('Work needs to be associated with campaign before it is activated')
self.activated = datetime.datetime.utcnow()
self.save()
return self
def suspend(self, reason):
status = self.status()
if status != 'ACTIVE':
raise UnglueitError('Campaign needs to be active in order to be suspended')
else:
self.suspended = datetime.datetime.utcnow()
self.supended_reason = reason
self.save()
return self
def withdraw(self, reason):
status = self.status()
if status != 'ACTIVE':
raise UnglueitError('Campaign needs to be active in order to be withdrawn')
else:
self.withdrawn = datetime.datetime.utcnow()
self.withdrawn_reason = reason
self.save()
return self
def resume(self):
"""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')
else:
self.suspended = None
self.suspended_reason = None
self.save()
return self
class Work(models.Model):
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=1000)
openlibrary_id = models.CharField(max_length=50, null=True)
@classmethod
def get_by_isbn(klass, isbn):
for w in Work.objects.filter(Q(editions__isbn_10=isbn) | Q(editions__isbn_13=isbn)):
return w
return None
def cover_image_small(self):
first_isbn = self.editions.all()[0].isbn_10
return "http://covers.openlibrary.org/b/isbn/%s-S.jpg" % first_isbn
def __unicode__(self):
return self.title
class Author(models.Model):
created = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=500)
openlibrary_id = models.CharField(max_length=50, null=True)
works = models.ManyToManyField("Work", related_name="authors")
def __unicode__(self):
return self.name
class Subject(models.Model):
created = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=500)
works = models.ManyToManyField("Work", related_name="subjects")
def __unicode__(self):
return self.name
class Edition(models.Model):
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=1000)
description = models.TextField(default='', null=True)
publisher = models.CharField(max_length=255)
publication_date = models.CharField(max_length=50)
isbn_10 = models.CharField(max_length=10, null=True)
isbn_13 = models.CharField(max_length=13, null=True)
openlibrary_id = models.CharField(max_length=50, null=True)
work = models.ForeignKey("Work", related_name="editions", null=True)
def __unicode__(self):
return self.title
@classmethod
def get_by_isbn(klass, isbn):
for e in Edition.objects.filter(Q(isbn_10=isbn) | Q(isbn_13=isbn)):
return e
return None
class EditionCover(models.Model):
openlibrary_id = models.IntegerField()
edition = models.ForeignKey("Edition", related_name="covers")
class Wishlist(models.Model):
created = models.DateTimeField(auto_now_add=True)
user = models.OneToOneField(User, related_name='wishlist')
works = models.ManyToManyField('Work', related_name='wishlists')
class UserProfile(models.Model):
user = models.OneToOneField(User)
tagline = models.CharField(max_length=140, blank=True)
from regluit.core import signals
from regluit.payment.manager import PaymentManager