Skip to content

Commit

Permalink
Migrate cavers field to ManyToManyField
Browse files Browse the repository at this point in the history
  • Loading branch information
anorthall committed Nov 1, 2023
1 parent 166588c commit 53c0033
Show file tree
Hide file tree
Showing 8 changed files with 186 additions and 8 deletions.
16 changes: 13 additions & 3 deletions app/logger/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,17 @@ class TripAdminForm(DistanceUnitFormMixin, ModelForm):
pass


class CaverInline(TabularInline):
model = Trip.cavers.through
extra = 0

def has_add_permission(self, request, obj=None):
return False

def has_change_permission(self, request, obj=None):
return False


class TripPhotoInline(TabularInline):
model = TripPhoto
fk_name = "trip"
Expand All @@ -29,7 +40,7 @@ def has_add_permission(self, request, obj=None):
@admin.register(Trip)
class TripAdmin(ModelAdmin):
form = TripAdminForm
inlines = [TripPhotoInline]
inlines = [CaverInline, TripPhotoInline]
search_fields = (
"cave_name",
"cave_entrance",
Expand Down Expand Up @@ -108,10 +119,9 @@ class TripAdmin(ModelAdmin):
},
),
(
"Attendees",
"Organisations",
{
"fields": (
"cavers",
"clubs",
"expedition",
),
Expand Down
61 changes: 61 additions & 0 deletions app/logger/migrations/0034_caver.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Generated by Django 4.2.6 on 2023-10-31 17:00

import uuid

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
("logger", "0033_make_trip_owner_follow_their_trips"),
]

operations = [
migrations.CreateModel(
name="Caver",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=40)),
(
"added",
models.DateTimeField(
auto_now_add=True, verbose_name="caver added on"
),
),
(
"updated",
models.DateTimeField(
auto_now=True, verbose_name="caver last updated"
),
),
(
"uuid",
models.UUIDField(
default=uuid.uuid4,
editable=False,
help_text="A unique identifier for this caver.",
unique=True,
verbose_name="UUID",
),
),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
],
),
]
21 changes: 21 additions & 0 deletions app/logger/migrations/0035_trip_cavers_new.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 4.2.6 on 2023-10-31 17:01

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("logger", "0034_caver"),
]

operations = [
migrations.AddField(
model_name="trip",
name="cavers_new",
field=models.ManyToManyField(
blank=True,
help_text="A list of cavers that were on this trip.",
to="logger.caver",
),
),
]
36 changes: 36 additions & 0 deletions app/logger/migrations/0036_old_cavers_to_new_cavers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# Generated by Django 4.2.6 on 2023-10-31 17:03

from django.db import migrations


def migrate_old_cavers_to_new_cavers(apps, schema_editor):
"""Migrate old, comma separated text field to new ManyToMany field"""
Trip = apps.get_model("logger", "Trip")
Caver = apps.get_model("logger", "Caver")

for trip in Trip.objects.all():
if not trip.cavers:
continue

caver_names = trip.cavers.split(",")
for caver_name in caver_names:
caver_name = caver_name.strip()
if not caver_name:
continue

try:
caver = Caver.objects.get(name__iexact=caver_name, user=trip.user)
except Caver.DoesNotExist:
caver = Caver.objects.create(name=caver_name, user=trip.user)

trip.cavers_new.add(caver)


class Migration(migrations.Migration):
dependencies = [
("logger", "0035_trip_cavers_new"),
]

operations = [
migrations.RunPython(migrate_old_cavers_to_new_cavers),
]
22 changes: 22 additions & 0 deletions app/logger/migrations/0037_rename_caver_fields.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 4.2.6 on 2023-10-31 17:19

from django.db import migrations


class Migration(migrations.Migration):
dependencies = [
("logger", "0036_old_cavers_to_new_cavers"),
]

operations = [
migrations.RenameField(
model_name="trip",
old_name="cavers",
new_name="cavers_old",
),
migrations.RenameField(
model_name="trip",
old_name="cavers_new",
new_name="cavers",
),
]
30 changes: 29 additions & 1 deletion app/logger/models/trip.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,29 @@
)


class Caver(models.Model):
"""A caver that was on a trip"""

name = models.CharField(max_length=40)
added = models.DateTimeField("caver added on", auto_now_add=True)
updated = models.DateTimeField("caver last updated", auto_now=True)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
uuid = models.UUIDField(
verbose_name="UUID",
default=uuid.uuid4,
editable=False,
unique=True,
help_text="A unique identifier for this caver.",
)

def __str__(self):
return self.name

def save(self, *args, **kwargs):
self.name = self.name.strip()
super().save(*args, **kwargs)


# noinspection PyUnresolvedReferences
class Trip(models.Model):
"""Caving trip model."""
Expand Down Expand Up @@ -119,14 +142,19 @@ class Trip(models.Model):
choices=TRIP_TYPES,
default=SPORT,
)
cavers = models.CharField(
cavers_old = models.CharField(
max_length=250,
blank=True,
help_text=(
"A comma-separated list of cavers that were on this trip. "
"Avoid adding yourself to this list."
),
)
cavers = models.ManyToManyField(
Caver,
blank=True,
help_text="A list of cavers that were on this trip.",
)
clubs = models.CharField(
max_length=100,
blank=True,
Expand Down
4 changes: 2 additions & 2 deletions app/templates/logger/_trip_data_blocks.html
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
{% load users_tags %}
{% load logger_tags %}

{% if trip.cavers %}
{% if trip.cavers.all %}
<div class="row mb-3">
<div class="col">
<small class="text-muted trip-field">Cavers</small><br />
{{ trip.cavers }}
{{ trip.cavers.all|join:", " }}
</div>
</div>
{% endif %}
Expand Down
4 changes: 2 additions & 2 deletions app/templates/logger/profile.html
Original file line number Diff line number Diff line change
Expand Up @@ -179,10 +179,10 @@
</td>
</tr>

{% if trip.cavers and show_cavers %}
{% if trip.cavers.all and show_cavers %}
<tr id="caver-list" data-href="{{ trip.get_absolute_url }}">
<td colspan="{% if profile_user.disable_distance_statistics %}5{% else %}7{% endif %}" class="pb-3 pt-3 px-3 text-primary">
with {{ trip.cavers }}
with {{ trip.cavers.all|join:", " }}
</td>
</tr>
{% endif %}
Expand Down

0 comments on commit 53c0033

Please sign in to comment.