+from django.contrib.auth.models import User
from django.db import models
+from core import utils
+
class Area(models.Model):
name = models.CharField(max_length=64)
- notes = models.TextField()
+ notes = models.TextField(blank=True, null=True)
+
+ def __str__(self):
+ return self.name
+
+ @property
+ def sub_areas(self):
+ return utils.merge(
+ self.crags.order_by('name'),
+ self.clusters.order_by('name'),
+ 'name',
+ )
class Crag(models.Model):
area = models.ForeignKey(
related_name='crags',
)
name = models.CharField(max_length=64)
- notes = models.TextField()
+ notes = models.TextField(blank=True, null=True)
+
+ def __str__(self):
+ return self.name
class Route(models.Model):
area = models.ForeignKey(
related_name='routes',
)
name = models.CharField(max_length=64)
- notes = models.TextField()
+ mountain_project = models.URLField(blank=True, null=True)
+ notes = models.TextField(blank=True, null=True)
+
+ def __str__(self):
+ pitch_count = self.pitches.count()
+
+ if pitch_count == 0:
+ return self.name
+
+ if pitch_count == 1:
+ return '{} {}'.format(self.name, self.difficulty)
+
+ return '{} {} ({} pitches)'.format(
+ self.name,
+ self.difficulty,
+ pitch_count,
+ )
+
+ @property
+ def difficulty(self):
+ diff = None
+ diff_index = -1
+
+ for pitch in self.pitches.all():
+ p_diff_index = _route_difficulty_index(pitch.difficulty)
+
+ if p_diff_index > diff_index:
+ diff_index = p_diff_index
+ diff = pitch.difficulty
+
+ return diff
ROUTE_DIFFICULTY_CHOICES = (
('5.0', '5.0'),
('5.15d', '5.15d'),
)
+def _route_difficulty_index(difficulty):
+ for i, d in enumerate(ROUTE_DIFFICULTY_CHOICES):
+ if difficulty == d[0]:
+ return i
+ return -1
+
SAFETY_CHOICES = (
('G', 'G'),
('PG', 'PG'),
on_delete=models.CASCADE,
related_name='pitches',
)
- name = models.CharField(max_length=64, null=True)
+ name = models.CharField(max_length=64, blank=True, null=True)
difficulty = models.CharField(max_length=5, choices=ROUTE_DIFFICULTY_CHOICES)
safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
- notes = models.TextField()
+ notes = models.TextField(blank=True, null=True)
+
+ class Meta:
+ verbose_name_plural = 'pitches'
+
+ def __str__(self):
+ if self.name:
+ return '{} ({})'.format(self.name, self.difficulty)
+ return 'Pitch ({})'.format(self.difficulty)
class Cluster(models.Model):
area = models.ForeignKey(
related_name='clusters',
)
name = models.CharField(max_length=64)
- notes = models.TextField()
+ notes = models.TextField(blank=True, null=True)
+
+ def __str__(self):
+ return self.name
class Boulder(models.Model):
cluster = models.ForeignKey(
related_name='boulders',
)
name = models.CharField(max_length=64)
- notes = models.TextField()
+ notes = models.TextField(blank=True, null=True)
+
+ def __str__(self):
+ return self.name
BOULDER_DIFFICULTY_CHOICES = (
('V0', 'V0'),
name = models.CharField(max_length=64)
difficulty = models.CharField(max_length=3, choices=BOULDER_DIFFICULTY_CHOICES)
safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
- notes = models.TextField()
+ mountain_project = models.URLField(blank=True, null=True)
+ notes = models.TextField(blank=True, null=True)
+
+ def __str__(self):
+ return '{} ({})'.format(self.name, self.difficulty)
+
+class RouteTodo(models.Model):
+ user = models.ForeignKey(User, on_delete=models.CASCADE)
+ route = models.ForeignKey(Route, on_delete=models.CASCADE)
+
+class ProblemTodo(models.Model):
+ user = models.ForeignKey(User, on_delete=models.CASCADE)
+ problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
+
+class RouteTick(models.Model):
+ user = models.ForeignKey(User, on_delete=models.CASCADE)
+ route = models.ForeignKey(Route, on_delete=models.CASCADE)
+ timestamp = models.DateTimeField()
+ notes = models.TextField(blank=True, null=True)
+
+class ProblemTick(models.Model):
+ user = models.ForeignKey(User, on_delete=models.CASCADE)
+ problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
+ timestamp = models.DateTimeField()
+ notes = models.TextField(blank=True, null=True)