From 3a429e714b2b1b025d2fe333fc4e0a32ab725846 Mon Sep 17 00:00:00 2001 From: "Tibor Bossanyi (Freelancer)" Date: Thu, 11 Nov 2021 21:16:12 +0100 Subject: [PATCH] BO 1.33 training program --- .../aitrainer_backoffice/admin/__init__.py | 3 +- .../admin/training_plan.py | 2 +- .../admin/training_program.py | 13 ++++ .../locale/hu/LC_MESSAGES/django.mo | Bin 4570 -> 4671 bytes .../locale/hu/LC_MESSAGES/django.po | 53 +++++++++------- .../models/training_plan.py | 3 + .../models/training_program.py | 19 ++++++ .../aitrainer_backoffice/settings/deploy.py | 4 +- .../aitrainer_backoffice/settings/dev.py | 4 +- .../aitrainer_backoffice/settings/prod.py | 2 +- .../controlling/automation/fcm.py | 4 +- .../locale/hu/LC_MESSAGES/django.po | 2 +- docker-compose.yml | 57 +++++++++++++++++- 13 files changed, 133 insertions(+), 33 deletions(-) create mode 100644 aitrainer_backoffice/aitrainer_backoffice/admin/training_program.py create mode 100644 aitrainer_backoffice/aitrainer_backoffice/models/training_program.py diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py b/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py index 0ec0695..16deb1e 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py +++ b/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py @@ -15,4 +15,5 @@ from .training_plan_day import TrainingPlanDayAdmin from .controlling import ControllingAdmin from .sport import SportAdmin from .app_text import AppTextAdmin -from .notification import NotificationAdmin \ No newline at end of file +from .notification import NotificationAdmin +from .training_program import TrainingProgramAdmin \ No newline at end of file diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py b/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py index ceb01a1..5660173 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py +++ b/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py @@ -100,7 +100,7 @@ class TranslationTrainingPlanInline(admin.TabularInline): class TrainingPlanAdmin( admin.ModelAdmin): list_display = ('training_plan_id', 'name', 'internal_name', 'free', 'active') - fields = ('tree', 'name', 'description', 'internal_name', 'free', 'active') + fields = ('tree','training_program', 'name', 'description', 'internal_name', 'free', 'active', 'weeks') list_editable = ('name', 'internal_name', 'free', 'active') def save_model(self, request, obj, form, change): diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin/training_program.py b/aitrainer_backoffice/aitrainer_backoffice/admin/training_program.py new file mode 100644 index 0000000..1a95f2d --- /dev/null +++ b/aitrainer_backoffice/aitrainer_backoffice/admin/training_program.py @@ -0,0 +1,13 @@ +from django.contrib import admin + +from ..models.training_program import TrainingProgram + + +class TrainingProgramAdmin(admin.ModelAdmin): + list_display = ('training_program_id', 'name',) + fields = ('name',) + list_editable = ('name',) + + +admin.site.register(TrainingProgram, TrainingProgramAdmin) +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 2a512526f1dcba4ed0a659f7c6484c35709ba1f4..ba6c1958b8fca1cf5a0207ecbf6844f0047fea97 100644 GIT binary patch delta 1916 zcmY+^Uuc$99Ki8kxy{t(UjL*yQ(xWON}bj$v#F(X%hIJYBMfg^H0E3xdm9Clc%qwb zim2t4HLwURMK3h5E=p0vNpw-v*a#yk2v;O^k^S%ceLd1VJiq62o*>G!>u2 z8}K!(!2M{uV4U(K#hm0{cCAT84MjI}{ zE;NIC(C_X~9z!R18Z&1&M8z5WjHc!vG^G{v?f~X;@x~liy(DH4!7}dNE(68q3iE zG@%1)Np3?YwgdCH3!UH_<>Y?`l|$Tc*PcZ?{uW)^AJGhz@HGcei9WAR)}g6fhVGFK z$PtevyU~uHPrizN=PmU8gBg_@shmQN_==Mw8%h3+rm%winVETLhjr)&8qxP3!I{{F zZqgUgP52JFbRQr`oZ)1{hs_6O<^g+cBbX%5==uL#Y}YfE<`)7$9dR< z)!2cye+ixG>u5*)NHXI+oQuaVKhI(~z3?46!;9$1|3p(?K`+i=KKg-rbRetI_gmBR zZRmivBTb_l&D;y<0CuAj-HQ%zAI@O^#bGLbcmVBq5N$Am&iprYbN+>P;8%Tr96FHc z==-(FrO4jAs%+uPEY%RV5i5x$#6o}nwZxr-v$eQ>mMX$MF}mEvMV`2Wu=CNyS@{?4 zpj!zC>sp%)Gvx-aC){t#2urq^Q)96jaZl28JL6l@^=Q^|;X2<+EJzPF;VR-@Vm@IO zR}dQrk`WC=3$dQKnXuGdCX2;X<`C{`i$BK)iKT=a#o|VC?KTq2i3f=L2>*t!l)I@c zB32Xr5}Jtn375v@a?|>gW)-8Eu&gWIp>lii^8eGCBSU4E#?0>A*}1bL-&%O8qtNzb zJXC1A>c){z#t)YEeK9e&pm6Hlr+c4h?}_Hed#U!c7oN#qx!2w`>TY}Ap4_ayA9BC^ E2OUPJZvX%Q delta 1824 zcmX}tTTIVk9LMo*I-jJJoH|GhIeZSWF$ z+F>6J?cfn=!sn=tBd7^JqXzhndhRc3qG%rW7vfAoy{b%9s@I|VRid8Xi^@O^DkBY% zynn{BMlNWgn%wXomLFlN;|PQ+BqLYKO?!R=7pi(!6IupN86UR`=WGYRZ?JPo#Q;m9lAI`>R ziKpI;{4eK8aj6LZxaFzb>QJ`&~=u\n" "Language-Team: LANGUAGE \n" @@ -26,10 +26,16 @@ msgstr "" msgid "Image Preview" msgstr "Kép előnézet" -#: .\aitrainer_backoffice\admin\evaluation.py:29 +#: .\aitrainer_backoffice\admin\evaluation.py:27 msgid "Clone the selected evaluation" msgstr "Kiértékelés klónozása" +#: .\aitrainer_backoffice\admin\exercise_type.py:56 +#, fuzzy +#| msgid "exercise_type" +msgid "Clone exercise type" +msgstr "Aktuális gyakorlat" + #: .\aitrainer_backoffice\admin\inline_select_action.py:116 msgid "Actions" msgstr "Akciók" @@ -89,7 +95,7 @@ msgstr "App Fordítások" #: .\aitrainer_backoffice\models\faq.py:34 #: .\aitrainer_backoffice\models\property.py:29 #: .\aitrainer_backoffice\models\sports.py:29 -#: .\aitrainer_backoffice\models\training_plan.py:58 +#: .\aitrainer_backoffice\models\training_plan.py:61 #: .\aitrainer_backoffice\models\training_plan_day.py:31 #: .\aitrainer_backoffice\models\tutorial.py:45 msgid "Translation" @@ -105,7 +111,7 @@ msgstr "Fordítás" #: .\aitrainer_backoffice\models\faq.py:35 #: .\aitrainer_backoffice\models\property.py:30 #: .\aitrainer_backoffice\models\sports.py:30 -#: .\aitrainer_backoffice\models\training_plan.py:59 +#: .\aitrainer_backoffice\models\training_plan.py:62 #: .\aitrainer_backoffice\models\training_plan_day.py:32 #: .\aitrainer_backoffice\models\tutorial.py:46 msgid "Translations" @@ -119,25 +125,23 @@ msgstr "Fordítások" #: .\aitrainer_backoffice\models\split_tests.py:7 #: .\aitrainer_backoffice\models\sports.py:9 #: .\aitrainer_backoffice\models\sports.py:25 -#: .\aitrainer_backoffice\models\training_plan.py:14 +#: .\aitrainer_backoffice\models\training_plan.py:16 #: .\aitrainer_backoffice\models\training_plan_day.py:11 #: .\aitrainer_backoffice\models\training_plan_day.py:27 +#: .\aitrainer_backoffice\models\training_program.py:11 #: .\aitrainer_backoffice\models\tutorial.py:11 msgid "name" msgstr "Név" #: .\aitrainer_backoffice\models\customer.py:10 -#| msgid "name" msgid "firstname" msgstr "Keresztnév" #: .\aitrainer_backoffice\models\customer.py:28 -#| msgid "Customer Property" msgid "Customer" msgstr "Ügyfél" #: .\aitrainer_backoffice\models\customer.py:29 -#| msgid "Customer Properties" msgid "Customers" msgstr "Ügyfelek" @@ -288,7 +292,7 @@ msgid "Exercise Parents" msgstr "Gyakorlat szülők" #: .\aitrainer_backoffice\models\exercisetree.py:15 -#: .\aitrainer_backoffice\models\training_plan.py:17 +#: .\aitrainer_backoffice\models\training_plan.py:19 msgid "internal_name" msgstr "" @@ -317,12 +321,11 @@ msgstr "GYÍK" msgid "FAQs" msgstr "GYÍK" -#: .\aitrainer_backoffice\models\notification.py:20 +#: .\aitrainer_backoffice\models\notification.py:21 msgid "Notification" msgstr "" -#: .\aitrainer_backoffice\models\notification.py:21 -#| msgid "Descriptions" +#: .\aitrainer_backoffice\models\notification.py:22 msgid "Notifications" msgstr "" @@ -366,32 +369,38 @@ msgstr "" msgid "Sports" msgstr "" -#: .\aitrainer_backoffice\models\training_plan.py:23 +#: .\aitrainer_backoffice\models\training_plan.py:26 msgid "Training Plan" -msgstr "Edzésprogram" +msgstr "Edzésterv" -#: .\aitrainer_backoffice\models\training_plan.py:24 +#: .\aitrainer_backoffice\models\training_plan.py:27 msgid "Training Plans" -msgstr "Edzésprogramok" +msgstr "Edzéstervek" -#: .\aitrainer_backoffice\models\training_plan.py:44 +#: .\aitrainer_backoffice\models\training_plan.py:47 msgid "Training Plan Detail" -msgstr "Edzésprogram részlet" +msgstr "Edzésterv részlet" -#: .\aitrainer_backoffice\models\training_plan.py:45 +#: .\aitrainer_backoffice\models\training_plan.py:48 msgid "Training Plan Details" -msgstr "Edzésprogram részletek" +msgstr "Edzésterv részletek" #: .\aitrainer_backoffice\models\training_plan_day.py:15 -#| msgid "Training Plan" msgid "Training Day" msgstr "Edzésnap" #: .\aitrainer_backoffice\models\training_plan_day.py:16 -#| msgid "Training Plans" msgid "Training Days" msgstr "Edzésnapok" +#: .\aitrainer_backoffice\models\training_program.py:15 +msgid "Training Program" +msgstr "Edzésprogram" + +#: .\aitrainer_backoffice\models\training_program.py:16 +msgid "Training Programs" +msgstr "Edzésprogramok" + #: .\aitrainer_backoffice\models\tutorial.py:15 msgid "Tutorial" msgstr "Tutorial" diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py b/aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py index 75fe81f..b559c1a 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py +++ b/aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py @@ -5,11 +5,13 @@ from django.utils.translation import ugettext_lazy as _ from .enums import LanguageTypes from ..models import ExerciseType, ExerciseTree from ..models.training_plan_day import TrainingPlanDay +from ..models.training_program import TrainingProgram class TrainingPlan(models.Model): training_plan_id = models.AutoField(primary_key=True) tree = models.ForeignKey(ExerciseTree,on_delete=models.CASCADE, limit_choices_to={'active':True}) + training_program = models.ForeignKey(TrainingProgram, on_delete=models.CASCADE) name = models.CharField(max_length=100, help_text='The name of the training plan', verbose_name=_("name")) description = RichTextField(blank=True, null=True) @@ -17,6 +19,7 @@ class TrainingPlan(models.Model): verbose_name=_("internal_name")) free = models.BooleanField(blank=True) active = models.BooleanField() + weeks = models.IntegerField(blank=True, null=True ) class Meta: db_table = 'training_plan' diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/training_program.py b/aitrainer_backoffice/aitrainer_backoffice/models/training_program.py new file mode 100644 index 0000000..8f76214 --- /dev/null +++ b/aitrainer_backoffice/aitrainer_backoffice/models/training_program.py @@ -0,0 +1,19 @@ +from django.db import models +from django.utils.translation import ugettext_lazy as _ +from ckeditor.fields import RichTextField + +from .enums import LanguageTypes + + +class TrainingProgram(models.Model): + training_program_id = models.AutoField(primary_key=True) + name = models.CharField(max_length=200, help_text='Unique description name', + verbose_name=_("name")) + + class Meta: + db_table = 'training_program' + verbose_name = _("Training Program") + verbose_name_plural = _("Training Programs") + + def __str__(self): + return self.name diff --git a/aitrainer_backoffice/aitrainer_backoffice/settings/deploy.py b/aitrainer_backoffice/aitrainer_backoffice/settings/deploy.py index c28cbd6..238b4c5 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/settings/deploy.py +++ b/aitrainer_backoffice/aitrainer_backoffice/settings/deploy.py @@ -1,7 +1,7 @@ import os from firebase_admin import initialize_app -BACKOFFICE_VERSION = "1.32" +BACKOFFICE_VERSION = "1.33" # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -51,7 +51,7 @@ INSTALLED_APPS = [ 'adminsortable2', 'inline_actions', 'django_cron', - 'firebase_admin' + 'firebase_admin', ] MIDDLEWARE = [ diff --git a/aitrainer_backoffice/aitrainer_backoffice/settings/dev.py b/aitrainer_backoffice/aitrainer_backoffice/settings/dev.py index 77eec0c..e20becb 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/settings/dev.py +++ b/aitrainer_backoffice/aitrainer_backoffice/settings/dev.py @@ -1,7 +1,7 @@ import os from firebase_admin import initialize_app -BACKOFFICE_VERSION = "1.32" +BACKOFFICE_VERSION = "1.33" # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -35,7 +35,7 @@ INSTALLED_APPS = [ 'adminsortable2', 'inline_actions', 'django_cron', - 'firebase_admin' + 'firebase_admin', ] DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' diff --git a/aitrainer_backoffice/aitrainer_backoffice/settings/prod.py b/aitrainer_backoffice/aitrainer_backoffice/settings/prod.py index f71ba64..14aa649 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/settings/prod.py +++ b/aitrainer_backoffice/aitrainer_backoffice/settings/prod.py @@ -1,7 +1,7 @@ import os from firebase_admin import initialize_app -BACKOFFICE_VERSION = "1.32" +BACKOFFICE_VERSION = "1.33" # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) diff --git a/aitrainer_backoffice/controlling/automation/fcm.py b/aitrainer_backoffice/controlling/automation/fcm.py index 65b31fd..49728cb 100644 --- a/aitrainer_backoffice/controlling/automation/fcm.py +++ b/aitrainer_backoffice/controlling/automation/fcm.py @@ -55,10 +55,12 @@ class FCM: return "Registration token is null" try: - if image_url == None or self.image_base == None: + notification_image_url = self.logo_url + ''' if image_url == None or self.image_base == None: notification_image_url = self.logo_url else: notification_image_url = self.image_base + '/' + image_url + ''' print(f'image: {notification_image_url}' ) diff --git a/aitrainer_backoffice/locale/hu/LC_MESSAGES/django.po b/aitrainer_backoffice/locale/hu/LC_MESSAGES/django.po index 16ac1c6..1d2101e 100644 --- a/aitrainer_backoffice/locale/hu/LC_MESSAGES/django.po +++ b/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-10-17 10:52+0200\n" +"POT-Creation-Date: 2021-11-11 20:59+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/docker-compose.yml b/docker-compose.yml index 047b3aa..a0fe58d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,6 +1,24 @@ version: "3.7" services: + + uvdesk: + image: dietermartens/uvdesk + environment: + # installation in dev, change it after installation to prod + - APP_ENV=dev + - APP_SECRET=8237945gker + - TZ=Europe/Budapest + - APP_TIMEZONE=Europe/Budapest + - APP_CURRENCY=EUR + - CRON_USER1=root + - CRON_SCHEDULE1=*/5 * * * * + # - CRON_COMMAND1=cd /usr/local/uvdesk && php bin/console uvdesk:refresh-mailbox info@domain.tld support@domain.tld + restart: always + volumes: + - uvdesk:/usr/local/uvdesk + ports: + - "7089:89" web: build: @@ -40,6 +58,8 @@ services: - /home/bosi/backoffice/aitrainer_backoffice/mysqlconf:/etc/mysql/conf.d ports: - "33060:3306" + networks: + - redis_tier phpmyadmin: image: phpmyadmin/phpmyadmin:latest @@ -53,6 +73,8 @@ services: volumes: - ./htpasswd:/etc/phpmyadmin/.htpasswd - ./phpmyadmin.config.php:/etc/phpmyadmin/config.user.inc.php + networks: + - redis_tier wordpress: image: wordpress @@ -62,6 +84,7 @@ services: - mysql-server:mysql depends_on: - mysql-server + - redis ports: - "8090:80" environment: @@ -73,8 +96,28 @@ services: WORDPRESS_DB_NAME: wp volumes: - wordpress:/var/www/html - - ./wp_php_custom.ini:/usr/local/etc/php/conf.d/uploads.ini - - ./wp_htaccess:/var/www/html/.htaccess + #- ./wp_php_custom.ini:/usr/local/etc/php/conf.d/uploads.ini:chached + - type: bind + target: /etc/php/conf.d/uploads.ini + source: /usr/local/bin/wordpress/wp_php_custom.ini + consistency: cached + #- ./wp_htaccess:/var/www/html/.htaccess + - type: bind + target: /var/www/html/.htaccess + source: /usr/local/bin/wordpress/wp_htaccess + consistency: cached + - /usr/local/bin/wordpress/wp-content/uploads:/var/www/html/wp-content/uploads:cached + networks: + - redis_tier + + redis: + image: redis + environment: + - REDIS_URL=redis://redis + ports: + - '6379:6379' + networks: + - redis_tier mautic: image: mautic/mautic:v3 @@ -93,6 +136,8 @@ services: - MAUTIC_DB_PASSWORD=$MYSQL_ROOT_PASSWORD - MAUTIC_DB_NAME=mautic - MAUTIC_RUN_CRON_JOBS=true + networks: + - redis_tier api: # container_name: api_server @@ -149,6 +194,8 @@ services: restart: unless-stopped ports: - "3000:3000" + networks: + - redis_tier volumes: mysql-data-backoffice: @@ -156,3 +203,9 @@ volumes: static: wordpress: mautic_data: + uvdesk: + redis_data: + +networks: + redis_tier: + driver: bridge \ No newline at end of file