Add areas
authorDavid Kerkeslager <kerkeslager@gmail.com>
Fri, 26 Feb 2021 05:51:54 +0000 (00:51 -0500)
committerDavid Kerkeslager <kerkeslager@gmail.com>
Fri, 26 Feb 2021 05:51:54 +0000 (00:51 -0500)
tickle/admin.py
tickle/migrations/0001_initial.py
tickle/migrations/0002_auto_20210225_1949.py [deleted file]
tickle/migrations/0002_auto_20210226_0543.py [new file with mode: 0644]
tickle/models.py

index 1cab492..1fa620d 100644 (file)
@@ -12,6 +12,7 @@ class RouteAdmin(admin.ModelAdmin):
 
 admin.site.register(models.Route, RouteAdmin)
 
+admin.site.register(models.Area)
 admin.site.register(models.Attempt)
 admin.site.register(models.Boulder)
 admin.site.register(models.Todo)
index 1e8635c..bae6458 100644 (file)
@@ -1,4 +1,4 @@
-# Generated by Django 3.1.7 on 2021-02-25 19:46
+# Generated by Django 3.1.7 on 2021-02-26 05:37
 
 from django.conf import settings
 from django.db import migrations, models
@@ -15,19 +15,23 @@ class Migration(migrations.Migration):
 
     operations = [
         migrations.CreateModel(
-            name='Boulder',
+            name='Area',
             fields=[
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('name', models.CharField(max_length=64)),
-                ('mountainproject', models.URLField(null=True)),
+                ('notes', models.TextField(blank=True)),
+                ('parent', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='tickle.area')),
             ],
         ),
         migrations.CreateModel(
-            name='BoulderDifficulty',
+            name='Boulder',
             fields=[
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('order', models.PositiveSmallIntegerField()),
-                ('name', models.CharField(max_length=8)),
+                ('name', models.CharField(max_length=64)),
+                ('difficulty', models.CharField(choices=[('v0', 'v0'), ('v1', 'v1'), ('v2', 'v2'), ('v3', 'v3'), ('v4', 'v4'), ('v5', 'v5'), ('v6', 'v6'), ('v7', 'v7'), ('v8', 'v8'), ('v9', 'v9'), ('v10', 'v10'), ('v11', 'v11'), ('v12', 'v12'), ('v13', 'v13'), ('v14', 'v14'), ('v15', 'v15'), ('v16', 'v16')], max_length=8)),
+                ('mountainproject', models.URLField(blank=True)),
+                ('notes', models.TextField(blank=True)),
+                ('area', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='tickle.area')),
             ],
         ),
         migrations.CreateModel(
@@ -36,49 +40,46 @@ class Migration(migrations.Migration):
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('name', models.CharField(max_length=64)),
                 ('protection_style', models.CharField(choices=[('sport', 'Sport'), ('toprope', 'Top Rope'), ('trad', 'Trad')], max_length=8)),
-                ('mountainproject', models.URLField(null=True)),
-            ],
-        ),
-        migrations.CreateModel(
-            name='RouteDifficulty',
-            fields=[
-                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('order', models.PositiveSmallIntegerField()),
-                ('name', models.CharField(max_length=8)),
+                ('mountainproject', models.URLField(blank=True)),
+                ('notes', models.TextField(blank=True)),
+                ('area', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='tickle.area')),
             ],
         ),
         migrations.CreateModel(
             name='Todo',
             fields=[
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
-                ('notes', models.TextField()),
+                ('notes', models.TextField(blank=True)),
                 ('protection', models.CharField(choices=[('none', 'None'), ('bolts', 'Bolts'), ('gear', 'Gear'), ('pad', 'Pad'), ('tr', 'Top Rope')], max_length=8)),
                 ('style', models.CharField(choices=[('onsight', 'On Sight'), ('flash', 'Flash'), ('project', 'Project'), ('other', 'Other')], max_length=8)),
                 ('boulder', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='todos', to='tickle.boulder')),
                 ('route', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='todos', to='tickle.route')),
                 ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
             ],
+            options={
+                'ordering': ('route__name',),
+            },
         ),
         migrations.CreateModel(
             name='Pitch',
             fields=[
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('order', models.PositiveSmallIntegerField()),
-                ('difficulty', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='pitches', to='tickle.routedifficulty')),
+                ('difficulty', models.CharField(choices=[('3', '3'), ('4', '4'), ('5.0', '5.0'), ('5.1', '5.1'), ('5.2', '5.2'), ('5.3', '5.3'), ('5.4', '5.4'), ('5.5', '5.5'), ('5.6', '5.6'), ('5.7', '5.7'), ('5.7+', '5.7+'), ('5.8', '5.8'), ('5.8+', '5.8+'), ('5.9', '5.9'), ('5.9+', '5.9+'), ('5.10a', '5.10a'), ('5.10b', '5.10b'), ('5.10c', '5.10c'), ('5.10d', '5.10d'), ('5.11a', '5.11a'), ('5.11b', '5.11b'), ('5.11c', '5.11c'), ('5.11d', '5.11d'), ('5.12a', '5.12a'), ('5.12b', '5.12b'), ('5.12c', '5.12c'), ('5.12d', '5.12d'), ('5.13a', '5.13a'), ('5.13b', '5.13b'), ('5.13c', '5.13c'), ('5.13d', '5.13d'), ('5.14a', '5.14a'), ('5.14b', '5.14b'), ('5.14c', '5.14c'), ('5.14d', '5.14d'), ('5.15a', '5.15a'), ('5.15b', '5.15b'), ('5.15c', '5.15c'), ('5.15d', '5.15d')], max_length=8)),
+                ('name', models.CharField(blank=True, max_length=32)),
+                ('notes', models.TextField(blank=True)),
                 ('route', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='pitches', to='tickle.route')),
             ],
