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 notes = models.TextField(blank=True, null=True)
78 ROUTE_DIFFICULTY_CHOICES = (
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, 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)
141 return '{} ({})'.format(self.name, self.difficulty)
142 return 'Pitch ({})'.format(self.difficulty)
144 class Cluster(models.Model):
145 area = models.ForeignKey(
147 on_delete=models.CASCADE,
148 related_name='clusters',
150 name = models.CharField(max_length=64)
151 notes = models.TextField(blank=True, null=True)
156 class Boulder(models.Model):
157 cluster = models.ForeignKey(
159 on_delete=models.CASCADE,
160 related_name='boulders',
162 name = models.CharField(max_length=64)
163 notes = models.TextField(blank=True, null=True)
168 BOULDER_DIFFICULTY_CHOICES = (
189 class Problem(models.Model):
190 boulder = models.ForeignKey(
192 on_delete=models.CASCADE,
193 related_name='problems',
195 name = models.CharField(max_length=64)
196 difficulty = models.CharField(max_length=3, choices=BOULDER_DIFFICULTY_CHOICES)
197 safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
198 notes = models.TextField(blank=True, null=True)
201 return '{} ({})'.format(self.name, self.difficulty)
203 class RouteTodo(models.Model):
204 user = models.ForeignKey(User, on_delete=models.CASCADE)
205 route = models.ForeignKey(Route, on_delete=models.CASCADE)
207 class ProblemTodo(models.Model):
208 user = models.ForeignKey(User, on_delete=models.CASCADE)
209 problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
211 class RouteTick(models.Model):
212 user = models.ForeignKey(User, on_delete=models.CASCADE)
213 route = models.ForeignKey(Route, on_delete=models.CASCADE)
214 timestamp = models.DateTimeField()
215 notes = models.TextField(blank=True, null=True)
217 class ProblemTick(models.Model):
218 user = models.ForeignKey(User, on_delete=models.CASCADE)
219 problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
220 timestamp = models.DateTimeField()
221 notes = models.TextField(blank=True, null=True)