membership / change db structure

This commit is contained in:
2025-05-30 13:04:54 +03:00
parent 296457ee99
commit dc09349cb6
9 changed files with 225 additions and 94 deletions

View File

@@ -227,10 +227,10 @@ class PricingSerializer(serializers.ModelSerializer):
class Meta:
model = Pricing
fields = ['plan', 'price', 'features', 'isPopular']
fields = ['plan', 'price', 'features', 'isPopular', 'duration', 'duration_hours']
def get_features(self, obj):
return list(obj.membershipfeatures_set.values_list('feature', flat=True))
return list(obj.features.values_list('name', flat=True))
def to_representation(self, instance):
# преобразуем данные перед отправкой на фронтенд

View File

@@ -1,21 +1,17 @@
from django.contrib import admin
from .models import *
@admin.register(Feature)
class FeatureAdmin(admin.ModelAdmin):
list_display = ['name']
search_fields = ['name']
class FeatureInline(admin.TabularInline):
model = MembershipFeatures
list_display = ['features'] # поля в списке
list_filter = ['features'] # фильтры справа
search_fields = ['features'] # поля для поиска
extra = 0
can_delete = False
verbose_name = 'Параметр тарифных планов'
verbose_name_plural = 'Параметры тарифных планов'
@admin.register(Pricing)
class PricingAdmin(admin.ModelAdmin):
inlines = [FeatureInline]
list_display = ['plan', 'price', 'is_popular', 'duration']
list_filter = ['is_popular']
search_fields = ['plan']
filter_horizontal = ['features']
admin.site.register(FAQ)
admin.site.register(News)
admin.site.register(Pricing, PricingAdmin)

View File

@@ -0,0 +1,37 @@
# Generated by Django 5.2.1 on 2025-05-30 09:41
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('routes', '0010_route_highlight_end_dt'),
('sitemanagement', '0011_transactions'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='pricing',
name='duration',
field=models.CharField(default='7 дней', max_length=10, verbose_name='Длительность подписки (в днях)'),
),
migrations.AddField(
model_name='pricing',
name='duration_hours',
field=models.IntegerField(default=168, max_length=8, verbose_name='Длительность подписки (в часах)'),
),
migrations.CreateModel(
name='RoutePromotionLog',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('action_type', models.CharField(choices=[('highlight', 'Выделение'), ('rising', 'Поднятие')], max_length=20)),
('created_at', models.DateTimeField(auto_now_add=True)),
('route', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='promotion_logs', to='routes.route')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 5.2.1 on 2025-05-30 09:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sitemanagement', '0012_pricing_duration_pricing_duration_hours_and_more'),
]
operations = [
migrations.AlterField(
model_name='pricing',
name='duration',
field=models.CharField(default='7 дней', verbose_name='Длительность подписки (в днях)'),
),
migrations.AlterField(
model_name='pricing',
name='duration_hours',
field=models.IntegerField(default=168, verbose_name='Длительность подписки (в часах)'),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 5.2.1 on 2025-05-30 09:50
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('sitemanagement', '0013_alter_pricing_duration_alter_pricing_duration_hours'),
]
operations = [
migrations.RenameModel(
old_name='MembershipFeatures',
new_name='MembershipFeature',
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 5.2.1 on 2025-05-30 09:52
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('sitemanagement', '0014_rename_membershipfeatures_membershipfeature'),
]
operations = [
migrations.AlterModelOptions(
name='membershipfeature',
options={'verbose_name': 'Свойство подписки', 'verbose_name_plural': 'Свойства подписки'},
),
]

View File

@@ -0,0 +1,32 @@
# Generated by Django 5.2.1 on 2025-05-30 10:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('sitemanagement', '0015_alter_membershipfeature_options'),
]
operations = [
migrations.CreateModel(
name='Feature',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255, verbose_name='Название свойства')),
],
options={
'verbose_name': 'Свойство',
'verbose_name_plural': 'Свойства',
},
),
migrations.AddField(
model_name='pricing',
name='features',
field=models.ManyToManyField(related_name='pricing_plans', to='sitemanagement.feature', verbose_name='Свойства'),
),
migrations.DeleteModel(
name='MembershipFeature',
),
]

View File

@@ -64,7 +64,10 @@ class Pricing(models.Model):
plan = models.CharField(max_length=10, choices=account_types)
price = models.IntegerField()
is_popular = models.BooleanField(default=False)
duration = models.CharField(default='7 дней', verbose_name='Длительность подписки (в днях)')
duration_hours = models.IntegerField(default=168, verbose_name='Длительность подписки (в часах)')
features = models.ManyToManyField('Feature', related_name='pricing_plans', verbose_name='Свойства')
class Meta:
verbose_name = 'Тарифный план'
verbose_name_plural = 'Тарифные планы'
@@ -72,10 +75,16 @@ class Pricing(models.Model):
def __str__(self):
return self.plan
class MembershipFeatures(models.Model):
plan = models.ForeignKey(Pricing, on_delete=models.CASCADE, verbose_name=('Тарифный план'))
feature = models.CharField(max_length=255)
class Feature(models.Model):
name = models.CharField(max_length=255, verbose_name='Название свойства')
class Meta:
verbose_name = 'Свойство'
verbose_name_plural = 'Свойства'
def __str__(self):
return self.name
class Transactions(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='Пользователь')
amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Сумма')