diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py b/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py index 28555b2..a462d07 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py +++ b/aitrainer_backoffice/aitrainer_backoffice/admin/__init__.py @@ -10,3 +10,4 @@ from .exercise_plan import ExercisePlanAdmin from .description import DescriptionAdmin from .training_plan import TrainingPlanAdmin, TrainingPlanDetailAdmin from .faq import FaqAdmin +from .split_tests import SplitTestAdmin diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin/split_tests.py b/aitrainer_backoffice/aitrainer_backoffice/admin/split_tests.py new file mode 100644 index 0000000..b77c20d --- /dev/null +++ b/aitrainer_backoffice/aitrainer_backoffice/admin/split_tests.py @@ -0,0 +1,12 @@ +from django.contrib import admin + +from ..models.split_tests import SplitTests + + +class SplitTestAdmin(admin.ModelAdmin): + list_display = ('test_id', 'name','remote_config_key', 'remote_config_value', 'test_value', 'active', 'valid_to') + list_editable = ('name','remote_config_key', 'remote_config_value', 'test_value', 'active', 'valid_to') + + +admin.site.register(SplitTests, SplitTestAdmin) +admin.autodiscover() diff --git a/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py b/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py index 69c653c..7ea7be1 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py +++ b/aitrainer_backoffice/aitrainer_backoffice/admin/training_plan.py @@ -13,7 +13,7 @@ class TranslationTrainingPlanInline(admin.TabularInline): class TrainingPlanAdmin(admin.ModelAdmin): list_display = ('training_plan_id', 'name','internal_name', 'free') - fields = ('name','description') + fields = ('tree', 'name','description', 'internal_name', 'free') list_editable = ('name','internal_name', 'free') inlines = [ diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/__init__.py b/aitrainer_backoffice/aitrainer_backoffice/models/__init__.py index 42cfabf..08b09f0 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/models/__init__.py +++ b/aitrainer_backoffice/aitrainer_backoffice/models/__init__.py @@ -13,3 +13,4 @@ from .evaluation import Evaluation, EvaluationAttribute from .description import Description, DescriptionTranslation from .training_plan import TrainingPlan, TrainingPlanDetail from .faq import Faq, FaqTranslation +from .split_tests import SplitTests diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/exercisetree.py b/aitrainer_backoffice/aitrainer_backoffice/models/exercisetree.py index d0f20b2..a235e5b 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/models/exercisetree.py +++ b/aitrainer_backoffice/aitrainer_backoffice/models/exercisetree.py @@ -1,12 +1,13 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from .enums import LanguageTypes +from ckeditor.fields import RichTextField class ExerciseTree(models.Model): tree_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 ' + description = RichTextField(max_length=1000, blank=True, null=True, help_text='The description should be in ' 'English here') image_url = models.ImageField(upload_to='images/', help_text='The menu image size is 1366x768') active = models.BooleanField(default=0, blank=True, null=True) @@ -28,7 +29,7 @@ class ExerciseTreeTranslation(models.Model): tree = models.ForeignKey(ExerciseTree, 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(max_length=1000, blank=True, null=True) class Meta: db_table = 'exercise_tree_translation' diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/split_tests.py b/aitrainer_backoffice/aitrainer_backoffice/models/split_tests.py new file mode 100644 index 0000000..917eded --- /dev/null +++ b/aitrainer_backoffice/aitrainer_backoffice/models/split_tests.py @@ -0,0 +1,20 @@ +from django.db import models +from django.utils.translation import ugettext_lazy as _ + +class SplitTests(models.Model): + test_id = models.AutoField(primary_key=True) + name = models.CharField(max_length=50, help_text='Unique test name', + verbose_name=_("name")) + remote_config_key = models.CharField(max_length=50, blank=True) + remote_config_value = models.CharField(max_length=50, blank=True) + test_value = models.CharField(max_length=50, blank=True) + active = models.BooleanField() + valid_to = models.DateTimeField(blank=True) + + class Meta: + db_table = 'split_tests' + verbose_name = _("A/B Test") + verbose_name_plural = _("A/B Tests") + + def __str__(self): + return self.name diff --git a/aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py b/aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py index c76d6fd..930c2bd 100644 --- a/aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py +++ b/aitrainer_backoffice/aitrainer_backoffice/models/training_plan.py @@ -3,11 +3,12 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from .enums import LanguageTypes -from ..models import ExerciseType +from ..models import ExerciseType, ExerciseTree class TrainingPlan(models.Model): training_plan_id = models.AutoField(primary_key=True) + tree = models.ForeignKey(ExerciseTree,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) diff --git a/docker-compose.yml b/docker-compose.yml index b8addb4..d8ce8e4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,5 +1,7 @@ version: "3.7" + services: + web: build: . container_name: backoffice @@ -13,12 +15,13 @@ services: command: gunicorn aitrainer_backoffice.aitrainer_backoffice.wsgi --env DJANGO_SETTINGS_MODULE=aitrainer_backoffice.aitrainer_backoffice.settings.prod --bind 0.0.0.0:8000 --workers 3 mysql-server: - image: mysql:8.0.20 + image: mysql:8.0.21 restart: always environment: MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD volumes: - mysql-data-backoffice:/var/lib/mysql + - /home/bosi/backoffice/aitrainer_backoffice/mysqlconf:/etc/mysql/conf.d ports: - "33060:3306" @@ -27,10 +30,113 @@ services: restart: always environment: PMA_HOST: mysql-server - PMA_USER: $MYSQL_USER - PMA_PASSWORD: $MYSQL_ROOT_PASSWORD + PMA_USER: aitrainer + PMA_PASSWORD: andio2009 ports: - "8085:80" + volumes: + - ./htpasswd:/etc/phpmyadmin/.htpasswd + - ./phpmyadmin.config.php:/etc/phpmyadmin/config.user.inc.php + + wordpress: + image: wordpress + container_name: wordpress + restart: always + links: + - mysql-server:mysql + depends_on: + - mysql-server + ports: + - "8090:80" + environment: + UPLOAD_LIMIT: 512M + UPLOAD_MAX_FILESIZE: 128M + WORDPRESS_DB_HOST: mysql-server + WORDPRESS_DB_USER: $MYSQL_USER + WORDPRESS_DB_PASSWORD: $MYSQL_ROOT_PASSWORD + 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 + + mautic: + image: mautic/mautic:v3 + container_name: mautic + links: + - mysql-server:mysql + depends_on: + - mysql-server + ports: + - "8091:80" + volumes: + - mautic_data:/var/www/html + environment: + - MAUTIC_DB_HOST=mysql-server + - MAUTIC_DB_USER=aitrainer + - MAUTIC_DB_PASSWORD=andio2009 + - MAUTIC_DB_NAME=mautic + - MAUTIC_RUN_CRON_JOBS=true + + api: + # container_name: api_server + image: api_server:latest + build: . + depends_on: + - mysql-server + restart: always + working_dir: /aitrainer_server + environment: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql-server:3306/aitrainer?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&allowMultiQueries=true + command: bash -c "SERVER_PORT=8888 java -jar aitrainer_server.jar --spring.profiles.active=prod" + ports: + - "8888:8888" + + api_test_ssl: + image: api_server_ssl_test:latest + build: . + depends_on: + - mysql-server + restart: always + working_dir: /aitrainer_server + environment: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql-server:3306/aitrainer_test?serverTimezone=CET&useSSL=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&allowMultiQueries=true + command: bash -c "SERVER_PORT=8843 java -jar aitrainer_server.jar --spring.profiles.active=prodtest" + ports: + - "8843:8843" + + api_ssl: + image: api_server_ssl:latest + build: . + depends_on: + - mysql-server + restart: always + working_dir: /aitrainer_server + environment: + SPRING_DATASOURCE_URL: jdbc:mysql://mysql-server:3306/aitrainer?serverTimezone=CET&useSSL=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&allowMultiQueries=true + command: bash -c "SERVER_PORT=8943 java -jar aitrainer_server.jar --spring.profiles.active=prod" + ports: + - "8943:8943" + + + wiki: + image: requarks/wiki:2 + depends_on: + - mysql-server + environment: + DB_TYPE: mysql + DB_HOST: mysql-server + DB_PORT: 3306 + DB_USER: aitrainer + DB_PASS: andio2009 + DB_NAME: wiki + restart: unless-stopped + ports: + - "3000:3000" + volumes: mysql-data-backoffice: media: + wordpress: + mautic_data: + xwiki-data: \ No newline at end of file