X-Git-Url: https://code.kerkeslager.com/?p=climbing.kerkeslager.com;a=blobdiff_plain;f=src%2Fclimbing%2Fmodels.py;h=14c728e7d9e0bd25f390aade9770f47f77f763da;hp=0f17d7a4f305ab3fd54a3065c38152722a57b235;hb=af1a3a283688e74a6e7868395cf2a507dcd2e0f4;hpb=1bc6954655e77c96abc15240b495331dfb0dd1a8 diff --git a/src/climbing/models.py b/src/climbing/models.py index 0f17d7a..14c728e 100644 --- a/src/climbing/models.py +++ b/src/climbing/models.py @@ -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)