Skip to content

Instantly share code, notes, and snippets.

@jsutterfield
Created June 13, 2013 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jsutterfield/5775271 to your computer and use it in GitHub Desktop.
Save jsutterfield/5775271 to your computer and use it in GitHub Desktop.
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