@@ -1,6 +1,5 @@ { "files.eol": "\n", - "ruff.showNotifications": "onWarning", "[python]": { "editor.formatOnSave": true, "editor.defaultFormatter": "charliermarsh.ruff", @@ -0,0 +1,17 @@ +# Generated by Django 5.0.11 on 2025-03-17 07:46 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('ml_model', '0043_merge_0042_alter_modelinput_type_0042_modelstat'), + ] + + operations = [ + migrations.AlterModelOptions( + name='modelstat', + options={'ordering': ('-created_at',), 'verbose_name': 'Статистика по модели', 'verbose_name_plural': 'Статистики по моделям'}, + ), + ] @@ -0,0 +1,20 @@ +# Generated by Django 5.0.11 on 2025-03-17 07:46 + +import django.contrib.postgres.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('payments', '0014_auto_20241116_1547'), + ] + + operations = [ + migrations.AddField( + model_name='paymentplan', + name='points', + field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(), default=[], help_text='Перечислять через запятую', size=None, verbose_name='Поинты'), + preserve_default=False, + ), + ] @@ -0,0 +1,19 @@ +# Generated by Django 5.0.11 on 2025-03-17 08:04 + +import django.contrib.postgres.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('payments', '0015_paymentplan_points'), + ] + + operations = [ + migrations.AlterField( + model_name='paymentplan', + name='points', + field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(), blank=True, help_text='Перечислять через запятую', null=True, size=None, verbose_name='Поинты'), + ), + ] @@ -0,0 +1,19 @@ +# Generated by Django 5.0.11 on 2025-03-17 08:15 + +import django.contrib.postgres.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('payments', '0016_alter_paymentplan_points'), + ] + + operations = [ + migrations.AlterField( + model_name='paymentplan', + name='points', + field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(), blank=True, default=list, help_text='Перечислять через запятую', size=None, verbose_name='Поинты'), + ), + ] @@ -2,6 +2,7 @@ from datetime import datetime from dateutil.relativedelta import relativedelta from django.contrib.auth import get_user_model +from django.contrib.postgres.fields import ArrayField from django.db import models from django.utils.translation import gettext_lazy as _ from django_celery_beat.models import PeriodicTask @@ -33,13 +34,20 @@ class PaymentPlan(BaseModel): default=MONTH, ) is_visible = models.BooleanField(default=True, verbose_name=_('Is visible')) + points = ArrayField( + default=list, + blank=True, + base_field=models.CharField(), + verbose_name='Поинты', + help_text='Перечислять через запятую', + ) accessed_models = models.ManyToManyField( NeuronModel, verbose_name='Доступные модели', ) def __str__(self) -> str: - return f"{self.title or 'Ошибка'}" + return f'{self.title or "Ошибка"}' class Meta: ordering = ['price'] @@ -83,7 +91,7 @@ class PaymentPlanUserInfo(BaseModel): return super().save(force_insert, force_update, using, update_fields) def __str__(self) -> str: - return f"{self.user.email or 'Ошибка'}" + return f'{self.user.email or "Ошибка"}' class Meta: verbose_name = _('User Balance') @@ -12,6 +12,7 @@ class PaymentPlanSerializer(serializers.Serializer): price = serializers.DecimalField(max_digits=10, decimal_places=2) tokens_per_plan = serializers.DecimalField(max_digits=50, decimal_places=2) duration = serializers.CharField(read_only=True) + points = serializers.ListField(read_only=True) accessed_models = serializers.SlugRelatedField( slug_field='slug', queryset=NeuronModel.objects.all(), many=True ) @@ -11,14 +11,14 @@ services: - -c - | python manage.py initialize_buckets - python manage.py migrate python manage.py collectstatic --no-input (python manage.py createsuperuser --no-input || true) - python -m uvicorn --host 0.0.0.0 --workers 1 --timeout-keep-alive 300 --ws wsproto --loop uvloop --http httptools --lifespan off backend.asgi:application --log-level debug --reload + python -m debugpy --wait-for-client --listen 0.0.0.0:5678 -m uvicorn backend.asgi:application --host 0.0.0.0 --workers 1 --timeout-keep-alive 300 --ws wsproto --loop uvloop --http httptools --lifespan off --log-level debug --reload volumes: - .:/code ports: - "8000:8000" + - "5678:5678" env_file: - .env depends_on: @@ -29,6 +29,19 @@ services: db: condition: service_started + migrator: + restart: on-failure:1 + container_name: migrator + build: + context: . + dockerfile: Dockerfile.dev + command: + - /bin/sh + - -c + - python manage.py migrate + env_file: + - .env + cache-mdb: container_name: cache-mdb image: redis:alpine