Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
56db5fe
Add some additional basic nutritional values validation for ingredients
rolandgeider Jul 19, 2024
9606d5f
Replace bleach with nh3 and implement Markdown support for exercises
Dec 9, 2025
555f6f8
Implement exercises description migration and finalize security
Dec 10, 2025
a316eb0
Merge branch 'wger-project:master' into markdown
Frenzy-code Dec 10, 2025
6521873
Auto-reformatted code
Dec 10, 2025
6b26e1c
Merge branch 'master' into fork/Frenzy-code/markdown
rolandgeider Feb 6, 2026
fc55eb8
Use the markdown description when handling the submission endpoint
rolandgeider Feb 8, 2026
71f2f4c
Move logic from management command to migration.
rolandgeider Feb 8, 2026
4bef696
Remove bleach, this is not needed anymore
rolandgeider Feb 8, 2026
ae30122
feat(measurements): replace DateField with DateTimeField and remove u…
sg172003 Mar 18, 2026
1f6c325
Simplify the way the units are handled for nutritional plans
rolandgeider Mar 30, 2026
2a19fa0
Format code
rolandgeider Apr 9, 2026
f33acfd
Merge branch 'master' into fork/sg172003/feature/measurement-datetime…
rolandgeider Apr 9, 2026
1d1cb69
Merge branch 'feature/rework-nutrition-units' into feature/version-2.5
rolandgeider Apr 10, 2026
60c8124
Merge branch 'fork/Frenzy-code/markdown' into feature/version-2.5
rolandgeider Apr 10, 2026
0154996
Fix migrations
rolandgeider Apr 10, 2026
9806f9c
Update AUTHORS.md
rolandgeider Apr 10, 2026
73028c1
Bump app and min app versions
rolandgeider Apr 10, 2026
1908657
Update .po files
rolandgeider Apr 10, 2026
f15f858
Update exercise data
rolandgeider Apr 10, 2026
45c559b
Refactor filter-fixtures.py a bit
rolandgeider Apr 10, 2026
caeca35
Backport the UUIDv7 implemtation from the "powersync" branch
rolandgeider Apr 11, 2026
e2da616
Add a UUID field to the ingredient units
rolandgeider Apr 11, 2026
d7cafdf
Merge branch 'master' into feature/rework-nutrition-units
rolandgeider Apr 11, 2026
9b7c931
Properly handle units in the ingredient sync
rolandgeider Apr 11, 2026
449f1a9
Better handling of some edge cases, some refactoring
rolandgeider Apr 11, 2026
6ee64ea
Extract common logic
rolandgeider Apr 11, 2026
87aae71
Merge PR #1726 (plus some changes)
rolandgeider Apr 11, 2026
3febe99
Just for completeness, check the validity of the Nutriscore
rolandgeider Apr 11, 2026
a4d0ff3
Smooth ingredient import/export progress bar
rolandgeider Apr 11, 2026
0c407bd
Merge branch 'feature/rework-nutrition-units' into feature/version-2.5
rolandgeider Apr 11, 2026
5cb269d
Sync exercise variations as well
rolandgeider Apr 12, 2026
7a4b7e2
Make tests more robusts
rolandgeider Apr 12, 2026
e5bc2d2
Add orphan variation handling to exercises health check command
rolandgeider Apr 12, 2026
e5e2bda
Move the exercise variation to a field in the exercise table
rolandgeider Apr 13, 2026
b6b9914
Cleanup the ci settings
rolandgeider Apr 13, 2026
6fecb13
Add PR link to variations group blurb in changelog
rolandgeider Apr 13, 2026
ae870e8
Improve overview cache test
rolandgeider Apr 13, 2026
0dc3ec1
Cleanup
rolandgeider Apr 13, 2026
473b5c5
Merge branch 'feature/sync-variations' into feature/version-2.5
rolandgeider Apr 13, 2026
3a033ae
Cleanup and fixes
rolandgeider Apr 13, 2026
ebf67c9
Split migrations so that each can run in its own transaction
rolandgeider Apr 13, 2026
9f8e0a0
Make the description source non-nullable
rolandgeider Apr 13, 2026
c079b92
Update initial exercise fixtures
rolandgeider Apr 13, 2026
a449e0c
Set the description source in test exercise data
rolandgeider Apr 13, 2026
830859d
Set missing fields to test ingredients
rolandgeider Apr 13, 2026
c48d5be
Improve display of vegetarian, vegan and nutri-score values
rolandgeider Apr 13, 2026
eda1bb7
Properly split all language codes
rolandgeider Apr 13, 2026
a407b83
Make nutri-score badge more consistent
rolandgeider Apr 14, 2026
ffe1734
Remove the deprecated exercise search endpoint
rolandgeider Apr 14, 2026
3067193
Delete the models in the correct order
rolandgeider Apr 14, 2026
4b1a1f1
Also limit the license name length to 200 characters
rolandgeider Apr 14, 2026
9a1687c
Make tests more robust
rolandgeider Apr 14, 2026
9ff01c3
Add vegan, vegetarian, and nutri-score values to import test mocks
rolandgeider Apr 14, 2026
6ef1b5e
Update @wger-project/react-components to 26.4.14
rolandgeider Apr 14, 2026
e76d9c4
Merge branch 'fork/sg172003/feature/measurement-datetime-field' into …
rolandgeider Apr 14, 2026
3b2ab21
Update test fixtures
rolandgeider Apr 14, 2026
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
2 changes: 1 addition & 1 deletion .github/workflows/docker-base.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@ jobs:
push: true
file: extras/docker/base/Dockerfile
platforms: linux/amd64,linux/arm64,linux/arm/v7
tags: ${{ vars.REGISTRY_REPO }}/base:latest,${{ vars.REGISTRY_REPO }}/base:2.4-dev
tags: ${{ vars.REGISTRY_REPO }}/base:latest,${{ vars.REGISTRY_REPO }}/base:2.5-dev
38 changes: 35 additions & 3 deletions AUTHORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,36 @@

