From 59aa298db640174d35f307fe340177e88999b127 Mon Sep 17 00:00:00 2001 From: Administrator Date: Sat, 23 Sep 2023 18:54:49 +0300 Subject: [PATCH] experiments --- Platform/settings.py | 3 +- Platform/urls.py | 1 + experiments/__init__.py | 0 experiments/admin.py | 3 ++ experiments/apps.py | 6 +++ experiments/migrations/0001_initial.py | 35 +++++++++++++ experiments/migrations/__init__.py | 0 experiments/models.py | 29 +++++++++++ experiments/tests.py | 3 ++ experiments/urls.py | 8 +++ experiments/views.py | 42 ++++++++++++++++ templates/experiments.html | 70 ++++++++++++++++++++++++++ templates/includes/sidebar.html | 2 +- 13 files changed, 200 insertions(+), 2 deletions(-) create mode 100644 experiments/__init__.py create mode 100644 experiments/admin.py create mode 100644 experiments/apps.py create mode 100644 experiments/migrations/0001_initial.py create mode 100644 experiments/migrations/__init__.py create mode 100644 experiments/models.py create mode 100644 experiments/tests.py create mode 100644 experiments/urls.py create mode 100644 experiments/views.py create mode 100644 templates/experiments.html diff --git a/Platform/settings.py b/Platform/settings.py index e9e1dca..836a67b 100644 --- a/Platform/settings.py +++ b/Platform/settings.py @@ -46,7 +46,8 @@ INSTALLED_APPS = [ "django.contrib.messages", "django.contrib.staticfiles", 'web.apps.WebConfig', - 'configs.apps.ConfigsConfig' + 'configs.apps.ConfigsConfig', + 'experiments.apps.ExperimentsConfig' ] MIDDLEWARE = [ diff --git a/Platform/urls.py b/Platform/urls.py index a76e99c..8082856 100644 --- a/Platform/urls.py +++ b/Platform/urls.py @@ -19,5 +19,6 @@ from django.urls import path, include urlpatterns = [ path("admin/", admin.site.urls), path('configs/', include('configs.urls')), + path('experiments/', include('experiments.urls')), path('', include('web.urls')) ] diff --git a/experiments/__init__.py b/experiments/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/experiments/admin.py b/experiments/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/experiments/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/experiments/apps.py b/experiments/apps.py new file mode 100644 index 0000000..37c160c --- /dev/null +++ b/experiments/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ExperimentsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'experiments' diff --git a/experiments/migrations/0001_initial.py b/experiments/migrations/0001_initial.py new file mode 100644 index 0000000..ae6b8ff --- /dev/null +++ b/experiments/migrations/0001_initial.py @@ -0,0 +1,35 @@ +# Generated by Django 4.1.7 on 2023-09-23 15:45 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('web', '0004_alter_customuser_vk_id_alter_customuser_yandex_id'), + ] + + operations = [ + migrations.CreateModel( + name='Experiment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField()), + ('enabled', models.BooleanField(default=False)), + ('condition', models.TextField(default='False')), + ('stage', models.TextField(default='production')), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='web.project')), + ], + ), + migrations.AddIndex( + model_name='experiment', + index=models.Index(fields=['project', 'stage'], name='experiments_project_e2c9f6_idx'), + ), + migrations.AddIndex( + model_name='experiment', + index=models.Index(fields=['project', 'name', 'stage'], name='experiments_project_dade49_idx'), + ), + ] diff --git a/experiments/migrations/__init__.py b/experiments/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/experiments/models.py b/experiments/models.py new file mode 100644 index 0000000..4c9e7eb --- /dev/null +++ b/experiments/models.py @@ -0,0 +1,29 @@ +from django.db import models + +# Create your models here. + + +class Experiment(models.Model): + name = models.TextField() + enabled = models.BooleanField(default=False) + condition = models.TextField(default='False') + project = models.ForeignKey('web.Project', on_delete=models.CASCADE) + stage = models.TextField(default='production') + + class Meta: + indexes = [ + models.Index(fields=['project', 'stage']), + models.Index(fields=['project', 'name', 'stage']) + ] + + @property + def exp_type(self): + if self.condition == 'False': + return 0 + if self.condition == 'user.is_superuser': + return 1 + if self.condition == 'user.is_staff': + return 2 + if self.condition == 'True': + return 3 + return 4 \ No newline at end of file diff --git a/experiments/tests.py b/experiments/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/experiments/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/experiments/urls.py b/experiments/urls.py new file mode 100644 index 0000000..da2ec91 --- /dev/null +++ b/experiments/urls.py @@ -0,0 +1,8 @@ +from django.contrib import admin +from django.urls import path + +from .views import * + +urlpatterns = [ + path(*ExperimentsView.as_path()) +] diff --git a/experiments/views.py b/experiments/views.py new file mode 100644 index 0000000..41fa5c3 --- /dev/null +++ b/experiments/views.py @@ -0,0 +1,42 @@ +from BaseLib.BaseView import BaseView +from experiments.models import Experiment + + +class ExperimentsView(BaseView): + required_login = True + endpoint = '' + view_file = 'experiments.html' + + def pre_handle(self): + if 'stage' not in self.request.GET or self.request.GET['stage'] not in ['development', 'production']: + return '/experiments/?stage=production' + self.stage = self.request.GET['stage'] + self.context['stage'] = self.stage + + def get(self): + self.context['experiments'] = Experiment.objects.filter(project=self.request.user.selected_project, + stage=self.stage).order_by('name') + + def post_create(self): + Experiment.objects.create(project=self.request.user.selected_project, stage=self.stage, name=self.request.POST['name']) + return '/experiments/?stage=' + self.stage + + def post_delete(self): + Experiment.objects.get(id=self.request.POST['experiment_id']).delete() + return '/experiments/?stage=' + self.stage + def post_change(self): + exp = Experiment.objects.get(id=self.request.POST['experiment_id']) + exp.enabled = 'enabled' in self.request.POST + condition = self.request.POST['condition_select'] + if condition == 'Другое (только для техлидов)': + exp.condition = self.request.POST['condition'] + elif condition == 'Никому': + exp.condition = 'False' + elif condition == 'Только админам': + exp.condition = 'user.is_superuser' + elif condition == 'Только сотрудникам': + exp.condition = 'user.is_staff' + else: + exp.condition = 'True' + exp.save() + return '/experiments/?stage=' + self.stage \ No newline at end of file diff --git a/templates/experiments.html b/templates/experiments.html new file mode 100644 index 0000000..175e044 --- /dev/null +++ b/templates/experiments.html @@ -0,0 +1,70 @@ +{% extends 'layouts/base.html' %} + +{% block javascripts %} + +{% endblock %} + +{% block content %} +

Эксперименты

+ + + + + + + + + + + {% for experiment in experiments %} + + + {% csrf_token %} + + + + + + + + {% endfor %} + +
Название экспериментаВключенУсловиеДействие
{{ experiment.name }} + + +
+{% endblock %} \ No newline at end of file diff --git a/templates/includes/sidebar.html b/templates/includes/sidebar.html index 407d174..e7fc64d 100644 --- a/templates/includes/sidebar.html +++ b/templates/includes/sidebar.html @@ -83,7 +83,7 @@