-        ),
-        migrations.AddField(
-            model_name='boulder',
-            name='difficulty',
-            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='boulders', to='tickle.boulderdifficulty'),
+            options={
+                'ordering': ('order',),
+            },
         ),
         migrations.CreateModel(
             name='Attempt',
             fields=[
                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                 ('date', models.DateField()),
-                ('notes', models.TextField()),
+                ('notes', models.TextField(blank=True)),
                 ('result', models.CharField(choices=[('send', 'Sent'), ('fall', 'Fall')], max_length=8)),
                 ('prior_knowledge', models.BooleanField(default=True)),
                 ('protection_used', models.CharField(choices=[('none', 'None'), ('bolts', 'Bolts'), ('gear', 'Gear'), ('pad', 'Pad'), ('tr', 'Top Rope')], max_length=8)),
@@ -86,6 +87,9 @@ class Migration(migrations.Migration):
                 ('route', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='attempts', to='tickle.route')),
                 ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
             ],
+            options={
+                'ordering': ('date',),
+            },
         ),
         migrations.AddConstraint(
             model_name='todo',
diff --git a/tickle/migrations/0002_auto_20210225_1949.py b/tickle/migrations/0002_auto_20210225_1949.py
deleted file mode 100644 (file)
index 1b487b9..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-# Generated by Django 3.1.7 on 2021-02-25 19:49
-
-from django.db import migrations, models
-
-
-class Migration(migrations.Migration):
-
-    dependencies = [
-        ('tickle', '0001_initial'),
-    ]
-
-    operations = [
-        migrations.AlterField(
-            model_name='boulder',
-            name='mountainproject',
-            field=models.URLField(blank=True, default=''),
-            preserve_default=False,
-        ),
-        migrations.AlterField(
-            model_name='route',
-            name='mountainproject',
-            field=models.URLField(blank=True, default=''),
-            preserve_default=False,
-        ),
-    ]
diff --git a/tickle/migrations/0002_auto_20210226_0543.py b/tickle/migrations/0002_auto_20210226_0543.py
new file mode 100644 (file)
index 0000000..4ee6754
--- /dev/null
@@ -0,0 +1,19 @@
+# Generated by Django 3.1.7 on 2021-02-26 05:43
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('tickle', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='area',
+            name='parent',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='tickle.area'),
+        ),
+    ]
index ce395f9..eb661d1 100644 (file)
@@ -29,13 +29,31 @@ BOULDER_DIFFICULTY_CHOICES = (
     ('v16', 'v16'),
 )
 
+class Area(models.Model):
+    parent = models.ForeignKey(
+        'self',
+        blank=True,
+        null=True,
+        on_delete=models.CASCADE,
+    )
+    name = models.CharField(max_length=64)
+    notes = models.TextField(blank=True)
+
+    def __str__(self):
+        if self.parent is None:
+            return self.name
+
+        return '{} > {}'.format(self.parent, self.name)
+
 class Boulder(models.Model):
+    area = models.ForeignKey('Area', on_delete=models.PROTECT)
     name = models.CharField(max_length=64)
     difficulty = models.CharField(
         choices=BOULDER_DIFFICULTY_CHOICES,
         max_length=8,
     )
     mountainproject = models.URLField(blank=True)
+    notes = models.TextField(blank=True)
 
     def __str__(self):
         return '{} ({})'.format(self.name, self.difficulty)
@@ -94,6 +112,7 @@ class Pitch(models.Model):
         max_length=8,
     )
     name = models.CharField(blank=True, max_length=32)
+    notes = models.TextField(blank=True)
 
     class Meta:
         ordering = ('order',)
@@ -108,9 +127,11 @@ PROTECTION_STYLE_CHOICES = (
 )
 
 class Route(models.Model):
+    area = models.ForeignKey('Area', on_delete=models.PROTECT)
     name = models.CharField(max_length=64)
     protection_style = models.CharField(max_length=8, choices=PROTECTION_STYLE_CHOICES)
     mountainproject = models.URLField(blank=True)
+    notes = models.TextField(blank=True)
 
     # TODO Write test for this
     @property
@@ -136,7 +157,7 @@ PROTECTION_CHOICES = (
 class Attempt(models.Model):
     user = models.ForeignKey(User, on_delete=models.CASCADE)
     date = models.DateField()
-    notes = models.TextField()
+    notes = models.TextField(blank=True)
     boulder = models.ForeignKey('Boulder', null=True, on_delete=models.PROTECT, related_name='attempts')
     route = models.ForeignKey('Route', null=True, on_delete=models.PROTECT, related_name='attempts')
     result = models.CharField(max_length=8, choices=ATTEMPT_RESULT_CHOICES)
@@ -162,7 +183,7 @@ STYLE_CHOICES = (
 
 class Todo(models.Model):
     user = models.ForeignKey(User, on_delete=models.CASCADE)
-    notes = models.TextField()
+    notes = models.TextField(blank=True)
     protection = models.CharField(max_length=8, choices=PROTECTION_CHOICES)
     boulder = models.ForeignKey('Boulder', null=True, on_delete=models.PROTECT, related_name='todos')
     route = models.ForeignKey('Route', null=True, on_delete=models.PROTECT, related_name='todos')