diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin.py b/aitrainer_backoffice/aitrainer_backoffice/admin.py index e6a4b34..52ad1d3 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/admin.py +++ b/aitrainer_backoffice/aitrainer_backoffice/admin.py @@ -1,13 +1,12 @@ -from abc import ABC - -from django.contrib import admin +from django.contrib import admin, messages from django.utils.html import format_html -from django.utils.translation import ugettext_lazy as _ -#from treenode.admin import TreeNodeModelAdmin -#from treenode.forms import TreeNodeForm +from django.utils.translation import ugettext_lazy as _, ngettext +# from treenode.admin import TreeNodeModelAdmin +# from treenode.forms import TreeNodeForm from .models import ExerciseType, ExerciseTypeAlternative, ExerciseTypeParents from .models import Product +from .models import Evaluation, EvaluationAttribute from .models import ExerciseDevice, ExerciseDeviceTranslation, ExerciseTypeDevice, ExerciseDeviceAlternative from .models import ExerciseTypeImage from .models import ExerciseTypeTranslation @@ -15,7 +14,6 @@ from .models import ExerciseTreeTranslation from .models import ExerciseTree from .models import ExerciseTreeParents from .models import ExercisePlanTranslation -from .models import ExercisePlan from .models import ExercisePlanTemplate, ExercisePlanTemplateTranslation, ExercisePlanTemplateDetail ''' @@ -53,7 +51,7 @@ class ExerciseTreeAdmin(admin.ModelAdmin): list_display = ('tree_id', 'name_colored', 'active') search_fields = ['name'] - fields = ["name", 'description', "image_url", "active", "get_image_preview"] + fields = ["name", 'description', "image_url", "active", "get_image_preview"] readonly_fields = ("get_image_preview",) def get_image_preview(self, obj): @@ -198,9 +196,8 @@ class ExercisePlanTemplateAdmin(admin.ModelAdmin): 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') - + 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 @@ -231,6 +228,7 @@ class ExercisePlanAdmin(admin.ModelAdmin): TranslationPlanInline ] + ''' class ExercisePlanDetailAdmin(admin.ModelAdmin): list_display = ('get_plan', 'get_exercise_type', 'serie', 'repeats', 'weight_equation',) @@ -282,10 +280,35 @@ class ExerciseDeviceAdmin(admin.ModelAdmin): ] +class EvaluationAdmin(admin.ModelAdmin): + list_display = ('evaluation_id', 'name', 'get_exercise_type') + + def get_exercise_type(self, obj): + return obj.exercise_type.name + + +class EvaluationAttributeAdmin(admin.ModelAdmin): + list_display = ( + 'evaluation_attr_id', 'name', 'sex', 'age_min', 'age_max', 'value_min', 'value_max', 'evaluation_text') + list_editable = ('name', 'sex', 'age_min', 'age_max', 'value_min', 'value_max', 'evaluation_text') + list_filter = ('evaluation',) + + def copy_attributes(self, request, queryset): + for objectAttr in queryset: + objectAttr.pk = None + objectAttr.name = objectAttr.name + "_copy" + objectAttr.save() + + copy_attributes.short_description = "Clone the selected attribute" + + actions = [copy_attributes] + + admin.site.register(ExerciseType, ExerciseTypeAdmin) admin.site.register(ExerciseTree, ExerciseTreeAdmin) admin.site.register(ExercisePlanTemplate, ExercisePlanTemplateAdmin) -#admin.site.register(ExercisePlan, ExercisePlanAdmin) admin.site.register(Product, ProductAdmin) admin.site.register(ExerciseDevice, ExerciseDeviceAdmin) +admin.site.register(Evaluation, EvaluationAdmin) +admin.site.register(EvaluationAttribute, EvaluationAttributeAdmin) admin.autodiscover() diff --git a/aitrainer_backoffice/aitrainer_backoffice/locale/hu/LC_MESSAGES/django.mo b/aitrainer_backoffice/aitrainer_backoffice/locale/hu/LC_MESSAGES/django.mo index 6cc18cc..cfc8bc8 100644 Binary files a/aitrainer_backoffice/aitrainer_backoffice/locale/hu/LC_MESSAGES/django.mo and b/aitrainer_backoffice/aitrainer_backoffice/locale/hu/LC_MESSAGES/django.mo differ 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 87acbdf..cf1c008 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: 2021-02-23 14:53+0100\n" +"POT-Creation-Date: 2021-04-03 14:27+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,191 +18,219 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: .\aitrainer_backoffice\admin.py:48 .\aitrainer_backoffice\admin.py:94 -#: .\aitrainer_backoffice\admin.py:258 +#: .\aitrainer_backoffice\admin.py:63 .\aitrainer_backoffice\admin.py:109 +#: .\aitrainer_backoffice\admin.py:275 msgid "Image Preview" msgstr "Kép előnézet" -#: .\aitrainer_backoffice\models.py:27 .\aitrainer_backoffice\models.py:201 +#: .\aitrainer_backoffice\models.py:30 .\aitrainer_backoffice\models.py:211 msgid "Exercise Device" msgstr "Edzés eszköz" -#: .\aitrainer_backoffice\models.py:28 .\aitrainer_backoffice\models.py:202 +#: .\aitrainer_backoffice\models.py:31 .\aitrainer_backoffice\models.py:212 msgid "Exercise Devices" msgstr "Edzés eszközök" -#: .\aitrainer_backoffice\models.py:42 -#, fuzzy -#| msgid "Exercise Tree Parent" +#: .\aitrainer_backoffice\models.py:46 msgid "exercise_device_parent" msgstr "Gyakorlat Eszköz szülő" -#: .\aitrainer_backoffice\models.py:44 -#, fuzzy -#| msgid "Exercise Tree" +#: .\aitrainer_backoffice\models.py:48 msgid "exercise_device_child" msgstr "Gyakorlat eszköz" -#: .\aitrainer_backoffice\models.py:48 +#: .\aitrainer_backoffice\models.py:52 msgid "Device Alternative" msgstr "Eszköz alternatíva" -#: .\aitrainer_backoffice\models.py:49 +#: .\aitrainer_backoffice\models.py:53 msgid "Device Alternatives" msgstr "Eszköz alternatívák" -#: .\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 +#: .\aitrainer_backoffice\models.py:65 .\aitrainer_backoffice\models.py:106 +#: .\aitrainer_backoffice\models.py:197 .\aitrainer_backoffice\models.py:271 +#: .\aitrainer_backoffice\models.py:317 .\aitrainer_backoffice\models.py:400 msgid "Translation" msgstr "Fordítás" -#: .\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 +#: .\aitrainer_backoffice\models.py:66 .\aitrainer_backoffice\models.py:107 +#: .\aitrainer_backoffice\models.py:198 .\aitrainer_backoffice\models.py:272 +#: .\aitrainer_backoffice\models.py:318 .\aitrainer_backoffice\models.py:401 msgid "Translations" msgstr "Fordítások" -#: .\aitrainer_backoffice\models.py:83 +#: .\aitrainer_backoffice\models.py:89 msgid "Exercise Tree" msgstr "Gyakorlat Menü" -#: .\aitrainer_backoffice\models.py:84 +#: .\aitrainer_backoffice\models.py:90 msgid "Exercise Tree Items" msgstr "Gyakorlat Menü elemek" -#: .\aitrainer_backoffice\models.py:108 -#, fuzzy -#| msgid "Exercise Tree Parent" +#: .\aitrainer_backoffice\models.py:117 msgid "exercise_tree_parent" msgstr "Gyakorlat Menü szülő" -#: .\aitrainer_backoffice\models.py:108 +#: .\aitrainer_backoffice\models.py:118 msgid "Parent menu" msgstr "Szülő menüpont" -#: .\aitrainer_backoffice\models.py:110 -#, fuzzy -#| msgid "Exercise Tree" -msgid "exercise_tree_child" -msgstr "Aktuális Gyakorlat Menü" +#: .\aitrainer_backoffice\models.py:123 .\aitrainer_backoffice\models.py:124 +msgid "Menu Tree Representation" +msgstr "" -#: .\aitrainer_backoffice\models.py:110 -msgid "Actual menu" -msgstr "Aktuális menüpont" - -#: .\aitrainer_backoffice\models.py:114 -msgid "Exercise Tree Parent" -msgstr "Gyakorlat Menü szülő" - -#: .\aitrainer_backoffice\models.py:115 -msgid "Exercise Tree Parents" -msgstr "Gyakorlat Menü szülők" - -#: .\aitrainer_backoffice\models.py:150 +#: .\aitrainer_backoffice\models.py:159 msgid "Exercise" msgstr "Gyakorlat" -#: .\aitrainer_backoffice\models.py:151 +#: .\aitrainer_backoffice\models.py:160 msgid "Exercises" msgstr "Gyakorlatok" -#: .\aitrainer_backoffice\models.py:171 +#: .\aitrainer_backoffice\models.py:181 msgid "Image" msgstr "Kép" -#: .\aitrainer_backoffice\models.py:172 +#: .\aitrainer_backoffice\models.py:182 msgid "Images" msgstr "Képek" -#: .\aitrainer_backoffice\models.py:208 -#, fuzzy -#| msgid "Exercise Tree Parent" +#: .\aitrainer_backoffice\models.py:218 msgid "exercise_type_parent" msgstr "Gyakorlat szülő" -#: .\aitrainer_backoffice\models.py:210 -#, fuzzy -#| msgid "Exercise Tree" +#: .\aitrainer_backoffice\models.py:220 msgid "exercise_type_child" msgstr "Aktuális gyakorlat" -#: .\aitrainer_backoffice\models.py:214 +#: .\aitrainer_backoffice\models.py:224 msgid "Exercise Alternative" msgstr "Gyakorlat alternatíva" -#: .\aitrainer_backoffice\models.py:215 +#: .\aitrainer_backoffice\models.py:225 msgid "Exercise Alternatives" msgstr "Gyakorlat alternatívák" -#: .\aitrainer_backoffice\models.py:226 +#: .\aitrainer_backoffice\models.py:236 msgid "Exercise Parent" msgstr "Gyakorlat szülő" -#: .\aitrainer_backoffice\models.py:227 +#: .\aitrainer_backoffice\models.py:237 msgid "Exercise Parents" msgstr "Gyakorlat szülők" -#: .\aitrainer_backoffice\models.py:245 -#, fuzzy -#| msgid "Exercise Plan Detail" +#: .\aitrainer_backoffice\models.py:255 msgid "Exercise Plan Template" msgstr "Edzésterv sablon" -#: .\aitrainer_backoffice\models.py:246 -#, fuzzy -#| msgid "Exercise Plan Details" +#: .\aitrainer_backoffice\models.py:256 msgid "Exercise Plan Templates" msgstr "Edzésterv sablonok" -#: .\aitrainer_backoffice\models.py:279 -#, fuzzy -#| msgid "Exercise Plan Detail" +#: .\aitrainer_backoffice\models.py:289 msgid "Exercise Plan Template Detail" msgstr "Edzésterv sablon gyakorlat" -#: .\aitrainer_backoffice\models.py:280 -#, fuzzy -#| msgid "Exercise Plan Details" +#: .\aitrainer_backoffice\models.py:290 msgid "Exercise Plan Template Details" msgstr "Edzésterv sablon gyakorlatok" -#: .\aitrainer_backoffice\models.py:291 +#: .\aitrainer_backoffice\models.py:301 msgid "Exercise Plan" msgstr "Edzésterv" -#: .\aitrainer_backoffice\models.py:292 +#: .\aitrainer_backoffice\models.py:302 msgid "Exercise Plans" msgstr "Edzéstervek" -#: .\aitrainer_backoffice\models.py:324 +#: .\aitrainer_backoffice\models.py:334 msgid "Exercise Plan Detail" msgstr "Edzésterv gyakorlat" -#: .\aitrainer_backoffice\models.py:325 +#: .\aitrainer_backoffice\models.py:335 msgid "Exercise Plan Details" msgstr "Edzésterv gyakorlatok" -#: .\aitrainer_backoffice\models.py:347 +#: .\aitrainer_backoffice\models.py:357 msgid "Product" msgstr "Termék" -#: .\aitrainer_backoffice\models.py:348 +#: .\aitrainer_backoffice\models.py:358 msgid "Products" msgstr "Termékek" -#: .\aitrainer_backoffice\models.py:364 +#: .\aitrainer_backoffice\models.py:374 msgid "Purchase" msgstr "Vásárlás" -#: .\aitrainer_backoffice\models.py:365 +#: .\aitrainer_backoffice\models.py:375 msgid "Purchases" msgstr "Vásárlások" -#: .\aitrainer_backoffice\models.py:375 +#: .\aitrainer_backoffice\models.py:385 msgid "Customer Property" msgstr "Ügyfél tulajdonság" -#: .\aitrainer_backoffice\models.py:376 +#: .\aitrainer_backoffice\models.py:386 msgid "Customer Properties" msgstr "Ügyfél tulajdonságok" + +#: .\aitrainer_backoffice\models.py:410 +msgid "exercise_type" +msgstr "Aktuális gyakorlat" + +#: .\aitrainer_backoffice\models.py:411 +msgid "unit" +msgstr "Mértékegység" + +#: .\aitrainer_backoffice\models.py:415 +msgid "Evaluation" +msgstr "Kiértékelés" + +#: .\aitrainer_backoffice\models.py:416 +msgid "Evaluations" +msgstr "Kiértékelés Csoport" + +#: .\aitrainer_backoffice\models.py:439 +msgid "evaluation_foreign" +msgstr "Kiértékelés Főcsoport" + +#: .\aitrainer_backoffice\models.py:440 +msgid "name" +msgstr "Név" + +#: .\aitrainer_backoffice\models.py:441 +msgid "sex" +msgstr "Nem" + +#: .\aitrainer_backoffice\models.py:442 +msgid "age_min" +msgstr "Kortól" + +#: .\aitrainer_backoffice\models.py:443 +msgid "age_max" +msgstr "Korig" + +#: .\aitrainer_backoffice\models.py:444 +msgid "value_min" +msgstr "Min érték" + +#: .\aitrainer_backoffice\models.py:445 +msgid "value_max" +msgstr "Max érték" + +#: .\aitrainer_backoffice\models.py:447 +msgid "evaluation_text" +msgstr "Osztályozás" + +#: .\aitrainer_backoffice\models.py:449 +msgid "suggestion" +msgstr "Javaslat" + +#: .\aitrainer_backoffice\models.py:453 +msgid "Evaluation Table" +msgstr "Kiértékelés tábla" + +#: .\aitrainer_backoffice\models.py:454 +msgid "Evaluation Tables" +msgstr "Kiértékelés táblák" diff --git a/aitrainer_backoffice/aitrainer_backoffice/models.py b/aitrainer_backoffice/aitrainer_backoffice/models.py index 3eb36af..0dab21f 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/models.py +++ b/aitrainer_backoffice/aitrainer_backoffice/models.py @@ -1,7 +1,9 @@ from django.db import models from django.utils.safestring import mark_safe from django.utils.translation import ugettext_lazy as _ -#from treenode.models import TreeNodeModel + + +# from treenode.models import TreeNodeModel class LanguageTypes(models.TextChoices): @@ -41,9 +43,9 @@ class ExerciseDevice(models.Model): class ExerciseDeviceAlternative(models.Model): exercise_device_alternative_id = models.AutoField(primary_key=True) exercise_device_parent = models.ForeignKey(ExerciseDevice, on_delete=models.CASCADE, - related_name=_('exercise_device_parent')) + related_name='exercise_device_parent') exercise_device_child = models.ForeignKey(ExerciseDevice, on_delete=models.CASCADE, - related_name=_('exercise_device_child')) + related_name='exercise_device_child') class Meta: db_table = 'exercise_device_alternative' @@ -109,10 +111,10 @@ class ExerciseTreeTranslation(models.Model): class ExerciseTreeParents(models.Model): - #treenode_display_field = 'name' + # treenode_display_field = 'name' exercise_tree_parents_id = models.AutoField(primary_key=True) exercise_tree_parent = models.ForeignKey(ExerciseTree, on_delete=models.CASCADE, - related_name=_('exercise_tree_parent'), + related_name='exercise_tree_parent', help_text=_('Parent menu'), blank=True) exercise_tree_child = models.ForeignKey(ExerciseTree, on_delete=models.CASCADE) @@ -213,9 +215,9 @@ class ExerciseTypeDevice(models.Model): class ExerciseTypeAlternative(models.Model): exercise_type_alternative_id = models.AutoField(primary_key=True) exercise_type_parent = models.ForeignKey(ExerciseType, on_delete=models.CASCADE, - related_name=_('exercise_type_parent')) + related_name='exercise_type_parent') exercise_type_child = models.ForeignKey(ExerciseType, on_delete=models.CASCADE, - related_name=_('exercise_type_child')) + related_name='exercise_type_child') class Meta: db_table = 'exercise_type_alternative' @@ -345,8 +347,8 @@ class Product(models.Model): type = models.CharField(max_length=15, choices=ProductTypes.choices, default=ProductTypes.SUBS) valid_from = models.DateField(blank=True, null=True) valid_to = models.DateField(blank=True, null=True) - product_id_ios = models.CharField(max_length=50,blank=True, null=True) - product_id_android = models.CharField(max_length=50,blank=True, null=True) + product_id_ios = models.CharField(max_length=50, blank=True, null=True) + product_id_android = models.CharField(max_length=50, blank=True, null=True) price_ios = models.DecimalField(max_length=12, decimal_places=2, max_digits=12, blank=True) price_android = models.DecimalField(max_length=12, decimal_places=2, max_digits=12, blank=True) @@ -400,3 +402,56 @@ class PropertyTranslation(models.Model): def __str__(self): return self.property_name + + +class Evaluation(models.Model): + evaluation_id = models.AutoField(primary_key=True) + name = models.CharField(max_length=100, help_text='The name should be in English here') + exercise_type = models.ForeignKey(ExerciseType, on_delete=models.CASCADE, verbose_name=_("exercise_type")) + unit = models.CharField(max_length=50, verbose_name=_("unit")) + + class Meta: + db_table = 'evaluation' + verbose_name = _("Evaluation") + verbose_name_plural = _("Evaluations") + + def __str__(self): + return self.name + + +class EvaluationAttribute(models.Model): + class SexTypes(models.TextChoices): + MAN = 'm' + WOMAN = 'w' + + class EvaluationTypes(models.TextChoices): + ELITE = "elite" + EXCELLENT = "excellent" + GOOD = "good" + ABOVE_AVERAGE = "above_average" + AVERAGE = "average" + BELOW_AVERAGE = "below_average" + FAIR = "fair" + POOR = "poor" + VERY_POOR = "very_poor" + + evaluation_attr_id = models.AutoField(primary_key=True) + evaluation = models.ForeignKey(Evaluation, on_delete=models.CASCADE, verbose_name=_("evaluation_foreign")) + name = models.CharField(max_length=100, help_text='The name should be in English here', verbose_name=_("name")) + sex = models.CharField(max_length=1, choices=SexTypes.choices, default=SexTypes.MAN, verbose_name=_("sex")) + age_min = models.IntegerField(verbose_name=_("age_min")) + age_max = models.IntegerField(verbose_name=_("age_max")) + value_min = models.FloatField(verbose_name=_("value_min")) + value_max = models.FloatField(verbose_name=_("value_max")) + evaluation_text = models.CharField(max_length=50, choices=EvaluationTypes.choices, default=EvaluationTypes.AVERAGE, + verbose_name=_("evaluation_text")) + suggestion = models.TextField(max_length=1000, blank=True, null=True, help_text="English suggestion here", + verbose_name=_("suggestion")) + + class Meta: + db_table = 'evaluation_attribute' + verbose_name = _("Evaluation Table") + verbose_name_plural = _("Evaluation Tables") + + def __str__(self): + return self.name