From 78c6dbee717bbc68c0652bb9a1e2818b531e93a3 Mon Sep 17 00:00:00 2001
From: Bossanyi Tibor <sw@andio.biz>
Date: Tue, 23 Feb 2021 17:13:54 +0100
Subject: [PATCH] API 1.0.26 admin: ExercisePlanTemplate

---
 .../aitrainer_backoffice/admin.py             |  54 +++-
 .../locale/hu/LC_MESSAGES/django.po           | 252 ++++++++++--------
 .../aitrainer_backoffice/models.py            |  52 ++++
 .../aitrainer_backoffice/urls.py              |   1 +
 aitrainer_backoffice/translate.bat            |   1 -
 aitrainer_backoffice/translate_compile.bat    |   2 +
 6 files changed, 243 insertions(+), 119 deletions(-)
 create mode 100644 aitrainer_backoffice/translate_compile.bat

diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin.py b/aitrainer_backoffice/aitrainer_backoffice/admin.py
index 9bb9105..f594bd6 100644
--- a/aitrainer_backoffice/aitrainer_backoffice/admin.py
+++ b/aitrainer_backoffice/aitrainer_backoffice/admin.py
@@ -1,3 +1,5 @@
+from abc import ABC
+
 from django.contrib import admin
 from django.utils.html import format_html
 from django.utils.translation import ugettext_lazy as _
@@ -11,6 +13,7 @@ from .models import ExerciseTree, ExerciseTreeParents
 from .models import ExercisePlanTranslation
 from .models import ExercisePlanDetail
 from .models import ExercisePlan
+from .models import ExercisePlanTemplate, ExercisePlanTemplateTranslation, ExercisePlanTemplateDetail
 
 ''' 
     ExerciseTree
@@ -114,7 +117,7 @@ class ExerciseTypeParentsInline(admin.TabularInline):
 
 class ExerciseTypeAdmin(admin.ModelAdmin):
     list_display = ('exercise_type_id', 'name_colored', 'active', 'base')
-    search_fields = ['name']
+    search_fields = ['name', 'exercisetypetranslation__name']
     fields = ('name', 'description', 'unit', 'unit_quantity', 'unit_quantity_unit', 'active', 'base')
 
     def name_colored(self, obj):
@@ -142,11 +145,53 @@ class ExerciseTypeAdmin(admin.ModelAdmin):
 
 
 ''' 
-    ExercisePlan
+    ExercisePlan + Template
     ------------ 
 '''
 
 
+class TranslationPlanTemplateInline(admin.TabularInline):
+    model = ExercisePlanTemplateTranslation
+    fields = ('language_code', 'name', 'description')
+    extra = 0
+
+
+class TranslationPlanTemplateDetailInline(admin.TabularInline):
+    model = ExercisePlanTemplateDetail
+    fields = ('exercise_type',)
+    extra = 0
+
+
+class ExercisePlanTemplateAdmin(admin.ModelAdmin):
+    list_display = ('name_colored', 'template_type')
+    search_fields = ['name']
+
+    def name_colored(self, obj):
+        color_code = 'C20000'
+        html = '<span style="color: #{};">{}</span>˓→'.format(color_code, obj.name)
+        return format_html(html)
+
+    name_colored.admin_order_field = 'name'
+    name_colored.short_description = 'name'
+
+    inlines = [
+        TranslationPlanTemplateInline,
+        TranslationPlanTemplateDetailInline
+    ]
+
+
+class ExercisePlanTemplateDetailAdmin(admin.ModelAdmin):
+    list_display = ('get_plan', 'get_exercise_type', 'quantity', 'quantity_unit_quantity','rest_time',)
+    list_editable = ('serie', 'quantity', 'quantity_unit_quantity','rest_time')
+
+
+    def get_plan(self, obj):
+        return obj.exercise_plan_template.name
+
+    def get_exercise_type(self, obj):
+        return obj.exercise_type.name
+
+
 class TranslationPlanInline(admin.TabularInline):
     model = ExercisePlanTranslation
     fields = ('language_code', 'name', 'description')
@@ -169,7 +214,7 @@ class ExercisePlanAdmin(admin.ModelAdmin):
         TranslationPlanInline
     ]
 
-
+'''
 class ExercisePlanDetailAdmin(admin.ModelAdmin):
     list_display = ('get_plan', 'get_exercise_type', 'serie', 'repeats', 'weight_equation',)
     list_editable = ('serie', 'repeats', 'weight_equation',)
