bgneal@1
|
1 from django.db import models
|
bgneal@1
|
2 from django.contrib.localflavor.us.models import USStateField
|
bgneal@1
|
3 from django.contrib.localflavor.us.models import PhoneNumberField
|
bgneal@1
|
4
|
bgneal@1
|
5 from mysite.photologue.models import Photo
|
bgneal@1
|
6 import datetime
|
bgneal@1
|
7 import random
|
bgneal@1
|
8 import string
|
bgneal@1
|
9
|
bgneal@1
|
10 #######################################################################
|
bgneal@1
|
11
|
bgneal@1
|
12 class SiteConfig(models.Model):
|
bgneal@1
|
13 band_name = models.CharField(max_length = 50)
|
bgneal@1
|
14 url = models.URLField(verify_exists = False, max_length = 200)
|
bgneal@1
|
15 contact_email = models.EmailField()
|
bgneal@1
|
16 ordering_info = models.TextField(help_text = 'Enter instructions on how to order merchandise here')
|
bgneal@1
|
17 intro_text = models.TextField(help_text = 'This text appears on the home page.')
|
bgneal@1
|
18 intro_photo = models.ForeignKey(Photo)
|
bgneal@1
|
19
|
bgneal@1
|
20 def __unicode__(self):
|
bgneal@1
|
21 return self.band_name
|
bgneal@1
|
22
|
bgneal@1
|
23 class Meta:
|
bgneal@1
|
24 verbose_name = "Site Configuration"
|
bgneal@1
|
25 verbose_name_plural = "Site Configuration"
|
bgneal@1
|
26
|
bgneal@1
|
27 #######################################################################
|
bgneal@1
|
28
|
bgneal@1
|
29 class Member(models.Model):
|
bgneal@1
|
30 name = models.CharField(max_length = 50, db_index = True)
|
bgneal@1
|
31 nickname = models.CharField(max_length = 50, blank = True)
|
bgneal@1
|
32 instrument = models.CharField(max_length = 255)
|
bgneal@1
|
33 bio = models.TextField(blank = True)
|
bgneal@1
|
34 photo = models.FileField(upload_to = 'images/bio/', blank = True)
|
bgneal@1
|
35 order = models.SmallIntegerField(help_text = '''Controls order of display on the bio page, lower numbers displayed
|
bgneal@1
|
36 first''')
|
bgneal@1
|
37 is_active = models.BooleanField(db_index = True)
|
bgneal@1
|
38 start_date = models.DateField()
|
bgneal@1
|
39 end_date = models.DateField(blank = True, help_text = 'Only used if the member is not active',
|
bgneal@1
|
40 default = datetime.date(1985, 1, 1))
|
bgneal@1
|
41 email = models.EmailField()
|
bgneal@1
|
42
|
bgneal@1
|
43 def __unicode__(self):
|
bgneal@1
|
44 return self.name
|
bgneal@1
|
45
|
bgneal@1
|
46 class Meta:
|
bgneal@1
|
47 ordering = ('-is_active', 'name')
|
bgneal@1
|
48
|
bgneal@1
|
49 #######################################################################
|
bgneal@1
|
50
|
bgneal@1
|
51 class Gear(models.Model):
|
bgneal@1
|
52 member = models.ForeignKey(Member)
|
bgneal@1
|
53 item = models.CharField(max_length = 255)
|
bgneal@1
|
54
|
bgneal@1
|
55 def __unicode__(self):
|
bgneal@1
|
56 return self.item
|
bgneal@1
|
57
|
bgneal@1
|
58 class Meta:
|
bgneal@1
|
59 verbose_name_plural = 'Gear List'
|
bgneal@1
|
60
|
bgneal@1
|
61 #######################################################################
|
bgneal@1
|
62
|
bgneal@5
|
63 class Country(models.Model):
|
bgneal@5
|
64 name = models.CharField(max_length=64)
|
bgneal@5
|
65
|
bgneal@5
|
66 class Meta:
|
bgneal@5
|
67 ordering = ('name', )
|
bgneal@5
|
68 verbose_name_plural = 'Countries'
|
bgneal@5
|
69
|
bgneal@5
|
70 def __unicode__(self):
|
bgneal@5
|
71 return self.name
|
bgneal@5
|
72
|
bgneal@5
|
73 #######################################################################
|
bgneal@5
|
74
|
bgneal@1
|
75 class State(models.Model):
|
bgneal@1
|
76 name = models.CharField(max_length = 16)
|
bgneal@1
|
77 abbrev = USStateField()
|
bgneal@1
|
78
|
bgneal@1
|
79 class Meta:
|
bgneal@1
|
80 ordering = ('name', )
|
bgneal@1
|
81
|
bgneal@1
|
82 def __unicode__(self):
|
bgneal@1
|
83 return self.name
|
bgneal@1
|
84
|
bgneal@1
|
85 #######################################################################
|
bgneal@1
|
86
|
bgneal@1
|
87 class City(models.Model):
|
bgneal@1
|
88 name = models.CharField(max_length = 50)
|
bgneal@1
|
89 state = models.ForeignKey(State, null = True, blank = True)
|
bgneal@5
|
90 country = models.ForeignKey(Country, null=True, blank=True)
|
bgneal@1
|
91
|
bgneal@1
|
92 class Meta:
|
bgneal@1
|
93 verbose_name_plural = 'Cities'
|
bgneal@1
|
94 ordering = ('name', )
|
bgneal@1
|
95
|
bgneal@1
|
96 def __unicode__(self):
|
bgneal@1
|
97 if self.state:
|
bgneal@1
|
98 return self.name + u', ' + self.state.abbrev
|
bgneal@1
|
99 return self.name
|
bgneal@1
|
100
|
bgneal@1
|
101 #######################################################################
|
bgneal@1
|
102
|
bgneal@1
|
103 class Venue(models.Model):
|
bgneal@1
|
104 name = models.CharField(max_length = 50, db_index = True)
|
bgneal@1
|
105 url = models.URLField(verify_exists = False, blank = True)
|
bgneal@1
|
106 address = models.CharField(max_length = 255, blank = True)
|
bgneal@1
|
107 phone = PhoneNumberField(help_text = "Format: XXX-XXX-XXXX", blank = True)
|
bgneal@1
|
108 city = models.ForeignKey(City)
|
bgneal@1
|
109
|
bgneal@1
|
110 class Meta:
|
bgneal@1
|
111 ordering = ('name', )
|
bgneal@1
|
112
|
bgneal@1
|
113 def __unicode__(self):
|
bgneal@1
|
114 return self.name
|
bgneal@1
|
115
|
bgneal@1
|
116 #######################################################################
|
bgneal@1
|
117
|
bgneal@1
|
118 class Band(models.Model):
|
bgneal@1
|
119 name = models.CharField(max_length = 64)
|
bgneal@1
|
120 url = models.URLField(verify_exists = False, blank = True)
|
bgneal@1
|
121
|
bgneal@1
|
122 class Meta:
|
bgneal@1
|
123 ordering = ('name', )
|
bgneal@1
|
124
|
bgneal@1
|
125 def __unicode__(self):
|
bgneal@1
|
126 return self.name
|
bgneal@1
|
127
|
bgneal@1
|
128 #######################################################################
|
bgneal@1
|
129
|
bgneal@1
|
130 class Gig(models.Model):
|
bgneal@1
|
131 title = models.CharField(max_length = 50, blank = True, help_text = "Optional; e.g. Some Festival")
|
bgneal@1
|
132 url = models.URLField(verify_exists = False, blank = True, help_text = "Optional; e.g. Some Festival's Website")
|
bgneal@1
|
133 date = models.DateField(db_index = True)
|
bgneal@1
|
134 time = models.TimeField(null = True, blank = True)
|
bgneal@1
|
135 venue = models.ForeignKey(Venue, null = True, blank = True)
|
bgneal@1
|
136 notes = models.TextField(blank = True)
|
bgneal@1
|
137 bands = models.ManyToManyField(Band, blank = True)
|
bgneal@1
|
138 flyer = models.ForeignKey(Photo, null = True, blank = True)
|
bgneal@1
|
139
|
bgneal@1
|
140 def __unicode__(self):
|
bgneal@1
|
141 if self.title:
|
bgneal@1
|
142 return u'%s %s %s' % (self.date.strftime('%m/%d/%Y'), self.title, self.venue.name)
|
bgneal@1
|
143 elif self.venue:
|
bgneal@1
|
144 return u'%s %s' % (self.date.strftime('%m/%d/%Y'), self.venue.name)
|
bgneal@1
|
145 else:
|
bgneal@1
|
146 return u'' + self.date.strftime('%m/%d/%Y')
|
bgneal@1
|
147
|
bgneal@1
|
148 class Meta:
|
bgneal@1
|
149 ordering = ('-date', 'time')
|
bgneal@1
|
150
|
bgneal@1
|
151 #######################################################################
|
bgneal@1
|
152
|
bgneal@1
|
153 class News(models.Model):
|
bgneal@1
|
154 title = models.CharField(max_length = 64, blank = True)
|
bgneal@1
|
155 date = models.DateField(db_index = True)
|
bgneal@1
|
156 author = models.CharField(max_length = 50, blank = True)
|
bgneal@1
|
157 text = models.TextField()
|
bgneal@1
|
158 markup_enabled = models.BooleanField(default = True,
|
bgneal@1
|
159 help_text = 'Check this box to allow Textile style markup in the text field')
|
bgneal@1
|
160 photo = models.FileField(upload_to = 'images/news/%Y/%m/%d/', blank = True)
|
bgneal@1
|
161 photo_caption = models.CharField(max_length = 50, blank = True)
|
bgneal@1
|
162
|
bgneal@1
|
163 def __unicode__(self):
|
bgneal@1
|
164 return u'%s %s' % (self.date.strftime('%m/%d/%Y'), self.title)
|
bgneal@1
|
165
|
bgneal@1
|
166 class Meta:
|
bgneal@1
|
167 ordering = ('-date', )
|
bgneal@1
|
168 verbose_name_plural = "News"
|
bgneal@1
|
169
|
bgneal@1
|
170 #######################################################################
|
bgneal@1
|
171
|
bgneal@1
|
172 class Article(models.Model):
|
bgneal@1
|
173 title = models.CharField(max_length = 64)
|
bgneal@1
|
174 date = models.DateField(db_index = True)
|
bgneal@1
|
175 text = models.TextField()
|
bgneal@1
|
176 markup_enabled = models.BooleanField(default = True,
|
bgneal@1
|
177 help_text = 'Check this box to allow Textile style markup in the text field')
|
bgneal@1
|
178 source = models.TextField(help_text = '''Enter the source/author for the article, copyright info, etc; it will appear under
|
bgneal@1
|
179 the article.''')
|
bgneal@1
|
180 url = models.URLField(blank = True, help_text = 'Link to original article; optional')
|
bgneal@1
|
181 pdf = models.FileField(upload_to = 'pdf/articles/%Y/%m/%d/', blank = True,
|
bgneal@1
|
182 help_text = '''If you want to make the original article available as a PDF download, you may upload it
|
bgneal@1
|
183 here.''')
|
bgneal@1
|
184
|
bgneal@1
|
185 def __unicode__(self):
|
bgneal@1
|
186 return self.title
|
bgneal@1
|
187
|
bgneal@1
|
188 class Meta:
|
bgneal@1
|
189 ordering = ('date', )
|
bgneal@1
|
190
|
bgneal@1
|
191 #######################################################################
|
bgneal@1
|
192
|
bgneal@1
|
193 class Mp3_Set(models.Model):
|
bgneal@1
|
194 date = models.DateField(auto_now_add = True, editable = False)
|
bgneal@1
|
195 title = models.CharField(max_length = 64)
|
bgneal@1
|
196 text = models.TextField()
|
bgneal@1
|
197
|
bgneal@1
|
198 def __unicode__(self):
|
bgneal@1
|
199 return self.title
|
bgneal@1
|
200
|
bgneal@1
|
201 class Meta:
|
bgneal@1
|
202 ordering = ('date', )
|
bgneal@1
|
203 verbose_name = "MP3 Set"
|
bgneal@1
|
204
|
bgneal@1
|
205 #######################################################################
|
bgneal@1
|
206
|
bgneal@1
|
207 class Mp3(models.Model):
|
bgneal@1
|
208 mp3_set = models.ForeignKey(Mp3_Set)
|
bgneal@1
|
209 title = models.CharField(max_length = 64)
|
bgneal@1
|
210 desc = models.CharField(max_length = 128, blank = True)
|
bgneal@1
|
211 file = models.FileField(upload_to = 'mp3s/%Y/%m/%d/')
|
bgneal@1
|
212 slug = models.SlugField(unique = True)
|
bgneal@1
|
213
|
bgneal@1
|
214 def __unicode__(self):
|
bgneal@1
|
215 return self.title
|
bgneal@1
|
216
|
bgneal@1
|
217 class Meta:
|
bgneal@1
|
218 ordering = ('title', )
|
bgneal@1
|
219 verbose_name = "MP3"
|
bgneal@1
|
220
|
bgneal@1
|
221 #######################################################################
|
bgneal@1
|
222
|
bgneal@1
|
223 class Video_Set(models.Model):
|
bgneal@1
|
224 date = models.DateField(auto_now_add = True, editable = False)
|
bgneal@1
|
225 title = models.CharField(max_length = 64)
|
bgneal@1
|
226 text = models.TextField()
|
bgneal@1
|
227
|
bgneal@1
|
228 def __unicode__(self):
|
bgneal@1
|
229 return self.title
|
bgneal@1
|
230
|
bgneal@1
|
231 class Meta:
|
bgneal@1
|
232 ordering = ('date', )
|
bgneal@1
|
233 verbose_name = "Video Set"
|
bgneal@1
|
234
|
bgneal@1
|
235 #######################################################################
|
bgneal@1
|
236
|
bgneal@1
|
237 class Video(models.Model):
|
bgneal@1
|
238 video_set = models.ForeignKey(Video_Set)
|
bgneal@1
|
239 title = models.CharField(max_length = 64)
|
bgneal@1
|
240 embed_code = models.CharField(max_length = 1024)
|
bgneal@1
|
241
|
bgneal@1
|
242 def __unicode__(self):
|
bgneal@1
|
243 return self.title
|
bgneal@1
|
244
|
bgneal@1
|
245 class Meta:
|
bgneal@1
|
246 ordering = ('title', )
|
bgneal@1
|
247
|
bgneal@1
|
248 #######################################################################
|
bgneal@1
|
249
|
bgneal@1
|
250 class Record_Label(models.Model):
|
bgneal@1
|
251 name = models.CharField(max_length = 64)
|
bgneal@1
|
252 url = models.URLField(verify_exists = False, max_length = 200)
|
bgneal@1
|
253
|
bgneal@1
|
254 def __unicode__(self):
|
bgneal@1
|
255 return self.name
|
bgneal@1
|
256
|
bgneal@1
|
257 class Meta:
|
bgneal@1
|
258 verbose_name = 'Record Label'
|
bgneal@1
|
259
|
bgneal@1
|
260 #######################################################################
|
bgneal@1
|
261
|
bgneal@1
|
262 class Album(models.Model):
|
bgneal@1
|
263 title = models.CharField(max_length = 64)
|
bgneal@1
|
264 photo = models.ForeignKey(Photo)
|
bgneal@1
|
265 desc = models.TextField(blank = True)
|
bgneal@1
|
266
|
bgneal@1
|
267 def __unicode__(self):
|
bgneal@1
|
268 return self.title
|
bgneal@1
|
269
|
bgneal@1
|
270 class Meta:
|
bgneal@1
|
271 pass
|
bgneal@1
|
272
|
bgneal@1
|
273 #######################################################################
|
bgneal@1
|
274
|
bgneal@1
|
275 class Album_Track(models.Model):
|
bgneal@1
|
276 album = models.ForeignKey(Album)
|
bgneal@1
|
277 track_number = models.SmallIntegerField()
|
bgneal@1
|
278 track_name = models.CharField(max_length = 64)
|
bgneal@1
|
279
|
bgneal@1
|
280 def __unicode__(self):
|
bgneal@1
|
281 return self.track_name
|
bgneal@1
|
282
|
bgneal@1
|
283 class Meta:
|
bgneal@1
|
284 verbose_name = 'Album Track'
|
bgneal@1
|
285 ordering = ('album', 'track_number', )
|
bgneal@1
|
286
|
bgneal@1
|
287 #######################################################################
|
bgneal@1
|
288
|
bgneal@1
|
289 class Label_Release(models.Model):
|
bgneal@1
|
290 record_label = models.ForeignKey(Record_Label)
|
bgneal@1
|
291 album = models.ForeignKey(Album)
|
bgneal@1
|
292 catalog_number = models.CharField(max_length = 32)
|
bgneal@1
|
293 release_date = models.DateField()
|
bgneal@1
|
294
|
bgneal@1
|
295 def __unicode__(self):
|
bgneal@1
|
296 return u'%s %s %s' % (self.record_label.name, self.album.title, self.catalog_number)
|
bgneal@1
|
297
|
bgneal@1
|
298 class Meta:
|
bgneal@1
|
299 verbose_name = 'Label Release'
|
bgneal@1
|
300
|
bgneal@1
|
301 #######################################################################
|
bgneal@1
|
302
|
bgneal@1
|
303 class Album_Merchant(models.Model):
|
bgneal@1
|
304 album = models.ForeignKey(Album)
|
bgneal@1
|
305 name = models.CharField(max_length = 64)
|
bgneal@1
|
306 url = models.URLField(verify_exists = False, max_length = 200)
|
bgneal@1
|
307
|
bgneal@1
|
308 def __unicode__(self):
|
bgneal@1
|
309 return u'%s (%s)' % (self.name, self.album.title)
|
bgneal@1
|
310
|
bgneal@1
|
311 class Meta:
|
bgneal@1
|
312 verbose_name = 'Album Merchant'
|
bgneal@1
|
313 ordering = ('name', )
|
bgneal@1
|
314
|
bgneal@1
|
315 #######################################################################
|
bgneal@1
|
316
|
bgneal@1
|
317 class Merchandise(models.Model):
|
bgneal@1
|
318 name = models.CharField(max_length = 64)
|
bgneal@1
|
319 desc = models.TextField()
|
bgneal@1
|
320 price = models.DecimalField(max_digits = 5, decimal_places = 2)
|
bgneal@1
|
321 in_stock = models.BooleanField()
|
bgneal@1
|
322 photo = models.ForeignKey(Photo)
|
bgneal@1
|
323
|
bgneal@1
|
324 def __unicode__(self):
|
bgneal@1
|
325 return self.name
|
bgneal@1
|
326
|
bgneal@1
|
327 class Meta:
|
bgneal@1
|
328 verbose_name_plural = "Merchandise"
|
bgneal@1
|
329
|
bgneal@1
|
330 #######################################################################
|
bgneal@1
|
331
|
bgneal@1
|
332 class Fan(models.Model):
|
bgneal@1
|
333 statusCodes = (('P', 'Pending'), ('A', 'Active'), ('L', 'Leaving'))
|
bgneal@1
|
334 keyLength = 16
|
bgneal@1
|
335
|
bgneal@1
|
336 name = models.CharField(max_length = 32, blank = True)
|
bgneal@1
|
337 email = models.EmailField(db_index = True)
|
bgneal@1
|
338 location = models.CharField(max_length = 64, blank = True)
|
bgneal@1
|
339 status = models.CharField(max_length = 1, choices = statusCodes, default = 'A',
|
bgneal@1
|
340 editable = False, db_index = True)
|
bgneal@1
|
341 key = models.CharField(max_length = keyLength, editable = False, blank = True, db_index = True)
|
bgneal@1
|
342 status_date = models.DateField(default = datetime.date.today, editable = False, db_index = True)
|
bgneal@1
|
343
|
bgneal@1
|
344 def __unicode__(self):
|
bgneal@1
|
345 if self.name:
|
bgneal@1
|
346 return u'%s <%s>' % (self.name, self.email)
|
bgneal@1
|
347 return self.email
|
bgneal@1
|
348
|
bgneal@1
|
349 class Meta:
|
bgneal@1
|
350 ordering = ('name', 'email')
|
bgneal@1
|
351
|
bgneal@1
|
352 def setPending(self):
|
bgneal@1
|
353 self.status = 'P'
|
bgneal@1
|
354 self.status_date = datetime.date.today()
|
bgneal@1
|
355 self.genKey()
|
bgneal@1
|
356
|
bgneal@1
|
357 def setActive(self):
|
bgneal@1
|
358 self.status = 'A'
|
bgneal@1
|
359 self.status_date = datetime.date.today()
|
bgneal@1
|
360
|
bgneal@1
|
361 def setLeaving(self):
|
bgneal@1
|
362 self.status = 'L'
|
bgneal@1
|
363 self.status_date = datetime.date.today()
|
bgneal@1
|
364 self.genKey()
|
bgneal@1
|
365
|
bgneal@1
|
366 def isPending(self):
|
bgneal@1
|
367 return self.status == 'P'
|
bgneal@1
|
368
|
bgneal@1
|
369 def isLeaving(self):
|
bgneal@1
|
370 return self.status == 'L'
|
bgneal@1
|
371
|
bgneal@1
|
372 def isActive(self):
|
bgneal@1
|
373 return self.status == 'A'
|
bgneal@1
|
374
|
bgneal@1
|
375 def current_status(self):
|
bgneal@1
|
376 if self.status == 'P':
|
bgneal@1
|
377 return 'Pending'
|
bgneal@1
|
378 elif self.status == 'L':
|
bgneal@1
|
379 return 'Leaving'
|
bgneal@1
|
380 elif self.status == 'A':
|
bgneal@1
|
381 return 'Active'
|
bgneal@1
|
382 else:
|
bgneal@1
|
383 return 'Unknown'
|
bgneal@1
|
384
|
bgneal@1
|
385 def genKey(self):
|
bgneal@1
|
386 self.key = ''.join(random.sample(string.ascii_letters + string.digits, self.keyLength))
|
bgneal@1
|
387
|