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