1 from django.contrib.auth.models import User
2 from django.db import models
6 class Area(models.Model):
7 name = models.CharField(max_length=64)
8 notes = models.TextField(blank=True, null=True)
16 self.crags.order_by('name'),
17 self.clusters.order_by('name'),
21 class Crag(models.Model):
22 area = models.ForeignKey(
24 on_delete=models.CASCADE,
27 name = models.CharField(max_length=64)
28 notes = models.TextField(blank=True, null=True)
33 class Route(models.Model):
34 area = models.ForeignKey(
36 on_delete=models.CASCADE,
37 related_name='routes',
39 name = models.CharField(max_length=64)
40 mountain_project = models.URLField(blank=True, null=True)
41 notes = models.TextField(blank=True, null=True)
44 pitch_count = self.pitches.count()
50 return '{} {}'.format(self.name, self.difficulty)
52 return '{} {} ({} pitches)'.format(
63 for pitch in self.pitches.all():
64 p_diff_index = _route_difficulty_index(pitch.difficulty)
66 if p_diff_index > diff_index:
67 diff_index = p_diff_index
68 diff = pitch.difficulty
72 ROUTE_DIFFICULTY_CHOICES = (
114 def _route_difficulty_index(difficulty):
115 for i, d in enumerate(ROUTE_DIFFICULTY_CHOICES):
116 if difficulty == d[0]:
128 class Pitch(models.Model):
129 route = models.ForeignKey(
131 on_delete=models.CASCADE,
132 related_name='pitches',
134 name = models.CharField(max_length=64, blank=True, null=True)
135 difficulty = models.CharField(max_length=5, choices=ROUTE_DIFFICULTY_CHOICES)
136 safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
137 notes = models.TextField(blank=True, null=True)
140 verbose_name_plural = 'pitches'
144 return '{} ({})'.format(self.name, self.difficulty)
145 return 'Pitch ({})'.format(self.difficulty)
147 class Cluster(models.Model):
148 area = models.ForeignKey(
150 on_delete=models.CASCADE,
151 related_name='clusters',
153 name = models.CharField(max_length=64)
154 notes = models.TextField(blank=True, null=True)
159 class Boulder(models.Model):
160 cluster = models.ForeignKey(
162 on_delete=models.CASCADE,
163 related_name='boulders',
165 name = models.CharField(max_length=64)
166 notes = models.TextField(blank=True, null=True)
171 BOULDER_DIFFICULTY_CHOICES = (
192 class Problem(models.Model):
193 boulder = models.ForeignKey(
195 on_delete=models.CASCADE,
196 related_name='problems',
198 name = models.CharField(max_length=64)
199 difficulty = models.CharField(max_length=3, choices=BOULDER_DIFFICULTY_CHOICES)
200 safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
201 mountain_project = models.URLField(blank=True, null=True)
202 notes = models.TextField(blank=True, null=True)
205 return '{} ({})'.format(self.name, self.difficulty)
207 class RouteTodo(models.Model):
208 user = models.ForeignKey(User, on_delete=models.CASCADE)
209 route = models.ForeignKey(Route, on_delete=models.CASCADE)
211 class ProblemTodo(models.Model):
212 user = models.ForeignKey(User, on_delete=models.CASCADE)
213 problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
215 class RouteTick(models.Model):
216 user = models.ForeignKey(User, on_delete=models.CASCADE)
217 route = models.ForeignKey(Route, on_delete=models.CASCADE)
218 timestamp = models.DateTimeField()
219 notes = models.TextField(blank=True, null=True)
221 class ProblemTick(models.Model):
222 user = models.ForeignKey(User, on_delete=models.CASCADE)
223 problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
224 timestamp = models.DateTimeField()
225 notes = models.TextField(blank=True, null=True)