@@ -4,6 +4,7 @@ from __future__ import division |
||
4 | 4 |
|
5 | 5 |
from django.conf import settings |
6 | 6 |
from django.db import transaction |
7 |
+from django.db.models import Sum |
|
7 | 8 |
from django_logit import logit |
8 | 9 |
from django_query import get_query_value |
9 | 10 |
from django_response import response |
@@ -425,16 +426,20 @@ def activity_signin(request): |
||
425 | 426 |
}) |
426 | 427 |
|
427 | 428 |
|
428 |
-def get_group_share_info_integral(share_user_id, open_gid, group_share_integral): |
|
429 |
+def get_group_share_info_integral(activity_id, share_user_id, open_gid, group_share_integral, group_share_max_integral): |
|
429 | 430 |
# 校验该分享人是否已领取该群积分 |
430 |
- has_integral = MemberActivityGroupShareInfo.objects.filter(share_user_id=share_user_id, open_gid=open_gid, is_integral=True).exists() |
|
431 |
+ has_integral = MemberActivityGroupShareInfo.objects.filter(activity_id=activity_id, share_user_id=share_user_id, open_gid=open_gid, is_integral=True).exists() |
|
431 | 432 |
if has_integral: |
432 | 433 |
return False, 0 |
433 |
- # TODO: 其他限制条件 |
|
434 |
+ # 校验该分享人是否已领取该活动积分上限 |
|
435 |
+ total_integral = MemberActivityGroupShareInfo.objects.filter(activity_id=activity_id, share_user_id=share_user_id).aggregate(Sum('integral')).get('integral__sum', 0) or 0 |
|
436 |
+ if total_integral + group_share_integral > group_share_max_integral: |
|
437 |
+ return False, 0 |
|
434 | 438 |
return True, group_share_integral |
435 | 439 |
|
436 | 440 |
|
437 | 441 |
@logit |
442 |
+@transaction.atomic |
|
438 | 443 |
def activity_group_share(request): |
439 | 444 |
brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) |
440 | 445 |
share_user_id = request.POST.get('share_user_id', '') |
@@ -460,12 +465,12 @@ def activity_group_share(request): |
||
460 | 465 |
return response() |
461 | 466 |
|
462 | 467 |
try: |
463 |
- act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True) |
|
468 |
+ act = MemberActivityInfo.objects.select_for_update().get(activity_id=activity_id, status=True) |
|
464 | 469 |
except MemberActivityInfo.DoesNotExist: |
465 | 470 |
return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND) |
466 | 471 |
|
467 | 472 |
# 判断是否给积分 & 给多少积分 |
468 |
- is_integral, integral = get_group_share_info_integral(share_user_id, open_gid, act.group_share_integral) |
|
473 |
+ is_integral, integral = get_group_share_info_integral(act.activity_id, share_user_id, open_gid, act.group_share_integral, act.group_share_max_integral) |
|
469 | 474 |
|
470 | 475 |
MemberActivityGroupShareInfo.objects.create(**{ |
471 | 476 |
'brand_id': act.brand_id, |
@@ -479,4 +484,4 @@ def activity_group_share(request): |
||
479 | 484 |
'integral': integral, |
480 | 485 |
}) |
481 | 486 |
|
482 |
- return response(data={}) |
|
487 |
+ return response() |
@@ -63,7 +63,7 @@ class MemberActivitySigninInfoAdmin(admin.ModelAdmin): |
||
63 | 63 |
|
64 | 64 |
|
65 | 65 |
class MemberActivityGroupShareInfoAdmin(admin.ModelAdmin): |
66 |
- list_display = ('group_share_id', 'share_user_id', 'click_user_id', 'open_gid', 'activity_id', 'title', 'is_integral', 'integral', 'status', 'created_at', 'updated_at') |
|
66 |
+ list_display = ('group_share_id', 'activity_id', 'share_user_id', 'click_user_id', 'open_gid', 'title', 'is_integral', 'integral', 'status', 'created_at', 'updated_at') |
|
67 | 67 |
list_filter = ('is_integral', 'status') |
68 | 68 |
|
69 | 69 |
|
@@ -298,6 +298,7 @@ class MemberActivityInfo(BaseModelMixin): |
||
298 | 298 |
|
299 | 299 |
integral = models.IntegerField(_(u'integral'), default=0, help_text=u'会员积分') |
300 | 300 |
group_share_integral = models.IntegerField(_(u'group_share_integral'), default=0, help_text=u'群组分享会员积分') |
301 |
+ group_share_max_integral = models.IntegerField(_(u'group_share_max_integral'), default=0, help_text=u'群组分享会员积分单人上限') |
|
301 | 302 |
|
302 | 303 |
image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'活动内容图片') |
303 | 304 |
|
@@ -311,10 +312,10 @@ class MemberActivityInfo(BaseModelMixin): |
||
311 | 312 |
share_img_link = models.CharField(_(u'share_img_link'), max_length=255, blank=True, null=True, help_text=u'活动图片分享') |
312 | 313 |
share_h5_link = models.CharField(_(u'share_h5_link'), max_length=255, blank=True, null=True, help_text=u'活动H5分享') |
313 | 314 |
|
314 |
- position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True) |
|
315 |
- |
|
316 | 315 |
is_signup = models.BooleanField(_(u'is_signup'), default=True, help_text=u'是否有报名功能') |
317 | 316 |
|
317 |
+ position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True) |
|
318 |
+ |
|
318 | 319 |
class Meta: |
319 | 320 |
verbose_name = _(u'会员活动信息') |
320 | 321 |
verbose_name_plural = _(u'会员活动信息') |
@@ -462,13 +463,13 @@ class MemberActivityGroupShareInfo(BaseModelMixin): |
||
462 | 463 |
|
463 | 464 |
group_share_id = ShortUUIDField(_(u'group_share_id'), max_length=32, blank=True, null=True, help_text=u'活动群组分享唯一标识', db_index=True, unique=True) |
464 | 465 |
|
466 |
+ activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True) |
|
467 |
+ |
|
465 | 468 |
share_user_id = models.CharField(_(u'share_user_id'), max_length=32, blank=True, null=True, help_text=u'分享用户唯一标识', db_index=True) |
466 | 469 |
click_user_id = models.CharField(_(u'click_user_id'), max_length=32, blank=True, null=True, help_text=u'点击用户唯一标识', db_index=True) |
467 | 470 |
|
468 | 471 |
open_gid = models.CharField(_(u'open_gid'), max_length=32, blank=True, null=True, help_text=u'群组唯一标识', db_index=True) |
469 | 472 |
|
470 |
- activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True) |
|
471 |
- |
|
472 | 473 |
title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称') |
473 | 474 |
|
474 | 475 |
is_integral = models.BooleanField(_(u'is_integral'), default=False, help_text=u'是否有积分') |