Created
June 13, 2013 16:39
-
-
Save jsutterfield/5775271 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.db import models | |
from django.contrib.localflavor.us.models import USStateField, PhoneNumberField | |
def save_area(instance, file_name): | |
return "photos/%s/%s/%s" % (instance.area.state, instance.area.name, file_name) | |
def save_problem(instance, file_name): | |
return "photos/%s/%s/%s/%s" % (instance.problem.parent.state, instance.problem.parent.name, instance.problem.name, file_name) | |
class Area(models.Model): | |
AREA_CHOICES = ( | |
("RE", "Region"), | |
("AR", "Area"), | |
("BO", "Boulder") | |
) | |
APPROACH_CHOICES = ( | |
("Easy", "Flip Flops"), | |
("Intermediate", "Sneakers"), | |
("Difficult", "Boots") | |
) | |
name = models.CharField(max_length=100) | |
area_type = models.CharField(max_length=2, choices=AREA_CHOICES, | |
help_text="eg 'Bay Area' = Region, 'Indian Rock' = Area, 'Motar Rock' = Boulder") | |
area_parent = models.ForeignKey("self", null=True, blank=True) | |
state = USStateField() | |
city = models.CharField(max_length=20, blank=True) | |
longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) | |
latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) | |
street_address = models.CharField(max_length=40, blank=True) | |
zipcode = models.IntegerField(null=True, blank=True) | |
bouldering = models.BooleanField(default=False, blank=True) | |
top_rope = models.BooleanField(default=False, blank=True) | |
sport = models.BooleanField(default=False, blank=True) | |
trad = models.BooleanField(default=False, blank=True) | |
approach_difficulty = models.CharField(max_length=12, choices=APPROACH_CHOICES, blank=True) | |
approach_time = models.IntegerField(null=True, blank=True, help_text="In minutes") | |
approach_distance = models.IntegerField(null=True, blank=True, help_text="In feet (1/4 mi = 1320ft, 1/2 mi = 2640ft, 1 mi = 5280ft)") | |
approach_description = models.TextField(blank=True) | |
trailhead_longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) | |
trailhead_latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) | |
lot_parking = models.BooleanField(default=False, blank=True) | |
street_parking = models.BooleanField(default=False, blank=True) | |
garage_parking = models.BooleanField(default=False, blank=True) | |
pullout_parking = models.BooleanField(default=False, blank=True) | |
parking_longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) | |
parking_latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) | |
parking_description = models.TextField(blank=True) | |
height = models.CharField(max_length=20, blank=True) | |
short_description = models.CharField(max_length=120, blank=True) | |
about = models.TextField(blank=True) | |
description = models.TextField(blank=True) | |
rock_type = models.CharField(max_length=25, blank=True) | |
weather_description = models.CharField(max_length=500, blank=True) | |
spring = models.BooleanField(default=False, blank=True) | |
summer = models.BooleanField(default=False, blank=True) | |
fall = models.BooleanField(default=False, blank=True) | |
winter = models.BooleanField(default=False, blank=True) | |
hazard_information = models.CharField(max_length=750, blank=True) | |
misc_information = models.CharField(max_length=750, blank=True) | |
pet_friendly = models.BooleanField(default=False) | |
nearest_emergency = models.CharField(max_length=50, blank=True) | |
nearest_emergency_address = models.CharField(max_length=150, blank=True) | |
nearest_emergency_phone = PhoneNumberField(null=True, blank=True, help_text='XXX-XXX-XXXX') | |
slug = models.SlugField(max_length=50) | |
featured = models.BooleanField(default=False) | |
def __unicode__(self): | |
return "%s" % self.name | |
def get_absolute_url(self): | |
if self.area_type == 'RE': | |
return "climbs/%s" % (self.slug) | |
elif self.area_type == 'AR': | |
return "climbs/%s/%s" % (self.area_parent.slug, self.slug) | |
else: | |
return "climbs/%s/%s/%s" % (self.area_parent.area_parent.slug, | |
self.area_parent.slug, | |
self.slug) | |
class Meta: | |
ordering = ['area_type', 'name'] | |
class Problem(models.Model): | |
PROBLEM_QUALITY = ( | |
# Look into having the first value be nums, not strings. | |
('1', "One Star"), | |
('2', "Two Star"), | |
('3', "Three Star"), | |
('4', "Four Star"), | |
('5', "Five Star") | |
) | |
ANGLE_CHOICES = ( | |
('S', 'Slab'), | |
('N', '90 Degrees'), | |
('O', 'Overhang'), | |
('R', 'Roof') | |
) | |
name = models.CharField(max_length=100) | |
parent = models.ForeignKey('Area') | |
featured = models.BooleanField(default=False) | |
grade = models.CharField(max_length=6) | |
quality = models.CharField(max_length=1, choices=PROBLEM_QUALITY, blank=True) | |
longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) | |
latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True) | |
description = models.TextField(blank=True) | |
height = models.CharField(max_length=20, blank=True) | |
angle = models.CharField(max_length=1, choices=ANGLE_CHOICES, blank=True) | |
cracks = models.BooleanField(default=False) | |
crimps = models.BooleanField(default=False) | |
jugs = models.BooleanField(default=False) | |
slopers = models.BooleanField(default=False) | |
sidepulls = models.BooleanField(default=False) | |
pockets = models.BooleanField(default=False) | |
pinches = models.BooleanField(default=False) | |
compression = models.BooleanField(default=False) | |
dynos = models.BooleanField(default=False) | |
highball = models.BooleanField(default=False) | |
mantle = models.BooleanField(default=False) | |
arete = models.BooleanField(default=False) | |
short_description = models.CharField(max_length=120, blank=True) | |
about = models.TextField(blank=True) | |
location = models.CharField(max_length=100, blank=True) | |
problem_start = models.CharField(max_length=100, blank=True) | |
problem_finish = models.CharField(max_length=100, blank=True) | |
problem_descent = models.CharField(max_length=100, blank=True) | |
landing_information = models.CharField(max_length=100, blank=True) | |
hazard_information = models.CharField(max_length=100, blank=True) | |
aspect = models.CharField(max_length=50, blank=True) | |
variations = models.CharField(max_length=100, blank=True) | |
misc_information = models.CharField(max_length=100, blank=True) | |
first_ascent = models.CharField(max_length=20, blank=True) | |
source = models.CharField(max_length=100, blank=True) | |
slug = models.SlugField(max_length=50, help_text='Used in URL to map to database to this route') | |
def __unicode__(self): | |
return "%s: %s, %s" % (self.name, self.parent.area_parent.name, self.parent.state) | |
def get_absolute_url(self): | |
return "/climbs/%s/%s/%s/%s" % (self.parent.area_parent.area_parent.slug, | |
self.parent.area_parent.slug, | |
self.parent.slug, self.slug) | |
def boulder(self): | |
return self.parent.name | |
boulder.admin_order_field = 'parent' | |
def area(self): | |
return self.parent.area_parent.name | |
area.admin_order_field = 'parent__area_parent__name' | |
def region(self): | |
return self.parent.area_parent.area_parent.name | |
region.admin_order_field = 'parent__area_parent__area_parent__name' | |
def state(self): | |
return self.parent.state | |
state.admin_order_field = 'parent__state' | |
def validate_rating(self): | |
pass | |
class Meta: | |
ordering = ['name'] | |
class ProblemPhoto(models.Model): | |
PHOTO_CHOICES = ( | |
("O", "Overview"), | |
("G", "General") | |
) | |
photo_type = models.CharField(max_length=1, choices=PHOTO_CHOICES) | |
problem = models.ForeignKey('Problem') | |
photo = models.ImageField(upload_to=save_problem) | |
def __unicode__(self): | |
return "%s-%s" % (self.problem, self.photo_type) | |
def get_problem_url(self): | |
return self.problem.get_absolute_url() | |
class AreaPhoto(models.Model): | |
PHOTO_CHOICES = ( | |
("G", "General"), | |
("A", "Approach"), | |
) | |
area = models.ForeignKey('Area') | |
photo = models.ImageField(upload_to=save_area) | |
photo_type = models.CharField(max_length=1, choices=PHOTO_CHOICES) | |
def __unicode__(self): | |
return "%s-%s" % (self.area, self.photo_type) | |
def get_area_url(self): | |
return self.area.get_absolute_url() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment