| 
              # -*- coding: utf-8 -*-
from django.conf import settings
from django.db import transaction
from django_logit import logit
from django_query import get_query_value
from django_response import response
from paginator import pagination
from account.models import UserInfo, LensmanInfo
from member.models import MemberActivityContributionInfo, MemberActivityInfo, MemberActivitySignupInfo, MemberActivityDataInfo
from utils.error.errno_utils import MemberActivityContributionStatusCode, MemberActivityStatusCode, UserStatusCode
@logit
def activity_home(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    banners = MemberActivityInfo.objects.filter(activity_state=1, is_slider=True, is_series=False, status=True).order_by('-date')
    banners = [act.data(user_id) for act in banners]
    return response(data={
        'banners': banners,
    })
@logit
def activity_list(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    activity_section = request.POST.get('activity_section', 3)
    activitys = MemberActivityInfo.objects.filter(activity_state=1, activity_section=activity_section, is_series=False, status=True).order_by('-date')
    activitys = [act.data(user_id) for act in activitys]
    return response(data={
        'activitys': activitys,
    })
@logit
def activity_list_v2(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    activity_section = request.POST.get('activity_section', 3)
    activitys = MemberActivityInfo.objects.filter(activity_state=1, activity_section=activity_section, main_activity_id='', status=True).order_by('-date')
    activitys = [act.data(user_id) for act in activitys]
    return response(data={
        'activitys': activitys,
    })
@logit
def activity_series_list(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    main_activity_id = request.POST.get('main_activity_id', '')
    activitys = MemberActivityInfo.objects.filter(activity_state=1, main_activity_id=main_activity_id, status=True).order_by('-date')
    activitys = [act.data(user_id) for act in activitys]
    return response(data={
        'activitys': activitys,
    })
@logit
def activity_detail(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    activity_id = request.POST.get('activity_id', '')
    try:
        act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
    except MemberActivityInfo.DoesNotExist:
        return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
    return response(data={
        'activity': act.details(user_id),
    })
@logit
def activity_signup(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    lensman_id = request.POST.get('lensman_id', '')
    name = request.POST.get('name', '')
    phone = request.POST.get('phone', '')
    activity_id = request.POST.get('activity_id', '')
    fields = request.POST.get('fields', '[]')
    try:
        act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
    except MemberActivityInfo.DoesNotExist:
        return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
    
    MemberActivitySignupInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={
        'title': act.title,
        'lensman_id': lensman_id,
        'name': name,
        'phone': phone,
        'fields': fields,
    })
    # TODO: 立即推送模版消息(报名成功,时间,地点)
    # TODO: 延迟(活动当天)推送模版消息(时间,地点)
    return response(data={
        'activity': act.data(user_id),
    })
@logit
def activity_signup_detail(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    activity_id = request.POST.get('activity_id', '')
    try:
        signup_info = MemberActivitySignupInfo.objects.get(user_id=user_id, activity_id=activity_id, status=True)
    except MemberActivitySignupInfo.DoesNotExist:
        return response()
    return response(data={
        'signup_info': signup_info.data,
    })
@logit
def activity_data_submit(request):
    user_id = request.POST.get('user_id', '')
    lensman_id = request.POST.get('lensman_id', '')
    activity_id = request.POST.get('activity_id', '')
    data_fields = request.POST.get('data_fields', '[]')
    try:
        act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
    except MemberActivityInfo.DoesNotExist:
        return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
    
    try:
        lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True)
    except LensmanInfo.DoesNotExist:
        return response('400001', 'LensmanInfo Not Found', '摄影师不存在')
    if lensman.is_expired:
        return response(40001, 'Lensman Has Expired', '摄影师合作已到期')
    MemberActivityDataInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={
        'title': act.title,
        'lensman_id': lensman_id,
        'lensman_name': lensman.name,
        'lensman_phone': lensman.phone,
        'data_fields': data_fields,
    })
    return response(data={
        'activity': act.data(user_id),
    })
@logit
def activity_data_detail(request):
    user_id = request.POST.get('user_id', '')
    activity_id = request.POST.get('activity_id', '')
    try:
        data_info = MemberActivityDataInfo.objects.get(user_id=user_id, activity_id=activity_id, status=True)
    except MemberActivityDataInfo.DoesNotExist:
        return response()
    return response(data={
        'data_info': data_info.data,
    })
@logit
def activity_contribute_create(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    activity_id = request.POST.get('activity_id', '')
    main_activity_id = request.POST.get('main_activity_id', '')
    content_type = get_query_value(request, 'content_type', val_cast_type='int')
    title = request.POST.get('title', '')
    content = request.POST.get('content', '')
    images = get_query_value(request, 'images', val_cast_type='listjson')
    video_url = request.POST.get('video_url', '')
    # 报名字段
    user_name = request.POST.get('user_name', '')
    user_avatar = request.POST.get('user_avatar', '')
    act = MemberActivityInfo.objects.get(activity_id=activity_id)
    try:
        signup_info = MemberActivitySignupInfo.objects.get(user_id=user_id, activity_id=activity_id, status=True)
        if user_name and user_avatar:
            signup_info.name = user_name
            signup_info.avatar = user_avatar
            signup_info.save()
            MemberActivityContributionInfo.objects.filter(user_id=user_id, activity_id=activity_id).update(user_name=user_name, user_avatar=user_avatar)
    except MemberActivitySignupInfo.DoesNotExist:
        signup_info = MemberActivitySignupInfo.objects.create(
            user_id=user_id,
            activity_id=activity_id,
            title=act.title,
            name=user_name,
            avatar=user_avatar,
        )
    contribution = MemberActivityContributionInfo.objects.create(
        brand_id=brand_id,
        user_id=user_id,
        activity_id=activity_id,
        main_activity_id=main_activity_id,
        content_type=content_type,
        title=title,
        content=content,
        images=images,
        video_url=video_url,
        user_name=signup_info.name,
        user_avatar=signup_info.final_avatar,
    )
    return response(data={
        'contribution': contribution.data,
    })
@logit
def activity_contribute_update(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    activity_id = request.POST.get('activity_id', '')
    main_activity_id = request.POST.get('main_activity_id', '')
    content_type = get_query_value(request, 'content_type', val_cast_type='int')
    contribution_id = request.POST.get('contribution_id', '')
    title = request.POST.get('title', '')
    content = request.POST.get('content', '')
    images = get_query_value(request, 'images', val_cast_type='listjson')
    video_url = request.POST.get('video_url', '')
    # 报名字段
    user_name = request.POST.get('user_name', '')
    user_avatar = request.POST.get('user_avatar', '')
    try:
        signup_info = MemberActivitySignupInfo.objects.get(user_id=user_id, activity_id=activity_id, status=True)
        if user_name and user_avatar:
            signup_info.name = user_name
            signup_info.avatar = user_avatar
            signup_info.save()
            MemberActivityContributionInfo.objects.filter(user_id=user_id, activity_id=activity_id).update(user_name=user_name, user_avatar=user_avatar)
    except MemberActivitySignupInfo.DoesNotExist:
        signup_info = None
    contribution, _ = MemberActivityContributionInfo.objects.update_or_create(brand_id=brand_id, user_id=user_id, activity_id=activity_id, contribution_id=contribution_id, defaults={
        'title': title,
        'content': content,
        'images': images,
        'video_url': video_url,
        'user_name': signup_info.name if signup_info else '',
        'user_avatar': signup_info.final_avatar if signup_info else '',
        'audit_status': 0,
    })
    return response(data={
        'contribution': contribution.data,
    })
@logit
def activity_contribute_list(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    main_activity_id = request.POST.get('main_activity_id', '')
    activity_id = request.POST.get('activity_id', '')
    content_type = get_query_value(request, 'content_type', val_cast_type='int')
    is_myself = get_query_value(request, 'is_myself', val_cast_type='int')
    audit_status = get_query_value(request, 'audit_status', val_cast_type='int')
    is_audit_pass = get_query_value(request, 'is_audit_pass', val_cast_type='int')
    is_selected = get_query_value(request, 'is_selected', val_cast_type='int')
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)
    if main_activity_id:
        contributions = MemberActivityContributionInfo.objects.filter(main_activity_id=main_activity_id, status=True)
    else:
        contributions = MemberActivityContributionInfo.objects.filter(activity_id=activity_id, status=True)
    if 'content_type' in request.POST:
        contributions = contributions.filter(content_type=content_type)
    if 'is_myself' in request.POST:
        if is_myself:
            contributions = contributions.filter(user_id=user_id)
        else:
            contributions = contributions.exclude(user_id=user_id)
    if 'audit_status' in request.POST:
        contributions = contributions.filter(audit_status=audit_status)
    if 'is_audit_pass' in request.POST:
        if is_audit_pass:
            contributions = contributions.filter(audit_status=MemberActivityContributionInfo.AUDIT_PASS)
        else:
            contributions = contributions.exclude(audit_status=MemberActivityContributionInfo.AUDIT_PASS)
    if 'is_selected' in request.POST:
        contributions = contributions.filter(is_selected=is_selected)
    contributions = contributions.order_by('-pk')
    contributions, left = pagination(contributions, page, num)
    contributions = [contribution.data for contribution in contributions]
    return response(data={
        'contributions': contributions,
        'left': left,
    })
@logit
def activity_contribute_detail(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    contribution_id = request.POST.get('contribution_id', '')
    try:
        contribution = MemberActivityContributionInfo.objects.get(contribution_id=contribution_id, status=True)
    except MemberActivityContributionInfo.DoesNotExist:
        return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND)
    return response(data=contribution.data)
@logit
def activity_contribute_detail_lastest(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    activity_id = request.POST.get('activity_id', '')
    contribution = MemberActivityContributionInfo.objects.filter(activity_id=activity_id, user_id=user_id, status=True).first()
    return response(data=contribution.data)
@logit
@transaction.atomic
def activity_signin(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    user_id = request.POST.get('user_id', '')
    activity_id = request.POST.get('activity_id', '')
    # 校验用户是否存在
    try:
        user = UserInfo.objects.select_for_update().get(user_id=user_id)
    except UserInfo.DoesNotExist:
        return response(UserStatusCode.USER_NOT_FOUND)
    try:
        act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True)
    except MemberActivityInfo.DoesNotExist:
        return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND)
    try:
        signup_info = MemberActivitySignupInfo.objects.get(activity_id=activity_id, user_id=user_id, status=True)
    except MemberActivitySignupInfo.DoesNotExist:
        return response(40001, 'Signup Info Not Found', u'用户未报名')
    signup_info.is_signin = True
    signup_info.save()
    return response(data={
        'activity': act.data(user_id)
    })
 
  |