Skip to content

Commit

Permalink
Add foreign key to the user table
Browse files Browse the repository at this point in the history
This is only needed because powersync can't handle joins
  • Loading branch information
rolandgeider committed Sep 18, 2024
1 parent 2b6949f commit c6163de
Show file tree
Hide file tree
Showing 10 changed files with 608 additions and 415 deletions.
738 changes: 385 additions & 353 deletions wger/nutrition/fixtures/test-nutrition-data.json

Large diffs are not rendered by default.

119 changes: 62 additions & 57 deletions wger/nutrition/fixtures/test-nutrition-diary.json
Original file line number Diff line number Diff line change
@@ -1,62 +1,67 @@
[
{
"fields": {
"plan": 1,
"datetime": "2016-05-15T12:01:00Z",
"ingredient": 5,
"comment": "",
"amount": "2",
"weight_unit": 1
},
"pk": 1,
"model": "nutrition.logitem"
{
"fields": {
"plan": 1,
"user": 2,
"datetime": "2016-05-15T12:01:00Z",
"ingredient": 5,
"comment": "",
"amount": "2",
"weight_unit": 1
},
{
"fields": {
"plan": 1,
"datetime": "2016-05-15T12:01:15Z",
"ingredient": 4,
"comment": "",
"amount": "100",
"weight_unit": null
},
"pk": 2,
"model": "nutrition.logitem"
"pk": 1,
"model": "nutrition.logitem"
},
{
"fields": {
"plan": 1,
"user": 2,
"datetime": "2016-05-15T12:01:15Z",
"ingredient": 4,
"comment": "",
"amount": "100",
"weight_unit": null
},
{
"fields": {
"plan": 1,
"datetime": "2016-05-15T12:01:00Z",
"ingredient": 1,
"comment": "",
"amount": "75",
"weight_unit": null
},
"pk": 3,
"model": "nutrition.logitem"
"pk": 2,
"model": "nutrition.logitem"
},
{
"fields": {
"plan": 1,
"user": 2,
"datetime": "2016-05-15T12:01:00Z",
"ingredient": 1,
"comment": "",
"amount": "75",
"weight_unit": null
},
{
"fields": {
"plan": 1,
"datetime": "2016-05-14T17:11:33Z",
"ingredient": 1,
"comment": "",
"amount": "75",
"weight_unit": null
},
"pk": 4,
"model": "nutrition.logitem"
"pk": 3,
"model": "nutrition.logitem"
},
{
"fields": {
"plan": 1,
"user": 2,
"datetime": "2016-05-14T17:11:33Z",
"ingredient": 1,
"comment": "",
"amount": "75",
"weight_unit": null
},
{
"fields": {
"plan": 2,
"datetime": "2016-05-14T17:11:33Z",
"ingredient": 1,
"comment": "",
"amount": "75",
"weight_unit": null
},
"pk": 4,
"model": "nutrition.logitem"
}
]
"pk": 4,
"model": "nutrition.logitem"
},
{
"fields": {
"plan": 2,
"user": 1,
"datetime": "2016-05-14T17:11:33Z",
"ingredient": 1,
"comment": "",
"amount": "75",
"weight_unit": null
},
"pk": 4,
"model": "nutrition.logitem"
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ def handle(self, **options):
for _ in range(0, options['nr_diary_entries']):
log = LogItem(
plan=plan,
user=user,
datetime=date,
ingredient=choice(ingredients),
weight_unit=None,
Expand Down
1 change: 1 addition & 0 deletions wger/nutrition/migrations/0025_create_publication.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

# TODO move to more appropriate place


def add_publication(apps, schema_editor):
if is_postgres_db():
schema_editor.execute(
Expand Down
103 changes: 103 additions & 0 deletions wger/nutrition/migrations/0026_add_user_foreign_key.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# Generated by Django 4.2.13 on 2024-09-18 13:26

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


def add_foreign_key(apps, schema_editor):
Meal = apps.get_model('nutrition', 'Meal')
MealItem = apps.get_model('nutrition', 'MealItem')
Log = apps.get_model('nutrition', 'LogItem')

for meal in Meal.objects.all():
meal.user = meal.plan.user
meal.save()

for item in MealItem.objects.all():
item.user = item.meal.plan.user
item.save()

for log in Log.objects.all():
log.user = log.plan.user
log.save()


class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('nutrition', '0025_create_publication'),
]

operations = [
# Foreign key nullable
migrations.AddField(
model_name='meal',
name='user',
field=models.ForeignKey(
null=True,
editable=False,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
verbose_name='User',
),
),
migrations.AddField(
model_name='mealitem',
name='user',
field=models.ForeignKey(
null=True,
editable=False,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
verbose_name='User',
),
),
migrations.AddField(
model_name='logitem',
name='user',
field=models.ForeignKey(
null=True,
editable=False,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
verbose_name='User',
),
),
# Migrate
migrations.RunPython(add_foreign_key, reverse_code=migrations.RunPython.noop),
# Foreign key non nullable
migrations.AlterField(
model_name='meal',
name='user',
field=models.ForeignKey(
null=False,
editable=False,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
verbose_name='User',
),
),
migrations.AlterField(
model_name='mealitem',
name='user',
field=models.ForeignKey(
null=False,
editable=False,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
verbose_name='User',
),
),
migrations.AlterField(
model_name='logitem',
name='user',
field=models.ForeignKey(
null=False,
editable=False,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
verbose_name='User',
),
),
]
17 changes: 17 additions & 0 deletions wger/nutrition/models/log.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from decimal import Decimal

# Django
from django.contrib.auth.models import User
from django.core.validators import (
MaxValueValidator,
MinValueValidator,
Expand Down Expand Up @@ -68,6 +69,18 @@ class Meta:
The meal this log belongs to (optional)
"""

user = models.ForeignKey(
User,
verbose_name=_('User'),
editable=False,
on_delete=models.CASCADE,
)
"""
NOTE: this foreign key is only needed for powersync since it currently
can't use joins. Since this could change in the future, do not use
it if it can be avoided.
"""

datetime = models.DateTimeField(verbose_name=_('Date and Time (Approx.)'), default=timezone.now)
"""
Time and date when the log was added
Expand Down Expand Up @@ -118,6 +131,10 @@ def __str__(self):
"""
return f'Diary entry for {self.datetime}, plan {self.plan.pk}'

def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
self.user = self.plan.user
super().save(force_insert, force_update, using, update_fields)

def get_owner_object(self):
"""
Returns the object that has owner information
Expand Down
20 changes: 18 additions & 2 deletions wger/nutrition/models/meal.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,13 @@

# Standard Library
import logging
from decimal import Decimal

# Django
from django.contrib.auth.models import User
from django.db import models
from django.utils.translation import gettext_lazy as _

# wger
from wger.utils.constants import TWOPLACES
from wger.utils.fields import Html5TimeField

# Local
Expand Down Expand Up @@ -51,6 +50,19 @@ class Meta:
editable=False,
on_delete=models.CASCADE,
)

user = models.ForeignKey(
User,
verbose_name=_('User'),
editable=False,
on_delete=models.CASCADE,
)
"""
NOTE: this foreign key is only needed for powersync since it currently
can't use joins. Since this could change in the future, do not use
it if it can be avoided.
"""

order = models.IntegerField(
verbose_name=_('Order'),
blank=True,
Expand All @@ -76,6 +88,10 @@ def __str__(self):
"""
return f'{self.order} Meal'

def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
self.user = self.plan.user
super().save(force_insert, force_update, using, update_fields)

def get_owner_object(self):
"""
Returns the object that has owner information
Expand Down
19 changes: 19 additions & 0 deletions wger/nutrition/models/meal_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from decimal import Decimal

# Django
from django.contrib.auth.models import User
from django.core.validators import (
MaxValueValidator,
MinValueValidator,
Expand Down Expand Up @@ -49,11 +50,25 @@ class MealItem(BaseMealItem, models.Model):
editable=False,
on_delete=models.CASCADE,
)

user = models.ForeignKey(
User,
verbose_name=_('User'),
editable=False,
on_delete=models.CASCADE,
)
"""
NOTE: this foreign key is only needed for powersync since it currently
can't use joins. Since this could change in the future, do not use
it if it can be avoided.
"""

ingredient = models.ForeignKey(
Ingredient,
verbose_name=_('Ingredient'),
on_delete=models.CASCADE,
)

weight_unit = models.ForeignKey(
IngredientWeightUnit,
verbose_name=_('Weight unit'),
Expand All @@ -80,6 +95,10 @@ def __str__(self):
"""
return f'{self.amount}g ingredient {self.ingredient_id}'

def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
self.user = self.meal.plan.user
super().save(force_insert, force_update, using, update_fields)

def get_owner_object(self):
"""
Returns the object that has owner information
Expand Down
2 changes: 0 additions & 2 deletions wger/nutrition/models/plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
# Standard Library
import datetime
import logging
from decimal import Decimal

# Django
from django.contrib.auth.models import User
Expand All @@ -30,7 +29,6 @@
from wger.nutrition.consts import ENERGY_FACTOR
from wger.nutrition.helpers import NutritionalValues
from wger.utils.cache import cache_mapper
from wger.utils.constants import TWOPLACES
from wger.weight.models import WeightEntry


Expand Down
3 changes: 2 additions & 1 deletion wger/utils/db.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@
from django.conf import settings


def is_postgres_db():
def is_postgres_db() -> bool:
"""Check if the application is using a postgres database"""
return 'postgres' in settings.DATABASES['default']['ENGINE']

0 comments on commit c6163de

Please sign in to comment.