81 lines
3.0 KiB
Python
81 lines
3.0 KiB
Python
"""用户管理汇总统计(集团汇总 + 按俱乐部拆分)。"""
|
|
from django.utils import timezone
|
|
|
|
from jituan.constants import DATA_SCOPE_ALL
|
|
from jituan.models import Club
|
|
from jituan.services.club_context import (
|
|
filter_queryset_by_club,
|
|
resolve_club_id_from_request,
|
|
resolve_club_scope,
|
|
filter_user_qs_by_club,
|
|
filter_user_related_by_club,
|
|
)
|
|
from products.models import Huiyuangoumai
|
|
from users.business_models import User
|
|
from users.models import UserDashou, UserGuanshi, UserShangjia, UserZuzhang
|
|
|
|
|
|
def _dashou_valid_count(request, dashou_user_ids):
|
|
now = timezone.now()
|
|
hy_qs = filter_queryset_by_club(Huiyuangoumai.query.all(), request)
|
|
return hy_qs.filter(
|
|
yonghu_id__in=dashou_user_ids,
|
|
huiyuan_zhuangtai=1,
|
|
daoqi_time__gt=now,
|
|
).values('yonghu_id').distinct().count()
|
|
|
|
|
|
def _counts_for_club_id(club_id):
|
|
dashou_qs = UserDashou.query.filter(user__ClubID=club_id)
|
|
dashou_ids = dashou_qs.values_list('user__UserUID', flat=True)
|
|
now = timezone.now()
|
|
dashou_valid = Huiyuangoumai.query.filter(
|
|
club_id=club_id,
|
|
yonghu_id__in=dashou_ids,
|
|
huiyuan_zhuangtai=1,
|
|
daoqi_time__gt=now,
|
|
).values('yonghu_id').distinct().count()
|
|
shangjia_qs = UserShangjia.query.filter(user__ClubID=club_id)
|
|
return {
|
|
'club_id': club_id,
|
|
'dashou_total': dashou_qs.count(),
|
|
'dashou_valid': dashou_valid,
|
|
'guanshi_total': User.query.filter(ClubID=club_id, GuanshiProfile__isnull=False).count(),
|
|
'shangjia_total': shangjia_qs.count(),
|
|
'shangjia_valid': shangjia_qs.filter(zhuangtai=1).count(),
|
|
'zuzhang_total': UserZuzhang.query.filter(user__ClubID=club_id).count(),
|
|
'zuzhang_active': UserZuzhang.query.filter(user__ClubID=club_id, zhuangtai=1).count(),
|
|
}
|
|
|
|
|
|
def build_user_summary(request):
|
|
dashou_qs = filter_user_related_by_club(UserDashou.query.all(), request)
|
|
guanshi_qs = filter_user_qs_by_club(
|
|
User.query.filter(GuanshiProfile__isnull=False), request,
|
|
)
|
|
shangjia_qs = filter_user_related_by_club(UserShangjia.query.all(), request)
|
|
zuzhang_qs = filter_user_related_by_club(UserZuzhang.query.all(), request)
|
|
|
|
dashou_ids = dashou_qs.values_list('user__UserUID', flat=True)
|
|
result = {
|
|
'club_id': resolve_club_id_from_request(request),
|
|
'scope': resolve_club_scope(request),
|
|
'dashou_total': dashou_qs.count(),
|
|
'dashou_valid': _dashou_valid_count(request, dashou_ids),
|
|
'guanshi_total': guanshi_qs.count(),
|
|
'shangjia_total': shangjia_qs.count(),
|
|
'shangjia_valid': shangjia_qs.filter(zhuangtai=1).count(),
|
|
'zuzhang_total': zuzhang_qs.count(),
|
|
'zuzhang_active': zuzhang_qs.filter(zhuangtai=1).count(),
|
|
}
|
|
|
|
if resolve_club_scope(request) == DATA_SCOPE_ALL:
|
|
by_club = []
|
|
for club in Club.query.filter(status=1).order_by('sort_order', 'club_id'):
|
|
row = _counts_for_club_id(club.club_id)
|
|
row['name'] = club.name
|
|
by_club.append(row)
|
|
result['by_club'] = by_club
|
|
|
|
return result
|