| @@ -402,8 +402,12 @@ def consumer_info_api(request): | ||
| 402 | 402 | user.shots_num += 1 | 
| 403 | 403 | if user.level < UserInfo.MEMBER_BLACK_GOLD: | 
| 404 | 404 | user.level += 1 | 
| 405 | + # 发放会员权益 | |
| 406 | +            r.rpushjson({ | |
| 407 | + 'brand_id': brand.brand_id, | |
| 408 | + 'user_id': user_id, | |
| 409 | + }) | |
| 405 | 410 | user.save() | 
| 406 | - # TODO: 发放会员权益 | |
| 407 | 411 |  | 
| 408 | 412 | return response(200, 'Submit Consumer Info Success', u'提交消费者信息成功') | 
| 409 | 413 |  | 
| @@ -13,7 +13,7 @@ from member.models import (CouponInfo, GoodsInfo, GoodsOrderInfo, MemberActivity | ||
| 13 | 13 | MemberActivitySignupInfo, RightInfo) | 
| 14 | 14 | from utils.error.errno_utils import (MemberActivityStatusCode, MemberGoodStatusCode, MemberRightStatusCode, | 
| 15 | 15 | UserStatusCode) | 
| 16 | -from utils.redis.rshot import get_shot_member_data | |
| 16 | +from utils.redis.rshot import get_member_shot_data | |
| 17 | 17 |  | 
| 18 | 18 |  | 
| 19 | 19 | @logit | 
| @@ -230,7 +230,7 @@ def integrals(request): | ||
| 230 | 230 |      brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) | 
| 231 | 231 |  | 
| 232 | 232 |      return response(200, data={ | 
| 233 | - 'shots_types': get_shot_member_data(), | |
| 233 | + 'shots_types': get_member_shot_data(), | |
| 234 | 234 | 'enable_photo_upvote_integral': True, | 
| 235 | 235 |          'photo_upvote_integrals': { | 
| 236 | 236 | 'headers': [u'排名', u'日', u'周', u'月'], | 
| @@ -0,0 +1,74 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | + | |
| 3 | +import logging | |
| 4 | +import time | |
| 5 | + | |
| 6 | +from django.db import transaction | |
| 7 | +from django_six import CompatibilityBaseCommand, close_old_connections | |
| 8 | +from TimeConvert import TimeConvert as tc | |
| 9 | + | |
| 10 | +from account.models import UserInfo | |
| 11 | +from member.models import CouponInfo, RightInfo | |
| 12 | +from utils.redis.connect import r | |
| 13 | +from utils.redis.rkeys import MEMBER_SEND_COUPON_LIST | |
| 14 | + | |
| 15 | + | |
| 16 | +logger = logging.getLogger('console') | |
| 17 | + | |
| 18 | + | |
| 19 | +class Command(CompatibilityBaseCommand): | |
| 20 | + def handle(self, *args, **options): | |
| 21 | + | |
| 22 | +        logger.info('Gis is dealing') | |
| 23 | + | |
| 24 | + while True: | |
| 25 | +            # r.rpushjson('TEMPLET_CMD_KEY', { | |
| 26 | + # 'brand_id': 'brand_id', | |
| 27 | + # 'user_id': 'user_id', | |
| 28 | + # }) | |
| 29 | + k, v = r.blpopjson(MEMBER_SEND_COUPON_LIST, 60) | |
| 30 | + if v: | |
| 31 | + | |
| 32 | + time.sleep(10) | |
| 33 | + | |
| 34 | + close_old_connections() | |
| 35 | + | |
| 36 | + logger.info(v) | |
| 37 | + | |
| 38 | +                brand_id = v.get('brand_id', 0) | |
| 39 | +                user_id = v.get('user_id', 0) | |
| 40 | + | |
| 41 | + with transaction.atomic(): | |
| 42 | + try: | |
| 43 | + user = UserInfo.objects.get(user_id=user_id) | |
| 44 | + except UserInfo.DoesNotExist: | |
| 45 | + continue | |
| 46 | + rights = RightInfo.objects.filter(is_send_coupon=True, status=True) | |
| 47 | + for right in rights: | |
| 48 | + if user.level == UserInfo.MEMBER_LRC: | |
| 49 | + coupon_amount = right.coupon_level1_amount | |
| 50 | + elif user.level == UserInfo.MEMBER_SILVER: | |
| 51 | + coupon_amount = right.coupon_level2_amount | |
| 52 | + elif user.level == UserInfo.MEMBER_SILVER: | |
| 53 | + coupon_amount = right.coupon_level3_amount | |
| 54 | + elif user.level == UserInfo.MEMBER_SILVER: | |
| 55 | + coupon_amount = right.coupon_level4_amount | |
| 56 | + else: | |
| 57 | + coupon_amount = right.coupon_level5_amount | |
| 58 | + for _ in xrange(right.coupon_num): | |
| 59 | + CouponInfo.objects.create( | |
| 60 | + user_id=user_id, | |
| 61 | + coupon_valid_period=right.coupon_valid_period, | |
| 62 | + coupon_amount=coupon_amount, | |
| 63 | + coupon_detail=right.coupon_detail, | |
| 64 | + active_at=tc.utc_datetime(), | |
| 65 | + expire_at=tc.utc_datetime(days=365), | |
| 66 | + right_id=right.right_id, | |
| 67 | + right_type=right.right_type, | |
| 68 | + icon=right.icon, | |
| 69 | + title=right.title, | |
| 70 | + subtitle=right.subtitle, | |
| 71 | + detail=right.detail, | |
| 72 | + ) | |
| 73 | + | |
| 74 | + close_old_connections() | 
| @@ -10,7 +10,7 @@ from pysnippets.strsnippets import strip | ||
| 10 | 10 |  | 
| 11 | 11 | from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, | 
| 12 | 12 | LatestAppInfo, LatestAppScreenInfo, ModelInfo, OperatorInfo, SaleclerkInfo) | 
| 13 | -from utils.redis.rshot import update_shot_member_data | |
| 13 | +from utils.redis.rshot import update_member_shot_data | |
| 14 | 14 |  | 
| 15 | 15 |  | 
| 16 | 16 | class AdministratorInfoAdmin(admin.ModelAdmin): | 
| @@ -81,11 +81,11 @@ class ModelInfoAdmin(admin.ModelAdmin): | ||
| 81 | 81 |  | 
| 82 | 82 | obj.save() | 
| 83 | 83 |  | 
| 84 | - update_shot_member_data() | |
| 84 | + update_member_shot_data() | |
| 85 | 85 |  | 
| 86 | 86 | def delete_model(self, request, obj): | 
| 87 | 87 | obj.delete() | 
| 88 | - update_shot_member_data() | |
| 88 | + update_member_shot_data() | |
| 89 | 89 |  | 
| 90 | 90 |  | 
| 91 | 91 | class ModelImageInfoAdmin(admin.ModelAdmin): | 
| @@ -242,7 +242,7 @@ class ModelInfo(BaseModelMixin): | ||
| 242 | 242 | fulldata = admindata | 
| 243 | 243 |  | 
| 244 | 244 | @property | 
| 245 | - def shot_member_data(self): | |
| 245 | + def member_shot_data(self): | |
| 246 | 246 |          return { | 
| 247 | 247 | 'shot_id': self.model_id, | 
| 248 | 248 | 'shot_name': self.shot_member_name, | 
| @@ -2,9 +2,9 @@ | ||
| 2 | 2 |  | 
| 3 | 3 | from django.contrib import admin | 
| 4 | 4 |  | 
| 5 | -from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo, | |
| 6 | - MemberActivitySignupInfo, MemberCouponInfo, RightInfo, ShotTypeInfo) | |
| 7 | -from utils.redis.rshot import update_shot_member_data | |
| 5 | +from member.models import (CouponInfo, GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo, | |
| 6 | + MemberActivitySignupInfo, RightInfo, ShotTypeInfo) | |
| 7 | +from utils.redis.rshot import update_member_shot_data | |
| 8 | 8 |  | 
| 9 | 9 |  | 
| 10 | 10 | class GoodsInfoAdmin(admin.ModelAdmin): | 
| @@ -27,7 +27,12 @@ class GoodsOrderInfoAdmin(admin.ModelAdmin): | ||
| 27 | 27 |  | 
| 28 | 28 |  | 
| 29 | 29 | class RightInfoAdmin(admin.ModelAdmin): | 
| 30 | -    list_display = ('right_id', 'right_type', 'icon', 'title', 'subtitle', 'detail', 'level1', 'level2', 'level3', 'level4', 'level5', 'minlevel', 'position', 'status', 'created_at', 'updated_at') | |
| 30 | +    list_display = ('right_id', 'right_type', 'icon', 'title', 'subtitle', 'detail', 'level1', 'level2', 'level3', 'level4', 'level5', 'minlevel', 'position', 'is_send_coupon', 'coupon_valid_period', 'coupon_num', 'status', 'created_at', 'updated_at') | |
| 31 | +    list_filter = ('right_type', 'is_send_coupon', 'status') | |
| 32 | + | |
| 33 | + | |
| 34 | +class CouponInfoAdmin(admin.ModelAdmin): | |
| 35 | +    list_display = ('coupon_id', 'user_id', 'coupon_valid_period', 'coupon_amount', 'coupon_detail', 'active_at', 'expire_at', 'right_id', 'right_type', 'icon', 'title', 'subtitle', 'detail', 'status', 'created_at', 'updated_at') | |
| 31 | 36 |      list_filter = ('right_type', 'status') | 
| 32 | 37 |  | 
| 33 | 38 |  | 
| @@ -36,11 +41,11 @@ class ShotTypeInfoAdmin(admin.ModelAdmin): | ||
| 36 | 41 |  | 
| 37 | 42 | def save_model(self, request, obj, form, change): | 
| 38 | 43 | obj.save() | 
| 39 | - update_shot_member_data() | |
| 44 | + update_member_shot_data() | |
| 40 | 45 |  | 
| 41 | 46 | def delete_model(self, request, obj): | 
| 42 | 47 | obj.delete() | 
| 43 | - update_shot_member_data() | |
| 48 | + update_member_shot_data() | |
| 44 | 49 |  | 
| 45 | 50 |  | 
| 46 | 51 | class MemberActivityInfoAdmin(admin.ModelAdmin): | 
| @@ -60,15 +65,11 @@ class MemberActivitySigninInfoAdmin(admin.ModelAdmin): | ||
| 60 | 65 |      list_display = ('signin_id', 'user_id', 'activity_id', 'title', 'status', 'created_at', 'updated_at') | 
| 61 | 66 |  | 
| 62 | 67 |  | 
| 63 | -class MemberCouponInfoAdmin(admin.ModelAdmin): | |
| 64 | -    list_display = ('coupon_id', 'user_id', 'coupon_type', 'coupon_start_at', 'coupon_expire_at', 'coupon_value', 'has_used', 'admin_id', 'used_at', 'status', 'created_at', 'updated_at') | |
| 65 | - | |
| 66 | - | |
| 67 | 68 | admin.site.register(GoodsInfo, GoodsInfoAdmin) | 
| 68 | 69 | admin.site.register(GoodsOrderInfo, GoodsOrderInfoAdmin) | 
| 69 | 70 | admin.site.register(RightInfo, RightInfoAdmin) | 
| 71 | +admin.site.register(CouponInfo, CouponInfoAdmin) | |
| 70 | 72 | admin.site.register(ShotTypeInfo, ShotTypeInfoAdmin) | 
| 71 | 73 | admin.site.register(MemberActivityInfo, MemberActivityInfoAdmin) | 
| 72 | 74 | admin.site.register(MemberActivitySignupInfo, MemberActivitySignupInfoAdmin) | 
| 73 | 75 | admin.site.register(MemberActivitySigninInfo, MemberActivitySigninInfoAdmin) | 
| 74 | -admin.site.register(MemberCouponInfo, MemberCouponInfoAdmin) | 
| @@ -0,0 +1,76 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2019-12-12 09:42 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | +import simditor.fields | |
| 7 | + | |
| 8 | + | |
| 9 | +class Migration(migrations.Migration): | |
| 10 | + | |
| 11 | + dependencies = [ | |
| 12 | +        ('member', '0007_auto_20191212_0952'), | |
| 13 | + ] | |
| 14 | + | |
| 15 | + operations = [ | |
| 16 | + migrations.AddField( | |
| 17 | + model_name='couponinfo', | |
| 18 | + name='coupon_amount', | |
| 19 | + field=models.IntegerField(blank=True, default=0, help_text='\u5238\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_amount'), | |
| 20 | + ), | |
| 21 | + migrations.AddField( | |
| 22 | + model_name='couponinfo', | |
| 23 | + name='coupon_detail', | |
| 24 | + field=simditor.fields.RichTextField(blank=True, help_text='\u5238\u8be6\u60c5', null=True, verbose_name='coupon_detail'), | |
| 25 | + ), | |
| 26 | + migrations.AddField( | |
| 27 | + model_name='couponinfo', | |
| 28 | + name='coupon_valid_period', | |
| 29 | + field=models.IntegerField(default=0, help_text='\u5238\u6709\u6548\u65f6\u95f4\uff08\u5355\u4f4d\uff1a\u5929\uff09', verbose_name='coupon_valid_period'), | |
| 30 | + ), | |
| 31 | + migrations.AddField( | |
| 32 | + model_name='rightinfo', | |
| 33 | + name='coupon_detail', | |
| 34 | + field=simditor.fields.RichTextField(blank=True, help_text='\u5238\u8be6\u60c5', null=True, verbose_name='coupon_detail'), | |
| 35 | + ), | |
| 36 | + migrations.AddField( | |
| 37 | + model_name='rightinfo', | |
| 38 | + name='coupon_level1_amount', | |
| 39 | + field=models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level1_amount'), | |
| 40 | + ), | |
| 41 | + migrations.AddField( | |
| 42 | + model_name='rightinfo', | |
| 43 | + name='coupon_level2_amount', | |
| 44 | + field=models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level2_amount'), | |
| 45 | + ), | |
| 46 | + migrations.AddField( | |
| 47 | + model_name='rightinfo', | |
| 48 | + name='coupon_level3_amount', | |
| 49 | + field=models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level3_amount'), | |
| 50 | + ), | |
| 51 | + migrations.AddField( | |
| 52 | + model_name='rightinfo', | |
| 53 | + name='coupon_level4_amount', | |
| 54 | + field=models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level4_amount'), | |
| 55 | + ), | |
| 56 | + migrations.AddField( | |
| 57 | + model_name='rightinfo', | |
| 58 | + name='coupon_level5_amount', | |
| 59 | + field=models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level5_amount'), | |
| 60 | + ), | |
| 61 | + migrations.AddField( | |
| 62 | + model_name='rightinfo', | |
| 63 | + name='coupon_num', | |
| 64 | + field=models.IntegerField(default=0, help_text='\u5238\u6bcf\u4f1a\u5458\u7ea7\u522b\u53d1\u653e\u5f20\u6570', verbose_name='coupon_num'), | |
| 65 | + ), | |
| 66 | + migrations.AddField( | |
| 67 | + model_name='rightinfo', | |
| 68 | + name='coupon_valid_period', | |
| 69 | + field=models.IntegerField(default=0, help_text='\u5238\u6709\u6548\u65f6\u95f4\uff08\u5355\u4f4d\uff1a\u5929\uff09', verbose_name='coupon_valid_period'), | |
| 70 | + ), | |
| 71 | + migrations.AddField( | |
| 72 | + model_name='rightinfo', | |
| 73 | + name='is_send_coupon', | |
| 74 | + field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u53d1\u5238', verbose_name='is_send_coupon'), | |
| 75 | + ), | |
| 76 | + ] | 
| @@ -0,0 +1,43 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2019-12-12 09:49 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations | |
| 6 | + | |
| 7 | + | |
| 8 | +class Migration(migrations.Migration): | |
| 9 | + | |
| 10 | + dependencies = [ | |
| 11 | +        ('member', '0008_auto_20191212_1742'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.RemoveField( | |
| 16 | + model_name='couponinfo', | |
| 17 | + name='level1', | |
| 18 | + ), | |
| 19 | + migrations.RemoveField( | |
| 20 | + model_name='couponinfo', | |
| 21 | + name='level2', | |
| 22 | + ), | |
| 23 | + migrations.RemoveField( | |
| 24 | + model_name='couponinfo', | |
| 25 | + name='level3', | |
| 26 | + ), | |
| 27 | + migrations.RemoveField( | |
| 28 | + model_name='couponinfo', | |
| 29 | + name='level4', | |
| 30 | + ), | |
| 31 | + migrations.RemoveField( | |
| 32 | + model_name='couponinfo', | |
| 33 | + name='level5', | |
| 34 | + ), | |
| 35 | + migrations.RemoveField( | |
| 36 | + model_name='couponinfo', | |
| 37 | + name='minlevel', | |
| 38 | + ), | |
| 39 | + migrations.RemoveField( | |
| 40 | + model_name='couponinfo', | |
| 41 | + name='position', | |
| 42 | + ), | |
| 43 | + ] | 
| @@ -0,0 +1,105 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2019-12-12 10:21 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | + | |
| 7 | + | |
| 8 | +class Migration(migrations.Migration): | |
| 9 | + | |
| 10 | + dependencies = [ | |
| 11 | +        ('member', '0009_auto_20191212_1749'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.AddField( | |
| 16 | + model_name='couponinfo', | |
| 17 | + name='brand_id', | |
| 18 | + field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'), | |
| 19 | + ), | |
| 20 | + migrations.AddField( | |
| 21 | + model_name='couponinfo', | |
| 22 | + name='brand_name', | |
| 23 | + field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'), | |
| 24 | + ), | |
| 25 | + migrations.AddField( | |
| 26 | + model_name='goodsinfo', | |
| 27 | + name='brand_id', | |
| 28 | + field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'), | |
| 29 | + ), | |
| 30 | + migrations.AddField( | |
| 31 | + model_name='goodsinfo', | |
| 32 | + name='brand_name', | |
| 33 | + field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'), | |
| 34 | + ), | |
| 35 | + migrations.AddField( | |
| 36 | + model_name='goodsorderinfo', | |
| 37 | + name='brand_id', | |
| 38 | + field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'), | |
| 39 | + ), | |
| 40 | + migrations.AddField( | |
| 41 | + model_name='goodsorderinfo', | |
| 42 | + name='brand_name', | |
| 43 | + field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'), | |
| 44 | + ), | |
| 45 | + migrations.AddField( | |
| 46 | + model_name='memberactivityinfo', | |
| 47 | + name='brand_id', | |
| 48 | + field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'), | |
| 49 | + ), | |
| 50 | + migrations.AddField( | |
| 51 | + model_name='memberactivityinfo', | |
| 52 | + name='brand_name', | |
| 53 | + field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'), | |
| 54 | + ), | |
| 55 | + migrations.AddField( | |
| 56 | + model_name='memberactivitysignininfo', | |
| 57 | + name='brand_id', | |
| 58 | + field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'), | |
| 59 | + ), | |
| 60 | + migrations.AddField( | |
| 61 | + model_name='memberactivitysignininfo', | |
| 62 | + name='brand_name', | |
| 63 | + field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'), | |
| 64 | + ), | |
| 65 | + migrations.AddField( | |
| 66 | + model_name='memberactivitysignupinfo', | |
| 67 | + name='brand_id', | |
| 68 | + field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'), | |
| 69 | + ), | |
| 70 | + migrations.AddField( | |
| 71 | + model_name='memberactivitysignupinfo', | |
| 72 | + name='brand_name', | |
| 73 | + field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'), | |
| 74 | + ), | |
| 75 | + migrations.AddField( | |
| 76 | + model_name='membercouponinfo', | |
| 77 | + name='brand_id', | |
| 78 | + field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'), | |
| 79 | + ), | |
| 80 | + migrations.AddField( | |
| 81 | + model_name='membercouponinfo', | |
| 82 | + name='brand_name', | |
| 83 | + field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'), | |
| 84 | + ), | |
| 85 | + migrations.AddField( | |
| 86 | + model_name='rightinfo', | |
| 87 | + name='brand_id', | |
| 88 | + field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'), | |
| 89 | + ), | |
| 90 | + migrations.AddField( | |
| 91 | + model_name='rightinfo', | |
| 92 | + name='brand_name', | |
| 93 | + field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'), | |
| 94 | + ), | |
| 95 | + migrations.AddField( | |
| 96 | + model_name='shottypeinfo', | |
| 97 | + name='brand_id', | |
| 98 | + field=models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id'), | |
| 99 | + ), | |
| 100 | + migrations.AddField( | |
| 101 | + model_name='shottypeinfo', | |
| 102 | + name='brand_name', | |
| 103 | + field=models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name'), | |
| 104 | + ), | |
| 105 | + ] | 
| @@ -0,0 +1,30 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2019-12-12 10:27 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | + | |
| 7 | + | |
| 8 | +class Migration(migrations.Migration): | |
| 9 | + | |
| 10 | + dependencies = [ | |
| 11 | +        ('member', '0010_auto_20191212_1821'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.AddField( | |
| 16 | + model_name='couponinfo', | |
| 17 | + name='admin_id', | |
| 18 | + field=models.CharField(blank=True, db_index=True, help_text='\u6838\u9500\u5458\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='admin_id'), | |
| 19 | + ), | |
| 20 | + migrations.AddField( | |
| 21 | + model_name='couponinfo', | |
| 22 | + name='has_used', | |
| 23 | + field=models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u5df2\u6838\u9500', verbose_name='has_used'), | |
| 24 | + ), | |
| 25 | + migrations.AddField( | |
| 26 | + model_name='couponinfo', | |
| 27 | + name='used_at', | |
| 28 | + field=models.DateTimeField(blank=True, help_text='\u7ef4\u4fee\u5238\u6838\u9500\u65f6\u95f4', null=True, verbose_name='used_at'), | |
| 29 | + ), | |
| 30 | + ] | 
| @@ -19,6 +19,9 @@ class GoodsInfo(BaseModelMixin): | ||
| 19 | 19 | (VIRTUAL, u'虚拟'), | 
| 20 | 20 | ) | 
| 21 | 21 |  | 
| 22 | + brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 23 | + brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 24 | + | |
| 22 | 25 | good_id = ShortUUIDField(_(u'good_id'), max_length=32, blank=True, null=True, help_text=u'商品唯一标识', db_index=True, unique=True) | 
| 23 | 26 | good_type = models.IntegerField(_(u'good_type'), choices=GOOD_TYPE_TUPLE, default=VIRTUAL, help_text=u'商品类型', db_index=True) | 
| 24 | 27 |  | 
| @@ -85,6 +88,9 @@ class GoodsOrderInfo(BaseModelMixin): | ||
| 85 | 88 | (VIRTUAL, u'虚拟'), | 
| 86 | 89 | ) | 
| 87 | 90 |  | 
| 91 | + brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 92 | + brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 93 | + | |
| 88 | 94 | order_id = ShortUUIDField(_(u'order_id'), max_length=32, blank=True, null=True, help_text=u'订单唯一标识', db_index=True, unique=True) | 
| 89 | 95 |  | 
| 90 | 96 | user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) | 
| @@ -121,6 +127,9 @@ class RightInfo(BaseModelMixin): | ||
| 121 | 127 | (COUPON, u'优惠券'), | 
| 122 | 128 | ) | 
| 123 | 129 |  | 
| 130 | + brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 131 | + brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 132 | + | |
| 124 | 133 | right_id = ShortUUIDField(_(u'right_id'), max_length=32, blank=True, null=True, help_text=u'权益唯一标识', db_index=True, unique=True) | 
| 125 | 134 | right_type = models.IntegerField(_(u'right_type'), choices=RIGHT_TYPE_TUPLE, default=VIRTUAL, help_text=u'权益类型', db_index=True) | 
| 126 | 135 |  | 
| @@ -139,6 +148,17 @@ class RightInfo(BaseModelMixin): | ||
| 139 | 148 |  | 
| 140 | 149 | position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True) | 
| 141 | 150 |  | 
| 151 | + # 券相关 | |
| 152 | + is_send_coupon = models.BooleanField(_(u'is_send_coupon'), default=False, help_text=_(u'是否发券'), db_index=True) | |
| 153 | + coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)')) | |
| 154 | + coupon_num = models.IntegerField(_(u'coupon_num'), default=0, help_text=_(u'券每会员级别发放张数')) | |
| 155 | + coupon_level1_amount = models.IntegerField(_(u'coupon_level1_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 156 | + coupon_level2_amount = models.IntegerField(_(u'coupon_level2_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 157 | + coupon_level3_amount = models.IntegerField(_(u'coupon_level3_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 158 | + coupon_level4_amount = models.IntegerField(_(u'coupon_level4_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 159 | + coupon_level5_amount = models.IntegerField(_(u'coupon_level5_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') | |
| 160 | + coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') | |
| 161 | + | |
| 142 | 162 | class Meta: | 
| 143 | 163 | verbose_name = _(u'会员权益信息') | 
| 144 | 164 | verbose_name_plural = _(u'会员权益信息') | 
| @@ -186,9 +206,16 @@ class CouponInfo(BaseModelMixin): | ||
| 186 | 206 | (COUPON, u'优惠券'), | 
| 187 | 207 | ) | 
| 188 | 208 |  | 
| 209 | + brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 210 | + brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 211 | + | |
| 189 | 212 | coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True) | 
| 190 | 213 | user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) | 
| 191 | 214 |  | 
| 215 | + coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)')) | |
| 216 | + coupon_amount = models.IntegerField(_(u'coupon_amount'), default=0, blank=True, null=True, help_text=u'券金额(单位:分)') | |
| 217 | + coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') | |
| 218 | + | |
| 192 | 219 | active_at = models.DateTimeField(_(u'active_at'), blank=True, null=True, help_text=_(u'生效时间')) | 
| 193 | 220 | expire_at = models.DateTimeField(_(u'expire_at'), blank=True, null=True, help_text=_(u'过期时间')) | 
| 194 | 221 |  | 
| @@ -200,15 +227,9 @@ class CouponInfo(BaseModelMixin): | ||
| 200 | 227 | subtitle = models.CharField(_(u'subtitle'), max_length=255, blank=True, null=True, help_text=u'权益二级名称') | 
| 201 | 228 | detail = RichTextField(_(u'detail'), blank=True, null=True, help_text=u'权益详情') | 
| 202 | 229 |  | 
| 203 | - level1 = models.CharField(_(u'level1'), max_length=255, blank=True, null=True, help_text=u'level1') | |
| 204 | - level2 = models.CharField(_(u'level2'), max_length=255, blank=True, null=True, help_text=u'level2') | |
| 205 | - level3 = models.CharField(_(u'level3'), max_length=255, blank=True, null=True, help_text=u'level3') | |
| 206 | - level4 = models.CharField(_(u'level4'), max_length=255, blank=True, null=True, help_text=u'level4') | |
| 207 | - level5 = models.CharField(_(u'level5'), max_length=255, blank=True, null=True, help_text=u'level5') | |
| 208 | - | |
| 209 | - minlevel = models.IntegerField(_(u'minlevel'), default=0, help_text=u'权益最低会员级别') | |
| 210 | - | |
| 211 | - position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True) | |
| 230 | + has_used = models.BooleanField(_(u'has_used'), default=False, help_text=u'是否已核销', db_index=True) | |
| 231 | + admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True) | |
| 232 | + used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=u'维修券核销时间') | |
| 212 | 233 |  | 
| 213 | 234 | class Meta: | 
| 214 | 235 | verbose_name = _(u'会员券信息') | 
| @@ -229,6 +250,9 @@ class CouponInfo(BaseModelMixin): | ||
| 229 | 250 | def data(self): | 
| 230 | 251 |          return { | 
| 231 | 252 | 'coupon_id': self.coupon_id, | 
| 253 | + 'coupon_valid_period': self.coupon_valid_period, | |
| 254 | + 'coupon_amount': self.coupon_amount, | |
| 255 | + 'coupon_detail': self.coupon_detail, | |
| 232 | 256 | 'active_at': tc.local_string(self.active_at, format='%Y%m%d'), | 
| 233 | 257 | 'expire_at': tc.local_string(self.expire_at, format='%Y%m%d'), | 
| 234 | 258 | 'right_id': self.right_id, | 
| @@ -237,19 +261,16 @@ class CouponInfo(BaseModelMixin): | ||
| 237 | 261 | 'title': self.title, | 
| 238 | 262 | 'subtitle': self.subtitle, | 
| 239 | 263 | 'detail': self.detail, | 
| 240 | - 'level1': self.level1, | |
| 241 | - 'level2': self.level2, | |
| 242 | - 'level3': self.level3, | |
| 243 | - 'level4': self.level4, | |
| 244 | - 'level5': self.level5, | |
| 245 | - 'minlevel': self.minlevel, | |
| 246 | - 'able': True, | |
| 247 | - 'left_num': 3, | |
| 248 | - 'left_tip': 3, | |
| 264 | + 'has_used': self.has_used, | |
| 265 | + 'admin_id': self.admin_id, | |
| 266 | + 'used_at': self.used_at, | |
| 249 | 267 | } | 
| 250 | 268 |  | 
| 251 | 269 |  | 
| 252 | 270 | class ShotTypeInfo(BaseModelMixin): | 
| 271 | + brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 272 | + brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 273 | + | |
| 253 | 274 | shot_type_id = ShortUUIDField(_(u'shot_type_id'), max_length=32, blank=True, null=True, help_text=u'镜头类型唯一标识', db_index=True, unique=True) | 
| 254 | 275 | shot_type_name = models.CharField(_(u'shot_type_name'), max_length=255, blank=True, null=True, help_text=u'镜头类型名称') | 
| 255 | 276 |  | 
| @@ -265,7 +286,7 @@ class ShotTypeInfo(BaseModelMixin): | ||
| 265 | 286 | @property | 
| 266 | 287 | def shots(self): | 
| 267 | 288 | models = ModelInfo.objects.filter(shot_type_id=self.shot_type_id, status=True) | 
| 268 | - return [model.shot_member_data for model in models] | |
| 289 | + return [model.member_shot_data for model in models] | |
| 269 | 290 |  | 
| 270 | 291 | @property | 
| 271 | 292 | def data(self): | 
| @@ -277,6 +298,9 @@ class ShotTypeInfo(BaseModelMixin): | ||
| 277 | 298 |  | 
| 278 | 299 |  | 
| 279 | 300 | class MemberActivityInfo(BaseModelMixin): | 
| 301 | + brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 302 | + brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 303 | + | |
| 280 | 304 | activity_id = ShortUUIDField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True, unique=True) | 
| 281 | 305 |  | 
| 282 | 306 | title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'活动名称') | 
| @@ -371,6 +395,9 @@ class MemberActivityInfo(BaseModelMixin): | ||
| 371 | 395 |  | 
| 372 | 396 |  | 
| 373 | 397 | class MemberActivitySignupInfo(BaseModelMixin): | 
| 398 | + brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 399 | + brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 400 | + | |
| 374 | 401 | signup_id = ShortUUIDField(_(u'signup_id'), max_length=32, blank=True, null=True, help_text=u'活动报名唯一标识', db_index=True, unique=True) | 
| 375 | 402 |  | 
| 376 | 403 | user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) | 
| @@ -395,6 +422,9 @@ class MemberActivitySignupInfo(BaseModelMixin): | ||
| 395 | 422 |  | 
| 396 | 423 |  | 
| 397 | 424 | class MemberActivitySigninInfo(BaseModelMixin): | 
| 425 | + brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 426 | + brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 427 | + | |
| 398 | 428 | signin_id = ShortUUIDField(_(u'signin_id'), max_length=32, blank=True, null=True, help_text=u'活动签到唯一标识', db_index=True, unique=True) | 
| 399 | 429 |  | 
| 400 | 430 | user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) | 
| @@ -430,6 +460,9 @@ class MemberCouponInfo(BaseModelMixin): | ||
| 430 | 460 | (MAINTENANCE_MANPOWER, u'维修人工') | 
| 431 | 461 | ) | 
| 432 | 462 |  | 
| 463 | + brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | |
| 464 | + brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') | |
| 465 | + | |
| 433 | 466 | coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True) | 
| 434 | 467 |  | 
| 435 | 468 | user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) | 
| @@ -74,4 +74,5 @@ SCREEN_ADMIN_LOGIN = 'tamron:screen:admin:login:%s:%s' # brand_id, token | ||
| 74 | 74 |  | 
| 75 | 75 | SUBSCRIBE_USERINFO_LIST = 'subscribe:userinfo:%s' | 
| 76 | 76 |  | 
| 77 | -SHOT_MEMBER_DATA = 'shot:member:data' | |
| 77 | +MEMBER_SHOT_DATA = 'kodo:member:shot:data' | |
| 78 | +MEMBER_SEND_COUPON_LIST = 'kodo:member:send:coupon:list' | 
| @@ -1,16 +1,16 @@ | ||
| 1 | 1 | # -*- coding: utf-8 -*- | 
| 2 | 2 |  | 
| 3 | 3 | from utils.redis.connect import r | 
| 4 | -from utils.redis.rkeys import SHOT_MEMBER_DATA | |
| 4 | +from utils.redis.rkeys import MEMBER_SHOT_DATA | |
| 5 | 5 |  | 
| 6 | 6 |  | 
| 7 | -def update_shot_member_data(): | |
| 7 | +def update_member_shot_data(): | |
| 8 | 8 | from member.models import ShotTypeInfo | 
| 9 | 9 |      shots_types = ShotTypeInfo.objects.filter(status=True).order_by('position') | 
| 10 | 10 | shots_types = [st.data for st in shots_types] | 
| 11 | - r.setjson(SHOT_MEMBER_DATA, shots_types) | |
| 11 | + r.setjson(MEMBER_SHOT_DATA, shots_types) | |
| 12 | 12 | return shots_types | 
| 13 | 13 |  | 
| 14 | 14 |  | 
| 15 | -def get_shot_member_data(): | |
| 16 | - return r.getjson(SHOT_MEMBER_DATA) or update_shot_member_data() | |
| 15 | +def get_member_shot_data(): | |
| 16 | + return r.getjson(MEMBER_SHOT_DATA) or update_member_shot_data() |