From cbe7ab97ef1d38c1520e46775c799a6e5f254fd2 Mon Sep 17 00:00:00 2001 From: Bossanyi Tibor Date: Mon, 10 May 2021 16:53:37 +0200 Subject: [PATCH] BO 1.15 faq, training plans --- .../aitrainer_backoffice/admin/__init__.py | 3 +- .../aitrainer_backoffice/admin/faq.py | 22 +++ .../admin/training_plan.py | 84 +++++++++ .../locale/hu/LC_MESSAGES/django.mo | Bin 3023 -> 3833 bytes .../locale/hu/LC_MESSAGES/django.po | 165 +++++++++++++----- .../aitrainer_backoffice/models/__init__.py | 2 + .../models/description.py | 2 +- .../models/exercise_type.py | 4 +- .../aitrainer_backoffice/models/faq.py | 33 ++++ .../models/training_plan.py | 37 ++++ .../aitrainer_backoffice/settings/dev.py | 10 +- .../templates/admin/change_list.html | 89 ++++++++++ aitrainer_backoffice/static/training_plan.js | 5 + 13 files changed, 408 insertions(+), 48 deletions(-) create mode 100644 aitrainer_backoffice/aitrainer_backoffice/admin/faq.py create mode 100644 aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py create mode 100644 aitrainer_backoffice/aitrainer_backoffice/models/faq.py create mode 100644 aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py create mode 100644 aitrainer_backoffice/aitrainer_backoffice/templates/admin/change_list.html create mode 100644 aitrainer_backoffice/static/training_plan.js diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py b/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py index f645ea4..28555b2 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py +++ b/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py @@ -8,4 +8,5 @@ from .tutorial import TutorialAdmin from .evaluation import EvaluationAdmin, EvaluationAttributeAdmin from .exercise_plan import ExercisePlanAdmin from .description import DescriptionAdmin - +from .training_plan import TrainingPlanAdmin, TrainingPlanDetailAdmin +from .faq import FaqAdmin diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin/faq.py b/aitrainer_backoffice/aitrainer_backoffice/admin/faq.py new file mode 100644 index 0000000..d5dda33 --- /dev/null +++ b/aitrainer_backoffice/aitrainer_backoffice/admin/faq.py @@ -0,0 +1,22 @@ +from django.contrib import admin + +from ..models.faq import Faq, FaqTranslation + + +class FaqDescriptionInline(admin.TabularInline): + model = FaqTranslation + fields = ('language_code', 'name_translation', 'description_translation') + extra = 0 + + +class FaqAdmin(admin.ModelAdmin): + list_display = ('name',) + fields = ('name','description') + + inlines = [ + FaqDescriptionInline, + ] + + +admin.site.register(Faq, FaqAdmin) +admin.autodiscover() diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py b/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py new file mode 100644 index 0000000..fc5412a --- /dev/null +++ b/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py @@ -0,0 +1,84 @@ +from django.contrib import admin +from django.utils.html import format_html +from django.utils.translation import ugettext_lazy as _ + +from ..models.training_plan import TrainingPlan, TrainingPlanDetail + + +class TrainingPlanAdmin(admin.ModelAdmin): + list_display = ('name',) + fields = ('name',) + + +class TrainingPlanDetailAdmin(admin.ModelAdmin): + list_display = ( + 'training_plan', 'exercise_type', 'sort', 'set', 'repeats', 'max', 'weight', 'calc', + 'resting_time', 'parallel', 'day') + list_filter = ('training_plan__name', 'exercise_type__name') + list_editable = ( + 'exercise_type', 'sort', 'set', 'repeats', 'weight', 'resting_time', 'parallel', 'day') + ordering = ('sort',) + + def repeat_max(self, obj): + if obj.repeat_max: + obj.repeats = -1 + else: + obj.repeats = 0 + + def get_training_plan_info_info(self): + first_row = _("Special cases: Weight = -1 IF the Weight should be calculated.") + second_row = _("Repeats = -1 IF the repeats should be maximized") + return first_row + second_row + + def changelist_view(self, request, extra_context=None): + response = super(TrainingPlanDetailAdmin, self).changelist_view(request, extra_context) + extra_context = { + 'extra_hint': self.get_training_plan_info_info() + } + try: + response.context_data.update(extra_context) + except Exception as e: + pass + return response + + def copy_attributes(self, request, queryset): + for objectAttr in reversed(queryset): + objectAttr.pk = None + objectAttr.sort = objectAttr.sort + 1 + objectAttr.save() + copy_attributes.short_description = _("Clone the selected Training Plan Detail") + + def select_max_repeat(self, request, queryset): + for obj in queryset: + obj.repeats = -1 + obj.save() + select_max_repeat.short_description = _("Select the exercises with MAX repeats") + + def select_weight_calc(self, request, queryset): + for obj in queryset: + obj.weight = -1 + obj.save() + select_weight_calc.short_description = _("Select the exercises CALCULATED weight") + + def max(self, obj): + color_code = "000000" + if obj.repeats and obj.repeats == -1: + color_code = 'C20000' + + html = '{}'.format(color_code, "*") + return format_html(html) + + def calc(self, obj): + color_code = "000000" + if obj.weight == -1: + color_code = 'C20000' + + html = '{}'.format(color_code, "*") + return format_html(html) + + actions = [copy_attributes, select_max_repeat, select_weight_calc] + + +admin.site.register(TrainingPlan, TrainingPlanAdmin) +admin.site.register(TrainingPlanDetail, TrainingPlanDetailAdmin) +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 3d7475f0ee8db601bfbdb92bdcefc8f844e4bf66..4d1d06d0bb33e135750422948a5d5dd6cda27516 100644 GIT binary patch literal 3833 zcma)-U1(fI6vxME{fM<{{iwBCM_a#p(^jpm+oX1zY|=HmNldoUicoKMr`y}Td+$1P zH%(Rq!3RZA$b%mbiUt&1q=+pPg`(g!T3-Zx5m5xe3Zg!!PofY0|GRg;k}Wvwxxbk+ zbIzPObMDbEOcMgA3pl;E8DbIe0O~--4^aGvFHV zPmt?Yo-afXxDLDw+yv6kc93?%;Dz8McqRBKcoq0Kcq#Y{NV`{}@jKD@1Mm{)zW{0X z4M@A+z^lO(7YK1ZxDMO^?f}<kA4hH$Z;|l;BDn4qb5z$aD5a+yQdGJ>VAb0g(PGAkXtG$n(4oGTsv) z{eJ>7&tHQ0iSO{B-A^Fb{Rz_VIe2j2iz8kE@?O@1%xf=5yWJqqnF4w42SMJ~{z(5A zh@VgqeQ@tNLd=1@$5U9$ynYEX-k(9n^>4(L2%6_v4f0+#f{Zf;a(xn{{lRGdD9HU@ zjK;5m*I@h}NW0S@_x&c~FCfqL4~Q+rY9xpItpmAVFUa)?a6R}C$ht5f?|mM`PrQu> z^Ku-d-6tSiif=*Q_nC;lg3Rk5AkX(!T@p z9A%LEKLM@-p9bMlybdxS?}9wf#~|zBQ;>d7gFN3?ApQLq@plmAAnt;2U&hFJHcW}z zYQ6fSAJ__^f9}P&*|tOOfb>EbBjectVczbA+ydcQxIY`?z8wk_O zlnxxVTsJ2MmC0(S6ga-u-ZvP`I9Vm*bmrNCGo!kwj7ZGbZW+@sZ*^tHo_5tTMf+;> zXO+%62Fs#O$6no(EgM;nu4P&uw=EdAweo`2g8I09fomh=#@6E)!D(PSZdc_JLzz*< zl4}QT!Ph)A)ZJYznLV4&CHl5uMys|RIg-gh6YkgL8n#*VjoICB#U-FdZHR| zvFd1DXGA?OvZ%bW7)K2mC9}TPDjUe)u#!q^U(0Fb`bT@uI&Yc_w4W=!ZFS|K-lSO;hDLNIE6B%tgp5x^u6Wlp!WVvHW zq%@sNYeUcA%2=r|X!J2r4t(v{ZnGmN16ArAwN@E{R31clbvm9<%{SoSAzv#e-=PZB zY#>xrW(R}0k`kVcD=}(Tm~uX^Of90a=LCX|>b|2Myd#xIa2ZxIXHDU)M)WZ`9v>Kq z4=3bQVq!8mHrj)f`Z}=EChz2|z2&^IGJZ_^rUPPSdEnUIwptqr&4k>o=(WVL^_^K?THT#P9!ELcVnrSFCzg~M%l%f zOvOis_cM~dRBDgw^!hsAT7wAE$#kL>_O{-wJp;ZM;JvgmNJLCBIa}}^Io>XbI?+Z2 z{rfXR*3Q;C-qazbt%R5Lb0~wD+&S$8J>za!+paa_>!OKCuT&eF{=0U`dbj^JPu|!s zx81(0M@&{0-`9)tG6+v{!>!`Je2hr+5WgR*NM$@!iM7xI3gyI!PJcua>2rqxN9 zN+CR1!RNOAaSV^m*rJOvTquYUC#>oqtQHjaUNS^X3)8OMRlD3+4j7*|Er#dpg0E4` ztzKs=%?0ghI!xp$h(fCR0hSEIlZ7^irV^fV7w4C28eVYrnaBgXGT)41|UR z{6X+9qZUqWVO`VR$~&^Zy+B=*P4n8RTiSgQ;D@((OxEb(P%%*aRq=XF)M;KFbO z-{m}?L3jce(D5QkTue549mY%rySj6Jg?q;fK^Y^*wAIpRSe+50swf_?XKelph;-wv U%+Hyynipw%Rz@n3cD!c)Kjppx`Tzg` delta 1201 zcmZA0OGs2v7{Kvw)X7()H9ag%duaJ=GMhy^A%ut|h$sqLv}q%>h#+hsLsZLJbd#u{ z2NbO$aIhexMS|eQ5PIxHqD|2%Y>}(}f4y!x-0%MGoYy_)J9qxJerzf&8Y9h+x0E{tkWNG`fI!wErSH-_O+FXa<+Dk@rWA zRtL5s*@|8?`~7HYi)sBJI^j_22|U7aoke&4h}D{*GMcejG*b)cg8roKRZL?4W-QrZ zfCnc&#?9ZSa2t-G18<;bdN=hsx`Q|90%y?|enQ9pK>OR+0(tbP3g}S`qnW!<$NBRS z#3d>mIEJS79-4`#X!{E!TQP}FJcVpJ=8$*A7j)brn#o_t70cXwQIwQ(S^Q5u6Ua|jhs;IC+zPg&1?nX zhJ1f?5~gW4(MzlqC;q=QQ{loaF2wV;m|n|X!kxK$%O0X*pmv*Gy88D\n" "Language-Team: LANGUAGE \n" @@ -24,6 +24,68 @@ msgstr "" msgid "Image Preview" msgstr "Kép előnézet" +#: .\aitrainer_backoffice\admin\training_plan.py:29 +msgid "Special cases: Weight = -1 IF the Weight should be calculated." +msgstr "" + +#: .\aitrainer_backoffice\admin\training_plan.py:30 +msgid "Repeats = -1 IF the repeats should be maximized" +msgstr "Ismétlés: -1, HA MAX ismétlés" + +#: .\aitrainer_backoffice\admin\training_plan.py:49 +#, fuzzy +#| msgid "Training Plan Detail" +msgid "Clone the selected Training Plan Detail" +msgstr "Edzésprogram részlet" + +#: .\aitrainer_backoffice\admin\training_plan.py:55 +msgid "Select the exercises with MAX repeats" +msgstr "" + +#: .\aitrainer_backoffice\admin\training_plan.py:61 +msgid "Select the exercises CALCULATED weight" +msgstr "" + +#: .\aitrainer_backoffice\models\description.py:11 +#: .\aitrainer_backoffice\models\evaluation.py:40 +#: .\aitrainer_backoffice\models\faq.py:11 +#: .\aitrainer_backoffice\models\training_plan.py:10 +#: .\aitrainer_backoffice\models\tutorial.py:11 +msgid "name" +msgstr "Név" + +#: .\aitrainer_backoffice\models\description.py:19 +msgid "Description" +msgstr "Leírás" + +#: .\aitrainer_backoffice\models\description.py:20 +msgid "Descriptions" +msgstr "Leírás" + +#: .\aitrainer_backoffice\models\description.py:34 +#: .\aitrainer_backoffice\models\exercise_device.py:53 +#: .\aitrainer_backoffice\models\exercise_plan.py:32 +#: .\aitrainer_backoffice\models\exercise_plan_template.py:38 +#: .\aitrainer_backoffice\models\exercise_type.py:72 +#: .\aitrainer_backoffice\models\exercisetree.py:33 +#: .\aitrainer_backoffice\models\faq.py:32 +#: .\aitrainer_backoffice\models\property.py:29 +#: .\aitrainer_backoffice\models\tutorial.py:45 +msgid "Translation" +msgstr "Fordítás" + +#: .\aitrainer_backoffice\models\description.py:35 +#: .\aitrainer_backoffice\models\exercise_device.py:54 +#: .\aitrainer_backoffice\models\exercise_plan.py:33 +#: .\aitrainer_backoffice\models\exercise_plan_template.py:39 +#: .\aitrainer_backoffice\models\exercise_type.py:73 +#: .\aitrainer_backoffice\models\exercisetree.py:34 +#: .\aitrainer_backoffice\models\faq.py:33 +#: .\aitrainer_backoffice\models\property.py:30 +#: .\aitrainer_backoffice\models\tutorial.py:46 +msgid "Translations" +msgstr "Fordítások" + #: .\aitrainer_backoffice\models\evaluation.py:10 msgid "exercise_type" msgstr "Aktuális gyakorlat" @@ -44,11 +106,6 @@ msgstr "Kiértékelés Csoport" msgid "evaluation_foreign" msgstr "Kiértékelés Főcsoport" -#: .\aitrainer_backoffice\models\evaluation.py:40 -#: .\aitrainer_backoffice\models\tutorial.py:11 -msgid "name" -msgstr "Név" - #: .\aitrainer_backoffice\models\evaluation.py:41 msgid "sex" msgstr "Nem" @@ -86,12 +143,12 @@ msgid "Evaluation Tables" msgstr "Kiértékelés táblák" #: .\aitrainer_backoffice\models\exercise_device.py:18 -#: .\aitrainer_backoffice\models\exercise_type.py:88 +#: .\aitrainer_backoffice\models\exercise_type.py:86 msgid "Exercise Device" msgstr "Edzés eszköz" #: .\aitrainer_backoffice\models\exercise_device.py:19 -#: .\aitrainer_backoffice\models\exercise_type.py:89 +#: .\aitrainer_backoffice\models\exercise_type.py:87 msgid "Exercise Devices" msgstr "Edzés eszközök" @@ -103,26 +160,6 @@ msgstr "Eszköz alternatíva" msgid "Device Alternatives" msgstr "Eszköz alternatívák" -#: .\aitrainer_backoffice\models\exercise_device.py:53 -#: .\aitrainer_backoffice\models\exercise_plan.py:32 -#: .\aitrainer_backoffice\models\exercise_plan_template.py:40 -#: .\aitrainer_backoffice\models\exercise_type.py:74 -#: .\aitrainer_backoffice\models\exercisetree.py:33 -#: .\aitrainer_backoffice\models\property.py:29 -#: .\aitrainer_backoffice\models\tutorial.py:45 -msgid "Translation" -msgstr "Fordítás" - -#: .\aitrainer_backoffice\models\exercise_device.py:54 -#: .\aitrainer_backoffice\models\exercise_plan.py:33 -#: .\aitrainer_backoffice\models\exercise_plan_template.py:41 -#: .\aitrainer_backoffice\models\exercise_type.py:75 -#: .\aitrainer_backoffice\models\exercisetree.py:34 -#: .\aitrainer_backoffice\models\property.py:30 -#: .\aitrainer_backoffice\models\tutorial.py:46 -msgid "Translations" -msgstr "Fordítások" - #: .\aitrainer_backoffice\models\exercise_plan.py:16 msgid "Exercise Plan" msgstr "Edzésterv" @@ -139,51 +176,51 @@ msgstr "Edzésterv gyakorlat" msgid "Exercise Plan Details" msgstr "Edzésterv gyakorlatok" -#: .\aitrainer_backoffice\models\exercise_plan_template.py:23 +#: .\aitrainer_backoffice\models\exercise_plan_template.py:22 msgid "Exercise Plan Template" msgstr "Edzésterv sablon" -#: .\aitrainer_backoffice\models\exercise_plan_template.py:24 +#: .\aitrainer_backoffice\models\exercise_plan_template.py:23 msgid "Exercise Plan Templates" msgstr "Edzésterv sablonok" -#: .\aitrainer_backoffice\models\exercise_plan_template.py:59 +#: .\aitrainer_backoffice\models\exercise_plan_template.py:57 msgid "Exercise Plan Template Detail" msgstr "Edzésterv sablon gyakorlat" -#: .\aitrainer_backoffice\models\exercise_plan_template.py:60 +#: .\aitrainer_backoffice\models\exercise_plan_template.py:58 msgid "Exercise Plan Template Details" msgstr "Edzésterv sablon gyakorlatok" -#: .\aitrainer_backoffice\models\exercise_type.py:35 +#: .\aitrainer_backoffice\models\exercise_type.py:34 msgid "Exercise" msgstr "Gyakorlat" -#: .\aitrainer_backoffice\models\exercise_type.py:36 +#: .\aitrainer_backoffice\models\exercise_type.py:35 msgid "Exercises" msgstr "Gyakorlatok" -#: .\aitrainer_backoffice\models\exercise_type.py:57 +#: .\aitrainer_backoffice\models\exercise_type.py:56 msgid "Image" msgstr "Kép" -#: .\aitrainer_backoffice\models\exercise_type.py:58 +#: .\aitrainer_backoffice\models\exercise_type.py:57 msgid "Images" msgstr "Képek" -#: .\aitrainer_backoffice\models\exercise_type.py:101 +#: .\aitrainer_backoffice\models\exercise_type.py:99 msgid "Exercise Alternative" msgstr "Gyakorlat alternatíva" -#: .\aitrainer_backoffice\models\exercise_type.py:102 +#: .\aitrainer_backoffice\models\exercise_type.py:100 msgid "Exercise Alternatives" msgstr "Gyakorlat alternatívák" -#: .\aitrainer_backoffice\models\exercise_type.py:113 +#: .\aitrainer_backoffice\models\exercise_type.py:111 msgid "Exercise Parent" msgstr "Gyakorlat szülő" -#: .\aitrainer_backoffice\models\exercise_type.py:114 +#: .\aitrainer_backoffice\models\exercise_type.py:112 msgid "Exercise Parents" msgstr "Gyakorlat szülők" @@ -204,6 +241,14 @@ msgstr "Szülő menüpont" msgid "Menu Tree Representation" msgstr "" +#: .\aitrainer_backoffice\models\faq.py:16 +msgid "FAQ" +msgstr "GYÍK" + +#: .\aitrainer_backoffice\models\faq.py:17 +msgid "FAQs" +msgstr "GYÍK" + #: .\aitrainer_backoffice\models\product.py:24 msgid "Product" msgstr "Termék" @@ -228,6 +273,22 @@ msgstr "Ügyfél tulajdonság" msgid "Customer Properties" msgstr "Ügyfél tulajdonságok" +#: .\aitrainer_backoffice\models\training_plan.py:14 +msgid "Training Plan" +msgstr "Edzésprogram Csoport" + +#: .\aitrainer_backoffice\models\training_plan.py:15 +msgid "Training Plans" +msgstr "Edzésprogram Csoportok" + +#: .\aitrainer_backoffice\models\training_plan.py:35 +msgid "Training Plan Detail" +msgstr "Edzésprogram részlet" + +#: .\aitrainer_backoffice\models\training_plan.py:36 +msgid "Training Plan Details" +msgstr "Edzésprogram részletek" + #: .\aitrainer_backoffice\models\tutorial.py:15 msgid "Tutorial" msgstr "Tutorial" @@ -236,14 +297,34 @@ msgstr "Tutorial" msgid "Tutorials" msgstr "Tutoriálok" -#: .\aitrainer_backoffice\models\tutorial.py:32 +#: .\aitrainer_backoffice\models\tutorial.py:33 msgid "Tutorial Step" msgstr "Tutorial lépés" -#: .\aitrainer_backoffice\models\tutorial.py:33 +#: .\aitrainer_backoffice\models\tutorial.py:34 msgid "Tutorial Steps" msgstr "Tutorial lépések" +#: .\aitrainer_backoffice\templates\admin\change_list.html:31 +msgid "Home" +msgstr "Főoldal" + +#: .\aitrainer_backoffice\templates\admin\change_list.html:51 +msgid "Please correct the error below." +msgstr "Kérlek javítsd az alábbi hibát" + +#: .\aitrainer_backoffice\templates\admin\change_list.html:51 +msgid "Please correct the errors below." +msgstr "Kérlek javítsd az alábbi hibákat" + +#: .\aitrainer_backoffice\templates\admin\change_list.html:79 +msgid "Filter" +msgstr "Szűrő" + +#: .\aitrainer_backoffice\templates\admin\change_list.html:81 +msgid "Clear all filters" +msgstr "Szűrő törlése" + #~ msgid "exercise_device_parent" #~ msgstr "Gyakorlat Eszköz szülő" diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/__init__.py b/aitrainer_backoffice/aitrainer_backoffice/models/__init__.py index e62e613..42cfabf 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/models/__init__.py +++ b/aitrainer_backoffice/aitrainer_backoffice/models/__init__.py @@ -11,3 +11,5 @@ from .property import Property, PropertyTranslation from .tutorial import Tutorial, TutorialSteps, TutorialTranslation from .evaluation import Evaluation, EvaluationAttribute from .description import Description, DescriptionTranslation +from .training_plan import TrainingPlan, TrainingPlanDetail +from .faq import Faq, FaqTranslation diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/description.py b/aitrainer_backoffice/aitrainer_backoffice/models/description.py index efd6ccd..2e32041 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/models/description.py +++ b/aitrainer_backoffice/aitrainer_backoffice/models/description.py @@ -10,7 +10,7 @@ class Description(models.Model): name = models.CharField(max_length=50, help_text='Unique description name', verbose_name=_("name")) description = RichTextField() - version = models.IntegerField(max_length=3, blank=True) + version = models.IntegerField(blank=True) valid_from = models.DateTimeField(blank=True) valid_to = models.DateTimeField(blank=True) diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/exercise_type.py b/aitrainer_backoffice/aitrainer_backoffice/models/exercise_type.py index 11a59e4..8070acf 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/models/exercise_type.py +++ b/aitrainer_backoffice/aitrainer_backoffice/models/exercise_type.py @@ -20,8 +20,7 @@ class ExerciseType(models.Model): exercise_type_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') - description = RichTextField() + description = RichTextField(blank=True, null=True, help_text='The description should be in English here') unit = models.CharField(choices=UnitTypes.choices, default=UnitTypes.REPEAT, max_length=50, blank=True, null=True) unit_quantity = models.BooleanField(default=0, blank=True, null=True) unit_quantity_unit = models.CharField(choices=UnitTypes.choices, default=UnitTypes.KG, max_length=50, blank=True, @@ -66,7 +65,6 @@ class ExerciseTypeTranslation(models.Model): exercise_type = models.ForeignKey(ExerciseType, 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) description = RichTextField(blank=True, null=True) class Meta: diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/faq.py b/aitrainer_backoffice/aitrainer_backoffice/models/faq.py new file mode 100644 index 0000000..692bde1 --- /dev/null +++ b/aitrainer_backoffice/aitrainer_backoffice/models/faq.py @@ -0,0 +1,33 @@ +from django.db import models +from django.utils.translation import ugettext_lazy as _ +from ckeditor.fields import RichTextField + +from .enums import LanguageTypes + + +class Faq(models.Model): + faq_id = models.AutoField(primary_key=True) + name = models.CharField(max_length=50, help_text='Unique description name', + verbose_name=_("name")) + description = RichTextField() + + class Meta: + db_table = 'faq' + verbose_name = _("FAQ") + verbose_name_plural = _("FAQs") + + def __str__(self): + return self.name + + +class FaqTranslation(models.Model): + faq_translation_id = models.AutoField(primary_key=True) + faq = models.ForeignKey(Faq, on_delete=models.CASCADE) + language_code = models.CharField(max_length=2, choices=LanguageTypes.choices, default=LanguageTypes.HU) + name_translation = RichTextField() + description_translation = RichTextField() + + class Meta: + db_table = 'faq_translation' + verbose_name = _("Translation") + verbose_name_plural = _("Translations") diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py b/aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py new file mode 100644 index 0000000..9bd2a59 --- /dev/null +++ b/aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py @@ -0,0 +1,37 @@ +from django.db import models +from django.utils.translation import ugettext_lazy as _ + +from ..models import ExerciseType + + +class TrainingPlan(models.Model): + training_plan_id = models.AutoField(primary_key=True) + name = models.CharField(max_length=100, help_text='The name of the training plan', + verbose_name=_("name")) + + class Meta: + db_table = 'training_plan' + verbose_name = _("Training Plan") + verbose_name_plural = _("Training Plans") + + def __str__(self): + return self.name + + +class TrainingPlanDetail(models.Model): + training_plan_detail_id = models.AutoField(primary_key=True) + training_plan = models.ForeignKey(TrainingPlan, on_delete=models.CASCADE) + exercise_type = models.ForeignKey(ExerciseType, on_delete=models.CASCADE) + sort = models.IntegerField() + set = models.IntegerField() + repeats = models.IntegerField(blank=True) + weight = models.IntegerField(blank=True) + resting_time = models.IntegerField(blank=True) + parallel = models.BooleanField(blank=True) + day = models.CharField(max_length=50, blank=True) + + class Meta: + db_table = 'training_plan_detail' + verbose_name = _("Training Plan Detail") + verbose_name_plural = _("Training Plan Details") + diff --git a/aitrainer_backoffice/aitrainer_backoffice/settings/dev.py b/aitrainer_backoffice/aitrainer_backoffice/settings/dev.py index 6edec9d..4c3ad01 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/settings/dev.py +++ b/aitrainer_backoffice/aitrainer_backoffice/settings/dev.py @@ -64,7 +64,7 @@ ROOT_URLCONF = 'aitrainer_backoffice.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], + "DIRS": [os.path.join(BASE_DIR, "templates"), ], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -90,6 +90,14 @@ DATABASES = { 'PASSWORD': 'andio2009', 'HOST': '127.0.0.1', 'PORT': 3306 + }, + 'live': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'aitrainer2', + 'USER': 'aitrainer', + 'PASSWORD': 'andio2009', + 'HOST': '127.0.0.1', + 'PORT': 3306 } } diff --git a/aitrainer_backoffice/aitrainer_backoffice/templates/admin/change_list.html b/aitrainer_backoffice/aitrainer_backoffice/templates/admin/change_list.html new file mode 100644 index 0000000..310b97c --- /dev/null +++ b/aitrainer_backoffice/aitrainer_backoffice/templates/admin/change_list.html @@ -0,0 +1,89 @@ +{% extends "admin/base_site.html" %} +{% load i18n admin_urls static admin_list %} + +{% block extrastyle %} + {{ block.super }} + + {% if cl.formset %} + + {% endif %} + {% if cl.formset or action_form %} + + {% endif %} + {{ media.css }} + {% if not actions_on_top and not actions_on_bottom %} + + {% endif %} +{% endblock %} + +{% block extrahead %} +{{ block.super }} +{{ media.js }} +{% endblock %} + +{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-list{% endblock %} + +{% if not is_popup %} +{% block breadcrumbs %} + +{% endblock %} +{% endif %} + +{% block coltype %}{% endblock %} + +{% block content %} +
+ {% block object-tools %} +
    + {% block object-tools-items %} + {% change_list_object_tools %} + {% endblock %} +
+ {% endblock %} + {% if cl.formset and cl.formset.errors %} +

+ {% if cl.formset.total_error_count == 1 %}{% translate "Please correct the error below." %}{% else %}{% translate "Please correct the errors below." %}{% endif %} +

+ {{ cl.formset.non_form_errors }} + {% endif %} +

{{ extra_hint|default:"" }}

+
+
+ {% block search %}{% search_form cl %}{% endblock %} + {% block date_hierarchy %}{% if cl.date_hierarchy %}{% date_hierarchy cl %}{% endif %}{% endblock %} + + +
{% csrf_token %} + {% if cl.formset %} +
{{ cl.formset.management_form }}
+ {% endif %} + + + {% block result_list %} + {% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %} + {% result_list cl %} + {% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %} + {% endblock %} + {% block pagination %}{% pagination cl %}{% endblock %} +
+
+ {% block filters %} + {% if cl.has_filters %} +
+

{% translate 'Filter' %}

+ {% if cl.has_active_filters %}

+ ✖ {% translate "Clear all filters" %} +

{% endif %} + {% for spec in cl.filter_specs %}{% admin_list_filter cl spec %}{% endfor %} +
+ {% endif %} + {% endblock %} +
+
+{% endblock %} diff --git a/aitrainer_backoffice/static/training_plan.js b/aitrainer_backoffice/static/training_plan.js new file mode 100644 index 0000000..07ad524 --- /dev/null +++ b/aitrainer_backoffice/static/training_plan.js @@ -0,0 +1,5 @@ +(function($){ // your code + $( "#weight_calc" ).click(function() { + alert( "Handler for .click() called." ); + }); +})(django.jQuery);