BO 1.8 Evaluation

This commit is contained in:
Bossanyi Tibor 2021-04-03 14:36:31 +02:00
parent a16de5c7cd
commit fa6cd89fe2
4 changed files with 205 additions and 99 deletions

View File

@ -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()

View File

@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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"

View File

@ -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