diff --git a/apps/food/fixtures/initial.json b/apps/food/fixtures/initial.json new file mode 100644 index 00000000..43a0ffe1 --- /dev/null +++ b/apps/food/fixtures/initial.json @@ -0,0 +1,100 @@ +[ + { + "model": "food.allergen", + "pk": 1, + "fields": { + "name": "Lait" + } + }, + { + "model": "food.allergen", + "pk": 2, + "fields": { + "name": "Oeufs" + } + }, + { + "model": "food.allergen", + "pk": 3, + "fields": { + "name": "Gluten" + } + }, + { + "model": "food.allergen", + "pk": 4, + "fields": { + "name": "Fruits à coques" + } + }, + { + "model": "food.allergen", + "pk": 5, + "fields": { + "name": "Arachides" + } + }, + { + "model": "food.allergen", + "pk": 6, + "fields": { + "name": "Sésame" + } + }, + { + "model": "food.allergen", + "pk": 7, + "fields": { + "name": "Soja" + } + }, + { + "model": "food.allergen", + "pk": 8, + "fields": { + "name": "Céléri" + } + }, + { + "model": "food.allergen", + "pk": 9, + "fields": { + "name": "Lupin" + } + }, + { + "model": "food.allergen", + "pk": 10, + "fields": { + "name": "Moutarde" + } + }, + { + "model": "food.allergen", + "pk": 11, + "fields": { + "name": "Sulfites" + } + }, + { + "model": "food.allergen", + "pk": 12, + "fields": { + "name": "Crustacés" + } + }, + { + "model": "food.allergen", + "pk": 13, + "fields": { + "name": "Mollusques" + } + }, + { + "model": "food.allergen", + "pk": 14, + "fields": { + "name": "Poissons" + } + } +] diff --git a/apps/food/views.py b/apps/food/views.py index a0efd6df..96c6b89e 100644 --- a/apps/food/views.py +++ b/apps/food/views.py @@ -73,7 +73,13 @@ class FoodListView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, Li PermissionBackend.filter_queryset(self.request, Food, 'view')) # table served served_table = self.get_queryset().order_by('-pk').filter( - end_of_life='', is_ready=True) + end_of_life='', is_ready=True).filter( + Q(polymorphic_ctype__model='basicfood', + basicfood__date_type='DLC', + expiry_date__lte=timezone.now(),) + | Q(polymorphic_ctype__model='transformedfood', + expiry_date__lte=timezone.now(), + )) # tables club bureau_role_pk = 4 clubs = Club.objects.filter(membership__in=Membership.objects.filter( @@ -354,7 +360,7 @@ class FoodDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): value) for field, value in fields.items()] context["meals"] = self.object.transformed_ingredient_inv.all() context["update"] = PermissionBackend.check_perm(self.request, "food.change_food") - context["add_ingredient"] = self.object.end_of_life = '' and PermissionBackend.check_perm(self.request, "food.change_transformedfood") + context["add_ingredient"] = (self.object.end_of_life == '' and PermissionBackend.check_perm(self.request, "food.change_transformedfood")) return context def get(self, *args, **kwargs): diff --git a/apps/permission/fixtures/initial.json b/apps/permission/fixtures/initial.json index e6433f82..f1f01dcc 100644 --- a/apps/permission/fixtures/initial.json +++ b/apps/permission/fixtures/initial.json @@ -3307,436 +3307,184 @@ } }, { - "model": "permission.permission", - "pk": 211, - "fields": { - "model": [ - "food", - "transformedfood" - ], - "query": "{}", - "type": "view", - "mask": 3, - "field": "", - "permanent": false, - "description": "Voir tout les plats" - } + "model": "permission.permission", + "pk": 211, + "fields": { + "model": [ + "food", + "qrcode" + ], + "query": "{}", + "type": "view", + "mask": 2, + "permanent": false, + "description": "Voir n'importe quel QR-code" + } }, { - "model": "permission.permission", - "pk": 212, - "fields": { - "model": [ - "food", - "transformedfood" - ], - "query": "{\"owner\": [\"club\"]}", - "type": "view", - "mask": 3, - "field": "", - "permanent": false, - "description": "Voir tout les plats de son club" - } + "model": "permission.permission", + "pk": 212, + "fields": { + "model": [ + "food", + "allergen" + ], + "query": "{}", + "type": "view", + "mask": 1, + "permanent": false, + "description": "Voir n'importe quel allergène" + } }, { - "model": "permission.permission", - "pk": 213, - "fields": { - "model": [ - "food", - "transformedfood" - ], - "query": "{\"is_ready\": true}", - "type": "view", - "mask": 1, - "field": "", - "permanent": false, - "description": "Voir les plats préparés actifs servis" - } + "model": "permission.permission", + "pk": 213, + "fields": { + "model": [ + "food", + "food" + ], + "query": "{}", + "type": "view", + "mask": 2, + "permanent": false, + "description": "Voir n'importe quelle bouffe" + } }, { - "model": "permission.permission", - "pk": 214, - "fields": { - "model": [ - "food", - "qrcode" - ], - "query": "{}", - "type": "add", - "mask": 3, - "field": "", - "permanent": false, - "description": "Initialiser un QR code de traçabilité" - } + "model": "permission.permission", + "pk": 214, + "fields": { + "model": [ + "food", + "qrcode" + ], + "query": "{}", + "type": "add", + "mask": 2, + "permanent": false, + "description": "Ajouter n'importe quel QR-code" + } }, { - "model": "permission.permission", - "pk": 215, - "fields": { - "model": [ - "food", - "basicfood" - ], - "query": "{\"owner\": [\"club\"]}", - "type": "add", - "mask": 3, - "field": "", - "permanent": false, - "description": "Créer un nouvel ingrédient pour son club" - } + "model": "permission.permission", + "pk": 215, + "fields": { + "model": [ + "food", + "food" + ], + "query": "{}", + "type": "add", + "mask": 2, + "permanent": false, + "description": "Ajouter n'importe quelle bouffe" + } }, { - "model": "permission.permission", - "pk": 216, - "fields": { - "model": [ - "food", - "basicfood" - ], - "query": "{}", - "type": "add", - "mask": 3, - "field": "", - "permanent": false, - "description": "Créer un nouvel ingrédient" - } + "model": "permission.permission", + "pk": 216, + "fields": { + "model": [ + "food", + "food" + ], + "query": "{}", + "type": "change", + "mask": 2, + "permanent": false, + "description": "Modifier n'importe quelle bouffe" + } }, { - "model": "permission.permission", - "pk": 217, - "fields": { - "model": [ - "food", - "basicfood" - ], - "query": "{}", - "type": "view", - "mask": 3, - "field": "", - "permanent": false, - "description": "Voir toute la bouffe" - } + "model": "permission.permission", + "pk": 217, + "fields": { + "model": [ + "food", + "qrcode" + ], + "query": "{\"food_container__owner\": [\"club\"]}", + "type": "view", + "mask": 2, + "permanent": false, + "description": "Voir un QR-code lié à son club" + } }, { - "model": "permission.permission", - "pk": 218, - "fields": { - "model": [ - "food", - "basicfood" - ], - "query": "{\"is_ready\": true}", - "type": "view", - "mask": 3, - "field": "", - "permanent": false, - "description": "Voir toute la bouffe active" - } + "model": "permission.permission", + "pk": 218, + "fields": { + "model": [ + "food", + "food" + ], + "query": "{\"owner\": [\"club\"]}", + "type": "view", + "mask": 2, + "permanent": false, + "description": "Voir la bouffe de son club" + } }, { - "model": "permission.permission", - "pk": 219, - "fields": { - "model": [ - "food", - "basicfood" - ], - "query": "{\"is_ready\": true, \"owner\": [\"club\"]}", - "type": "view", - "mask": 3, - "field": "", - "permanent": false, - "description": "Voir la bouffe active de son club" - } + "model": "permission.permission", + "pk": 219, + "fields": { + "model": [ + "food", + "qrcode" + ], + "query": "{\"food_container__owner\": [\"club\"]}", + "type": "add", + "mask": 2, + "permanent": false, + "description": "Ajouter un QR-code pour son club" + } }, { - "model": "permission.permission", - "pk": 220, - "fields": { - "model": [ - "food", - "basicfood" - ], - "query": "{}", - "type": "change", - "mask": 3, - "field": "", - "permanent": false, - "description": "Modifier de la bouffe" - } + "model": "permission.permission", + "pk": 220, + "fields": { + "model": [ + "food", + "food" + ], + "query": "{\"owner\": [\"club\"]}", + "type": "add", + "mask": 2, + "permanent": false, + "description": "Ajouter de la bouffe appartenant à son club" + } }, { - "model": "permission.permission", - "pk": 221, - "fields": { - "model": [ - "food", - "basicfood" - ], - "query": "{\"is_ready\": true}", - "type": "change", - "mask": 3, - "field": "allergens", - "permanent": false, - "description": "Modifier les allergènes de la bouffe existante" - } + "model": "permission.permission", + "pk": 221, + "fields": { + "model": [ + "food", + "food" + ], + "query": "{\"owner\": [\"club\"]}", + "type": "change", + "mask": 2, + "permanent": false, + "description": "Modifier la bouffe appartenant à son club" + } }, { - "model": "permission.permission", - "pk": 222, - "fields": { - "model": [ - "food", - "basicfood" - ], - "query": "{\"is_ready\": true, \"owner\": [\"club\"]}", - "type": "change", - "mask": 3, - "field": "allergens", - "permanent": false, - "description": "Modifier les allergènes de la bouffe appartenant à son club" - } - }, - { - "model": "permission.permission", - "pk": 223, - "fields": { - "model": [ - "food", - "transformedfood" - ], - "query": "{}", - "type": "add", - "mask": 3, - "field": "", - "permanent": false, - "description": "Créer un plat" - } - }, - { - "model": "permission.permission", - "pk": 224, - "fields": { - "model": [ - "food", - "transformedfood" - ], - "query": "{\"owner\": [\"club\"]}", - "type": "add", - "mask": 3, - "field": "", - "permanent": false, - "description": "Créer un plat pour son club" - } - }, - { - "model": "permission.permission", - "pk": 225, - "fields": { - "model": [ - "food", - "transformedfood" - ], - "query": "{}", - "type": "change", - "mask": 3, - "field": "", - "permanent": false, - "description": "Modifier tout les plats" - } - }, - { - "model": "permission.permission", - "pk": 226, - "fields": { - "model": [ - "food", - "transformedfood" - ], - "query": "{\"is_ready\": true}", - "type": "change", - "mask": 3, - "field": "end_of_life", - "permanent": false, - "description": "Indiquer si un plat a été mangé" - } - }, - { - "model": "permission.permission", - "pk": 227, - "fields": { - "model": [ - "food", - "transformedfood" - ], - "query": "{\"is_ready\": true, \"owner\": [\"club\"]}", - "type": "change", - "mask": 3, - "field": "is_ready", - "permanent": false, - "description": "Indiquer si un plat de son club est prêt" - } - }, - { - "model": "permission.permission", - "pk": 228, - "fields": { - "model": [ - "food", - "transformedfood" - ], - "query": "{\"is_ready\": true}", - "type": "change", - "mask": 3, - "field": "is_ready", - "permanent": false, - "description": "Archiver un plat" - } - }, - { - "model": "permission.permission", - "pk": 229, - "fields": { - "model": [ - "food", - "basicfood" - ], - "query": "{\"is_ready\": true}", - "type": "change", - "mask": 3, - "field": "is_ready", - "permanent": false, - "description": "Archiver de la bouffe" - } - }, - { - "model": "permission.permission", - "pk": 231, - "fields": { - "model": [ - "food", - "qrcode" - ], - "query": "{}", - "type": "view", - "mask": 3, - "field": "", - "permanent": false, - "description": "Voir tous les QR codes" - } - }, - { - "model": "permission.permission", - "pk": 232, - "fields": { - "model": [ - "food", - "qrcode" - ], - "query": "{\"food_container__is_ready\": true}", - "type": "view", - "mask": 3, - "field": "", - "permanent": false, - "description": "Voir tous les QR codes actifs" - } - }, - { - "model": "permission.permission", - "pk": 233, - "fields": { - "model": [ - "food", - "qrcode" - ], - "query": "{\"food_container__owner\": [\"club\"], \"food_container__is_ready\": true}", - "type": "view", - "mask": 3, - "field": "", - "permanent": false, - "description": "Voir tous les QR codes actifs de son club" - } - }, - { - "model": "permission.permission", - "pk" : 234, - "fields": { - "model": [ - "food", - "transformedfood" - ], - "query": "{\"owner\": [\"club\"]}", - "type": "change", - "mask": 3, - "field": "ingredients", - "permanent": false, - "description": "Changer les ingrédients d'un plat actif de son club" - } - }, - { - "model": "permission.permission", - "pk": 235, - "fields": { - "model": [ - "food", - "food" - ], - "query": "{}", - "type": "view", - "mask": 3, - "field": "", - "permanent": false, - "description": "Voir bouffe" - } - }, - { - "model": "permission.permission", - "pk": 236, - "fields": { - "model": [ - "food", - "food" - ], - "query": "[]", - "type": "view", - "mask": 3, - "field": "", - "permanent": false, - "description": "Voir bouffe active" - } - }, - { - "model": "permission.permission", - "pk": 237, - "fields": { - "model": [ - "food", - "food" - ], - "query": "{\"owner\": [\"club\"]}", - "type": "view", - "mask": 3, - "field": "", - "permanent": false, - "description": "Voir bouffe active de son club" - } - }, - { - "model": "permission.permission", - "pk": 238, - "fields": { - "model": [ - "food", - "food" - ], - "query": "{}", - "type": "change", - "mask": 3, - "field": "", - "permanent": false, - "description": "Modifier bouffe" - } + "model": "permission.permission", + "pk": 222, + "fields": { + "model": [ + "food", + "food" + ], + "query": "{\"end_of_life\": \"\"}", + "type": "view", + "mask": 1, + "permanent": false, + "description": "Voir la bouffe servie" + } }, { "model": "permission.permission", @@ -4343,7 +4091,8 @@ 158, 159, 160, - 213 + 212, + 222 ] } }, @@ -4384,16 +4133,11 @@ 50, 141, 169, - 212, - 214, - 215, - 219, - 222, - 224, - 227, - 233, - 234, - 237, + 217, + 218, + 219, + 220, + 221, 247, 258, 259 @@ -4574,20 +4318,7 @@ 166, 167, 168, - 182, - 212, - 214, - 215, - 218, - 221, - 224, - 226, - 227, - 228, - 229, - 232, - 234, - 236 + 182 ] } }, @@ -4795,8 +4526,7 @@ 168, 176, 177, - 197, - 211 + 197 ] } }, @@ -4824,15 +4554,11 @@ "permissions": [ 137, 211, - 214, - 216, - 217, - 220, - 223, - 225, - 231, - 235, - 238 + 212, + 213, + 214, + 215, + 216 ] } }, diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index e33ee287..14dc6a1e 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-03-25 11:16+0100\n" +"POT-Creation-Date: 2025-04-24 18:22+0200\n" "PO-Revision-Date: 2022-04-11 22:05+0200\n" "Last-Translator: bleizi \n" "Language-Team: French \n" @@ -25,7 +25,7 @@ msgid "This opener already exists" msgstr "Cette amitié existe déjà" #: apps/activity/apps.py:10 apps/activity/models.py:129 -#: apps/activity/models.py:169 apps/activity/models.py:328 +#: apps/activity/models.py:169 apps/activity/models.py:329 msgid "activity" msgstr "activité" @@ -37,29 +37,29 @@ msgstr "La note du club est inactive." msgid "The end date must be after the start date." msgstr "La date de fin doit être après celle de début." -#: apps/activity/forms.py:83 apps/activity/models.py:276 +#: apps/activity/forms.py:83 apps/activity/models.py:277 msgid "You can't invite someone once the activity is started." msgstr "" "Vous ne pouvez pas inviter quelqu'un une fois que l'activité a démarré." -#: apps/activity/forms.py:86 apps/activity/models.py:279 +#: apps/activity/forms.py:86 apps/activity/models.py:280 msgid "This activity is not validated yet." msgstr "Cette activité n'est pas encore validée." -#: apps/activity/forms.py:96 apps/activity/models.py:287 +#: apps/activity/forms.py:96 apps/activity/models.py:288 msgid "This person has been already invited 5 times this year." msgstr "Cette personne a déjà été invitée 5 fois cette année." -#: apps/activity/forms.py:100 apps/activity/models.py:291 +#: apps/activity/forms.py:100 apps/activity/models.py:292 msgid "This person is already invited." msgstr "Cette personne est déjà invitée." -#: apps/activity/forms.py:104 apps/activity/models.py:295 +#: apps/activity/forms.py:104 apps/activity/models.py:296 msgid "You can't invite more than 3 people to this activity." msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité." -#: apps/activity/models.py:28 apps/activity/models.py:63 apps/food/models.py:42 -#: apps/food/models.py:56 apps/member/models.py:203 +#: apps/activity/models.py:28 apps/activity/models.py:63 apps/food/models.py:18 +#: apps/food/models.py:35 apps/member/models.py:203 #: apps/member/templates/member/includes/club_info.html:4 #: apps/member/templates/member/includes/profile_info.html:4 #: apps/note/models/notes.py:263 apps/note/models/transactions.py:26 @@ -121,7 +121,7 @@ msgid "type" msgstr "type" #: apps/activity/models.py:91 apps/logs/models.py:22 apps/member/models.py:325 -#: apps/note/models/notes.py:148 apps/treasury/models.py:293 +#: apps/note/models/notes.py:148 apps/treasury/models.py:294 #: apps/wei/models.py:171 apps/wei/templates/wei/attribute_bus_1A.html:13 #: apps/wei/templates/wei/survey.html:15 msgid "user" @@ -205,21 +205,21 @@ msgstr "Entrée de la note {note} pour l'activité « {activity} »" msgid "Already entered on " msgstr "Déjà rentré·e le " -#: apps/activity/models.py:204 apps/activity/tables.py:58 +#: apps/activity/models.py:205 apps/activity/tables.py:58 msgid "{:%Y-%m-%d %H:%M:%S}" msgstr "{:%d/%m/%Y %H:%M:%S}" -#: apps/activity/models.py:212 +#: apps/activity/models.py:213 msgid "The balance is negative." msgstr "La note est en négatif." -#: apps/activity/models.py:242 +#: apps/activity/models.py:243 #: apps/treasury/templates/treasury/sogecredit_detail.html:14 #: apps/wei/templates/wei/attribute_bus_1A.html:16 msgid "last name" msgstr "nom de famille" -#: apps/activity/models.py:247 +#: apps/activity/models.py:248 #: apps/member/templates/member/includes/profile_info.html:4 #: apps/registration/templates/registration/future_profile_detail.html:16 #: apps/treasury/templates/treasury/sogecredit_detail.html:17 @@ -228,36 +228,36 @@ msgstr "nom de famille" msgid "first name" msgstr "prénom" -#: apps/activity/models.py:252 +#: apps/activity/models.py:253 msgid "school" msgstr "école" -#: apps/activity/models.py:259 +#: apps/activity/models.py:260 msgid "inviter" msgstr "hôte" -#: apps/activity/models.py:263 +#: apps/activity/models.py:264 msgid "guest" msgstr "invité·e" -#: apps/activity/models.py:264 +#: apps/activity/models.py:265 msgid "guests" msgstr "invité·e·s" -#: apps/activity/models.py:317 +#: apps/activity/models.py:318 msgid "Invitation" msgstr "Invitation" -#: apps/activity/models.py:335 apps/activity/models.py:339 +#: apps/activity/models.py:336 apps/activity/models.py:340 msgid "Opener" msgstr "Ouvreur⋅se" -#: apps/activity/models.py:340 +#: apps/activity/models.py:341 #: apps/activity/templates/activity/activity_detail.html:16 msgid "Openers" msgstr "Ouvreur⋅ses" -#: apps/activity/models.py:344 +#: apps/activity/models.py:345 #, fuzzy, python-brace-format #| msgid "Entry for {note} to the activity {activity}" msgid "{opener} is opener of activity {acivity}" @@ -285,7 +285,7 @@ msgstr "Entré·e le " msgid "remove" msgstr "supprimer" -#: apps/activity/tables.py:84 apps/note/forms.py:69 apps/treasury/models.py:208 +#: apps/activity/tables.py:84 apps/note/forms.py:69 apps/treasury/models.py:209 msgid "Type" msgstr "Type" @@ -382,10 +382,8 @@ msgid "Entry done!" msgstr "Entrée effectuée !" #: apps/activity/templates/activity/activity_form.html:16 -#: apps/food/templates/food/add_ingredient_form.html:16 -#: apps/food/templates/food/basicfood_form.html:16 -#: apps/food/templates/food/create_qrcode_form.html:20 -#: apps/food/templates/food/transformedfood_form.html:16 +#: apps/food/templates/food/food_update.html:17 +#: apps/food/templates/food/qrcode.html:18 #: apps/member/templates/member/add_members.html:46 #: apps/member/templates/member/club_form.html:16 #: apps/note/templates/note/transactiontemplate_form.html:18 @@ -493,257 +491,277 @@ msgstr "Entrées pour l'activité « {} »" msgid "API" msgstr "API" -#: apps/food/apps.py:11 apps/food/models.py:105 +#: apps/food/apps.py:11 msgid "food" msgstr "bouffe" -#: apps/food/forms.py:32 -msgid "Fully used" -msgstr "Entièrement utilisé" - #: apps/food/forms.py:50 msgid "Pasta METRO 5kg" msgstr "Pâtes METRO 5kg" -#: apps/food/forms.py:100 +#: apps/food/forms.py:54 apps/food/forms.py:82 +msgid "Specific order given to GCKs" +msgstr "" + +#: apps/food/forms.py:78 msgid "Lasagna" msgstr "Lasagnes" -#: apps/food/models.py:18 -msgid "QR-code number" -msgstr "numéro de QR-code" +#: apps/food/forms.py:117 +msgid "Shelf life (in hours)" +msgstr "Durée de vie (en heure)" -#: apps/food/models.py:26 -msgid "food container" -msgstr "récipient" +#: apps/food/forms.py:139 +msgid "Fully used" +msgstr "Entièrement utilisé" -#: apps/food/models.py:30 -msgid "QR-code" -msgstr "QR-code" - -#: apps/food/models.py:31 -msgid "QR-codes" -msgstr "QR-codes" - -#: apps/food/models.py:34 -#, python-brace-format -msgid "QR-code number {qr_code_number}" -msgstr "numéro du QR-code {qr_code_number}" - -#: apps/food/models.py:47 +#: apps/food/models.py:23 msgid "Allergen" msgstr "Allergène" -#: apps/food/models.py:48 apps/food/templates/food/basicfood_detail.html:17 -#: apps/food/templates/food/transformedfood_detail.html:20 +#: apps/food/models.py:24 msgid "Allergens" msgstr "Allergènes" -#: apps/food/models.py:64 +#: apps/food/models.py:43 msgid "owner" msgstr "propriétaire" -#: apps/food/models.py:70 -msgid "allergen" -msgstr "allergène" +#: apps/food/models.py:49 +msgid "allergens" +msgstr "allergènes" -#: apps/food/models.py:74 +#: apps/food/models.py:53 msgid "expiry date" msgstr "date de péremption" -#: apps/food/models.py:80 -msgid "was eaten" -msgstr "a été mangé" +#: apps/food/models.py:59 +msgid "end of life" +msgstr "fin de vie" -#: apps/food/models.py:89 +#: apps/food/models.py:64 msgid "is ready" msgstr "est prêt" -#: apps/food/models.py:94 -msgid "is active" -msgstr "est en cours" +#: apps/food/models.py:70 +msgid "order" +msgstr "consigne" -#: apps/food/models.py:106 -msgid "foods" -msgstr "bouffes" +#: apps/food/models.py:107 apps/food/views.py:32 +#: note_kfet/templates/base.html:72 +msgid "Food" +msgstr "Bouffe" -#: apps/food/models.py:122 +#: apps/food/models.py:108 +msgid "Foods" +msgstr "Bouffes" + +#: apps/food/models.py:117 msgid "arrival date" msgstr "date d'arrivée" -#: apps/food/models.py:152 +#: apps/food/models.py:169 msgid "Basic food" msgstr "Aliment basique" -#: apps/food/models.py:153 +#: apps/food/models.py:170 msgid "Basic foods" msgstr "Aliments basiques" -#: apps/food/models.py:161 +#: apps/food/models.py:182 msgid "creation date" msgstr "date de création" -#: apps/food/models.py:169 -msgid "transformed ingredient" -msgstr "ingrédients tranformées" - -#: apps/food/models.py:174 +#: apps/food/models.py:188 msgid "shelf life" msgstr "durée de vie" -#: apps/food/models.py:225 apps/food/views.py:375 +#: apps/food/models.py:196 +msgid "transformed ingredient" +msgstr "ingrédients tranformées" + +#: apps/food/models.py:258 msgid "Transformed food" msgstr "Aliment transformé" -#: apps/food/models.py:226 +#: apps/food/models.py:259 msgid "Transformed foods" msgstr "Aliments transformés" -#: apps/food/templates/food/basicfood_detail.html:14 -#: apps/food/templates/food/create_qrcode_form.html:31 -#: apps/food/templates/food/qrcode_detail.html:15 -#: apps/food/templates/food/transformedfood_detail.html:14 -msgid "Owner" -msgstr "Propriétaire" +#: apps/food/models.py:271 +msgid "qr code number" +msgstr "numéro de QR-code" -#: apps/food/templates/food/basicfood_detail.html:15 -#: apps/food/templates/food/create_qrcode_form.html:34 -msgid "Arrival date" -msgstr "Date d'arrivée" +#: apps/food/models.py:278 +msgid "food container" +msgstr "récipient" -#: apps/food/templates/food/basicfood_detail.html:16 -#: apps/food/templates/food/create_qrcode_form.html:37 -#: apps/food/templates/food/qrcode_detail.html:16 -#: apps/food/templates/food/transformedfood_detail.html:19 -msgid "Expiry date" -msgstr "Date de péremption" +#: apps/food/models.py:282 +msgid "QR-code" +msgstr "QR-code" -#: apps/food/templates/food/basicfood_detail.html:24 -#: apps/food/templates/food/transformedfood_detail.html:36 -msgid "Active" -msgstr "Actif" +#: apps/food/models.py:283 +msgid "QR-codes" +msgstr "QR-codes" -#: apps/food/templates/food/basicfood_detail.html:25 -#: apps/food/templates/food/transformedfood_detail.html:37 -msgid "Eaten" -msgstr "Mangé" +#: apps/food/models.py:286 +msgid "QR-code number" +msgstr "numéro de QR-code" -#: apps/food/templates/food/basicfood_detail.html:28 -#: apps/food/templates/food/qrcode_detail.html:20 -#: apps/food/templates/food/qrcode_detail.html:24 -#: apps/food/templates/food/transformedfood_detail.html:41 +#: apps/food/templates/food/food_detail.html:19 +msgid "Contained in" +msgstr "Contenu dans" + +#: apps/food/templates/food/food_detail.html:26 +msgid "Contain" +msgstr "Contient" + +#: apps/food/templates/food/food_detail.html:35 msgid "Update" msgstr "Modifier" -#: apps/food/templates/food/basicfood_detail.html:32 -#: apps/food/templates/food/qrcode_detail.html:34 -#: apps/food/templates/food/transformedfood_detail.html:46 +#: apps/food/templates/food/food_detail.html:40 msgid "Add to a meal" msgstr "Ajouter à un plat" -#: apps/food/templates/food/create_qrcode_form.html:15 -msgid "New basic food" -msgstr "Nouvel aliment basique" +#: apps/food/templates/food/food_detail.html:44 +msgid "Return to the food list" +msgstr "Retour à la liste de nourriture" -#: apps/food/templates/food/create_qrcode_form.html:23 -msgid "Copy constructor" -msgstr "Constructeur de copie" - -#: apps/food/templates/food/create_qrcode_form.html:28 -#: apps/food/templates/food/qrcode_detail.html:14 -#: apps/note/templates/note/transaction_form.html:132 -#: apps/treasury/models.py:60 -msgid "Name" -msgstr "Nom" - -#: apps/food/templates/food/qrcode_detail.html:10 -msgid "number" -msgstr "numéro" - -#: apps/food/templates/food/qrcode_detail.html:29 -msgid "View details" -msgstr "Voir plus" - -#: apps/food/templates/food/transformedfood_detail.html:16 -#: apps/food/templates/food/transformedfood_detail.html:35 -msgid "Ready" -msgstr "Prêt" - -#: apps/food/templates/food/transformedfood_detail.html:18 -msgid "Creation date" -msgstr "Date de création" - -#: apps/food/templates/food/transformedfood_detail.html:27 -msgid "Ingredients" -msgstr "Ingrédients" - -#: apps/food/templates/food/transformedfood_detail.html:34 -msgid "Shelf life" -msgstr "Durée de vie" - -#: apps/food/templates/food/transformedfood_list.html:11 +#: apps/food/templates/food/food_list.html:14 msgid "Meal served" msgstr "Plat servis" -#: apps/food/templates/food/transformedfood_list.html:16 +#: apps/food/templates/food/food_list.html:19 msgid "New meal" msgstr "Nouveau plat" -#: apps/food/templates/food/transformedfood_list.html:25 +#: apps/food/templates/food/food_list.html:28 msgid "There is no meal served." msgstr "Il n'y a pas de plat servi." -#: apps/food/templates/food/transformedfood_list.html:33 -msgid "Open" +#: apps/food/templates/food/food_list.html:35 +msgid "Free food" msgstr "Open" -#: apps/food/templates/food/transformedfood_list.html:40 -msgid "There is no free meal." -msgstr "Il n'y a pas de plat en open" +#: apps/food/templates/food/food_list.html:42 +msgid "There is no free food." +msgstr "Il n'y a pas de bouffe en open" -#: apps/food/templates/food/transformedfood_list.html:48 -msgid "All meals" -msgstr "Tout les plats" +#: apps/food/templates/food/food_list.html:50 +msgid "Food of your clubs" +msgstr "Bouffe de tes clubs" -#: apps/food/templates/food/transformedfood_list.html:55 -msgid "There is no meal." -msgstr "Il n'y a pas de plat" +#: apps/food/templates/food/food_list.html:56 +msgid "Food of club" +msgstr "Bouffe du club" -#: apps/food/views.py:28 -msgid "Add the ingredient" -msgstr "Ajouter un ingrédient" +#: apps/food/templates/food/food_list.html:63 +msgid "Yours club has not food yet." +msgstr "Ton club n'a pas de bouffe pour l'instant" -#: apps/food/views.py:42 -msgid "The product is already prepared" -msgstr "Le produit est déjà prêt" +#: apps/food/templates/food/qrcode.html:22 +msgid "Copy constructor" +msgstr "Constructeur de copie" -#: apps/food/views.py:70 -msgid "Update an aliment" -msgstr "Modifier un aliment" +#: apps/food/templates/food/qrcode.html:23 +msgid "New food" +msgstr "Nouvel aliment" -#: apps/food/views.py:97 -msgid "Details of:" -msgstr "Détails de:" +#: apps/food/templates/food/qrcode.html:29 +#: apps/note/templates/note/transaction_form.html:132 +#: apps/treasury/models.py:61 +msgid "Name" +msgstr "Nom" -#: apps/food/views.py:121 -msgid "Add a new basic food with QRCode" -msgstr "Ajouter un nouvel ingrédient avec un QR-code" +#: apps/food/templates/food/qrcode.html:32 +msgid "Owner" +msgstr "Propriétaire" -#: apps/food/views.py:194 +#: apps/food/templates/food/qrcode.html:35 +msgid "Expiry date" +msgstr "Date de péremption" + +#: apps/food/utils.py:6 +msgid "second" +msgstr "seconde" + +#: apps/food/utils.py:6 +msgid "seconds" +msgstr "secondes" + +#: apps/food/utils.py:7 +msgid "minute" +msgstr "minute" + +#: apps/food/utils.py:7 +msgid "minutes" +msgstr "minutes" + +#: apps/food/utils.py:8 +msgid "hour" +msgstr "heure" + +#: apps/food/utils.py:8 +msgid "hours" +msgstr "heures" + +#: apps/food/utils.py:9 +msgid "day" +msgstr "jour" + +#: apps/food/utils.py:9 apps/member/templates/member/includes/club_info.html:27 +msgid "days" +msgstr "jours" + +#: apps/food/utils.py:10 +msgid "week" +msgstr "semaine" + +#: apps/food/utils.py:10 +msgid "weeks" +msgstr "semaines" + +#: apps/food/utils.py:53 +msgid "and" +msgstr "et" + +#: apps/food/views.py:116 msgid "Add a new QRCode" msgstr "Ajouter un nouveau QR-code" -#: apps/food/views.py:245 -msgid "QRCode" -msgstr "QR-code" +#: apps/food/views.py:165 +msgid "Add an aliment" +msgstr "Ajouter un nouvel aliment" -#: apps/food/views.py:281 -msgid "Add a new meal" -msgstr "Ajouter un nouveau plat" +#: apps/food/views.py:224 +msgid "Add a meal" +msgstr "Ajouter un plat" -#: apps/food/views.py:347 -msgid "Update a meal" -msgstr "Modifier le plat" +#: apps/food/views.py:251 +msgid "Add the ingredient:" +msgstr "Ajouter l'ingrédient" + +#: apps/food/views.py:275 +#, python-brace-format +msgid "Food fully used in : {meal.name}" +msgstr "Aliment entièrement utilisé dans : {meal.name}" + +#: apps/food/views.py:294 +msgid "Update an aliment" +msgstr "Modifier un aliment" + +#: apps/food/views.py:342 +msgid "Details of:" +msgstr "Détails de :" + +#: apps/food/views.py:352 apps/treasury/tables.py:149 +msgid "Yes" +msgstr "Oui" + +#: apps/food/views.py:354 apps/member/models.py:99 apps/treasury/tables.py:149 +msgid "No" +msgstr "Non" #: apps/logs/apps.py:11 msgid "Logs" @@ -1044,10 +1062,6 @@ msgstr "payé⋅e" msgid "Tells if the user receive a salary." msgstr "Indique si l'utilisateur⋅rice perçoit un salaire." -#: apps/member/models.py:99 apps/treasury/tables.py:149 -msgid "No" -msgstr "Non" - #: apps/member/models.py:100 msgid "Yes (receive them in french)" msgstr "Oui (les recevoir en français)" @@ -1357,10 +1371,6 @@ msgstr "Il n'y a pas d'adhésion trouvée avec cette entrée." msgid "Club Parent" msgstr "Club parent" -#: apps/member/templates/member/includes/club_info.html:27 -msgid "days" -msgstr "jours" - #: apps/member/templates/member/includes/club_info.html:31 #: apps/wei/templates/wei/base.html:40 msgid "membership fee" @@ -1456,11 +1466,11 @@ msgstr "Introspection :" msgid "Show my applications" msgstr "Voir mes applications" -#: apps/member/templates/member/picture_update.html:38 +#: apps/member/templates/member/picture_update.html:40 msgid "Nevermind" msgstr "Annuler" -#: apps/member/templates/member/picture_update.html:39 +#: apps/member/templates/member/picture_update.html:41 msgid "Crop and upload" msgstr "Recadrer et envoyer" @@ -1899,7 +1909,7 @@ msgstr "Ce champ est requis." msgid "membership transaction" msgstr "transaction d'adhésion" -#: apps/note/models/transactions.py:381 apps/treasury/models.py:300 +#: apps/note/models/transactions.py:381 apps/treasury/models.py:301 msgid "membership transactions" msgstr "transactions d'adhésion" @@ -2512,7 +2522,7 @@ msgstr "Invalider l'inscription" msgid "Treasury" msgstr "Trésorerie" -#: apps/treasury/forms.py:26 apps/treasury/models.py:112 +#: apps/treasury/forms.py:26 apps/treasury/models.py:113 #: apps/treasury/templates/treasury/invoice_form.html:22 msgid "This invoice is locked and can no longer be edited." msgstr "Cette facture est verrouillée et ne peut plus être éditée." @@ -2525,7 +2535,7 @@ msgstr "La remise est déjà fermée." msgid "You can't change the type of the remittance." msgstr "Vous ne pouvez pas changer le type de la remise." -#: apps/treasury/forms.py:125 apps/treasury/models.py:275 +#: apps/treasury/forms.py:125 apps/treasury/models.py:276 #: apps/treasury/tables.py:99 apps/treasury/tables.py:108 #: apps/treasury/templates/treasury/invoice_list.html:16 #: apps/treasury/templates/treasury/remittance_list.html:16 @@ -2541,139 +2551,139 @@ msgstr "Pas de remise associée" msgid "Invoice identifier" msgstr "Numéro de facture" -#: apps/treasury/models.py:42 apps/wrapped/models.py:28 +#: apps/treasury/models.py:43 apps/wrapped/models.py:28 #: apps/wrapped/models.py:29 msgid "BDE" msgstr "BDE" -#: apps/treasury/models.py:46 +#: apps/treasury/models.py:47 msgid "Quotation" msgstr "Devis" -#: apps/treasury/models.py:51 +#: apps/treasury/models.py:52 msgid "Object" msgstr "Objet" -#: apps/treasury/models.py:55 +#: apps/treasury/models.py:56 msgid "Description" msgstr "Description" -#: apps/treasury/models.py:64 +#: apps/treasury/models.py:65 msgid "Address" msgstr "Adresse" -#: apps/treasury/models.py:69 apps/treasury/models.py:202 +#: apps/treasury/models.py:70 apps/treasury/models.py:203 msgid "Date" msgstr "Date" -#: apps/treasury/models.py:75 +#: apps/treasury/models.py:76 msgid "Payment date" msgstr "Date de paiement" -#: apps/treasury/models.py:79 +#: apps/treasury/models.py:80 msgid "Acquitted" msgstr "Acquittée" -#: apps/treasury/models.py:84 +#: apps/treasury/models.py:85 msgid "Locked" msgstr "Verrouillée" -#: apps/treasury/models.py:85 +#: apps/treasury/models.py:86 msgid "An invoice can't be edited when it is locked." msgstr "Une facture ne peut plus être modifiée si elle est verrouillée." -#: apps/treasury/models.py:91 +#: apps/treasury/models.py:92 msgid "tex source" msgstr "fichier TeX source" -#: apps/treasury/models.py:95 apps/treasury/models.py:140 +#: apps/treasury/models.py:96 apps/treasury/models.py:141 msgid "invoice" msgstr "facture" -#: apps/treasury/models.py:96 +#: apps/treasury/models.py:97 msgid "invoices" msgstr "factures" -#: apps/treasury/models.py:99 +#: apps/treasury/models.py:100 #, python-brace-format msgid "Invoice #{id}" msgstr "Facture n°{id}" -#: apps/treasury/models.py:145 +#: apps/treasury/models.py:146 msgid "Designation" msgstr "Désignation" -#: apps/treasury/models.py:151 +#: apps/treasury/models.py:152 msgid "Quantity" msgstr "Quantité" -#: apps/treasury/models.py:156 +#: apps/treasury/models.py:157 msgid "Unit price" msgstr "Prix unitaire" -#: apps/treasury/models.py:160 +#: apps/treasury/models.py:161 msgid "product" msgstr "produit" -#: apps/treasury/models.py:161 +#: apps/treasury/models.py:162 msgid "products" msgstr "produits" -#: apps/treasury/models.py:189 +#: apps/treasury/models.py:190 msgid "remittance type" msgstr "type de remise" -#: apps/treasury/models.py:190 +#: apps/treasury/models.py:191 msgid "remittance types" msgstr "types de remises" -#: apps/treasury/models.py:213 +#: apps/treasury/models.py:214 msgid "Comment" msgstr "Commentaire" -#: apps/treasury/models.py:218 +#: apps/treasury/models.py:219 msgid "Closed" msgstr "Fermée" -#: apps/treasury/models.py:222 +#: apps/treasury/models.py:223 msgid "remittance" msgstr "remise" -#: apps/treasury/models.py:223 +#: apps/treasury/models.py:224 msgid "remittances" msgstr "remises" -#: apps/treasury/models.py:226 +#: apps/treasury/models.py:227 msgid "Remittance #{:d}: {}" msgstr "Remise n°{:d} : {}" -#: apps/treasury/models.py:279 +#: apps/treasury/models.py:280 msgid "special transaction proxy" msgstr "proxy de transaction spéciale" -#: apps/treasury/models.py:280 +#: apps/treasury/models.py:281 msgid "special transaction proxies" msgstr "proxys de transactions spéciales" -#: apps/treasury/models.py:306 +#: apps/treasury/models.py:307 msgid "credit transaction" msgstr "transaction de crédit" -#: apps/treasury/models.py:311 +#: apps/treasury/models.py:312 #: apps/treasury/templates/treasury/sogecredit_detail.html:10 msgid "Credit from the Société générale" msgstr "Crédit de la Société générale" -#: apps/treasury/models.py:312 +#: apps/treasury/models.py:313 msgid "Credits from the Société générale" msgstr "Crédits de la Société générale" -#: apps/treasury/models.py:315 +#: apps/treasury/models.py:316 #, python-brace-format msgid "Soge credit for {user}" msgstr "Crédit de la société générale pour l'utilisateur·rice {user}" -#: apps/treasury/models.py:445 +#: apps/treasury/models.py:446 msgid "" "This user doesn't have enough money to pay the memberships with its note. " "Please ask her/him to credit the note before invalidating this credit." @@ -2702,10 +2712,6 @@ msgstr "Nombre de transactions" msgid "View" msgstr "Voir" -#: apps/treasury/tables.py:149 -msgid "Yes" -msgstr "Oui" - #: apps/treasury/templates/treasury/invoice_confirm_delete.html:10 #: apps/treasury/views.py:174 msgid "Delete invoice" @@ -3812,10 +3818,6 @@ msgstr "" msgid "Reset" msgstr "Réinitialiser" -#: note_kfet/templates/base.html:72 -msgid "Food" -msgstr "Bouffe" - #: note_kfet/templates/base.html:84 msgid "Users" msgstr "Utilisateur·rices" @@ -4125,6 +4127,67 @@ msgstr "" "d'adhésion. Vous devez également valider votre adresse email en suivant le " "lien que vous avez reçu." +#, python-brace-format +#~ msgid "QR-code number {qr_code_number}" +#~ msgstr "numéro du QR-code {qr_code_number}" + +#~ msgid "was eaten" +#~ msgstr "a été mangé" + +#~ msgid "is active" +#~ msgstr "est en cours" + +#~ msgid "foods" +#~ msgstr "bouffes" + +#~ msgid "Arrival date" +#~ msgstr "Date d'arrivée" + +#~ msgid "Active" +#~ msgstr "Actif" + +#~ msgid "Eaten" +#~ msgstr "Mangé" + +#~ msgid "number" +#~ msgstr "numéro" + +#~ msgid "View details" +#~ msgstr "Voir plus" + +#~ msgid "Ready" +#~ msgstr "Prêt" + +#~ msgid "Creation date" +#~ msgstr "Date de création" + +#~ msgid "Ingredients" +#~ msgstr "Ingrédients" + +#~ msgid "Open" +#~ msgstr "Open" + +#~ msgid "All meals" +#~ msgstr "Tout les plats" + +#~ msgid "There is no meal." +#~ msgstr "Il n'y a pas de plat" + +#~ msgid "The product is already prepared" +#~ msgstr "Le produit est déjà prêt" + +#~ msgid "Add a new basic food with QRCode" +#~ msgstr "Ajouter un nouvel ingrédient avec un QR-code" + +#~ msgid "QRCode" +#~ msgstr "QR-code" + +#~ msgid "Add a new meal" +#~ msgstr "Ajouter un nouveau plat" + +#~ msgid "Update a meal" +#~ msgstr "Modifier le plat" + #, fuzzy #~| msgid "invalidate" #~ msgid "Enter a valid color." @@ -4180,11 +4243,6 @@ msgstr "" #~ msgid "Enter a number." #~ msgstr "numéro de téléphone" -#, fuzzy -#~| msgid "add" -#~ msgid "and" -#~ msgstr "ajouter" - #, fuzzy, python-format #~| msgid "A template with this name already exist" #~ msgid "%(model_name)s with this %(field_labels)s already exists." @@ -4446,9 +4504,6 @@ msgstr "" #~ msgid "Free" #~ msgstr "Open" -#~ msgid "Add a new aliment" -#~ msgstr "Ajouter un nouvel aliment" - #, fuzzy #~| msgid "Transformed food" #~ msgid "New transformed food"