This commit is contained in:
@@ -122,7 +122,7 @@ class OrderableAdminMixin:
|
|||||||
class ActivityAdmin(ModelAdmin):
|
class ActivityAdmin(ModelAdmin):
|
||||||
list_display = ('title', 'author', 'banner_display', 'start_time', 'location', 'signup_count', 'is_visible', 'is_active', 'auto_confirm', 'created_at')
|
list_display = ('title', 'author', 'banner_display', 'start_time', 'location', 'signup_count', 'is_visible', 'is_active', 'auto_confirm', 'created_at')
|
||||||
list_filter = ('is_visible', 'is_active', 'auto_confirm', 'start_time')
|
list_filter = ('is_visible', 'is_active', 'auto_confirm', 'start_time')
|
||||||
search_fields = ('title', 'location')
|
search_fields = ('title', 'location', 'author__phone_number')
|
||||||
# autocomplete_fields = ['author'] # 暂时注释,避免环境不一致导致报错
|
# autocomplete_fields = ['author'] # 暂时注释,避免环境不一致导致报错
|
||||||
raw_id_fields = ('author',)
|
raw_id_fields = ('author',)
|
||||||
inlines = [ActivitySignupInline]
|
inlines = [ActivitySignupInline]
|
||||||
@@ -157,7 +157,7 @@ class ActivityAdmin(ModelAdmin):
|
|||||||
class ActivitySignupAdmin(ModelAdmin):
|
class ActivitySignupAdmin(ModelAdmin):
|
||||||
list_display = ('activity', 'user', 'signup_time', 'status_label', 'order_link')
|
list_display = ('activity', 'user', 'signup_time', 'status_label', 'order_link')
|
||||||
list_filter = ('status', 'signup_time', 'activity')
|
list_filter = ('status', 'signup_time', 'activity')
|
||||||
search_fields = ('user__nickname', 'activity__title')
|
search_fields = ('user__nickname', 'user__phone_number', 'activity__title')
|
||||||
autocomplete_fields = ['activity', 'user']
|
autocomplete_fields = ['activity', 'user']
|
||||||
actions = [export_signups_csv, export_signups_excel]
|
actions = [export_signups_csv, export_signups_excel]
|
||||||
|
|
||||||
@@ -211,7 +211,7 @@ class ActivitySignupAdmin(ModelAdmin):
|
|||||||
class TopicAdmin(OrderableAdminMixin, ModelAdmin):
|
class TopicAdmin(OrderableAdminMixin, ModelAdmin):
|
||||||
list_display = ('title', 'status', 'category', 'author', 'get_related_item', 'reply_count', 'view_count', 'is_pinned', 'created_at', 'order_actions')
|
list_display = ('title', 'status', 'category', 'author', 'get_related_item', 'reply_count', 'view_count', 'is_pinned', 'created_at', 'order_actions')
|
||||||
list_filter = ('status', 'category', 'is_pinned', 'created_at', 'related_product', 'related_service', 'related_course')
|
list_filter = ('status', 'category', 'is_pinned', 'created_at', 'related_product', 'related_service', 'related_course')
|
||||||
search_fields = ('title', 'content', 'author__nickname')
|
search_fields = ('title', 'content', 'author__nickname', 'author__phone_number')
|
||||||
autocomplete_fields = ['author', 'related_product', 'related_service', 'related_course']
|
autocomplete_fields = ['author', 'related_product', 'related_service', 'related_course']
|
||||||
filter_horizontal = ('likes',)
|
filter_horizontal = ('likes',)
|
||||||
inlines = [TopicMediaInline, ReplyInline]
|
inlines = [TopicMediaInline, ReplyInline]
|
||||||
@@ -279,7 +279,7 @@ class TopicAdmin(OrderableAdminMixin, ModelAdmin):
|
|||||||
class ReplyAdmin(ModelAdmin):
|
class ReplyAdmin(ModelAdmin):
|
||||||
list_display = ('short_content', 'topic', 'author', 'is_pinned', 'like_count', 'created_at')
|
list_display = ('short_content', 'topic', 'author', 'is_pinned', 'like_count', 'created_at')
|
||||||
list_filter = ('is_pinned', 'created_at')
|
list_filter = ('is_pinned', 'created_at')
|
||||||
search_fields = ('content', 'author__nickname', 'topic__title')
|
search_fields = ('content', 'author__nickname', 'author__phone_number', 'topic__title')
|
||||||
autocomplete_fields = ['author', 'topic', 'reply_to']
|
autocomplete_fields = ['author', 'topic', 'reply_to']
|
||||||
filter_horizontal = ('likes',)
|
filter_horizontal = ('likes',)
|
||||||
list_editable = ('is_pinned',)
|
list_editable = ('is_pinned',)
|
||||||
|
|||||||
20
backend/community/migrations/0003_alter_activity_author.py
Normal file
20
backend/community/migrations/0003_alter_activity_author.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Generated by Django 6.0.1 on 2026-03-17 11:11
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('community', '0002_activity_author'),
|
||||||
|
('shop', '0039_vccourse_video_embed_code'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='activity',
|
||||||
|
name='author',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='activities', to='shop.wechatuser', to_field='phone_number', verbose_name='发布者'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -18,7 +18,7 @@ class Activity(models.Model):
|
|||||||
is_paid = models.BooleanField(default=False, verbose_name="是否收费")
|
is_paid = models.BooleanField(default=False, verbose_name="是否收费")
|
||||||
price = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name="报名费用")
|
price = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name="报名费用")
|
||||||
|
|
||||||
author = models.ForeignKey(WeChatUser, on_delete=models.SET_NULL, related_name='activities', verbose_name="发布者", null=True, blank=True)
|
author = models.ForeignKey(WeChatUser, to_field='phone_number', on_delete=models.SET_NULL, related_name='activities', verbose_name="发布者", null=True, blank=True)
|
||||||
|
|
||||||
is_active = models.BooleanField(default=True, verbose_name="是否启用")
|
is_active = models.BooleanField(default=True, verbose_name="是否启用")
|
||||||
is_visible = models.BooleanField(default=True, verbose_name="是否显示", help_text="关闭后将不在前端列表页显示")
|
is_visible = models.BooleanField(default=True, verbose_name="是否显示", help_text="关闭后将不在前端列表页显示")
|
||||||
|
|||||||
@@ -385,7 +385,7 @@ class SalespersonAdmin(ModelAdmin):
|
|||||||
class CommissionLogAdmin(ModelAdmin):
|
class CommissionLogAdmin(ModelAdmin):
|
||||||
list_display = ('id', 'salesperson', 'distributor', 'amount', 'level', 'status', 'created_at')
|
list_display = ('id', 'salesperson', 'distributor', 'amount', 'level', 'status', 'created_at')
|
||||||
list_filter = ('status', 'level', 'salesperson', 'distributor', 'created_at')
|
list_filter = ('status', 'level', 'salesperson', 'distributor', 'created_at')
|
||||||
search_fields = ('salesperson__name', 'distributor__user__nickname', 'order__id')
|
search_fields = ('salesperson__name', 'distributor__user__nickname', 'distributor__user__phone_number', 'order__id')
|
||||||
readonly_fields = ('amount', 'level', 'created_at')
|
readonly_fields = ('amount', 'level', 'created_at')
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
@@ -482,7 +482,7 @@ class ProductTypeFilter(admin.SimpleListFilter):
|
|||||||
class OrderAdmin(ModelAdmin):
|
class OrderAdmin(ModelAdmin):
|
||||||
list_display = ('id', 'customer_name', 'get_item_name', 'total_price', 'status', 'salesperson', 'distributor', 'created_at')
|
list_display = ('id', 'customer_name', 'get_item_name', 'total_price', 'status', 'salesperson', 'distributor', 'created_at')
|
||||||
list_filter = ('status', ProductTypeFilter, 'config', 'course', 'activity', PriceRangeFilter, 'salesperson', 'distributor', 'created_at')
|
list_filter = ('status', ProductTypeFilter, 'config', 'course', 'activity', PriceRangeFilter, 'salesperson', 'distributor', 'created_at')
|
||||||
search_fields = ('id', 'customer_name', 'phone_number', 'wechat_trade_no')
|
search_fields = ('id', 'customer_name', 'phone_number', 'wechat_trade_no', 'wechat_user__phone_number')
|
||||||
readonly_fields = ('total_price', 'created_at', 'wechat_trade_no')
|
readonly_fields = ('total_price', 'created_at', 'wechat_trade_no')
|
||||||
actions = [export_to_csv, export_to_excel]
|
actions = [export_to_csv, export_to_excel]
|
||||||
|
|
||||||
@@ -569,7 +569,7 @@ class WeChatUserAdmin(OrderableAdminMixin, ModelAdmin):
|
|||||||
@admin.register(Distributor)
|
@admin.register(Distributor)
|
||||||
class DistributorAdmin(ModelAdmin):
|
class DistributorAdmin(ModelAdmin):
|
||||||
list_display = ('get_nickname', 'level', 'status', 'total_earnings', 'withdrawable_balance', 'invite_code', 'created_at')
|
list_display = ('get_nickname', 'level', 'status', 'total_earnings', 'withdrawable_balance', 'invite_code', 'created_at')
|
||||||
search_fields = ('user__nickname', 'invite_code')
|
search_fields = ('user__nickname', 'user__phone_number', 'invite_code')
|
||||||
list_filter = ('status', 'level', 'created_at')
|
list_filter = ('status', 'level', 'created_at')
|
||||||
readonly_fields = ('total_earnings', 'withdrawable_balance', 'qr_code_url', 'created_at', 'updated_at')
|
readonly_fields = ('total_earnings', 'withdrawable_balance', 'qr_code_url', 'created_at', 'updated_at')
|
||||||
autocomplete_fields = ['user', 'parent']
|
autocomplete_fields = ['user', 'parent']
|
||||||
@@ -598,7 +598,7 @@ class DistributorAdmin(ModelAdmin):
|
|||||||
class WithdrawalAdmin(ModelAdmin):
|
class WithdrawalAdmin(ModelAdmin):
|
||||||
list_display = ('get_distributor', 'amount', 'status', 'created_at')
|
list_display = ('get_distributor', 'amount', 'status', 'created_at')
|
||||||
list_filter = ('status', 'created_at')
|
list_filter = ('status', 'created_at')
|
||||||
search_fields = ('distributor__user__nickname',)
|
search_fields = ('distributor__user__nickname', 'distributor__user__phone_number')
|
||||||
|
|
||||||
def get_distributor(self, obj):
|
def get_distributor(self, obj):
|
||||||
return obj.distributor.user.nickname
|
return obj.distributor.user.nickname
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class WeChatUser(models.Model):
|
|||||||
self.order = self.pk
|
self.order = self.pk
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.nickname or self.openid
|
return self.phone_number or self.nickname or self.openid
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "微信用户"
|
verbose_name = "微信用户"
|
||||||
|
|||||||
Reference in New Issue
Block a user