From: David Kerkeslager Date: Fri, 26 Feb 2021 05:51:54 +0000 (-0500) Subject: Add areas X-Git-Url: https://code.kerkeslager.com/?p=tickle;a=commitdiff_plain;h=1abbfc341a3a9e1a8d232388b0cc2b69e46f88bb Add areas --- diff --git a/tickle/admin.py b/tickle/admin.py index 1cab492..1fa620d 100644 --- a/tickle/admin.py +++ b/tickle/admin.py @@ -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) diff --git a/tickle/migrations/0001_initial.py b/tickle/migrations/0001_initial.py index 1e8635c..bae6458 100644 --- a/tickle/migrations/0001_initial.py +++ b/tickle/migrations/0001_initial.py @@ -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 index 1b487b9..0000000 --- a/tickle/migrations/0002_auto_20210225_1949.py +++ /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 index 0000000..4ee6754 --- /dev/null +++ b/tickle/migrations/0002_auto_20210226_0543.py @@ -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'), + ), + ] diff --git a/tickle/models.py b/tickle/models.py index ce395f9..eb661d1 100644 --- a/tickle/models.py +++ b/tickle/models.py @@ -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')