Add todos and ticks
[climbing.kerkeslager.com] / src / climbing / models.py
1 from django.db import models
2 from django.contrib.auth.models import User
3
4 class Area(models.Model):
5     name = models.CharField(max_length=64)
6     notes = models.TextField(blank=True, null=True)
7
8     def __str__(self):
9         return self.name
10
11 class Crag(models.Model):
12     area = models.ForeignKey(
13         Area,
14         on_delete=models.CASCADE,
15         related_name='crags',
16     )
17     name = models.CharField(max_length=64)
18     notes = models.TextField(blank=True, null=True)
19
20     def __str__(self):
21         return self.name
22
23 class Route(models.Model):
24     area = models.ForeignKey(
25         Crag,
26         on_delete=models.CASCADE,
27         related_name='routes',
28     )
29     name = models.CharField(max_length=64)
30     notes = models.TextField(blank=True, null=True)
31
32     def __str__(self):
33         return self.name
34
35 ROUTE_DIFFICULTY_CHOICES = (
36     ('5.0', '5.0'),
37     ('5.1', '5.1'),
38     ('5.2', '5.2'),
39     ('5.3', '5.3'),
40     ('5.4', '5.4'),
41     ('5.5', '5.5'),
42     ('5.6', '5.6'),
43     ('5.6+', '5.6+'),
44     ('5.7', '5.7'),
45     ('5.7+', '5.7+'),
46     ('5.8', '5.8'),
47     ('5.8+', '5.8+'),
48     ('5.9-', '5.9-'),
49     ('5.9', '5.9'),
50     ('5.9+', '5.9+'),
51     ('5.10a', '5.10a'),
52     ('5.10b', '5.10b'),
53     ('5.10c', '5.10c'),
54     ('5.10d', '5.10d'),
55     ('5.11a', '5.11a'),
56     ('5.11b', '5.11b'),
57     ('5.11c', '5.11c'),
58     ('5.11d', '5.11d'),
59     ('5.12a', '5.12a'),
60     ('5.12b', '5.12b'),
61     ('5.12c', '5.12c'),
62     ('5.12d', '5.12d'),
63     ('5.13a', '5.13a'),
64     ('5.13b', '5.13b'),
65     ('5.13c', '5.13c'),
66     ('5.13d', '5.13d'),
67     ('5.14a', '5.14a'),
68     ('5.14b', '5.14b'),
69     ('5.14c', '5.14c'),
70     ('5.14d', '5.14d'),
71     ('5.15a', '5.15a'),
72     ('5.15b', '5.15b'),
73     ('5.15c', '5.15c'),
74     ('5.15d', '5.15d'),
75 )
76
77 SAFETY_CHOICES = (
78     ('G', 'G'),
79     ('PG', 'PG'),
80     ('PG13', 'PG13'),
81     ('R', 'R'),
82     ('X', 'X'),
83 )
84
85 class Pitch(models.Model):
86     route = models.ForeignKey(
87         Route,
88         on_delete=models.CASCADE,
89         related_name='pitches',
90     )
91     name = models.CharField(max_length=64, null=True)
92     difficulty = models.CharField(max_length=5, choices=ROUTE_DIFFICULTY_CHOICES)
93     safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
94     notes = models.TextField(blank=True, null=True)
95
96     def __str__(self):
97         if self.name:
98             return '{} ({})'.format(self.name, self.difficulty)
99         return 'Pitch ({})'.format(self.difficulty)
100
101 class Cluster(models.Model):
102     area = models.ForeignKey(
103         Area,
104         on_delete=models.CASCADE,
105         related_name='clusters',
106     )
107     name = models.CharField(max_length=64)
108     notes = models.TextField(blank=True, null=True)
109
110     def __str__(self):
111         return self.name
112
113 class Boulder(models.Model):
114     cluster = models.ForeignKey(
115         Cluster,
116         on_delete=models.CASCADE,
117         related_name='boulders',
118     )
119     name = models.CharField(max_length=64)
120     notes = models.TextField(blank=True, null=True)
121
122     def __str__(self):
123         return self.name
124
125 BOULDER_DIFFICULTY_CHOICES = (
126     ('V0', 'V0'),
127     ('V1', 'V1'),
128     ('V2', 'V2'),
129     ('V3', 'V3'),
130     ('V4', 'V4'),
131     ('V5', 'V5'),
132     ('V6', 'V6'),
133     ('V7', 'V7'),
134     ('V8', 'V8'),
135     ('V9', 'V9'),
136     ('V10', 'V10'),
137     ('V11', 'V11'),
138     ('V12', 'V12'),
139     ('V13', 'V13'),
140     ('V14', 'V14'),
141     ('V15', 'V15'),
142     ('V16', 'V16'),
143     ('V17', 'V17'),
144 )
145
146 class Problem(models.Model):
147     boulder = models.ForeignKey(
148         Boulder,
149         on_delete=models.CASCADE,
150         related_name='problems',
151     )
152     name = models.CharField(max_length=64)
153     difficulty = models.CharField(max_length=3, choices=BOULDER_DIFFICULTY_CHOICES)
154     safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
155     notes = models.TextField(blank=True, null=True)
156
157     def __str__(self):
158         return '{} ({})'.format(self.name, self.difficulty)
159
160 class RouteTodo(models.Model):
161     user = models.ForeignKey(User, on_delete=models.CASCADE)
162     route = models.ForeignKey(Route, on_delete=models.CASCADE)
163
164 class ProblemTodo(models.Model):
165     user = models.ForeignKey(User, on_delete=models.CASCADE)
166     problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
167
168 class RouteTick(models.Model):
169     user = models.ForeignKey(User, on_delete=models.CASCADE)
170     route = models.ForeignKey(Route, on_delete=models.CASCADE)
171     timestamp = models.DateTimeField()
172     notes = models.TextField(blank=True, null=True)
173
174 class ProblemTick(models.Model):
175     user = models.ForeignKey(User, on_delete=models.CASCADE)
176     problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
177     timestamp = models.DateTimeField()
178     notes = models.TextField(blank=True, null=True)