Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify translatable models to use a shared Mixin #257

Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,14 @@
Contact,
Coordinate,
Fertilizertype,
FertilizertypeInternationalization,
Internationalization,
Mulchlayertype,
MulchlayertypeInternationalization,
Post,
Role,
Site,
Siteadmin,
Sitetreespecies,
Sitetype,
SitetypeInternationalization,
TreespeciestypeInternationalization,
Treetype,
User,
)
Expand Down Expand Up @@ -402,7 +399,7 @@ def create_fertilizer_types(self):
]
for _ in fertilizer_types:
Fertilizertype.objects.create(
name=FertilizertypeInternationalization.objects.create(en=_[0], fr=_[1])
name=Internationalization.objects.create(en=_[0], fr=_[1])
)

def create_mulch_layer_types(self):
Expand All @@ -416,14 +413,12 @@ def create_mulch_layer_types(self):
]
for _ in mulch_layer_types:
Mulchlayertype.objects.create(
name=MulchlayertypeInternationalization.objects.create(en=_[0], fr=_[1])
name=Internationalization.objects.create(en=_[0], fr=_[1])
)

def create_tree_types(self):
for _ in tree_types:
Treetype.objects.create(
name=TreespeciestypeInternationalization.objects.create(en=_[0], fr=_[1])
)
Treetype.objects.create(name=Internationalization.objects.create(en=_[0], fr=_[1]))

def create_site_types(self):
site_types = [
Expand All @@ -435,9 +430,7 @@ def create_site_types(self):
]

for _ in site_types:
Sitetype.objects.create(
name=SitetypeInternationalization.objects.create(en=_[0], fr=_[1])
)
Sitetype.objects.create(name=Internationalization.objects.create(en=_[0], fr=_[1]))

