diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin/exercise_type.py b/aitrainer_backoffice/aitrainer_backoffice/admin/exercise_type.py index 0120972..cc91813 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/admin/exercise_type.py +++ b/aitrainer_backoffice/aitrainer_backoffice/admin/exercise_type.py @@ -47,7 +47,7 @@ class ExerciseTypeParentsInline(admin.TabularInline): class ExerciseTypeAdmin(admin.ModelAdmin): - list_display = ('exercise_type_id', 'name_colored', 'active', 'base', 'buddy_warning') + list_display = ('exercise_type_id', 'name_colored', 'active', 'base', 'buddy_warning', 'is_description', 'is_desc_hu', 'alternatives') search_fields = ['name', 'exercisetypetranslation__name'] fields = ('name', 'description', 'unit', 'unit_quantity', 'unit_quantity_unit', 'active', 'base', 'buddy_warning') @@ -65,6 +65,31 @@ class ExerciseTypeAdmin(admin.ModelAdmin): name_colored.admin_order_field = 'name' name_colored.short_description = 'name' + def is_description(self, obj): + if not obj.description: + return "-" + else: + return "OK" + + is_description.short_description = 'desc' + + def is_desc_hu(self, obj): + desc_hu = ",".join([k.description for k in obj.exercisetypetranslation_set.all()]) + if not desc_hu: + return "-" + else: + return "OK" + + is_desc_hu.short_description = 'desc HU' + + def alternatives(self, obj): + alternatives = [] + for k in obj.exercise_type_child.all(): + alternatives.append(k.exercise_type_parent_id) + return ", " . join([ExerciseType.objects.get(pk=id).name for id in alternatives]) + + alternatives.short_description = 'alternatives' + inlines = [ ImageInline, TranslationInline, diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py b/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py index 18066a9..1e1294b 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py +++ b/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py @@ -5,6 +5,85 @@ from django.utils.translation import ugettext_lazy as _ from ..models.training_plan import TrainingPlan, TrainingPlanDetail, TrainingPlanTranslation +class TrainingPlanDetailInline(admin.TabularInline): + model = TrainingPlanDetail + #fk_name = 'training_plan_detail_id' + 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): + name = str(queryset[0].training_plan) + details = TrainingPlanDetail.objects.filter(training_plan__name=name).order_by('sort') + new_sort = details[len(details) - 1].sort + 1 + + for objectAttr in queryset: + objectAttr.pk = None + objectAttr.sort = new_sort + objectAttr.save() + new_sort = new_sort + 1 + + 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] + + class TranslationTrainingPlanInline(admin.TabularInline): model = TrainingPlanTranslation fields = ('language_code', 'name_translation', 'description_translation') @@ -17,7 +96,8 @@ class TrainingPlanAdmin(admin.ModelAdmin): list_editable = ('name', 'internal_name', 'free', 'active') inlines = [ - TranslationTrainingPlanInline + TranslationTrainingPlanInline, + TrainingPlanDetailInline ] @@ -99,5 +179,5 @@ class TrainingPlanDetailAdmin(admin.ModelAdmin): admin.site.register(TrainingPlan, TrainingPlanAdmin) -admin.site.register(TrainingPlanDetail, TrainingPlanDetailAdmin) +#admin.site.register(TrainingPlanDetail, TrainingPlanDetailAdmin) admin.autodiscover() diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/exercise_type.py b/aitrainer_backoffice/aitrainer_backoffice/models/exercise_type.py index 5420c75..479adc4 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/models/exercise_type.py +++ b/aitrainer_backoffice/aitrainer_backoffice/models/exercise_type.py @@ -95,6 +95,9 @@ class ExerciseTypeAlternative(models.Model): exercise_type_child = models.ForeignKey(ExerciseType, on_delete=models.CASCADE, related_name='exercise_type_child') + def __str__(self): + return self.exercise_type_parent.name + class Meta: db_table = 'exercise_type_alternative' verbose_name = _("Exercise Alternative") diff --git a/aitrainer_backoffice/aitrainer_backoffice/settings/prod.py b/aitrainer_backoffice/aitrainer_backoffice/settings/prod.py index d0a0fdb..cec4200 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/settings/prod.py +++ b/aitrainer_backoffice/aitrainer_backoffice/settings/prod.py @@ -28,7 +28,7 @@ SECRET_KEY = '9874959872==9847588jkklnkln$asdf' #os.environ['DJANGO_KEY'] # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True -ALLOWED_HOSTS = ['62.171.188.119', 'localhost', 'andio.eu', 'aitrainer.info','aitrainer.app', 'admin.aitrainer.info'] +ALLOWED_HOSTS = ['62.171.188.119', 'localhost', 'andio.eu', 'aitrainer.info','aitrainer.app', 'admin.aitrainer.info', "admin.aitrainer.app"] # Application definition