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 for index, diff_choice in enumerate(ROUTE_DIFFICULTY_CHOICES):
65 if pitch.difficulty == diff_choice[0]:
66 if diff_index < index:
67 diff = pitch.difficulty
73 ROUTE_DIFFICULTY_CHOICES = (
123 class Pitch(models.Model):
124 route = models.ForeignKey(
126 on_delete=models.CASCADE,
127 related_name='pitches',
129 name = models.CharField(max_length=64, blank=True, null=True)
130 difficulty = models.CharField(max_length=5, choices=ROUTE_DIFFICULTY_CHOICES)
131 safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
132 notes = models.TextField(blank=True, null=True)
135 verbose_name_plural = 'pitches'
139 return '{} ({})'.format(self.name, self.difficulty)
140 return 'Pitch ({})'.format(self.difficulty)
142 class Cluster(models.Model):
143 area = models.ForeignKey(
145 on_delete=models.CASCADE,
146 related_name='clusters',
148 name = models.CharField(max_length=64)
149 notes = models.TextField(blank=True, null=True)
154 class Boulder(models.Model):
155 cluster = models.ForeignKey(
157 on_delete=models.CASCADE,
158 related_name='boulders',
160 name = models.CharField(max_length=64)
161 notes = models.TextField(blank=True, null=True)
166 BOULDER_DIFFICULTY_CHOICES = (
187 class Problem(models.Model):
188 boulder = models.ForeignKey(
190 on_delete=models.CASCADE,
191 related_name='problems',
193 name = models.CharField(max_length=64)
194 difficulty = models.CharField(max_length=3, choices=BOULDER_DIFFICULTY_CHOICES)
195 safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
196 mountain_project = models.URLField(blank=True, null=True)
197 notes = models.TextField(blank=True, null=True)
200 return '{} ({})'.format(self.name, self.difficulty)
202 class RouteTodo(models.Model):
203 user = models.ForeignKey(User, on_delete=models.CASCADE)
204 route = models.ForeignKey(Route, on_delete=models.CASCADE)
206 class ProblemTodo(models.Model):
207 user = models.ForeignKey(User, on_delete=models.CASCADE)
208 problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
210 class RouteTick(models.Model):
211 user = models.ForeignKey(User, on_delete=models.CASCADE)
212 route = models.ForeignKey(Route, on_delete=models.CASCADE)
213 timestamp = models.DateTimeField()
214 notes = models.TextField(blank=True, null=True)
216 class ProblemTick(models.Model):
217 user = models.ForeignKey(User, on_delete=models.CASCADE)
218 problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
219 timestamp = models.DateTimeField()
220 notes = models.TextField(blank=True, null=True)