@@ -9,7 +9,8 @@ from django_response import response |
||
9 | 9 |
from paginator import pagination |
10 | 10 |
|
11 | 11 |
from account.models import UserInfo |
12 |
-from member.models import (CouponInfo, GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo, |
|
12 |
+from coupon.models import UserCouponInfo |
|
13 |
+from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo, |
|
13 | 14 |
MemberActivitySignupInfo, RightInfo) |
14 | 15 |
from utils.error.errno_utils import (MemberActivityStatusCode, MemberGoodStatusCode, MemberRightStatusCode, |
15 | 16 |
UserStatusCode) |
@@ -215,7 +216,7 @@ def coupons(request): |
||
215 | 216 |
page = request.POST.get('page', 1) |
216 | 217 |
num = request.POST.get('num', 20) |
217 | 218 |
|
218 |
- coupons = CouponInfo.objects.filter(user_id=user_id, status=True).order_by('-pk') |
|
219 |
+ coupons = UserCouponInfo.objects.filter(user_id=user_id, status=True).order_by('-pk') |
|
219 | 220 |
coupons, left = pagination(coupons, page, num) |
220 | 221 |
coupons = [coupon.data for coupon in coupons] |
221 | 222 |
|
@@ -8,7 +8,8 @@ from django_six import CompatibilityBaseCommand, close_old_connections |
||
8 | 8 |
from TimeConvert import TimeConvert as tc |
9 | 9 |
|
10 | 10 |
from account.models import UserInfo |
11 |
-from member.models import CouponInfo, RightInfo |
|
11 |
+from coupon.models import UserCouponInfo |
|
12 |
+from member.models import RightInfo |
|
12 | 13 |
from utils.redis.connect import r |
13 | 14 |
from utils.redis.rkeys import MEMBER_SEND_COUPON_LIST |
14 | 15 |
|
@@ -46,29 +47,35 @@ class Command(CompatibilityBaseCommand): |
||
46 | 47 |
rights = RightInfo.objects.filter(is_send_coupon=True, status=True) |
47 | 48 |
for right in rights: |
48 | 49 |
if user.level == UserInfo.MEMBER_LRC: |
49 |
- coupon_amount = right.coupon_level1_amount |
|
50 |
+ coupon_id = right.coupon_level1_id |
|
50 | 51 |
elif user.level == UserInfo.MEMBER_SILVER: |
51 |
- coupon_amount = right.coupon_level2_amount |
|
52 |
+ coupon_id = right.coupon_level2_id |
|
52 | 53 |
elif user.level == UserInfo.MEMBER_SILVER: |
53 |
- coupon_amount = right.coupon_level3_amount |
|
54 |
+ coupon_id = right.coupon_level3_id |
|
54 | 55 |
elif user.level == UserInfo.MEMBER_SILVER: |
55 |
- coupon_amount = right.coupon_level4_amount |
|
56 |
+ coupon_id = right.coupon_level4_id |
|
56 | 57 |
else: |
57 |
- coupon_amount = right.coupon_level5_amount |
|
58 |
+ coupon_id = right.coupon_level5_id |
|
59 |
+ |
|
60 |
+ try: |
|
61 |
+ coupon = UserCouponInfo.objects.get(coupon_id=coupon_id) |
|
62 |
+ except UserCouponInfo.DoesNotExist: |
|
63 |
+ continue |
|
64 |
+ |
|
58 | 65 |
for _ in xrange(right.coupon_num): |
59 |
- CouponInfo.objects.create( |
|
66 |
+ UserCouponInfo.objects.create( |
|
67 |
+ brand_id=coupon.brand_id, |
|
68 |
+ brand_name=coupon.brand_name, |
|
69 |
+ coupon_id=coupon_id, |
|
60 | 70 |
user_id=user_id, |
61 |
- coupon_valid_period=right.coupon_valid_period, |
|
62 |
- coupon_amount=coupon_amount, |
|
63 |
- coupon_detail=right.coupon_detail, |
|
71 |
+ coupon_title=coupon.coupon_title, |
|
72 |
+ coupon_detail=coupon.coupon_detail, |
|
73 |
+ coupon_value=coupon.coupon_value, |
|
74 |
+ coupon_image=coupon.coupon_image, |
|
64 | 75 |
active_at=tc.utc_datetime(), |
65 | 76 |
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, |
|
77 |
+ coupon_valid_period=coupon.coupon_valid_period, |
|
78 |
+ coupon_limit_brand_ids=coupon.coupon_limit_brand_ids, |
|
72 | 79 |
) |
73 | 80 |
|
74 | 81 |
close_old_connections() |
@@ -2,27 +2,14 @@ |
||
2 | 2 |
|
3 | 3 |
from django.contrib import admin |
4 | 4 |
|
5 |
-from coupon.models import CouponInfo |
|
5 |
+from coupon.models import CouponInfo, UserCouponInfo |
|
6 | 6 |
from mch.models import ActivityInfo |
7 | 7 |
from member.models import RightInfo |
8 | 8 |
|
9 | 9 |
|
10 | 10 |
class CouponInfoAdmin(admin.ModelAdmin): |
11 |
- list_display = ('coupon_id', 'coupon_expire_type', 'coupon_valid_period', 'coupon_expire_at', 'coupon_value', 'coupon_num', 'coupon_level1_amount', 'coupon_level2_amount', 'coupon_level3_amount', 'coupon_level4_amount', 'coupon_level5_amount', 'coupon_detail', 'status', 'created_at', 'updated_at') |
|
11 |
+ list_display = ('brand_id', 'brand_name', 'coupon_id', 'coupon_title', 'coupon_value', 'coupon_expire_type', 'coupon_valid_period', 'coupon_expire_at', 'status', 'created_at', 'updated_at') |
|
12 | 12 |
readonly_fields = ('coupon_id', 'created_at', 'updated_at') |
13 |
- fieldsets = ( |
|
14 |
- (u'', { |
|
15 |
- 'fields': ('coupon_id', 'status', 'created_at', 'updated_at') |
|
16 |
- }), |
|
17 |
- (u'活动券信息', { |
|
18 |
- 'classes': ('collapse', ), |
|
19 |
- 'fields': ('coupon_expire_type', 'coupon_valid_period', 'coupon_expire_at', 'coupon_value') |
|
20 |
- }), |
|
21 |
- (u'会员券信息', { |
|
22 |
- 'classes': ('collapse', ), |
|
23 |
- 'fields': ('coupon_num', 'coupon_level1_amount', 'coupon_level2_amount', 'coupon_level3_amount', 'coupon_level4_amount', 'coupon_level5_amount', 'coupon_detail') |
|
24 |
- }), |
|
25 |
- ) |
|
26 | 13 |
|
27 | 14 |
def save_model(self, request, obj, form, change): |
28 | 15 |
obj.save() |
@@ -30,4 +17,10 @@ class CouponInfoAdmin(admin.ModelAdmin): |
||
30 | 17 |
# TODO: Update ActivityInfo/RightInfo |
31 | 18 |
|
32 | 19 |
|
20 |
+class UserCouponInfoAdmin(admin.ModelAdmin): |
|
21 |
+ list_display = ('brand_id', 'brand_name', 'coupon_id', 'user_id', 'coupon_title', 'coupon_value', 'active_at', 'expire_at', 'coupon_valid_period', 'coupon_limit_brand_ids', 'has_used', 'admin_id', 'used_at', 'status', 'created_at', 'updated_at') |
|
22 |
+ list_filter = ('has_used', 'status') |
|
23 |
+ |
|
24 |
+ |
|
33 | 25 |
admin.site.register(CouponInfo, CouponInfoAdmin) |
26 |
+admin.site.register(UserCouponInfo, UserCouponInfoAdmin) |
@@ -0,0 +1,56 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+# Generated by Django 1.11.26 on 2019-12-21 07:34 |
|
3 |
+from __future__ import unicode_literals |
|
4 |
+ |
|
5 |
+from django.db import migrations, models |
|
6 |
+import django_models_ext.fileext |
|
7 |
+import jsonfield.fields |
|
8 |
+ |
|
9 |
+ |
|
10 |
+class Migration(migrations.Migration): |
|
11 |
+ |
|
12 |
+ dependencies = [ |
|
13 |
+ ('coupon', '0001_initial'), |
|
14 |
+ ] |
|
15 |
+ |
|
16 |
+ operations = [ |
|
17 |
+ migrations.RemoveField( |
|
18 |
+ model_name='couponinfo', |
|
19 |
+ name='coupon_level1_amount', |
|
20 |
+ ), |
|
21 |
+ migrations.RemoveField( |
|
22 |
+ model_name='couponinfo', |
|
23 |
+ name='coupon_level2_amount', |
|
24 |
+ ), |
|
25 |
+ migrations.RemoveField( |
|
26 |
+ model_name='couponinfo', |
|
27 |
+ name='coupon_level3_amount', |
|
28 |
+ ), |
|
29 |
+ migrations.RemoveField( |
|
30 |
+ model_name='couponinfo', |
|
31 |
+ name='coupon_level4_amount', |
|
32 |
+ ), |
|
33 |
+ migrations.RemoveField( |
|
34 |
+ model_name='couponinfo', |
|
35 |
+ name='coupon_level5_amount', |
|
36 |
+ ), |
|
37 |
+ migrations.RemoveField( |
|
38 |
+ model_name='couponinfo', |
|
39 |
+ name='coupon_num', |
|
40 |
+ ), |
|
41 |
+ migrations.AddField( |
|
42 |
+ model_name='couponinfo', |
|
43 |
+ name='coupon_image', |
|
44 |
+ field=models.ImageField(blank=True, help_text='\u5238\u56fe\u7247', null=True, upload_to=django_models_ext.fileext.upload_path, verbose_name='coupon_image'), |
|
45 |
+ ), |
|
46 |
+ migrations.AddField( |
|
47 |
+ model_name='couponinfo', |
|
48 |
+ name='coupon_limit_brand_ids', |
|
49 |
+ field=jsonfield.fields.JSONField(blank=True, help_text='\u5238\u9650\u5236\u4f7f\u7528 brand_ids', null=True, verbose_name='coupon_limit_brand_ids'), |
|
50 |
+ ), |
|
51 |
+ migrations.AddField( |
|
52 |
+ model_name='couponinfo', |
|
53 |
+ name='coupon_title', |
|
54 |
+ field=models.CharField(blank=True, help_text='\u5238\u6807\u9898', max_length=255, null=True, verbose_name='coupon_title'), |
|
55 |
+ ), |
|
56 |
+ ] |
@@ -0,0 +1,55 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+# Generated by Django 1.11.26 on 2019-12-21 08:13 |
|
3 |
+from __future__ import unicode_literals |
|
4 |
+ |
|
5 |
+from django.db import migrations, models |
|
6 |
+import jsonfield.fields |
|
7 |
+import shortuuidfield.fields |
|
8 |
+import simditor.fields |
|
9 |
+ |
|
10 |
+ |
|
11 |
+class Migration(migrations.Migration): |
|
12 |
+ |
|
13 |
+ dependencies = [ |
|
14 |
+ ('coupon', '0002_auto_20191221_1534'), |
|
15 |
+ ] |
|
16 |
+ |
|
17 |
+ operations = [ |
|
18 |
+ migrations.CreateModel( |
|
19 |
+ name='UserCouponInfo', |
|
20 |
+ fields=[ |
|
21 |
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), |
|
22 |
+ ('status', models.BooleanField(db_index=True, default=True, help_text='Status', verbose_name='status')), |
|
23 |
+ ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')), |
|
24 |
+ ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')), |
|
25 |
+ ('brand_id', models.CharField(blank=True, db_index=True, help_text='\u54c1\u724c\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='brand_id')), |
|
26 |
+ ('brand_name', models.CharField(blank=True, help_text='\u54c1\u724c\u540d\u79f0', max_length=255, null=True, verbose_name='brand_name')), |
|
27 |
+ ('coupon_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=22, null=True, unique=True)), |
|
28 |
+ ('user_id', models.CharField(blank=True, db_index=True, help_text='\u7528\u6237\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='user_id')), |
|
29 |
+ ('coupon_title', models.CharField(blank=True, help_text='\u5238\u6807\u9898', max_length=255, null=True, verbose_name='coupon_title')), |
|
30 |
+ ('coupon_detail', simditor.fields.RichTextField(blank=True, help_text='\u5238\u8be6\u60c5', null=True, verbose_name='coupon_detail')), |
|
31 |
+ ('coupon_value', models.IntegerField(blank=True, default=0, help_text='\u5238\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_value')), |
|
32 |
+ ('active_at', models.DateTimeField(blank=True, help_text='\u751f\u6548\u65f6\u95f4', null=True, verbose_name='active_at')), |
|
33 |
+ ('expire_at', models.DateTimeField(blank=True, help_text='\u8fc7\u671f\u65f6\u95f4', null=True, verbose_name='expire_at')), |
|
34 |
+ ('coupon_valid_period', models.IntegerField(default=0, help_text='\u5238\u6709\u6548\u65f6\u95f4\uff08\u5355\u4f4d\uff1a\u5929\uff09', verbose_name='coupon_valid_period')), |
|
35 |
+ ('coupon_limit_brand_ids', jsonfield.fields.JSONField(blank=True, help_text='\u5238\u9650\u5236\u4f7f\u7528 brand_ids', null=True, verbose_name='coupon_limit_brand_ids')), |
|
36 |
+ ('has_used', models.BooleanField(db_index=True, default=False, help_text='\u662f\u5426\u5df2\u6838\u9500', verbose_name='has_used')), |
|
37 |
+ ('admin_id', 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')), |
|
38 |
+ ('used_at', models.DateTimeField(blank=True, help_text='\u7ef4\u4fee\u5238\u6838\u9500\u65f6\u95f4', null=True, verbose_name='used_at')), |
|
39 |
+ ], |
|
40 |
+ options={ |
|
41 |
+ 'verbose_name': '\u7528\u6237\u5238\u4fe1\u606f', |
|
42 |
+ 'verbose_name_plural': '\u7528\u6237\u5238\u4fe1\u606f', |
|
43 |
+ }, |
|
44 |
+ ), |
|
45 |
+ migrations.AddField( |
|
46 |
+ model_name='couponinfo', |
|
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='couponinfo', |
|
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 |
+ ] |
@@ -2,8 +2,10 @@ |
||
2 | 2 |
|
3 | 3 |
from django.db import models |
4 | 4 |
from django.utils.translation import ugettext_lazy as _ |
5 |
-from django_models_ext import BaseModelMixin |
|
5 |
+from django_models_ext import BaseModelMixin, upload_file_path, upload_file_url, upload_path |
|
6 |
+from jsonfield import JSONField |
|
6 | 7 |
from shortuuidfield import ShortUUIDField |
8 |
+from TimeConvert import TimeConvert as tc |
|
7 | 9 |
|
8 | 10 |
from simditor.fields import RichTextField |
9 | 11 |
|
@@ -17,22 +19,21 @@ class CouponInfo(BaseModelMixin): |
||
17 | 19 |
(CHANGED_EXPIRED_TIME, u'可变结束时间'), |
18 | 20 |
) |
19 | 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 |
+ |
|
20 | 25 |
coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True) |
21 | 26 |
|
22 |
- # 活动券信息 |
|
27 |
+ coupon_title = models.CharField(_(u'coupon_title'), max_length=255, blank=True, null=True, help_text=u'券标题') |
|
28 |
+ coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') |
|
29 |
+ coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=_(u'维修券金额(单位:分)')) |
|
30 |
+ coupon_image = models.ImageField(_(u'coupon_image'), upload_to=upload_path, blank=True, null=True, help_text=u'券图片') |
|
31 |
+ |
|
23 | 32 |
coupon_expire_type = models.IntegerField(_(u'coupon_expire_type'), choices=COUPON_EXPIRED_TIME_TUPLE, default=FIXED_EXPIRED_TIME, help_text=_(u'维修券类型')) |
24 | 33 |
coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'维修券有效时间(单位:天)')) |
25 | 34 |
coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=_(u'维修券过期时间')) |
26 |
- coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=_(u'维修券金额(单位:分)')) |
|
27 | 35 |
|
28 |
- # 会员券信息 |
|
29 |
- coupon_num = models.IntegerField(_(u'coupon_num'), default=0, help_text=_(u'券每会员级别发放张数')) |
|
30 |
- coupon_level1_amount = models.IntegerField(_(u'coupon_level1_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') |
|
31 |
- coupon_level2_amount = models.IntegerField(_(u'coupon_level2_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') |
|
32 |
- coupon_level3_amount = models.IntegerField(_(u'coupon_level3_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') |
|
33 |
- coupon_level4_amount = models.IntegerField(_(u'coupon_level4_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') |
|
34 |
- coupon_level5_amount = models.IntegerField(_(u'coupon_level5_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') |
|
35 |
- coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') |
|
36 |
+ coupon_limit_brand_ids = JSONField(_(u'coupon_limit_brand_ids'), blank=True, null=True, help_text=u'券限制使用 brand_ids') |
|
36 | 37 |
|
37 | 38 |
class Meta: |
38 | 39 |
verbose_name = _(u'券信息') |
@@ -40,3 +41,59 @@ class CouponInfo(BaseModelMixin): |
||
40 | 41 |
|
41 | 42 |
def __unicode__(self): |
42 | 43 |
return unicode(self.pk) |
44 |
+ |
|
45 |
+ |
|
46 |
+class UserCouponInfo(BaseModelMixin): |
|
47 |
+ brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) |
|
48 |
+ brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') |
|
49 |
+ |
|
50 |
+ coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True) |
|
51 |
+ user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) |
|
52 |
+ |
|
53 |
+ coupon_title = models.CharField(_(u'coupon_title'), max_length=255, blank=True, null=True, help_text=u'券标题') |
|
54 |
+ coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') |
|
55 |
+ coupon_value = models.IntegerField(_(u'coupon_value'), default=0, blank=True, null=True, help_text=u'券金额(单位:分)') |
|
56 |
+ coupon_image = models.ImageField(_(u'coupon_image'), upload_to=upload_path, blank=True, null=True, help_text=u'券图片') |
|
57 |
+ |
|
58 |
+ active_at = models.DateTimeField(_(u'active_at'), blank=True, null=True, help_text=_(u'生效时间')) |
|
59 |
+ expire_at = models.DateTimeField(_(u'expire_at'), blank=True, null=True, help_text=_(u'过期时间')) |
|
60 |
+ coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)')) |
|
61 |
+ |
|
62 |
+ coupon_limit_brand_ids = JSONField(_(u'coupon_limit_brand_ids'), blank=True, null=True, help_text=u'券限制使用 brand_ids') |
|
63 |
+ |
|
64 |
+ has_used = models.BooleanField(_(u'has_used'), default=False, help_text=u'是否已核销', db_index=True) |
|
65 |
+ admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True) |
|
66 |
+ used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=u'维修券核销时间') |
|
67 |
+ |
|
68 |
+ class Meta: |
|
69 |
+ verbose_name = _(u'用户券信息') |
|
70 |
+ verbose_name_plural = _(u'用户券信息') |
|
71 |
+ |
|
72 |
+ def __unicode__(self): |
|
73 |
+ return unicode(self.pk) |
|
74 |
+ |
|
75 |
+ @property |
|
76 |
+ def coupon_image(self): |
|
77 |
+ return upload_file_path(self.coupon_image) |
|
78 |
+ |
|
79 |
+ @property |
|
80 |
+ def coupon_image_url(self): |
|
81 |
+ return upload_file_url(self.coupon_image) |
|
82 |
+ |
|
83 |
+ @property |
|
84 |
+ def data(self): |
|
85 |
+ return { |
|
86 |
+ 'coupon_id': self.coupon_id, |
|
87 |
+ 'coupon_title': self.coupon_title, |
|
88 |
+ 'coupon_detail': self.coupon_detail, |
|
89 |
+ 'coupon_amount': self.coupon_value, |
|
90 |
+ 'coupon_value': self.coupon_value, |
|
91 |
+ 'coupon_image_url': self.coupon_image_url, |
|
92 |
+ 'active_at': tc.local_string(self.active_at, format='%Y%m%d'), |
|
93 |
+ 'expire_at': tc.local_string(self.expire_at, format='%Y%m%d'), |
|
94 |
+ 'coupon_valid_period': self.coupon_valid_period, |
|
95 |
+ 'coupon_limit_brand_ids': self.coupon_limit_brand_ids, |
|
96 |
+ 'has_used': self.has_used, |
|
97 |
+ 'admin_id': self.admin_id, |
|
98 |
+ 'used_at': self.used_at, |
|
99 |
+ } |
@@ -2,13 +2,13 @@ |
||
2 | 2 |
|
3 | 3 |
from django.contrib import admin |
4 | 4 |
|
5 |
-from member.models import (CouponInfo, GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo, |
|
5 |
+from member.models import (GoodsInfo, GoodsOrderInfo, MemberActivityInfo, MemberActivitySigninInfo, |
|
6 | 6 |
MemberActivitySignupInfo, RightInfo, ShotTypeInfo) |
7 | 7 |
from utils.redis.rshot import update_member_shot_data |
8 | 8 |
|
9 | 9 |
|
10 | 10 |
class GoodsInfoAdmin(admin.ModelAdmin): |
11 |
- list_display = ('good_id', 'good_type', 'title', 'desc', 'image', 'is_slider', 'slider_image', 'integral', 'fee', 'minlevel', 'only_for_member', 'position', 'status', 'created_at', 'updated_at') |
|
11 |
+ list_display = ('good_id', 'good_type', 'title', 'value', 'left_num', 'coupon_id', 'image', 'is_slider', 'slider_image', 'integral', 'fee', 'minlevel', 'only_for_member', 'position', 'status', 'created_at', 'updated_at') |
|
12 | 12 |
list_filter = ('good_type', 'is_slider', 'only_for_member', 'status') |
13 | 13 |
|
14 | 14 |
|
@@ -28,7 +28,7 @@ class GoodsOrderInfoAdmin(admin.ModelAdmin): |
||
28 | 28 |
|
29 | 29 |
|
30 | 30 |
class RightInfoAdmin(admin.ModelAdmin): |
31 |
- 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_display = ('right_id', 'right_type', 'icon', 'title', 'subtitle', 'detail', 'level1', 'level2', 'level3', 'level4', 'level5', 'minlevel', 'position', 'is_send_coupon', 'coupon_num', 'coupon_level1_id', 'coupon_level2_id', 'coupon_level3_id', 'status', 'created_at', 'updated_at') |
|
32 | 32 |
list_filter = ('right_type', 'is_send_coupon', 'status') |
33 | 33 |
|
34 | 34 |
def save_model(self, request, obj, form, change): |
@@ -37,11 +37,6 @@ class RightInfoAdmin(admin.ModelAdmin): |
||
37 | 37 |
# TODO: Update coupon relative |
38 | 38 |
|
39 | 39 |
|
40 |
-class CouponInfoAdmin(admin.ModelAdmin): |
|
41 |
- 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') |
|
42 |
- list_filter = ('right_type', 'status') |
|
43 |
- |
|
44 |
- |
|
45 | 40 |
class ShotTypeInfoAdmin(admin.ModelAdmin): |
46 | 41 |
list_display = ('shot_type_id', 'shot_type_name', 'position', 'status', 'created_at', 'updated_at') |
47 | 42 |
|
@@ -74,7 +69,6 @@ class MemberActivitySigninInfoAdmin(admin.ModelAdmin): |
||
74 | 69 |
admin.site.register(GoodsInfo, GoodsInfoAdmin) |
75 | 70 |
admin.site.register(GoodsOrderInfo, GoodsOrderInfoAdmin) |
76 | 71 |
admin.site.register(RightInfo, RightInfoAdmin) |
77 |
-admin.site.register(CouponInfo, CouponInfoAdmin) |
|
78 | 72 |
admin.site.register(ShotTypeInfo, ShotTypeInfoAdmin) |
79 | 73 |
admin.site.register(MemberActivityInfo, MemberActivityInfoAdmin) |
80 | 74 |
admin.site.register(MemberActivitySignupInfo, MemberActivitySignupInfoAdmin) |
@@ -0,0 +1,90 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+# Generated by Django 1.11.26 on 2019-12-21 08:13 |
|
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', '0013_goodsinfo_only_for_member'), |
|
12 |
+ ] |
|
13 |
+ |
|
14 |
+ operations = [ |
|
15 |
+ migrations.DeleteModel( |
|
16 |
+ name='CouponInfo', |
|
17 |
+ ), |
|
18 |
+ migrations.RemoveField( |
|
19 |
+ model_name='rightinfo', |
|
20 |
+ name='coupon_detail', |
|
21 |
+ ), |
|
22 |
+ migrations.RemoveField( |
|
23 |
+ model_name='rightinfo', |
|
24 |
+ name='coupon_id', |
|
25 |
+ ), |
|
26 |
+ migrations.RemoveField( |
|
27 |
+ model_name='rightinfo', |
|
28 |
+ name='coupon_level1_amount', |
|
29 |
+ ), |
|
30 |
+ migrations.RemoveField( |
|
31 |
+ model_name='rightinfo', |
|
32 |
+ name='coupon_level2_amount', |
|
33 |
+ ), |
|
34 |
+ migrations.RemoveField( |
|
35 |
+ model_name='rightinfo', |
|
36 |
+ name='coupon_level3_amount', |
|
37 |
+ ), |
|
38 |
+ migrations.RemoveField( |
|
39 |
+ model_name='rightinfo', |
|
40 |
+ name='coupon_level4_amount', |
|
41 |
+ ), |
|
42 |
+ migrations.RemoveField( |
|
43 |
+ model_name='rightinfo', |
|
44 |
+ name='coupon_level5_amount', |
|
45 |
+ ), |
|
46 |
+ migrations.RemoveField( |
|
47 |
+ model_name='rightinfo', |
|
48 |
+ name='coupon_valid_period', |
|
49 |
+ ), |
|
50 |
+ migrations.AddField( |
|
51 |
+ model_name='goodsinfo', |
|
52 |
+ name='coupon_id', |
|
53 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_id'), |
|
54 |
+ ), |
|
55 |
+ migrations.AddField( |
|
56 |
+ model_name='goodsinfo', |
|
57 |
+ name='left_num', |
|
58 |
+ field=models.IntegerField(default=0, help_text='\u5546\u54c1\u5e93\u5b58', verbose_name='left_num'), |
|
59 |
+ ), |
|
60 |
+ migrations.AddField( |
|
61 |
+ model_name='goodsinfo', |
|
62 |
+ name='value', |
|
63 |
+ field=models.IntegerField(default=99999, help_text='\u5546\u54c1\u4ef7\u503c\uff0c\u5355\u4f4d\u5206', verbose_name='value'), |
|
64 |
+ ), |
|
65 |
+ migrations.AddField( |
|
66 |
+ model_name='rightinfo', |
|
67 |
+ name='coupon_level1_id', |
|
68 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_level1_id'), |
|
69 |
+ ), |
|
70 |
+ migrations.AddField( |
|
71 |
+ model_name='rightinfo', |
|
72 |
+ name='coupon_level2_id', |
|
73 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_level2_id'), |
|
74 |
+ ), |
|
75 |
+ migrations.AddField( |
|
76 |
+ model_name='rightinfo', |
|
77 |
+ name='coupon_level3_id', |
|
78 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_level3_id'), |
|
79 |
+ ), |
|
80 |
+ migrations.AddField( |
|
81 |
+ model_name='rightinfo', |
|
82 |
+ name='coupon_level4_id', |
|
83 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_level4_id'), |
|
84 |
+ ), |
|
85 |
+ migrations.AddField( |
|
86 |
+ model_name='rightinfo', |
|
87 |
+ name='coupon_level5_id', |
|
88 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_level5_id'), |
|
89 |
+ ), |
|
90 |
+ ] |
@@ -27,9 +27,13 @@ class GoodsInfo(BaseModelMixin): |
||
27 | 27 |
|
28 | 28 |
title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'商品名称') |
29 | 29 |
desc = RichTextField(_(u'desc'), blank=True, null=True, help_text=u'商品描述') |
30 |
+ value = models.IntegerField(_(u'value'), default=99999, help_text=u'商品价值,单位分') |
|
31 |
+ left_num = models.IntegerField(_(u'left_num'), default=0, help_text=u'商品库存') |
|
30 | 32 |
|
31 | 33 |
image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'商品图片') |
32 | 34 |
|
35 |
+ coupon_id = models.CharField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) |
|
36 |
+ |
|
33 | 37 |
is_slider = models.BooleanField(_(u'is_slider'), default=True, help_text=u'是否为轮播商品', db_index=True) |
34 | 38 |
slider_image = models.ImageField(_(u'slider_image'), upload_to=upload_path, blank=True, null=True, help_text=u'商品轮播图片') |
35 | 39 |
|
@@ -164,17 +168,12 @@ class RightInfo(BaseModelMixin): |
||
164 | 168 |
|
165 | 169 |
# 券相关 |
166 | 170 |
is_send_coupon = models.BooleanField(_(u'is_send_coupon'), default=False, help_text=_(u'是否发券'), db_index=True) |
167 |
- |
|
168 |
- coupon_id = models.CharField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) |
|
169 |
- |
|
170 |
- coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)')) |
|
171 | 171 |
coupon_num = models.IntegerField(_(u'coupon_num'), default=0, help_text=_(u'券每会员级别发放张数')) |
172 |
- coupon_level1_amount = models.IntegerField(_(u'coupon_level1_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') |
|
173 |
- coupon_level2_amount = models.IntegerField(_(u'coupon_level2_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') |
|
174 |
- coupon_level3_amount = models.IntegerField(_(u'coupon_level3_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') |
|
175 |
- coupon_level4_amount = models.IntegerField(_(u'coupon_level4_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') |
|
176 |
- coupon_level5_amount = models.IntegerField(_(u'coupon_level5_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') |
|
177 |
- coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') |
|
172 |
+ coupon_level1_id = models.CharField(_(u'coupon_level1_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) |
|
173 |
+ coupon_level2_id = models.CharField(_(u'coupon_level2_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) |
|
174 |
+ coupon_level3_id = models.CharField(_(u'coupon_level3_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) |
|
175 |
+ coupon_level4_id = models.CharField(_(u'coupon_level4_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) |
|
176 |
+ coupon_level5_id = models.CharField(_(u'coupon_level5_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) |
|
178 | 177 |
|
179 | 178 |
class Meta: |
180 | 179 |
verbose_name = _(u'会员权益信息') |
@@ -212,78 +211,6 @@ class RightInfo(BaseModelMixin): |
||
212 | 211 |
} |
213 | 212 |
|
214 | 213 |
|
215 |
-class CouponInfo(BaseModelMixin): |
|
216 |
- PHYSICAL = 0 |
|
217 |
- VIRTUAL = 1 |
|
218 |
- COUPON = 2 |
|
219 |
- |
|
220 |
- RIGHT_TYPE_TUPLE = ( |
|
221 |
- (PHYSICAL, u'实物'), |
|
222 |
- (VIRTUAL, u'虚拟'), |
|
223 |
- (COUPON, u'优惠券'), |
|
224 |
- ) |
|
225 |
- |
|
226 |
- brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) |
|
227 |
- brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') |
|
228 |
- |
|
229 |
- coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True) |
|
230 |
- user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) |
|
231 |
- |
|
232 |
- coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)')) |
|
233 |
- coupon_amount = models.IntegerField(_(u'coupon_amount'), default=0, blank=True, null=True, help_text=u'券金额(单位:分)') |
|
234 |
- coupon_detail = RichTextField(_(u'coupon_detail'), blank=True, null=True, help_text=u'券详情') |
|
235 |
- |
|
236 |
- active_at = models.DateTimeField(_(u'active_at'), blank=True, null=True, help_text=_(u'生效时间')) |
|
237 |
- expire_at = models.DateTimeField(_(u'expire_at'), blank=True, null=True, help_text=_(u'过期时间')) |
|
238 |
- |
|
239 |
- right_id = models.CharField(_(u'right_id'), max_length=32, blank=True, null=True, help_text=u'权益唯一标识', db_index=True) |
|
240 |
- right_type = models.IntegerField(_(u'right_type'), choices=RIGHT_TYPE_TUPLE, default=VIRTUAL, help_text=u'权益类型', db_index=True) |
|
241 |
- |
|
242 |
- icon = models.ImageField(_(u'icon'), upload_to=upload_path, blank=True, null=True, help_text=u'权益图标') |
|
243 |
- title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'权益名称') |
|
244 |
- subtitle = models.CharField(_(u'subtitle'), max_length=255, blank=True, null=True, help_text=u'权益二级名称') |
|
245 |
- detail = RichTextField(_(u'detail'), blank=True, null=True, help_text=u'权益详情') |
|
246 |
- |
|
247 |
- has_used = models.BooleanField(_(u'has_used'), default=False, help_text=u'是否已核销', db_index=True) |
|
248 |
- admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True) |
|
249 |
- used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=u'维修券核销时间') |
|
250 |
- |
|
251 |
- class Meta: |
|
252 |
- verbose_name = _(u'会员券信息') |
|
253 |
- verbose_name_plural = _(u'会员券信息') |
|
254 |
- |
|
255 |
- def __unicode__(self): |
|
256 |
- return unicode(self.pk) |
|
257 |
- |
|
258 |
- @property |
|
259 |
- def icon_path(self): |
|
260 |
- return upload_file_path(self.icon) |
|
261 |
- |
|
262 |
- @property |
|
263 |
- def icon_url(self): |
|
264 |
- return upload_file_url(self.icon) |
|
265 |
- |
|
266 |
- @property |
|
267 |
- def data(self): |
|
268 |
- return { |
|
269 |
- 'coupon_id': self.coupon_id, |
|
270 |
- 'coupon_valid_period': self.coupon_valid_period, |
|
271 |
- 'coupon_amount': self.coupon_amount, |
|
272 |
- 'coupon_detail': self.coupon_detail, |
|
273 |
- 'active_at': tc.local_string(self.active_at, format='%Y%m%d'), |
|
274 |
- 'expire_at': tc.local_string(self.expire_at, format='%Y%m%d'), |
|
275 |
- 'right_id': self.right_id, |
|
276 |
- 'right_type': self.right_type, |
|
277 |
- 'icon': self.icon_url, |
|
278 |
- 'title': self.title, |
|
279 |
- 'subtitle': self.subtitle, |
|
280 |
- 'detail': self.detail, |
|
281 |
- 'has_used': self.has_used, |
|
282 |
- 'admin_id': self.admin_id, |
|
283 |
- 'used_at': self.used_at, |
|
284 |
- } |
|
285 |
- |
|
286 |
- |
|
287 | 214 |
class ShotTypeInfo(BaseModelMixin): |
288 | 215 |
brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) |
289 | 216 |
brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') |