1 from django.contrib.auth.models import User
2 from django.db import models
4 class Area(models.Model):
5 name = models.CharField(max_length=64)
6 notes = models.TextField(blank=True, null=True)
13 crags = iter(self.crags.order_by('name'))
14 clusters = iter(self.clusters.order_by('name'))
22 cluster = next(clusters)
26 while crag and cluster:
27 if crag.name < cluster.name:
36 cluster = next(clusters)
50 cluster = next(clusters)
54 class Crag(models.Model):
55 area = models.ForeignKey(
57 on_delete=models.CASCADE,
60 name = models.CharField(max_length=64)
61 notes = models.TextField(blank=True, null=True)
66 class Route(models.Model):
67 area = models.ForeignKey(
69 on_delete=models.CASCADE,
70 related_name='routes',
72 name = models.CharField(max_length=64)
73 mountain_project = models.URLField(blank=True, null=True)
74 notes = models.TextField(blank=True, null=True)
79 ROUTE_DIFFICULTY_CHOICES = (
129 class Pitch(models.Model):
130 route = models.ForeignKey(
132 on_delete=models.CASCADE,
133 related_name='pitches',
135 name = models.CharField(max_length=64, null=True)
136 difficulty = models.CharField(max_length=5, choices=ROUTE_DIFFICULTY_CHOICES)
137 safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
138 notes = models.TextField(blank=True, null=True)
142 return '{} ({})'.format(self.name, self.difficulty)
143 return 'Pitch ({})'.format(self.difficulty)
145 class Cluster(models.Model):
146 area = models.ForeignKey(
148 on_delete=models.CASCADE,
149 related_name='clusters',
151 name = models.CharField(max_length=64)
152 notes = models.TextField(blank=True, null=True)
157 class Boulder(models.Model):
158 cluster = models.ForeignKey(
160 on_delete=models.CASCADE,
161 related_name='boulders',
163 name = models.CharField(max_length=64)
164 notes = models.TextField(blank=True, null=True)
169 BOULDER_DIFFICULTY_CHOICES = (
190 class Problem(models.Model):
191 boulder = models.ForeignKey(
193 on_delete=models.CASCADE,
194 related_name='problems',
196 name = models.CharField(max_length=64)
197 difficulty = models.CharField(max_length=3, choices=BOULDER_DIFFICULTY_CHOICES)
198 safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
199 mountain_project = models.URLField(blank=True, null=True)
200 notes = models.TextField(blank=True, null=True)
203 return '{} ({})'.format(self.name, self.difficulty)
205 class RouteTodo(models.Model):
206 user = models.ForeignKey(User, on_delete=models.CASCADE)
207 route = models.ForeignKey(Route, on_delete=models.CASCADE)
209 class ProblemTodo(models.Model):
210 user = models.ForeignKey(User, on_delete=models.CASCADE)
211 problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
213 class RouteTick(models.Model):
214 user = models.ForeignKey(User, on_delete=models.CASCADE)
215 route = models.ForeignKey(Route, on_delete=models.CASCADE)
216 timestamp = models.DateTimeField()
217 notes = models.TextField(blank=True, null=True)
219 class ProblemTick(models.Model):
220 user = models.ForeignKey(User, on_delete=models.CASCADE)
221 problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
222 timestamp = models.DateTimeField()
223 notes = models.TextField(blank=True, null=True)