def create_assets(self):
image_file_names = (
Expand Down Expand Up @@ -505,9 +498,7 @@ def create_sites(self):
site1 = Site.objects.create(
name="Canopeum",
is_public=True,
site_type=Sitetype.objects.get(
name=SitetypeInternationalization.objects.get(en="Parks")
),
site_type=Sitetype.objects.get(name=Internationalization.objects.get(en="Parks")),
coordinate=Coordinate.objects.create(
dms_latitude="45°30'06.1\"N",
dms_longitude="73°34'02.3\"W",
Expand Down Expand Up @@ -558,9 +549,7 @@ def create_sites(self):
site_2 = Site.objects.create(
name="Maple Grove Retreat",
is_public=True,
site_type=Sitetype.objects.get(
name=SitetypeInternationalization.objects.get(en="Parks")
),
site_type=Sitetype.objects.get(name=Internationalization.objects.get(en="Parks")),
coordinate=Coordinate.objects.create(
dms_latitude="46°48'33.6\"N",
dms_longitude="71°18'40.0\"W",
Expand Down Expand Up @@ -594,9 +583,7 @@ def create_sites(self):
site_3 = Site.objects.create(
name="Lakeside Oasis",
is_public=True,
site_type=Sitetype.objects.get(
name=SitetypeInternationalization.objects.get(en="Parks")
),
site_type=Sitetype.objects.get(name=Internationalization.objects.get(en="Parks")),
coordinate=Coordinate.objects.create(
dms_latitude="48°36'05.0\"N",
dms_longitude="71°18'27.0\"W",
Expand Down Expand Up @@ -631,9 +618,7 @@ def create_sites(self):
site_4 = Site.objects.create(
name="Evergreen Trail",
is_public=False,
site_type=Sitetype.objects.get(
name=SitetypeInternationalization.objects.get(en="Parks")
),
site_type=Sitetype.objects.get(name=Internationalization.objects.get(en="Parks")),
coordinate=Coordinate.objects.create(
dms_latitude="46°12'30.0\"N",
dms_longitude="74°35'30.0\"W",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Generated by Django 5.1 on 2024-10-03 18:38

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


class Migration(migrations.Migration):

dependencies = [
("canopeum_backend", "0001_initial"),
]

operations = [
migrations.AlterField(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

migration seems to only be good for if the db is empty, is it ok? Since FK won't be found in the other table unless we add them first.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah probably better off squashing the migrations again to get devs to regenerate the DB (we won't be able to do that once we have real data on prod, but for now it's an easy shortcut)

model_name="fertilizertype",
name="name",
field=models.ForeignKey(
on_delete=django.db.models.deletion.DO_NOTHING,
to="canopeum_backend.internationalization",
),
),
migrations.AlterField(
model_name="mulchlayertype",
name="name",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
to="canopeum_backend.internationalization",
),
),
migrations.AlterField(
model_name="sitetype",
name="name",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
to="canopeum_backend.internationalization",
),
),
migrations.AlterField(
model_name="treetype",
name="name",
field=models.ForeignKey(
on_delete=django.db.models.deletion.DO_NOTHING,
to="canopeum_backend.internationalization",
),
),
migrations.DeleteModel(
name="FertilizertypeInternationalization",
),
migrations.DeleteModel(
name="MulchlayertypeInternationalization",
),
migrations.DeleteModel(
name="SitetypeInternationalization",
),
migrations.DeleteModel(
name="TreespeciestypeInternationalization",
),
]
32 changes: 5 additions & 27 deletions canopeum_backend/canopeum_backend/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,13 +126,13 @@ def from_dms_lat_long(cls, dms_latitude: str, dms_longitude: str):
)


class SitetypeInternationalization(models.Model):
class Internationalization(models.Model):
en = models.TextField(db_column="EN", blank=True, null=True)
fr = models.TextField(db_column="FR", blank=True, null=True)


class Sitetype(models.Model):
name = models.ForeignKey(SitetypeInternationalization, models.DO_NOTHING, blank=True, null=True)
name = models.ForeignKey(Internationalization, models.DO_NOTHING, blank=True, null=True)

@override
def delete(self, using=None, keep_parents=False):
Expand Down Expand Up @@ -237,13 +237,8 @@ def plant_count(self) -> int:
return sum(specie.quantity for specie in batch_species)


class FertilizertypeInternationalization(models.Model):
en = models.TextField(db_column="EN", blank=True, null=True)
fr = models.TextField(db_column="FR", blank=True, null=True)


class Fertilizertype(models.Model):
name = models.ForeignKey(FertilizertypeInternationalization, models.DO_NOTHING)
name = models.ForeignKey(Internationalization, models.DO_NOTHING)


class Batchfertilizer(models.Model):
Expand All @@ -258,15 +253,8 @@ class Meta:
)


class MulchlayertypeInternationalization(models.Model):
en = models.TextField(db_column="EN", blank=True, null=True)
fr = models.TextField(db_column="FR", blank=True, null=True)


class Mulchlayertype(models.Model):
name = models.ForeignKey(
MulchlayertypeInternationalization, models.DO_NOTHING, blank=True, null=True
)
name = models.ForeignKey(Internationalization, models.DO_NOTHING, blank=True, null=True)


class Batchmulchlayer(models.Model):
Expand All @@ -281,13 +269,8 @@ class Meta:
)


class TreespeciestypeInternationalization(models.Model):
en = models.TextField(db_column="EN", blank=True, null=True)
fr = models.TextField(db_column="FR", blank=True, null=True)


class Treetype(models.Model):
name = models.ForeignKey(TreespeciestypeInternationalization, models.DO_NOTHING)
name = models.ForeignKey(Internationalization, models.DO_NOTHING)


class BatchSpecies(models.Model):
Expand Down Expand Up @@ -403,11 +386,6 @@ class Like(models.Model):
post = models.ForeignKey(Post, models.CASCADE)


class Internationalization(models.Model):
en = models.TextField(db_column="EN", blank=True, null=True)
fr = models.TextField(db_column="FR", blank=True, null=True)


# Everything under here are type overrides


Expand Down
74 changes: 27 additions & 47 deletions canopeum_backend/canopeum_backend/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,64 +186,49 @@ class Meta:
fields = ("en", "fr")


class SiteTypeSerializer(serializers.ModelSerializer[Sitetype]):
# Note about Any: Generic is the type of "instance", not set here
class TranslatableSerializerMixin(serializers.Serializer[Any]):
en = serializers.SerializerMethodField()
fr = serializers.SerializerMethodField()
__translate_key__ = "name"

class Meta:
model = Sitetype
fields = ("id", "en", "fr")
abstract = True
fields = ("en", "fr")

def get_en(self, obj):
return InternationalizationSerializer(obj.name).data.get("en", None)
return InternationalizationSerializer(getattr(obj, self.__translate_key__)).data.get("en")

def get_fr(self, obj):
return InternationalizationSerializer(obj.name).data.get("fr", None)
return InternationalizationSerializer(getattr(obj, self.__translate_key__)).data.get("fr")


class TreeTypeSerializer(serializers.ModelSerializer[Treetype]):
en = serializers.SerializerMethodField()
fr = serializers.SerializerMethodField()

class SiteTypeSerializer(serializers.ModelSerializer[Sitetype], TranslatableSerializerMixin):
class Meta:
model = Treetype
fields = ("id", "en", "fr")

def get_en(self, obj):
return InternationalizationSerializer(obj.name).data.get("en", None)
model = Sitetype
fields = ("id", *TranslatableSerializerMixin.Meta.fields)

def get_fr(self, obj):
return InternationalizationSerializer(obj.name).data.get("fr", None)

class TreeTypeSerializer(serializers.ModelSerializer[Treetype], TranslatableSerializerMixin):
class Meta:
model = Treetype
fields = ("id", *TranslatableSerializerMixin.Meta.fields)

class FertilizerTypeSerializer(serializers.ModelSerializer[Fertilizertype]):
en = serializers.SerializerMethodField()
fr = serializers.SerializerMethodField()

class FertilizerTypeSerializer(
serializers.ModelSerializer[Fertilizertype], TranslatableSerializerMixin
):
class Meta:
model = Fertilizertype
fields = ("id", "en", "fr")

def get_en(self, obj: Fertilizertype):
return InternationalizationSerializer(obj.name).data.get("en", None)
fields = ("id", *TranslatableSerializerMixin.Meta.fields)

def get_fr(self, obj: Fertilizertype):
return InternationalizationSerializer(obj.name).data.get("fr", None)


class MulchLayerTypeSerializer(serializers.ModelSerializer[Mulchlayertype]):
en = serializers.SerializerMethodField()
fr = serializers.SerializerMethodField()

class MulchLayerTypeSerializer(
serializers.ModelSerializer[Mulchlayertype], TranslatableSerializerMixin
):
class Meta:
model = Mulchlayertype
fields = ("id", "en", "fr")

def get_en(self, obj: Mulchlayertype):
return InternationalizationSerializer(obj.name).data.get("en", None)

def get_fr(self, obj: Mulchlayertype):
return InternationalizationSerializer(obj.name).data.get("fr", None)
fields = ("id", *TranslatableSerializerMixin.Meta.fields)


class AnnouncementSerializer(serializers.ModelSerializer[Announcement]):
Expand All @@ -258,24 +243,19 @@ class Meta:
fields = "__all__"


class SitetreespeciesSerializer(serializers.ModelSerializer[Sitetreespecies]):
en = serializers.SerializerMethodField()
fr = serializers.SerializerMethodField()
class SitetreespeciesSerializer(
serializers.ModelSerializer[Sitetreespecies], TranslatableSerializerMixin
):
id = serializers.SerializerMethodField()
__translate_key__ = "tree_type"

class Meta:
model = Sitetreespecies
fields = ("id", "quantity", "en", "fr")
fields = ("id", "quantity", *TranslatableSerializerMixin.Meta.fields)

def get_id(self, obj) -> int:
return TreeTypeSerializer(obj.tree_type).data.get("id", None) # type: ignore[no-any-return]

def get_en(self, obj):
return TreeTypeSerializer(obj.tree_type).data.get("en", None)

def get_fr(self, obj):
return TreeTypeSerializer(obj.tree_type).data.get("fr", None)


class AssetSerializer(serializers.ModelSerializer[Asset]):
asset = serializers.FileField()
Expand Down