@@ -181,6 +226,7 @@ class ExercisePlanDetailAdmin(admin.ModelAdmin):
 
     def get_exercise_type(self, obj):
         return obj.exercise_type.name
+'''
 
 
 class ProductAdmin(admin.ModelAdmin):
@@ -221,8 +267,8 @@ class ExerciseDeviceAdmin(admin.ModelAdmin):
 
 admin.site.register(ExerciseType, ExerciseTypeAdmin)
 admin.site.register(ExerciseTree, ExerciseTreeAdmin)
+admin.site.register(ExercisePlanTemplate, ExercisePlanTemplateAdmin)
 admin.site.register(ExercisePlan, ExercisePlanAdmin)
-admin.site.register(ExercisePlanDetail, ExercisePlanDetailAdmin)
 admin.site.register(Product, ProductAdmin)
 admin.site.register(ExerciseDevice, ExerciseDeviceAdmin)
 admin.autodiscover()
diff --git a/aitrainer_backoffice/aitrainer_backoffice/locale/hu/LC_MESSAGES/django.po b/aitrainer_backoffice/aitrainer_backoffice/locale/hu/LC_MESSAGES/django.po
index 426177c..87acbdf 100644
--- a/aitrainer_backoffice/aitrainer_backoffice/locale/hu/LC_MESSAGES/django.po
+++ b/aitrainer_backoffice/aitrainer_backoffice/locale/hu/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-12-03 18:29+0100\n"
+"POT-Creation-Date: 2021-02-23 14:53+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,167 +18,191 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: .\aitrainer_backoffice\admin.py:34 .\aitrainer_backoffice\admin.py:114
-#: .\aitrainer_backoffice\admin.py:227
+#: .\aitrainer_backoffice\admin.py:48 .\aitrainer_backoffice\admin.py:94
+#: .\aitrainer_backoffice\admin.py:258
 msgid "Image Preview"
 msgstr "Kép előnézet"
 
-#: .\aitrainer_backoffice\models.py:21 .\aitrainer_backoffice\models.py:252
+#: .\aitrainer_backoffice\models.py:27 .\aitrainer_backoffice\models.py:201
 msgid "Exercise Device"
 msgstr "Edzés eszköz"
 
-#: .\aitrainer_backoffice\models.py:22 .\aitrainer_backoffice\models.py:253
+#: .\aitrainer_backoffice\models.py:28 .\aitrainer_backoffice\models.py:202
 msgid "Exercise Devices"
 msgstr "Edzés eszközök"
 
 #: .\aitrainer_backoffice\models.py:42
-msgid "Exercise Tree"
-msgstr "Gyakorlat Menü"
-
-#: .\aitrainer_backoffice\models.py:43
-msgid "Exercise Tree Items"
-msgstr "Gyakorlat Menü elemek"
-
-#: .\aitrainer_backoffice\models.py:76
-msgid "Exercise"
-msgstr "Gyakorlat"
-
-#: .\aitrainer_backoffice\models.py:77
-msgid "Exercises"
-msgstr "Gyakorlatok"
-
-#: .\aitrainer_backoffice\models.py:97
-msgid "Image"
-msgstr "Kép"
-
-#: .\aitrainer_backoffice\models.py:98
-msgid "Images"
-msgstr "Képek"
-
-#: .\aitrainer_backoffice\models.py:113 .\aitrainer_backoffice\models.py:128
-#: .\aitrainer_backoffice\models.py:159 .\aitrainer_backoffice\models.py:238
-#: .\aitrainer_backoffice\models.py:264
-msgid "Translation"
-msgstr "Fordítás"
-
-#: .\aitrainer_backoffice\models.py:114 .\aitrainer_backoffice\models.py:129
-#: .\aitrainer_backoffice\models.py:160 .\aitrainer_backoffice\models.py:239
-#: .\aitrainer_backoffice\models.py:265
-msgid "Translations"
-msgstr "Fordítások"
-
-#: .\aitrainer_backoffice\models.py:143
-msgid "Exercise Plan"
-msgstr "Edzésterv"
-
-#: .\aitrainer_backoffice\models.py:144
-msgid "Exercise Plans"
-msgstr "Edzéstervek"
-
-#: .\aitrainer_backoffice\models.py:176
-msgid "Exercise Plan Detail"
-msgstr "Edzésterv gyakorlat"
-
-#: .\aitrainer_backoffice\models.py:177
-msgid "Exercise Plan Details"
-msgstr "Edzésterv gyakorlatok"
-
-#: .\aitrainer_backoffice\models.py:195
-msgid "Product"
-msgstr "Termék"
-
-#: .\aitrainer_backoffice\models.py:196
-msgid "Products"
-msgstr "Termékek"
-
-#: .\aitrainer_backoffice\models.py:212
-msgid "Purchase"
-msgstr "Vásárlás"
-
-#: .\aitrainer_backoffice\models.py:213
-msgid "Purchases"
-msgstr "Vásárlások"
-
-#: .\aitrainer_backoffice\models.py:223
-msgid "Customer Property"
-msgstr "Ügyfél tulajdonság"
-
-#: .\aitrainer_backoffice\models.py:224
-msgid "Customer Properties"
-msgstr "Ügyfél tulajdonságok"
-
-#: .\aitrainer_backoffice\models.py:274
 #, fuzzy
 #| msgid "Exercise Tree Parent"
 msgid "exercise_device_parent"
 msgstr "Gyakorlat Eszköz szülő"
 
-#: .\aitrainer_backoffice\models.py:276
+#: .\aitrainer_backoffice\models.py:44
 #, fuzzy
 #| msgid "Exercise Tree"
 msgid "exercise_device_child"
 msgstr "Gyakorlat eszköz"
 
-#: .\aitrainer_backoffice\models.py:280
+#: .\aitrainer_backoffice\models.py:48
 msgid "Device Alternative"
 msgstr "Eszköz alternatíva"
 
-#: .\aitrainer_backoffice\models.py:281
+#: .\aitrainer_backoffice\models.py:49
 msgid "Device Alternatives"
 msgstr "Eszköz alternatívák"
 
-#: .\aitrainer_backoffice\models.py:288
-#, fuzzy
-#| msgid "Exercise Tree Parent"
-msgid "exercise_type_parent"
-msgstr "Gyakorlat szülő"
+#: .\aitrainer_backoffice\models.py:61 .\aitrainer_backoffice\models.py:98
+#: .\aitrainer_backoffice\models.py:187 .\aitrainer_backoffice\models.py:261
+#: .\aitrainer_backoffice\models.py:307 .\aitrainer_backoffice\models.py:390
+msgid "Translation"
+msgstr "Fordítás"
 
-#: .\aitrainer_backoffice\models.py:290
-#, fuzzy
-#| msgid "Exercise Tree"
-msgid "exercise_type_child"
-msgstr "Aktuális gyakorlat"
+#: .\aitrainer_backoffice\models.py:62 .\aitrainer_backoffice\models.py:99
+#: .\aitrainer_backoffice\models.py:188 .\aitrainer_backoffice\models.py:262
+#: .\aitrainer_backoffice\models.py:308 .\aitrainer_backoffice\models.py:391
+msgid "Translations"
+msgstr "Fordítások"
 
-#: .\aitrainer_backoffice\models.py:294
-msgid "Exercise Alternative"
-msgstr "Gyakorlat alternatíva"
+#: .\aitrainer_backoffice\models.py:83
+msgid "Exercise Tree"
+msgstr "Gyakorlat Menü"
 
-#: .\aitrainer_backoffice\models.py:295
-msgid "Exercise Alternatives"
-msgstr "Gyakorlat alternatívák"
+#: .\aitrainer_backoffice\models.py:84
+msgid "Exercise Tree Items"
+msgstr "Gyakorlat Menü elemek"
 
-#: .\aitrainer_backoffice\models.py:306
-msgid "Exercise Parent"
-msgstr "Gyakorlat szülő"
-
-#: .\aitrainer_backoffice\models.py:307
-msgid "Exercise Parents"
-msgstr "Gyakorlat szülők"
-
-#: .\aitrainer_backoffice\models.py:313
+#: .\aitrainer_backoffice\models.py:108
 #, fuzzy
 #| msgid "Exercise Tree Parent"
 msgid "exercise_tree_parent"
 msgstr "Gyakorlat Menü szülő"
 
-#: .\aitrainer_backoffice\models.py:313
+#: .\aitrainer_backoffice\models.py:108
 msgid "Parent menu"
 msgstr "Szülő menüpont"
 
-#: .\aitrainer_backoffice\models.py:314
+#: .\aitrainer_backoffice\models.py:110
 #, fuzzy
 #| msgid "Exercise Tree"
 msgid "exercise_tree_child"
 msgstr "Aktuális Gyakorlat Menü"
 
-#: .\aitrainer_backoffice\models.py:314
+#: .\aitrainer_backoffice\models.py:110
 msgid "Actual menu"
 msgstr "Aktuális menüpont"
 
-#: .\aitrainer_backoffice\models.py:318
+#: .\aitrainer_backoffice\models.py:114
 msgid "Exercise Tree Parent"
 msgstr "Gyakorlat Menü szülő"
 
-#: .\aitrainer_backoffice\models.py:319
+#: .\aitrainer_backoffice\models.py:115
 msgid "Exercise Tree Parents"
 msgstr "Gyakorlat Menü szülők"
+
+#: .\aitrainer_backoffice\models.py:150
+msgid "Exercise"
+msgstr "Gyakorlat"
+
+#: .\aitrainer_backoffice\models.py:151
+msgid "Exercises"
+msgstr "Gyakorlatok"
+
+#: .\aitrainer_backoffice\models.py:171
+msgid "Image"
+msgstr "Kép"
+
+#: .\aitrainer_backoffice\models.py:172
+msgid "Images"
+msgstr "Képek"
+
+#: .\aitrainer_backoffice\models.py:208
+#, fuzzy
+#| msgid "Exercise Tree Parent"
+msgid "exercise_type_parent"
+msgstr "Gyakorlat szülő"
+
+#: .\aitrainer_backoffice\models.py:210
+#, fuzzy
+#| msgid "Exercise Tree"
+msgid "exercise_type_child"
+msgstr "Aktuális gyakorlat"
+
+#: .\aitrainer_backoffice\models.py:214
+msgid "Exercise Alternative"
+msgstr "Gyakorlat alternatíva"
+
+#: .\aitrainer_backoffice\models.py:215
+msgid "Exercise Alternatives"
+msgstr "Gyakorlat alternatívák"
+
+#: .\aitrainer_backoffice\models.py:226
+msgid "Exercise Parent"
+msgstr "Gyakorlat szülő"
+
+#: .\aitrainer_backoffice\models.py:227
+msgid "Exercise Parents"
+msgstr "Gyakorlat szülők"
+
+#: .\aitrainer_backoffice\models.py:245
+#, fuzzy
+#| msgid "Exercise Plan Detail"
+msgid "Exercise Plan Template"
+msgstr "Edzésterv sablon"
+
+#: .\aitrainer_backoffice\models.py:246
+#, fuzzy
+#| msgid "Exercise Plan Details"
+msgid "Exercise Plan Templates"
+msgstr "Edzésterv sablonok"
+
+#: .\aitrainer_backoffice\models.py:279
+#, fuzzy
+#| msgid "Exercise Plan Detail"
+msgid "Exercise Plan Template Detail"
+msgstr "Edzésterv sablon gyakorlat"
+
+#: .\aitrainer_backoffice\models.py:280
+#, fuzzy
+#| msgid "Exercise Plan Details"
+msgid "Exercise Plan Template Details"
+msgstr "Edzésterv sablon gyakorlatok"
+
+#: .\aitrainer_backoffice\models.py:291
+msgid "Exercise Plan"
+msgstr "Edzésterv"
+
+#: .\aitrainer_backoffice\models.py:292
+msgid "Exercise Plans"
+msgstr "Edzéstervek"
+
+#: .\aitrainer_backoffice\models.py:324
+msgid "Exercise Plan Detail"
+msgstr "Edzésterv gyakorlat"
+
+#: .\aitrainer_backoffice\models.py:325
+msgid "Exercise Plan Details"
+msgstr "Edzésterv gyakorlatok"
+
+#: .\aitrainer_backoffice\models.py:347
+msgid "Product"
+msgstr "Termék"
+
+#: .\aitrainer_backoffice\models.py:348
+msgid "Products"
+msgstr "Termékek"
+
+#: .\aitrainer_backoffice\models.py:364
+msgid "Purchase"
+msgstr "Vásárlás"
+
+#: .\aitrainer_backoffice\models.py:365
+msgid "Purchases"
+msgstr "Vásárlások"
+
+#: .\aitrainer_backoffice\models.py:375
+msgid "Customer Property"
+msgstr "Ügyfél tulajdonság"
+
+#: .\aitrainer_backoffice\models.py:376
+msgid "Customer Properties"
+msgstr "Ügyfél tulajdonságok"
diff --git a/aitrainer_backoffice/aitrainer_backoffice/models.py b/aitrainer_backoffice/aitrainer_backoffice/models.py
index 012e6e3..0e3c657 100644
--- a/aitrainer_backoffice/aitrainer_backoffice/models.py
+++ b/aitrainer_backoffice/aitrainer_backoffice/models.py
@@ -228,6 +228,58 @@ class ExerciseTypeParents(models.Model):
         unique_together = [['exercise_type', 'exercise_tree']]
 
 
+class TemplateTypes(models.TextChoices):
+    MINI_SET = "mini_test_set"
+    SPECIAL = "special"
+
+
+class ExercisePlanTemplate(models.Model):
+    exercise_plan_template_id = models.AutoField(primary_key=True)
+    name = models.CharField(max_length=100, help_text='The name should be in English here')
+    description = models.TextField(max_length=1000, blank=True, null=True, help_text='The description should be in '
+                                                                                     'English here')
+    template_type = models.CharField(max_length=20, choices=TemplateTypes.choices, default=TemplateTypes.SPECIAL)
+
+    class Meta:
+        db_table = 'exercise_plan_template'
+        verbose_name = _("Exercise Plan Template")
+        verbose_name_plural = _("Exercise Plan Templates")
+
+    def __str__(self):
+        return self.name
+
+
+class ExercisePlanTemplateTranslation(models.Model):
+    translation_id = models.AutoField(primary_key=True)
+    exercise_plan_template = models.ForeignKey(ExercisePlanTemplate, on_delete=models.CASCADE)
+    language_code = models.CharField(max_length=2, choices=LanguageTypes.choices, default=LanguageTypes.HU)
+    name = models.CharField(max_length=100)
+    description = models.TextField(max_length=1000, blank=True, null=True)
+
+    class Meta:
+        db_table = 'exercise_plan_template_translation'
+        verbose_name = _("Translation")
+        verbose_name_plural = _("Translations")
+
+    def __str__(self):
+        return self.name
+
+
+class ExercisePlanTemplateDetail(models.Model):
+    exercise_plan_template_detail_id = models.AutoField(primary_key=True)
+    exercise_plan_template = models.ForeignKey(ExercisePlanTemplate, on_delete=models.CASCADE)
+    exercise_type = models.ForeignKey(ExerciseType, on_delete=models.CASCADE)
+    serie = models.IntegerField()
+    quantity = models.FloatField()
+    quantity_unit_quantity = models.FloatField()
+    resting_time = models.TimeField()
+
+    class Meta:
+        db_table = 'exercise_plan_template_detail'
+        verbose_name = _("Exercise Plan Template Detail")
+        verbose_name_plural = _("Exercise Plan Template Details")
+
+
 class ExercisePlan(models.Model):
     exercise_plan_id = models.AutoField(primary_key=True)
     name = models.CharField(max_length=100, help_text='The name should be in English here')
diff --git a/aitrainer_backoffice/aitrainer_backoffice/urls.py b/aitrainer_backoffice/aitrainer_backoffice/urls.py
index 9f8cbd1..e5f0a3c 100644
--- a/aitrainer_backoffice/aitrainer_backoffice/urls.py
+++ b/aitrainer_backoffice/aitrainer_backoffice/urls.py
@@ -27,3 +27,4 @@ urlpatterns = [
 
 urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
 
+admin.site.site_header = 'WorkoutTest Admin'
\ No newline at end of file
diff --git a/aitrainer_backoffice/translate.bat b/aitrainer_backoffice/translate.bat
index c018a6f..3814d47 100644
--- a/aitrainer_backoffice/translate.bat
+++ b/aitrainer_backoffice/translate.bat
@@ -1,3 +1,2 @@
 django-admin makemessages -l hu --ignore venv  --pythonpath "D:\projects\aitrainer\src\aitrainer_backoffice" --settings aitrainer_backoffice.aitrainer_backoffice.settings.dev
 
-## compilemessages
\ No newline at end of file
diff --git a/aitrainer_backoffice/translate_compile.bat b/aitrainer_backoffice/translate_compile.bat
new file mode 100644
index 0000000..26a7027
--- /dev/null
+++ b/aitrainer_backoffice/translate_compile.bat
@@ -0,0 +1,2 @@
+django-admin compilemessages  -l hu --pythonpath "D:\projects\aitrainer\src\aitrainer_backoffice" --settings aitrainer_backoffice.aitrainer_backoffice.settings.dev
+