+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(
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(
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'),
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(
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(
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'),
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)