view mysite/band/models.py @ 5:e602b5302b94

Added support for countries beside the USA.
author Brian Neal <bgneal@gmail.com>
date Thu, 14 May 2009 00:31:39 +0000
parents 0dcfcdf50c62
children dac690ab98b2
line wrap: on
line source
from django.db import models
from django.contrib.localflavor.us.models import USStateField
from django.contrib.localflavor.us.models import PhoneNumberField

from mysite.photologue.models import Photo
import datetime 
import random
import string

#######################################################################

class SiteConfig(models.Model):
   band_name = models.CharField(max_length = 50)
   url = models.URLField(verify_exists = False, max_length = 200)
   contact_email = models.EmailField()
   ordering_info = models.TextField(help_text = 'Enter instructions on how to order merchandise here')
   intro_text = models.TextField(help_text = 'This text appears on the home page.')
   intro_photo = models.ForeignKey(Photo)

   def __unicode__(self):
      return self.band_name

   class Meta:
      verbose_name = "Site Configuration"
      verbose_name_plural = "Site Configuration"

#######################################################################

class Member(models.Model):
   name = models.CharField(max_length = 50, db_index = True)
   nickname = models.CharField(max_length = 50, blank = True)
   instrument = models.CharField(max_length = 255)
   bio = models.TextField(blank = True)
   photo = models.FileField(upload_to = 'images/bio/', blank = True)
   order = models.SmallIntegerField(help_text = '''Controls order of display on the bio page, lower numbers displayed
         first''')
   is_active = models.BooleanField(db_index = True)
   start_date = models.DateField()
   end_date = models.DateField(blank = True, help_text = 'Only used if the member is not active',
         default = datetime.date(1985, 1, 1))
   email = models.EmailField()

   def __unicode__(self):
      return self.name

   class Meta:
      ordering = ('-is_active', 'name')

#######################################################################

class Gear(models.Model):
   member = models.ForeignKey(Member)
   item = models.CharField(max_length = 255)

   def __unicode__(self):
      return self.item

   class Meta:
      verbose_name_plural = 'Gear List'

#######################################################################

class Country(models.Model):
    name = models.CharField(max_length=64)

    class Meta:
        ordering = ('name', )
        verbose_name_plural = 'Countries'

    def __unicode__(self):
        return self.name

#######################################################################

class State(models.Model):
   name = models.CharField(max_length = 16)
   abbrev = USStateField()

   class Meta:
      ordering = ('name', )

   def __unicode__(self):
      return self.name

#######################################################################

class City(models.Model):
   name = models.CharField(max_length = 50)
   state = models.ForeignKey(State, null = True, blank = True)
   country = models.ForeignKey(Country, null=True, blank=True)

   class Meta:
      verbose_name_plural = 'Cities'
      ordering = ('name', )

   def __unicode__(self):
      if self.state:
         return self.name + u', ' + self.state.abbrev
      return self.name

#######################################################################

class Venue(models.Model):
   name = models.CharField(max_length = 50, db_index = True)
   url = models.URLField(verify_exists = False, blank = True)
   address = models.CharField(max_length = 255, blank = True)
   phone = PhoneNumberField(help_text = "Format: XXX-XXX-XXXX", blank = True)
   city = models.ForeignKey(City)

   class Meta:
      ordering = ('name', )

   def __unicode__(self):
      return self.name

#######################################################################

class Band(models.Model):
   name = models.CharField(max_length = 64)
   url = models.URLField(verify_exists = False, blank = True)

   class Meta:
      ordering = ('name', )

   def __unicode__(self):
      return self.name

#######################################################################

class Gig(models.Model):
   title = models.CharField(max_length = 50, blank = True, help_text = "Optional; e.g. Some Festival")
   url = models.URLField(verify_exists = False, blank = True, help_text = "Optional; e.g. Some Festival's Website")
   date = models.DateField(db_index = True)
   time = models.TimeField(null = True, blank = True)
   venue = models.ForeignKey(Venue, null = True, blank = True)
   notes = models.TextField(blank = True)
   bands = models.ManyToManyField(Band, blank = True)
   flyer = models.ForeignKey(Photo, null = True, blank = True)

   def __unicode__(self):
      if self.title:
         return u'%s %s %s' % (self.date.strftime('%m/%d/%Y'), self.title, self.venue.name)
      elif self.venue:
         return u'%s %s' % (self.date.strftime('%m/%d/%Y'), self.venue.name)
      else:
         return u'' + self.date.strftime('%m/%d/%Y')

   class Meta:
      ordering = ('-date', 'time')

#######################################################################

class News(models.Model):
   title = models.CharField(max_length = 64, blank = True)
   date = models.DateField(db_index = True)
   author = models.CharField(max_length = 50, blank = True)
   text = models.TextField()
   markup_enabled = models.BooleanField(default = True,
         help_text = 'Check this box to allow Textile style markup in the text field')
   photo = models.FileField(upload_to = 'images/news/%Y/%m/%d/', blank = True)
   photo_caption = models.CharField(max_length = 50, blank = True)

   def __unicode__(self):
      return u'%s %s' % (self.date.strftime('%m/%d/%Y'), self.title)

   class Meta:
      ordering = ('-date', )
      verbose_name_plural = "News"

#######################################################################

