@@ -0,0 +1,33 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+from django.contrib import admin |
|
4 |
+ |
|
5 |
+from coupon.models import CouponInfo |
|
6 |
+from mch.models import ActivityInfo |
|
7 |
+from member.models import RightInfo |
|
8 |
+ |
|
9 |
+ |
|
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') |
|
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 |
+ |
|
27 |
+ def save_model(self, request, obj, form, change): |
|
28 |
+ obj.save() |
|
29 |
+ |
|
30 |
+ # TODO: Update ActivityInfo/RightInfo |
|
31 |
+ |
|
32 |
+ |
|
33 |
+admin.site.register(CouponInfo, CouponInfoAdmin) |
@@ -0,0 +1,8 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+from __future__ import unicode_literals |
|
3 |
+ |
|
4 |
+from django.apps import AppConfig |
|
5 |
+ |
|
6 |
+ |
|
7 |
+class CouponConfig(AppConfig): |
|
8 |
+ name = 'coupon' |
@@ -0,0 +1,43 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+# Generated by Django 1.11.26 on 2019-12-21 06:19 |
|
3 |
+from __future__ import unicode_literals |
|
4 |
+ |
|
5 |
+from django.db import migrations, models |
|
6 |
+import shortuuidfield.fields |
|
7 |
+import simditor.fields |
|
8 |
+ |
|
9 |
+ |
|
10 |
+class Migration(migrations.Migration): |
|
11 |
+ |
|
12 |
+ initial = True |
|
13 |
+ |
|
14 |
+ dependencies = [ |
|
15 |
+ ] |
|
16 |
+ |
|
17 |
+ operations = [ |
|
18 |
+ migrations.CreateModel( |
|
19 |
+ name='CouponInfo', |
|
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 |
+ ('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)), |
|
26 |
+ ('coupon_expire_type', models.IntegerField(choices=[(0, '\u56fa\u5b9a\u7ed3\u675f\u65f6\u95f4'), (1, '\u53ef\u53d8\u7ed3\u675f\u65f6\u95f4')], default=0, help_text='\u7ef4\u4fee\u5238\u7c7b\u578b', verbose_name='coupon_expire_type')), |
|
27 |
+ ('coupon_valid_period', models.IntegerField(default=0, help_text='\u7ef4\u4fee\u5238\u6709\u6548\u65f6\u95f4\uff08\u5355\u4f4d\uff1a\u5929\uff09', verbose_name='coupon_valid_period')), |
|
28 |
+ ('coupon_expire_at', models.DateTimeField(blank=True, help_text='\u7ef4\u4fee\u5238\u8fc7\u671f\u65f6\u95f4', null=True, verbose_name='coupon_expire_at')), |
|
29 |
+ ('coupon_value', models.IntegerField(default=0, help_text='\u7ef4\u4fee\u5238\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', verbose_name='coupon_value')), |
|
30 |
+ ('coupon_num', models.IntegerField(default=0, help_text='\u5238\u6bcf\u4f1a\u5458\u7ea7\u522b\u53d1\u653e\u5f20\u6570', verbose_name='coupon_num')), |
|
31 |
+ ('coupon_level1_amount', models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level1_amount')), |
|
32 |
+ ('coupon_level2_amount', models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level2_amount')), |
|
33 |
+ ('coupon_level3_amount', models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level3_amount')), |
|
34 |
+ ('coupon_level4_amount', models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level4_amount')), |
|
35 |
+ ('coupon_level5_amount', models.IntegerField(blank=True, default=0, help_text='\u91d1\u989d\uff08\u5355\u4f4d\uff1a\u5206\uff09', null=True, verbose_name='coupon_level5_amount')), |
|
36 |
+ ('coupon_detail', simditor.fields.RichTextField(blank=True, help_text='\u5238\u8be6\u60c5', null=True, verbose_name='coupon_detail')), |
|
37 |
+ ], |
|
38 |
+ options={ |
|
39 |
+ 'verbose_name': '\u5238\u4fe1\u606f', |
|
40 |
+ 'verbose_name_plural': '\u5238\u4fe1\u606f', |
|
41 |
+ }, |
|
42 |
+ ), |
|
43 |
+ ] |
@@ -0,0 +1,42 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+from django.db import models |
|
4 |
+from django.utils.translation import ugettext_lazy as _ |
|
5 |
+from django_models_ext import BaseModelMixin |
|
6 |
+from shortuuidfield import ShortUUIDField |
|
7 |
+ |
|
8 |
+from simditor.fields import RichTextField |
|
9 |
+ |
|
10 |
+ |
|
11 |
+class CouponInfo(BaseModelMixin): |
|
12 |
+ FIXED_EXPIRED_TIME = 0 |
|
13 |
+ CHANGED_EXPIRED_TIME = 1 |
|
14 |
+ |
|
15 |
+ COUPON_EXPIRED_TIME_TUPLE = ( |
|
16 |
+ (FIXED_EXPIRED_TIME, u'固定结束时间'), |
|
17 |
+ (CHANGED_EXPIRED_TIME, u'可变结束时间'), |
|
18 |
+ ) |
|
19 |
+ |
|
20 |
+ coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True) |
|
21 |
+ |
|
22 |
+ # 活动券信息 |
|
23 |
+ coupon_expire_type = models.IntegerField(_(u'coupon_expire_type'), choices=COUPON_EXPIRED_TIME_TUPLE, default=FIXED_EXPIRED_TIME, help_text=_(u'维修券类型')) |
|
24 |
+ coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'维修券有效时间(单位:天)')) |
|
25 |
+ 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 |
+ |
|
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 |
+ |
|
37 |
+ class Meta: |
|
38 |
+ verbose_name = _(u'券信息') |
|
39 |
+ verbose_name_plural = _(u'券信息') |
|
40 |
+ |
|
41 |
+ def __unicode__(self): |
|
42 |
+ return unicode(self.pk) |
@@ -0,0 +1,6 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+from __future__ import unicode_literals |
|
3 |
+ |
|
4 |
+from django.test import TestCase |
|
5 |
+ |
|
6 |
+# Create your tests here. |
@@ -0,0 +1,6 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+from __future__ import unicode_literals |
|
3 |
+ |
|
4 |
+from django.shortcuts import render |
|
5 |
+ |
|
6 |
+# Create your views here. |
@@ -54,6 +54,7 @@ INSTALLED_APPS = ( |
||
54 | 54 |
'account', |
55 | 55 |
'box', |
56 | 56 |
'commands', |
57 |
+ 'coupon', |
|
57 | 58 |
'group', |
58 | 59 |
'guideline', |
59 | 60 |
'integral', |
@@ -196,6 +196,11 @@ class ActivityInfoAdmin(admin.ModelAdmin): |
||
196 | 196 |
list_display = ('activity_name', 'model_uni_names', 'start_at', 'end_at', 'coupon_expire_type', 'coupon_valid_period', 'coupon_expire_at', 'coupon_value', 'status', 'created_at', 'updated_at') |
197 | 197 |
list_filter = ('coupon_expire_type', 'status') |
198 | 198 |
|
199 |
+ def save_model(self, request, obj, form, change): |
|
200 |
+ obj.save() |
|
201 |
+ |
|
202 |
+ # TODO: Update coupon relative |
|
203 |
+ |
|
199 | 204 |
|
200 | 205 |
admin.site.register(AdministratorInfo, AdministratorInfoAdmin) |
201 | 206 |
admin.site.register(OperatorInfo, OperatorInfoAdmin) |
@@ -0,0 +1,20 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+# Generated by Django 1.11.26 on 2019-12-21 06:19 |
|
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 |
+ ('mch', '0040_modelinfo_shot_member_name'), |
|
12 |
+ ] |
|
13 |
+ |
|
14 |
+ operations = [ |
|
15 |
+ migrations.AddField( |
|
16 |
+ model_name='activityinfo', |
|
17 |
+ name='coupon_id', |
|
18 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_id'), |
|
19 |
+ ), |
|
20 |
+ ] |
@@ -615,6 +615,8 @@ class ActivityInfo(BaseModelMixin): |
||
615 | 615 |
start_at = models.DateTimeField(_(u'start_at'), help_text=_(u'start_at')) |
616 | 616 |
end_at = models.DateTimeField(_(u'end_at'), help_text=_(u'end_at')) |
617 | 617 |
|
618 |
+ coupon_id = models.CharField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True) |
|
619 |
+ |
|
618 | 620 |
coupon_expire_type = models.IntegerField(_(u'coupon_expire_type'), choices=COUPON_EXPIRED_TIME_TUPLE, default=FIXED_EXPIRED_TIME, help_text=_(u'维修券类型')) |
619 | 621 |
coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'维修券有效时间(单位:天)')) |
620 | 622 |
coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=_(u'维修券过期时间')) |
@@ -30,6 +30,11 @@ class RightInfoAdmin(admin.ModelAdmin): |
||
30 | 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 | 31 |
list_filter = ('right_type', 'is_send_coupon', 'status') |
32 | 32 |
|
33 |
+ def save_model(self, request, obj, form, change): |
|
34 |
+ obj.save() |
|
35 |
+ |
|
36 |
+ # TODO: Update coupon relative |
|
37 |
+ |
|
33 | 38 |
|
34 | 39 |
class CouponInfoAdmin(admin.ModelAdmin): |
35 | 40 |
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') |
@@ -0,0 +1,23 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+# Generated by Django 1.11.26 on 2019-12-21 06:19 |
|
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', '0011_auto_20191212_1827'), |
|
12 |
+ ] |
|
13 |
+ |
|
14 |
+ operations = [ |
|
15 |
+ migrations.DeleteModel( |
|
16 |
+ name='MemberCouponInfo', |
|
17 |
+ ), |
|
18 |
+ migrations.AddField( |
|
19 |
+ model_name='rightinfo', |
|
20 |
+ name='coupon_id', |
|
21 |
+ field=models.CharField(blank=True, db_index=True, help_text='\u5238\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='coupon_id'), |
|
22 |
+ ), |
|
23 |
+ ] |
@@ -92,6 +92,7 @@ class GoodsInfo(BaseModelMixin): |
||
92 | 92 |
'desc': self.desc, |
93 | 93 |
} |
94 | 94 |
|
95 |
+ |
|
95 | 96 |
class GoodsOrderInfo(BaseModelMixin): |
96 | 97 |
PHYSICAL = 0 |
97 | 98 |
VIRTUAL = 1 |
@@ -163,6 +164,9 @@ class RightInfo(BaseModelMixin): |
||
163 | 164 |
|
164 | 165 |
# 券相关 |
165 | 166 |
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 |
+ |
|
166 | 170 |
coupon_valid_period = models.IntegerField(_(u'coupon_valid_period'), default=0, help_text=_(u'券有效时间(单位:天)')) |
167 | 171 |
coupon_num = models.IntegerField(_(u'coupon_num'), default=0, help_text=_(u'券每会员级别发放张数')) |
168 | 172 |
coupon_level1_amount = models.IntegerField(_(u'coupon_level1_amount'), default=0, blank=True, null=True, help_text=u'金额(单位:分)') |
@@ -476,55 +480,3 @@ class MemberActivitySigninInfo(BaseModelMixin): |
||
476 | 480 |
|
477 | 481 |
def __unicode__(self): |
478 | 482 |
return unicode(self.pk) |
479 |
- |
|
480 |
- |
|
481 |
-class MemberCouponInfo(BaseModelMixin): |
|
482 |
- DEEP_CLEANING = 0 |
|
483 |
- FREE_FOCUS = 1 |
|
484 |
- CLEAN_APPEARANCE = 2 |
|
485 |
- ACCIDENTAL_MAINTENANCE = 3 |
|
486 |
- MAINTENANCE_MANPOWER = 4 |
|
487 |
- |
|
488 |
- COUPON_TYPE_TUPLE = ( |
|
489 |
- (DEEP_CLEANING, u'深度清洁'), |
|
490 |
- (FREE_FOCUS, u'免费调焦'), |
|
491 |
- (CLEAN_APPEARANCE, u'外观清洁'), |
|
492 |
- (ACCIDENTAL_MAINTENANCE, u'意外维修'), |
|
493 |
- (MAINTENANCE_MANPOWER, u'维修人工') |
|
494 |
- ) |
|
495 |
- |
|
496 |
- brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) |
|
497 |
- brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') |
|
498 |
- |
|
499 |
- coupon_id = ShortUUIDField(_(u'coupon_id'), max_length=32, blank=True, null=True, help_text=u'券唯一标识', db_index=True, unique=True) |
|
500 |
- |
|
501 |
- user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) |
|
502 |
- |
|
503 |
- coupon_type = models.IntegerField(_(u'coupon_type'), choices=COUPON_TYPE_TUPLE, default=DEEP_CLEANING, help_text=u'券类型', db_index=True) |
|
504 |
- coupon_start_at = models.DateTimeField(_(u'coupon_start_at'), blank=True, null=True, help_text=u'券生效时间') |
|
505 |
- coupon_expire_at = models.DateTimeField(_(u'coupon_expire_at'), blank=True, null=True, help_text=u'券过期时间') |
|
506 |
- coupon_value = models.IntegerField(_(u'coupon_value'), default=0, help_text=u'券金额(单位:分)') |
|
507 |
- |
|
508 |
- has_used = models.BooleanField(_(u'has_used'), default=False, help_text=u'是否已核销', db_index=True) |
|
509 |
- admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True) |
|
510 |
- used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=u'维修券核销时间') |
|
511 |
- |
|
512 |
- class Meta: |
|
513 |
- verbose_name = _(u'会员券信息') |
|
514 |
- verbose_name_plural = _(u'会员券信息') |
|
515 |
- |
|
516 |
- def __unicode__(self): |
|
517 |
- return unicode(self.pk) |
|
518 |
- |
|
519 |
- @property |
|
520 |
- def data(self): |
|
521 |
- return { |
|
522 |
- 'coupon_id': self.coupon_id, |
|
523 |
- 'coupon_type': self.coupon_type, |
|
524 |
- 'coupon_start_at': tc.local_string(self.coupon_start_at, format='%Y%m%d'), |
|
525 |
- 'coupon_expire_at': tc.local_string(self.coupon_expire_at, format='%Y%m%d'), |
|
526 |
- 'coupon_value': self.coupon_value, |
|
527 |
- 'has_used': self.has_used, |
|
528 |
- 'admin_id': self.admin_id, |
|
529 |
- 'used_at': tc.local_string(self.used_at, format='%Y%m%d'), |
|
530 |
- } |