diff --git a/apps/daren_detail/views.py b/apps/daren_detail/views.py index 6c325b9..0fc1970 100644 --- a/apps/daren_detail/views.py +++ b/apps/daren_detail/views.py @@ -2723,25 +2723,53 @@ def add_creator_to_private_pool(request): if creator_id and not creator_ids: creator_ids = [creator_id] - if not pool_id or not creator_ids: + if not creator_ids: return JsonResponse({ 'code': 400, - 'message': '缺少必要参数: pool_id 或 creator_id/creator_ids', + 'message': '缺少必要参数: creator_id/creator_ids', 'data': None }, json_dumps_params={'ensure_ascii': False}) # 查询私有库信息并验证所有权 - try: - private_pool = PrivateCreatorPool.objects.get( - id=pool_id, - user_id=current_user.id # 确保只能操作当前用户的私有库 - ) - except PrivateCreatorPool.DoesNotExist: - return JsonResponse({ - 'code': 404, - 'message': f'找不到ID为 {pool_id} 的私有库或无权限访问', - 'data': None - }, json_dumps_params={'ensure_ascii': False}) + private_pool = None + is_auto_created = False + + if pool_id: + # 如果提供了pool_id,查询指定的私有库 + try: + private_pool = PrivateCreatorPool.objects.get( + id=pool_id, + user_id=current_user.id # 确保只能操作当前用户的私有库 + ) + except PrivateCreatorPool.DoesNotExist: + return JsonResponse({ + 'code': 404, + 'message': f'找不到ID为 {pool_id} 的私有库或无权限访问', + 'data': None + }, json_dumps_params={'ensure_ascii': False}) + else: + # 如果没有提供pool_id,查询用户的默认私有库 + try: + private_pool = PrivateCreatorPool.objects.get( + user_id=current_user.id, + is_default=True + ) + except PrivateCreatorPool.DoesNotExist: + # 如果没有默认私有库,尝试获取用户的任意一个私有库 + private_pool = PrivateCreatorPool.objects.filter( + user_id=current_user.id + ).first() + + if not private_pool: + # 如果用户没有任何私有库,自动创建一个默认私有库 + private_pool = PrivateCreatorPool.objects.create( + user_id=current_user.id, + name="默认私有达人库", + description="系统自动创建的默认私有达人库", + is_default=True + ) + is_auto_created = True + logger.info(f"为用户 {current_user.id} 自动创建默认私有达人库,ID: {private_pool.id}") # 添加达人到私有库 added_creators = [] @@ -2807,7 +2835,9 @@ def add_creator_to_private_pool(request): 'already_exists_count': already_exists_count, 'pool': { 'id': private_pool.id, - 'name': private_pool.name + 'name': private_pool.name, + 'is_default': private_pool.is_default, + 'auto_created': is_auto_created } } }, json_dumps_params={'ensure_ascii': False}) @@ -3217,14 +3247,8 @@ def filter_private_pool_creators(request): # 解析POST请求体 data = json.loads(request.body) - # 获取私有库ID + # 获取私有库ID(现在是可选的) pool_id = data.get('pool_id') - if not pool_id: - return JsonResponse({ - 'code': 400, - 'message': '缺少必要参数: pool_id', - 'data': None - }, json_dumps_params={'ensure_ascii': False}) # 获取过滤条件 filter_data = data.get('filter', {}) @@ -3236,29 +3260,46 @@ def filter_private_pool_creators(request): # 获取状态过滤参数,如果提供了才使用 status = filter_data.get('status') - # 查询私有库信息 - try: - private_pool = PrivateCreatorPool.objects.get(id=pool_id) - - # 检查私有库是否属于当前登录用户 - if private_pool.user_id != request.user.id: + # 初始化查询逻辑 + creator_relations = PrivateCreatorRelation.objects.filter( + private_pool__user_id=request.user.id # 确保只查询当前用户的私有库 + ).select_related('creator') + + # 私有库信息 + pool_info = None + + # 如果提供了pool_id,则筛选特定私有库 + if pool_id: + try: + private_pool = PrivateCreatorPool.objects.get(id=pool_id) + + # 检查私有库是否属于当前登录用户 + if private_pool.user_id != request.user.id: + return JsonResponse({ + 'code': 403, + 'message': '没有权限访问此私有达人库', + 'data': None + }, json_dumps_params={'ensure_ascii': False}) + + # 进一步筛选指定私有库中的达人 + creator_relations = creator_relations.filter(private_pool=private_pool) + + # 构造私有库信息 + pool_info = { + "id": private_pool.id, + "name": private_pool.name, + "description": private_pool.description, + "is_default": private_pool.is_default, + "user_id": private_pool.user_id, + "created_at": private_pool.created_at.strftime('%Y-%m-%d') + } + + except PrivateCreatorPool.DoesNotExist: return JsonResponse({ - 'code': 403, - 'message': '没有权限访问此私有达人库', + 'code': 404, + 'message': f'找不到ID为 {pool_id} 的私有库', 'data': None }, json_dumps_params={'ensure_ascii': False}) - - except PrivateCreatorPool.DoesNotExist: - return JsonResponse({ - 'code': 404, - 'message': f'找不到ID为 {pool_id} 的私有库', - 'data': None - }, json_dumps_params={'ensure_ascii': False}) - - # 查询私有库中的达人关联 - creator_relations = PrivateCreatorRelation.objects.filter( - private_pool=private_pool - ).select_related('creator') # 应用状态过滤条件(仅当提供了status参数时) if status: @@ -3357,6 +3398,7 @@ def filter_private_pool_creators(request): creator_list = [] for relation in paged_relations: creator = relation.creator + private_pool = relation.private_pool # 获取关联的私有库 # 格式化电商等级 e_commerce_level_formatted = f"L{creator.e_commerce_level}" if creator.e_commerce_level else None @@ -3378,6 +3420,8 @@ def filter_private_pool_creators(request): formatted_creator = { "relation_id": relation.id, "creator_id": creator.id, + "pool_id": private_pool.id, # 添加池ID + "pool_name": private_pool.name, # 添加池名称 "name": creator.name, "avatar": creator.avatar_url, "category": creator.category, @@ -3410,16 +3454,6 @@ def filter_private_pool_creators(request): "has_prev": page > 1 } - # 构造私有库信息 - pool_info = { - "id": private_pool.id, - "name": private_pool.name, - "description": private_pool.description, - "is_default": private_pool.is_default, - "user_id": private_pool.user_id, - "created_at": private_pool.created_at.strftime('%Y-%m-%d') - } - return JsonResponse({ 'code': 200, 'message': '获取成功', @@ -3748,29 +3782,13 @@ def search_private_creators(request): # 获取搜索参数 search_query = request.GET.get('q', '').strip() # 搜索关键词 search_mode = request.GET.get('mode', 'and').lower() # 搜索模式:and 或 or,默认为 and - pool_id = request.GET.get('pool_id') # 私有达人库ID,如果提供则只搜索特定私有库 page = int(request.GET.get('page', 1)) page_size = int(request.GET.get('page_size', 10)) - # 基础查询 - 查询用户的私有达人库中的达人 - if pool_id: - # 如果提供了特定池ID,只搜索该池 - try: - pool = PrivateCreatorPool.objects.get(id=pool_id, user=user) - query = PrivateCreatorRelation.objects.filter( - private_pool=pool - ).select_related('creator', 'private_pool') - except PrivateCreatorPool.DoesNotExist: - return JsonResponse({ - 'code': 404, - 'message': '私有达人库不存在', - 'data': None - }, json_dumps_params={'ensure_ascii': False}) - else: - # 否则搜索用户所有私有库 - query = PrivateCreatorRelation.objects.filter( - private_pool__user=user - ).select_related('creator', 'private_pool') + # 直接搜索用户所有私有库中的达人 + query = PrivateCreatorRelation.objects.filter( + private_pool__user=user + ).select_related('creator', 'private_pool') # 如果有搜索关键词,进行模糊搜索 if search_query: @@ -3910,7 +3928,8 @@ def search_private_creators(request): "added_from_public": relation.added_from_public, "added_at": relation.created_at.strftime('%Y-%m-%d'), "is_public_removed": relation.status == 'public_removed', - "status_note": "该达人已从公有库中移除" if relation.status == 'public_removed' else None + "status_note": "该达人已从公有库中移除" if relation.status == 'public_removed' else None, + "pool_name": relation.private_pool.name # 添加所属达人库名称 } creator_list.append(formatted_creator) @@ -3934,29 +3953,15 @@ def search_private_creators(request): "results_count": total_count, "search_applied": bool(search_query), "supports_single_char": True, # 标识支持单字符搜索 - "search_scope": "private_only", # 标识只搜索私有达人库 - "pool_id": pool_id # 返回当前搜索的池ID,如果有的话 + "search_scope": "private_only" # 标识只搜索私有达人库 } - # 构造私有库信息(如果有特定池ID) - pool_info = None - if pool_id and 'pool' in locals(): - pool_info = { - "id": pool.id, - "name": pool.name, - "description": pool.description, - "is_default": pool.is_default, - "user_id": pool.user_id, - "created_at": pool.created_at.strftime('%Y-%m-%d') - } - return JsonResponse({ 'code': 200, 'message': '搜索成功', 'data': creator_list, 'pagination': pagination, - 'search_info': search_info, - 'pool_info': pool_info + 'search_info': search_info }, json_dumps_params={'ensure_ascii': False}) except Exception as e: