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 3d7475f..4d1d06d 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 610aa8b..a4b77b3 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-04-24 11:26+0200\n" +"POT-Creation-Date: 2021-05-10 16:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \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);