membership / change db structure
This commit is contained in:
@@ -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):
|
||||
# преобразуем данные перед отправкой на фронтенд
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -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='Длительность подписки (в часах)'),
|
||||
),
|
||||
]
|
||||
@@ -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',
|
||||
),
|
||||
]
|
||||
@@ -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': 'Свойства подписки'},
|
||||
),
|
||||
]
|
||||
@@ -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',
|
||||
),
|
||||
]
|
||||
@@ -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='Сумма')
|
||||
|
||||
Reference in New Issue
Block a user