Thank you all for contributing to the project, you are true heroes! 🫶

*Generated on 2026-01-18*
*Generated on 2026-04-10*

---

## Contributors

- Github-actions - [https://github.com/invalid-email-address](https://github.com/invalid-email-address)
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
- Github-actions - [https://github.com/invalid-email-address](https://github.com/invalid-email-address)
- pankaj-basnet - [https://github.com/pankaj-basnet](https://github.com/pankaj-basnet)
- Luca van der Wijngaart - [https://github.com/lvdwijngaart](https://github.com/lvdwijngaart)
- Luca van der Wijngaart - [https://github.com/lvdwijngaart](https://github.com/lvdwijngaart)
- OTijmen - [https://github.com/OTijmen](https://github.com/OTijmen)
- betterrrrr - [https://github.com/betterrrrr](https://github.com/betterrrrr)
- Imad Rahhali - [https://github.com/ImadRahhali](https://github.com/ImadRahhali)
- MadoctheHadoc - [https://github.com/MadoctheHadoc](https://github.com/MadoctheHadoc)
- Ilya - [https://github.com/Really-Fun](https://github.com/Really-Fun)
- shihab - [https://github.com/shihabhasan0161](https://github.com/shihabhasan0161)
- infektyd - [https://github.com/infektyd](https://github.com/infektyd)
- Sam Tucker-Davis - [https://github.com/stuckvgn](https://github.com/stuckvgn)
- Stavros Kois - [https://github.com/stavros-k](https://github.com/stavros-k)
- AlexisBirling3
- Sam - [https://github.com/stuckvgn](https://github.com/stuckvgn)
- stuckvgn - [https://github.com/stuckvgn](https://github.com/stuckvgn)
- Francisco - [https://github.com/franchsli](https://github.com/franchsli)
- cryptbrn - [https://github.com/cryptbrn](https://github.com/cryptbrn)
- ndimoro - [https://github.com/ndimoro](https://github.com/ndimoro)
- yontank - [https://github.com/yontank](https://github.com/yontank)
- Justin - [https://github.com/justin-pinheiro](https://github.com/justin-pinheiro)
- Justin Pinheiro - [https://github.com/justin-pinheiro](https://github.com/justin-pinheiro)
- tbouri - [https://github.com/tbouri](https://github.com/tbouri)
- HairyCrabW - [https://github.com/HairyCrabW](https://github.com/HairyCrabW)
- Jeremy - [https://github.com/zru-1](https://github.com/zru-1)
- Yousef - [https://github.com/yza-cmu](https://github.com/yza-cmu)
Expand Down Expand Up @@ -179,6 +199,7 @@ Thank you all for contributing to the project, you are true heroes! 🫶

### Chinese (Simplified Han script)

- youkarin - [https://github.com/yukarin4869](https://github.com/yukarin4869)
- KW Lam - [https://github.com/loksonlkw](https://github.com/loksonlkw)
- Herb Huang

Expand Down Expand Up @@ -212,6 +233,7 @@ Thank you all for contributing to the project, you are true heroes! 🫶

### Danish

- Thomas Hansen - [https://github.com/BitKid-exe](https://github.com/BitKid-exe)
- Fedder Skovgaard - [https://github.com/fedders](https://github.com/fedders)
- Tomasz Cielecki - [https://github.com/Cheesebaron](https://github.com/Cheesebaron)
- Roland Geider - [https://github.com/rolandgeider](https://github.com/rolandgeider)
Expand Down Expand Up @@ -241,6 +263,7 @@ Thank you all for contributing to the project, you are true heroes! 🫶

### French

- Thomas Peyrot - [https://github.com/Thomas-PEYROT](https://github.com/Thomas-PEYROT)
- Justin Pinheiro - [https://github.com/justin-pinheiro](https://github.com/justin-pinheiro)
- Paul Bonneau - [https://github.com/paulbonneau](https://github.com/paulbonneau)
- Kilian
Expand Down Expand Up @@ -317,12 +340,14 @@ Thank you all for contributing to the project, you are true heroes! 🫶

### Japanese

- heppocogne - [https://github.com/heppocogne](https://github.com/heppocogne)
- Ryohei Morimoto - [https://github.com/Ryohei-Caulked](https://github.com/Ryohei-Caulked)
- sasukeiscool - [https://github.com/sasukeiscool](https://github.com/sasukeiscool)
- yuki chi - [https://github.com/kumo2kumo](https://github.com/kumo2kumo)

### Korean

- Hosted Weblate user 141821
- kobo
- 고수처럼 - [https://github.com/rrrmaster](https://github.com/rrrmaster)
- Gyu-sun Youm - [https://github.com/Perlmint](https://github.com/Perlmint)
Expand Down Expand Up @@ -358,6 +383,7 @@ Thank you all for contributing to the project, you are true heroes! 🫶

### Portuguese

- Edson Wolf - [https://github.com/edsonblwolf](https://github.com/edsonblwolf)
- Ninguém Mesmo
- Luiz Felipe Guidorizzi de Oliveira - [https://github.com/EvilMonark](https://github.com/EvilMonark)
- Wilton Rodrigues
Expand All @@ -376,6 +402,7 @@ Thank you all for contributing to the project, you are true heroes! 🫶

### Romanian

- Teodor Olteanu - [https://github.com/StickSy](https://github.com/StickSy)
- Vlad Bejenaru - [https://github.com/vladbejenaru](https://github.com/vladbejenaru)
- B Sebastian
- Daniel Vigaru - [https://github.com/danielvigaru](https://github.com/danielvigaru)
Expand All @@ -400,6 +427,7 @@ Thank you all for contributing to the project, you are true heroes! 🫶

### Spanish

- David Peñas - [https://github.com/davidpgomez](https://github.com/davidpgomez)
- v7mbz
- Jose David Villegas (JoseDv1) - [https://github.com/JoseDv1](https://github.com/JoseDv1)
- Oscar González - [https://github.com/ogrydc](https://github.com/ogrydc)
Expand All @@ -426,6 +454,10 @@ Thank you all for contributing to the project, you are true heroes! 🫶
- stefan - [https://github.com/clint1337](https://github.com/clint1337)
- Allan Nordhøy - [https://github.com/comradekingu](https://github.com/comradekingu)

### Tamil

- saraswathi - [https://github.com/saraswathirajkumar18](https://github.com/saraswathirajkumar18)

### Turkish

- Oğuz Ersen - [https://github.com/oersen](https://github.com/oersen)
Expand All @@ -435,7 +467,7 @@ Thank you all for contributing to the project, you are true heroes! 🫶

### Ukrainian

- Максим Горпиніч - [https://github.com/maksim2005UKR](https://github.com/maksim2005UKR)
- Максим Горпиніч
- Максим Горпиніч - [https://github.com/Maksim2005UA](https://github.com/Maksim2005UA)
- Максим Горпиніч
- Максим Горпиніч
Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,16 @@ timer or similar. The `setting-repetitionunit` endpoint now exposes the new fiel

<https://github.com/wger-project/wger/issues/2124>
Automatically read the date from uploaded image to the gallery.

<https://github.com/wger-project/wger/pull/2292> Move the variation ID from an
(empty) table to a field in the exercise model. This simplifies a lot of code
and allows us to properly sync them to local instances as well.
The API endpoint `/api/v2/variations/` API endpoint has been removed.

Improve serving size support for ingredients. Users can now log food in
everyday units like "1 Serving (2 biscuits)" or "1 Cup" instead of only grams,
with serving sizes automatically imported from Open Food Facts.
The `/api/v2/weightunit/` endpoint has been removed.

The deprecated API endpoint `/api/v2/exercise/search/` has been removed. Use the
regular `/api/v2/exerciseinfo/` endpoint with appropriate query parameters instead.
153 changes: 80 additions & 73 deletions extras/scripts/filter-fixtures.py
100644 → 100755
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# -*- coding: utf-8 -*-
#!/usr/bin/env python3

# This file is part of wger Workout Manager.
#
Expand All @@ -19,93 +19,100 @@
manageable chunks.

After dumping the database (or parts of it), just copy the file and filter it:
python ./manage.py dumpdata --indent 4 --natural-foreign > extras/scripts/data.json
python ./manage.py dumpdata --indent 4 --natural-foreign exercises > extras/scripts/data.json
cd extras/scripts
python3 filter-fixtures.py
mv exercises.json ../../wger/exercises/fixtures/
mv categories.json muscles.json equipment.json translations.json exercise-base-data.json ../../wger/exercises/fixtures
...
rm *.json
"""

import json
import sys

# This is a full dump of the DB
fixture = open('data.json')
data = json.load(fixture)
fixture.close()


def filter_dump(model_list, filename):
def filter_dump(data, model_list, filename):
"""
Helper function
"""
filter_data = [i for i in data if i['model'] in model_list]
if filter_data:
with open(filename, 'w') as outfile:
# Filter out submission models that are not accepted, if an entry
# has no 'status' field, add them all
out_data = [entry for entry in filter_data if entry['fields'].get('status', '2') == '2']
json.dump(out_data, outfile, indent=4)
model_set = set(model_list)
filter_data = [i for i in data if i['model'] in model_set]
if not filter_data:
# print(f'Warning: no data found for {model_list}')
return

with open(filename, 'w') as outfile:
json.dump(filter_data, outfile, indent=4)

#
# Ingredients
#
filter_dump(('nutrition.ingredient',), 'ingredients.json')
filter_dump(('nutrition.weightunit',), 'weight_units.json')
filter_dump(('nutrition.ingredientweightunit',), 'ingredient_units.json')
filter_dump(('nutrition.logitem',), 'nutrition_diary.json')

#
# Exercises
#
filter_dump(('exercises.muscle',), 'muscles.json')
filter_dump(('exercises.exercisecategory',), 'categories.json')
filter_dump(('exercises.exerciseimage',), 'exercise-images.json')
filter_dump(
(
'exercises.exercise',
'exercises.variation',
),
'exercise-base-data.json',
)
filter_dump(
('exercises.translation', 'exercises.exercisecomment', 'exercises.alias'), 'translations.json'
)
filter_dump(
(
'exercises.equipment',
'exercises.equipment',
),
'equipment.json',
)
def main():
# This is a full dump of the DB
try:
with open('data.json') as fixture:
data = json.load(fixture)
except FileNotFoundError:
sys.exit('Error: data.json not found. Please run dumpdata first (see docstring for usage).')
except json.JSONDecodeError as e:
sys.exit(f'Error: data.json contains invalid JSON: {e}')

#
# Gym
#
filter_dump(('gym.gym',), 'gyms.json')
filter_dump(('gym.gymconfig',), 'gym_config.json')
filter_dump(('gym.gymadminconfig',), 'gym_adminconfig.json')
filter_dump(('gym.gymuserconfig',), 'gym_userconfig.json')
filter_dump(('gym.adminusernote',), 'gym_admin_user_notes.json')
filter_dump(('gym.userdocument',), 'gym_user_documents.json')
filter_dump(('gym.contract',), 'gym_contracts.json')
#
# Ingredients
#
filter_dump(data, ('nutrition.ingredient',), 'ingredients.json')
filter_dump(data, ('nutrition.weightunit',), 'weight_units.json')
filter_dump(data, ('nutrition.ingredientweightunit',), 'ingredient_units.json')
filter_dump(data, ('nutrition.logitem',), 'nutrition_diary.json')

#
# Core
#
filter_dump(('core.gym',), 'gyms.json')
filter_dump(('core.language',), 'languages.json')
filter_dump(('core.license',), 'licenses.json')
filter_dump(('core.repetitionunit',), 'repetition_units.json')
#
# Exercises
#
filter_dump(data, ('exercises.muscle',), 'muscles.json')
filter_dump(data, ('exercises.exercisecategory',), 'categories.json')
filter_dump(data, ('exercises.exerciseimage',), 'exercise-images.json')
filter_dump(
data,
(
'exercises.exercise',
'exercises.variation',
),
'exercise-base-data.json',
)
filter_dump(
data,
('exercises.translation', 'exercises.exercisecomment', 'exercises.alias'),
'translations.json',
)
filter_dump(data, ('exercises.equipment',), 'equipment.json')

#
# Configurations
#
filter_dump(('config.gymconfig',), 'gym_config.json')
#
# Gym
#
filter_dump(data, ('gym.gym',), 'gyms.json')
filter_dump(data, ('gym.gymconfig',), 'gym_config.json')
filter_dump(data, ('gym.gymadminconfig',), 'gym_adminconfig.json')
filter_dump(data, ('gym.gymuserconfig',), 'gym_userconfig.json')
filter_dump(data, ('gym.adminusernote',), 'gym_admin_user_notes.json')
filter_dump(data, ('gym.userdocument',), 'gym_user_documents.json')
filter_dump(data, ('gym.contract',), 'gym_contracts.json')

#
# Other
#
filter_dump(('auth.group',), 'groups.json')
filter_dump(('auth.user',), 'users.json')
#
# Core
#
filter_dump(data, ('core.gym',), 'gyms.json')
filter_dump(data, ('core.language',), 'languages.json')
filter_dump(data, ('core.license',), 'licenses.json')
filter_dump(data, ('core.repetitionunit',), 'repetition_units.json')

#
# Configurations
#
filter_dump(data, ('config.gymconfig',), 'gym_config.json')

#
# Other
#
filter_dump(data, ('auth.group',), 'groups.json')
filter_dump(data, ('auth.user',), 'users.json')


if __name__ == '__main__':
main()
Loading
Loading