Files
Django/jituan/services/user_stats.py

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