Add weight record modeling
[climbing.kerkeslager.com] / src / climbing / models.py
index 0f17d7a..14c728e 100644 (file)
@@ -1,18 +1,79 @@
+from django.contrib.auth.models import User
 from django.db import models
 
 class Area(models.Model):
     name = models.CharField(max_length=64)
-    notes = models.TextField()
+    notes = models.TextField(blank=True, null=True)
+
+    def __str__(self):
+        return self.name
+
+    @property
+    def sub_areas(self):
+        crags = iter(self.crags.order_by('name'))
+        clusters = iter(self.clusters.order_by('name'))
+
+        try:
+            crag = next(crags)
+        except StopIteration:
+            crag = None
+
+        try:
+            cluster = next(clusters)
+        except StopIteration:
+            cluster = None
+
+        while crag and cluster:
+            if crag.name < cluster.name:
+                yield crag
+                try:
+                    crag = next(crags)
+                except:
+                    crag = None
+            else:
+                yield cluster
+                try:
+                    cluster = next(clusters)
+                except:
+                    cluster = None
+
+        while crag:
+            yield crag
+            try:
+                crag = next(crags)
+            except:
+                crag = None
+
+        while cluster:
+            yield cluster
+            try:
+                cluster = next(clusters)
+            except:
+                cluster = None
 
 class Crag(models.Model):
-    area = models.ForeignKey(Area, on_delete=models.CASCADE)
+    area = models.ForeignKey(
+        Area,
+        on_delete=models.CASCADE,
+        related_name='crags',
+    )
     name = models.CharField(max_length=64)
-    notes = models.TextField()
+    notes = models.TextField(blank=True, null=True)
+
+    def __str__(self):
+        return self.name
 
 class Route(models.Model):
-    area = models.ForeignKey(Crag, on_delete=models.CASCADE)
+    area = models.ForeignKey(
+        Crag,
+        on_delete=models.CASCADE,
+        related_name='routes',
+    )
     name = models.CharField(max_length=64)
-    notes = models.TextField()
+    notes = models.TextField(blank=True, null=True)
+
+    def __str__(self):
+        return self.name
 
 ROUTE_DIFFICULTY_CHOICES = (
     ('5.0', '5.0'),
@@ -65,21 +126,44 @@ SAFETY_CHOICES = (
 )
 
 class Pitch(models.Model):
-    route = models.ForeignKey(Route, on_delete=models.CASCADE)
+    route = models.ForeignKey(
+        Route,
+        on_delete=models.CASCADE,
+        related_name='pitches',
+    )
     name = models.CharField(max_length=64, null=True)
     difficulty = models.CharField(max_length=5, choices=ROUTE_DIFFICULTY_CHOICES)
     safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
-    notes = models.TextField()
+    notes = models.TextField(blank=True, null=True)
+
+    def __str__(self):
+        if self.name:
+            return '{} ({})'.format(self.name, self.difficulty)
+        return 'Pitch ({})'.format(self.difficulty)
 
 class Cluster(models.Model):
-    area = models.ForeignKey(Area, on_delete=models.CASCADE)
+    area = models.ForeignKey(
+        Area,
+        on_delete=models.CASCADE,
+        related_name='clusters',
+    )
     name = models.CharField(max_length=64)
-    notes = models.TextField()
+    notes = models.TextField(blank=True, null=True)
+
+    def __str__(self):
+        return self.name
 
 class Boulder(models.Model):
-    cluster = models.ForeignKey(Cluster, on_delete=models.CASCADE)
+    cluster = models.ForeignKey(
+        Cluster,
+        on_delete=models.CASCADE,
+        related_name='boulders',
+    )
     name = models.CharField(max_length=64)
-    notes = models.TextField()
+    notes = models.TextField(blank=True, null=True)
+
+    def __str__(self):
+        return self.name
 
 BOULDER_DIFFICULTY_CHOICES = (
     ('V0', 'V0'),
@@ -103,8 +187,35 @@ BOULDER_DIFFICULTY_CHOICES = (
 )
 
 class Problem(models.Model):
-    boulder = models.ForeignKey(Boulder, on_delete=models.CASCADE)
+    boulder = models.ForeignKey(
+        Boulder,
+        on_delete=models.CASCADE,
+        related_name='problems',
+    )
     name = models.CharField(max_length=64)
     difficulty = models.CharField(max_length=3, choices=BOULDER_DIFFICULTY_CHOICES)
     safety = models.CharField(max_length=4, choices=SAFETY_CHOICES)
-    notes = models.TextField()
+    notes = models.TextField(blank=True, null=True)
+
+    def __str__(self):
+        return '{} ({})'.format(self.name, self.difficulty)
+
+class RouteTodo(models.Model):
+    user = models.ForeignKey(User, on_delete=models.CASCADE)
+    route = models.ForeignKey(Route, on_delete=models.CASCADE)
+
+class ProblemTodo(models.Model):
+    user = models.ForeignKey(User, on_delete=models.CASCADE)
+    problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
+
+class RouteTick(models.Model):
+    user = models.ForeignKey(User, on_delete=models.CASCADE)
+    route = models.ForeignKey(Route, on_delete=models.CASCADE)
+    timestamp = models.DateTimeField()
+    notes = models.TextField(blank=True, null=True)
+
+class ProblemTick(models.Model):
+    user = models.ForeignKey(User, on_delete=models.CASCADE)
+    problem = models.ForeignKey(Problem, on_delete=models.CASCADE)
+    timestamp = models.DateTimeField()
+    notes = models.TextField(blank=True, null=True)