class Article(models.Model):
   title = models.CharField(max_length = 64)
   date = models.DateField(db_index = True)
   text = models.TextField()
   markup_enabled = models.BooleanField(default = True,
         help_text = 'Check this box to allow Textile style markup in the text field')
   source = models.TextField(help_text = '''Enter the source/author for the article, copyright info, etc; it will appear under
            the article.''')
   url = models.URLField(blank = True, help_text = 'Link to original article; optional')
   pdf = models.FileField(upload_to = 'pdf/articles/%Y/%m/%d/', blank = True, 
            help_text = '''If you want to make the original article available as a PDF download, you may upload it
            here.''')

   def __unicode__(self):
      return self.title

   class Meta:
      ordering = ('date', )

#######################################################################

class Mp3_Set(models.Model):
   date = models.DateField(auto_now_add = True, editable = False)
   title = models.CharField(max_length = 64)
   text = models.TextField()

   def __unicode__(self):
      return self.title

   class Meta:
      ordering = ('date', )
      verbose_name = "MP3 Set"

#######################################################################

class Mp3(models.Model):
   mp3_set = models.ForeignKey(Mp3_Set)
   title = models.CharField(max_length = 64)
   desc = models.CharField(max_length = 128, blank = True)
   file = models.FileField(upload_to = 'mp3s/%Y/%m/%d/')
   slug = models.SlugField(unique = True)

   def __unicode__(self):
      return self.title

   class Meta:
      ordering = ('title', )
      verbose_name = "MP3"

#######################################################################

class Video_Set(models.Model):
   date = models.DateField(auto_now_add = True, editable = False)
   title = models.CharField(max_length = 64)
   text = models.TextField()

   def __unicode__(self):
      return self.title

   class Meta:
      ordering = ('date', )
      verbose_name = "Video Set"

#######################################################################

class Video(models.Model):
   video_set = models.ForeignKey(Video_Set)
   title = models.CharField(max_length = 64)
   embed_code = models.CharField(max_length = 1024)

   def __unicode__(self):
      return self.title

   class Meta:
      ordering = ('title', )

#######################################################################

class Record_Label(models.Model):
   name = models.CharField(max_length = 64)
   url = models.URLField(verify_exists = False, max_length = 200)

   def __unicode__(self):
      return self.name

   class Meta:
      verbose_name = 'Record Label'

#######################################################################

class Album(models.Model):
   title = models.CharField(max_length = 64)
   photo = models.ForeignKey(Photo)
   desc = models.TextField(blank = True)

   def __unicode__(self):
      return self.title

   class Meta:
      pass

#######################################################################

class Album_Track(models.Model):
   album = models.ForeignKey(Album)
   track_number = models.SmallIntegerField()
   track_name = models.CharField(max_length = 64)

   def __unicode__(self):
      return self.track_name

   class Meta:
      verbose_name = 'Album Track'
      ordering = ('album', 'track_number', )

#######################################################################

class Label_Release(models.Model):
   record_label = models.ForeignKey(Record_Label)
   album = models.ForeignKey(Album)
   catalog_number = models.CharField(max_length = 32)
   release_date = models.DateField()

   def __unicode__(self):
      return u'%s %s %s' % (self.record_label.name, self.album.title, self.catalog_number)

   class Meta:
      verbose_name = 'Label Release'

#######################################################################

class Album_Merchant(models.Model):
   album = models.ForeignKey(Album)
   name = models.CharField(max_length = 64)
   url = models.URLField(verify_exists = False, max_length = 200)

   def __unicode__(self):
      return u'%s (%s)' % (self.name, self.album.title)

   class Meta:
      verbose_name = 'Album Merchant'
      ordering = ('name', )

#######################################################################

class Merchandise(models.Model):
   name = models.CharField(max_length = 64)
   desc = models.TextField()
   price = models.DecimalField(max_digits = 5, decimal_places = 2)
   in_stock = models.BooleanField()
   photo = models.ForeignKey(Photo)

   def __unicode__(self):
      return self.name

   class Meta:
      verbose_name_plural = "Merchandise"

#######################################################################

class Fan(models.Model):
   statusCodes = (('P', 'Pending'), ('A', 'Active'), ('L', 'Leaving'))
   keyLength = 16

   name = models.CharField(max_length = 32, blank = True)
   email = models.EmailField(db_index = True)
   location = models.CharField(max_length = 64, blank = True)
   status = models.CharField(max_length = 1, choices = statusCodes, default = 'A', 
         editable = False, db_index = True)
   key = models.CharField(max_length = keyLength, editable = False, blank = True, db_index = True)
   status_date = models.DateField(default = datetime.date.today, editable = False, db_index = True)

   def __unicode__(self):
      if self.name:
         return u'%s <%s>' % (self.name, self.email)
      return self.email

   class Meta:
      ordering = ('name', 'email')

   def setPending(self):
      self.status = 'P'
      self.status_date = datetime.date.today()
      self.genKey()

   def setActive(self):
      self.status = 'A'
      self.status_date = datetime.date.today()

   def setLeaving(self):
      self.status = 'L'
      self.status_date = datetime.date.today()
      self.genKey()

   def isPending(self):
      return self.status == 'P'

   def isLeaving(self):
      return self.status == 'L'

   def isActive(self):
      return self.status == 'A'

   def current_status(self):
      if self.status == 'P':
         return 'Pending'
      elif self.status == 'L':
         return 'Leaving'
      elif self.status == 'A':
         return 'Active'
      else:
         return 'Unknown'

   def genKey(self):
      self.key = ''.join(random.sample(string.ascii_letters + string.digits, self.keyLength))