| @@ -5,7 +5,7 @@ from django_logit import logit | ||
| 5 | 5 | from django_response import response | 
| 6 | 6 | from paginator import pagination | 
| 7 | 7 |  | 
| 8 | -from member.models import MemberActivityInfo | |
| 8 | +from member.models import MemberActivityInfo, MemberActivitySignupInfo, MemberActivityContributionInfo | |
| 9 | 9 | from utils.error.errno_utils import MemberActivityStatusCode | 
| 10 | 10 |  | 
| 11 | 11 |  | 
| @@ -50,3 +50,188 @@ def activity_detail(request): | ||
| 50 | 50 |      return response(data={ | 
| 51 | 51 | 'activity': act.details(user_id), | 
| 52 | 52 | }) | 
| 53 | + | |
| 54 | + | |
| 55 | +@logit | |
| 56 | +def activity_signup(request): | |
| 57 | +    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID | |
| 58 | +    user_id = request.POST.get('user_id', '') | |
| 59 | +    activity_id = request.POST.get('activity_id', '') | |
| 60 | +    fields = request.POST.get('fields', fields) | |
| 61 | + | |
| 62 | + try: | |
| 63 | + act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True) | |
| 64 | + except MemberActivityInfo.DoesNotExist: | |
| 65 | + return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND) | |
| 66 | + | |
| 67 | +    MemberActivitySignupInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={ | |
| 68 | + 'title': act.title, | |
| 69 | + 'fields': fields, | |
| 70 | + }) | |
| 71 | + | |
| 72 | + # TODO: 立即推送模版消息(报名成功,时间,地点) | |
| 73 | + # TODO: 延迟(活动当天)推送模版消息(时间,地点) | |
| 74 | + | |
| 75 | +    return response(data={ | |
| 76 | + 'activity': act.data(user_id), | |
| 77 | + }) | |
| 78 | + | |
| 79 | + | |
| 80 | +@logit | |
| 81 | +def activity_signup_detail(request): | |
| 82 | +    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID | |
| 83 | +    user_id = request.POST.get('user_id', '') | |
| 84 | +    activity_id = request.POST.get('activity_id', '') | |
| 85 | + | |
| 86 | + try: | |
| 87 | + signup_info = MemberActivitySignupInfo.objects.get(user_id=user_id, activity_id=activity_id, status=True) | |
| 88 | + except MemberActivitySignupInfo.DoesNotExist: | |
| 89 | + return response() | |
| 90 | + | |
| 91 | +    return response(data={ | |
| 92 | + 'signup_info': signup_info.data, | |
| 93 | + }) | |
| 94 | + | |
| 95 | + | |
| 96 | +@logit | |
| 97 | +def activity_contribute_create(request): | |
| 98 | +    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID | |
| 99 | +    user_id = request.POST.get('user_id', '') | |
| 100 | +    activity_id = request.POST.get('activity_id', '') | |
| 101 | +    main_activity_id = request.POST.get('main_activity_id', '') | |
| 102 | + content_type = get_query_value(request, 'content_type', val_cast_type='int') | |
| 103 | +    title = request.POST.get('title', '') | |
| 104 | +    content = request.POST.get('content', '') | |
| 105 | + images = get_query_value(request, 'images', val_cast_type='listjson') | |
| 106 | +    video_url = request.POST.get('video_url', '') | |
| 107 | + | |
| 108 | + # 报名字段 | |
| 109 | +    user_name = request.POST.get('user_name', '') | |
| 110 | +    user_avatar = request.POST.get('user_avatar', '') | |
| 111 | + | |
| 112 | + # 校验用户是否存在 | |
| 113 | + try: | |
| 114 | + UserInfo.objects.get(user_id=user_id) | |
| 115 | + except UserInfo.DoesNotExist: | |
| 116 | + return response(UserStatusCode.USER_NOT_FOUND) | |
| 117 | + | |
| 118 | +    MemberActivitySignupInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={ | |
| 119 | + 'title': act.title, | |
| 120 | + 'name': user_name, | |
| 121 | + 'avatar': user_avatar, | |
| 122 | + }) | |
| 123 | + | |
| 124 | + contribution = MemberActivityContributionInfo.objects.create( | |
| 125 | + brand_id=brand_id, | |
| 126 | + user_id=user_id, | |
| 127 | + activity_id=activity_id, | |
| 128 | + main_activity_id=main_activity_id, | |
| 129 | + content_type=content_type, | |
| 130 | + title=title, | |
| 131 | + content=content, | |
| 132 | + images=images, | |
| 133 | + video_url=video_url, | |
| 134 | + user_name=user_name, | |
| 135 | + user_avatar=user_avatar, | |
| 136 | + ) | |
| 137 | + | |
| 138 | +    return response(data={ | |
| 139 | + 'contribution': contribution.data, | |
| 140 | + }) | |
| 141 | + | |
| 142 | + | |
| 143 | +@logit | |
| 144 | +def activity_contribute_update(request): | |
| 145 | +    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID | |
| 146 | +    user_id = request.POST.get('user_id', '') | |
| 147 | +    activity_id = request.POST.get('activity_id', '') | |
| 148 | +    main_activity_id = request.POST.get('main_activity_id', '') | |
| 149 | + content_type = get_query_value(request, 'content_type', val_cast_type='int') | |
| 150 | +    contribution_id = request.POST.get('contribution_id', '') | |
| 151 | +    title = request.POST.get('title', '') | |
| 152 | +    content = request.POST.get('content', '') | |
| 153 | + images = get_query_value(request, 'images', val_cast_type='listjson') | |
| 154 | +    video_url = request.POST.get('video_url', '') | |
| 155 | + | |
| 156 | + # 校验用户是否存在 | |
| 157 | + try: | |
| 158 | + UserInfo.objects.get(user_id=user_id) | |
| 159 | + except UserInfo.DoesNotExist: | |
| 160 | + return response(UserStatusCode.USER_NOT_FOUND) | |
| 161 | + | |
| 162 | + try: | |
| 163 | + signup_info = MemberActivitySignupInfo.objects.get(user_id=user_id, activity_id=activity_id, main_activity_id=main_activity_id, status=True) | |
| 164 | + except MemberActivitySignupInfo.DoesNotExist: | |
| 165 | + signup_info = None | |
| 166 | + | |
| 167 | +    contribution, _ = MemberActivityContributionInfo.objects.update_or_create(brand_id=brand_id, user_id=user_id, activity_id=activity_id, contribution_id=contribution_id, defaults={ | |
| 168 | + 'title': title, | |
| 169 | + 'content': content, | |
| 170 | + 'images': images, | |
| 171 | + 'video_url': video_url, | |
| 172 | + 'user_name': signup_info.name if signup_info else '', | |
| 173 | + 'user_avatar': signup_info.final_avatar if signup_info else '', | |
| 174 | + 'audit_status': 0, | |
| 175 | + }) | |
| 176 | + | |
| 177 | +    return response(data={ | |
| 178 | + 'contribution': contribution.data, | |
| 179 | + }) | |
| 180 | + | |
| 181 | + | |
| 182 | +@logit | |
| 183 | +def activity_contribute_list(request): | |
| 184 | +    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID | |
| 185 | +    user_id = request.POST.get('user_id', '') | |
| 186 | +    main_activity_id = request.POST.get('main_activity_id', '') | |
| 187 | +    activity_id = request.POST.get('activity_id', '') | |
| 188 | + content_type = get_query_value(request, 'content_type', val_cast_type='int') | |
| 189 | + is_myself = get_query_value(request, 'is_myself', val_cast_type='int') | |
| 190 | + audit_status = get_query_value(request, 'audit_status', val_cast_type='int') | |
| 191 | + is_audit_pass = get_query_value(request, 'is_audit_pass', val_cast_type='int') | |
| 192 | + is_selected = get_query_value(request, 'is_selected', val_cast_type='int') | |
| 193 | +    page = request.POST.get('page', 1) | |
| 194 | +    num = request.POST.get('num', 20) | |
| 195 | + | |
| 196 | + if main_activity_id: | |
| 197 | + contributions = MemberActivityContributionInfo.objects.filter(main_activity_id=main_activity_id, status=True) | |
| 198 | + else: | |
| 199 | + contributions = MemberActivityContributionInfo.objects.filter(activity_id=activity_id, status=True) | |
| 200 | + | |
| 201 | + if 'content_type' in request.POST: | |
| 202 | + contributions = contributions.filter(content_type=content_type) | |
| 203 | + if 'is_myself' in request.POST: | |
| 204 | + if is_myself: | |
| 205 | + contributions = contributions.filter(user_id=user_id) | |
| 206 | + else: | |
| 207 | + contributions = contributions.exclude(user_id=user_id) | |
| 208 | + if 'audit_status' in request.POST: | |
| 209 | + contributions = contributions.filter(audit_status=audit_status) | |
| 210 | + if 'is_audit_pass' in request.POST: | |
| 211 | + if is_audit_pass: | |
| 212 | + contributions = contributions.filter(audit_status=MemberActivityContributionInfo.AUDIT_PASS) | |
| 213 | + else: | |
| 214 | + contributions = contributions.exclude(audit_status=MemberActivityContributionInfo.AUDIT_PASS) | |
| 215 | + if 'is_selected' in request.POST: | |
| 216 | + contributions = contributions.filter(is_selected=is_selected) | |
| 217 | +    contributions = contributions.order_by('-pk') | |
| 218 | + contributions, left = pagination(contributions, page, num) | |
| 219 | + contributions = [contribution.data for contribution in contributions] | |
| 220 | + | |
| 221 | +    return response(data={ | |
| 222 | + 'contributions': contributions, | |
| 223 | + 'left': left, | |
| 224 | + }) | |
| 225 | + | |
| 226 | + | |
| 227 | +@logit | |
| 228 | +def activity_contribute_detail(request): | |
| 229 | +    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID | |
| 230 | +    contribution_id = request.POST.get('contribution_id', '') | |
| 231 | + | |
| 232 | + try: | |
| 233 | + contribution = MemberActivityContributionInfo.objects.get(contribution_id=contribution_id, status=True) | |
| 234 | + except MemberActivityContributionInfo.DoesNotExist: | |
| 235 | + return response(MemberActivityContributionStatusCode.ACTIVITY_CONTRIBUTION_NOT_FOUND) | |
| 236 | + | |
| 237 | + return response(data=contribution.data) | 
| @@ -0,0 +1,21 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | + | |
| 3 | +# Generated by Django 3.2.6 on 2023-05-15 08:07 | |
| 4 | + | |
| 5 | +from django.db import migrations | |
| 6 | +import jsonfield.fields | |
| 7 | + | |
| 8 | + | |
| 9 | +class Migration(migrations.Migration): | |
| 10 | + | |
| 11 | + dependencies = [ | |
| 12 | +        ('member', '0061_alter_memberactivityinfo_feed_id'), | |
| 13 | + ] | |
| 14 | + | |
| 15 | + operations = [ | |
| 16 | + migrations.AddField( | |
| 17 | + model_name='memberactivitysignupinfo', | |
| 18 | + name='fields', | |
| 19 | + field=jsonfield.fields.JSONField(blank=True, default='[]', help_text='自定义报名字段', null=True, verbose_name='fields'), | |
| 20 | + ), | |
| 21 | + ] | 
| @@ -718,6 +718,8 @@ class MemberActivitySignupInfo(BaseModelMixin, BrandInfoMixin): | ||
| 718 | 718 | name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'姓名') | 
| 719 | 719 | phone = models.CharField(_(u'phone'), max_length=255, blank=True, null=True, help_text=u'电话') | 
| 720 | 720 |  | 
| 721 | + fields = JSONField(_(u'fields'), blank=True, null=True, default='[]', help_text=u'自定义报名字段') | |
| 722 | + | |
| 721 | 723 | class Meta: | 
| 722 | 724 | verbose_name = _(u'会员活动报名信息') | 
| 723 | 725 | verbose_name_plural = _(u'会员活动报名信息') | 
| @@ -741,6 +743,7 @@ class MemberActivitySignupInfo(BaseModelMixin, BrandInfoMixin): | ||
| 741 | 743 | 'avatar': self.final_avatar, | 
| 742 | 744 | 'name': self.name, | 
| 743 | 745 | 'phone': self.phone, | 
| 746 | + 'fields': json.loads(self.fields) if self.fields else [], | |
| 744 | 747 | } | 
| 745 | 748 |  | 
| 746 | 749 | @property | 
| @@ -753,6 +756,7 @@ class MemberActivitySignupInfo(BaseModelMixin, BrandInfoMixin): | ||
| 753 | 756 | 'avatar': self.final_avatar, | 
| 754 | 757 | 'name': self.name, | 
| 755 | 758 | 'phone': self.phone, | 
| 759 | + 'fields': json.loads(self.fields) if self.fields else [], | |
| 756 | 760 | } | 
| 757 | 761 |  | 
| 758 | 762 |  | 
| @@ -10,3 +10,17 @@ urlpatterns = [ | ||
| 10 | 10 | url(r'^member/activity/list$', activity_mp_views.activity_list, name='mp_member_activity_list'), # 获取会员分区活动列表 | 
| 11 | 11 | url(r'^member/activity/detail$', activity_mp_views.activity_detail, name='mp_member_activity_detail'), # 获取会员分区活动详情 | 
| 12 | 12 | ] | 
| 13 | + | |
| 14 | +# activity signup | |
| 15 | +urlpatterns += [ | |
| 16 | + url(r'^member/activity/signup$', activity_mp_views.activity_signup, name='mp_member_activity_signup'), # 会员活动报名 | |
| 17 | + url(r'^member/activity/signup/detail$', activity_mp_views.activity_signup_detail, name='mp_member_activity_signup_detail'), # 获取会员活动报名信息 | |
| 18 | +] | |
| 19 | + | |
| 20 | +# activity contribution | |
| 21 | +urlpatterns += [ | |
| 22 | + url(r'^member/activity/contribute/create$', activity_mp_views.activity_contribute_create, name='mp_member_activity_contribute_create'), | |
| 23 | + url(r'^member/activity/contribute/list$', activity_mp_views.activity_contribute_list, name='member_activity_contribute_list'), | |
| 24 | + url(r'^member/activity/contribute/update$', activity_mp_views.activity_contribute_update, name='member_aactivity_contribute_update'), | |
| 25 | + url(r'^member/activity/contribute/detail$', activity_mp_views.activity_contribute_detail, name='member_activity_contribute_detail'), | |
| 26 | +] |