| @@ -145,27 +145,14 @@ def decrypt(request, v='v2'): | ||
| 145 | 145 | mdli.decrypt_count += 1 | 
| 146 | 146 | mdli.save() | 
| 147 | 147 |  | 
| 148 | + #弃用老版本的劵形式,和会员系统统一 | |
| 148 | 149 | if v == 'v1': | 
| 149 | -        act = ActivityInfo.objects.filter(status=True).order_by('-pk').first() | |
| 150 | - has_unexpired_activity = True if act and act.has_unexpired_activity(model.model_uni_name) else False | |
| 151 | - | |
| 152 | -        coupon_info = { | |
| 153 | - 'coupon_expire_at': act.final_coupon_expire_at(created_at=None), | |
| 154 | - 'coupon_value': act.coupon_value, | |
| 155 | -        } if has_unexpired_activity else { | |
| 156 | - 'coupon_expire_at': '', | |
| 157 | - 'coupon_value': 0, | |
| 158 | - } | |
| 150 | + has_unexpired_activity = False | |
| 151 | +        coupon_infos = {} | |
| 159 | 152 |  | 
| 160 | 153 | else: | 
| 161 | 154 |          activities = ActivityInfo.objects.filter(status=True).order_by('-pk') | 
| 162 | - unexpired_activities = [True if act and act.has_unexpired_activity(model.model_uni_name) else False for act in activities] | |
| 163 | - has_unexpired_activity = any(unexpired_activities) | |
| 164 | - | |
| 165 | -        coupon_info = [{ | |
| 166 | - 'coupon_expire_at': act.final_coupon_expire_at(created_at=None), | |
| 167 | - 'coupon_value': act.coupon_value, | |
| 168 | - } for act in unexpired_activities] | |
| 155 | + coupon_infos = [act.coupon_info3 for act in activities if act and act.has_unexpired_activity(model.model_uni_name)] | |
| 169 | 156 |  | 
| 170 | 157 |      return response(200, data={ | 
| 171 | 158 | 'plaintext': plaintext, | 
| @@ -182,8 +169,8 @@ def decrypt(request, v='v2'): | ||
| 182 | 169 | 'img': model.imgdata1 if model else '', | 
| 183 | 170 |              'img2': model.imgdata if model else {}, | 
| 184 | 171 | }, | 
| 185 | - 'has_unexpired_activity': has_unexpired_activity, | |
| 186 | - 'coupon_info': coupon_info, | |
| 172 | + 'has_unexpired_activity': False, | |
| 173 | + 'coupon_infos': coupon_infos, | |
| 187 | 174 | }) | 
| 188 | 175 |  | 
| 189 | 176 |  | 
| @@ -253,26 +240,12 @@ def decrypt2(request, v='v2'): | ||
| 253 | 240 | mdli.save() | 
| 254 | 241 |  | 
| 255 | 242 | if v == 'v1': | 
| 256 | -        act = ActivityInfo.objects.filter(status=True).order_by('-pk').first() | |
| 257 | - has_unexpired_activity = True if act and act.has_unexpired_activity(model.model_uni_name) else False | |
| 258 | - | |
| 259 | -        coupon_info = { | |
| 260 | - 'coupon_expire_at': act.final_coupon_expire_at(created_at=None), | |
| 261 | - 'coupon_value': act.coupon_value, | |
| 262 | -        } if has_unexpired_activity else { | |
| 263 | - 'coupon_expire_at': '', | |
| 264 | - 'coupon_value': 0, | |
| 265 | - } | |
| 243 | + has_unexpired_activity = False | |
| 244 | +        coupon_infos = {} | |
| 266 | 245 |  | 
| 267 | 246 | else: | 
| 268 | 247 |          activities = ActivityInfo.objects.filter(status=True).order_by('-pk') | 
| 269 | - unexpired_activities = [True if act and act.has_unexpired_activity(model.model_uni_name) else False for act in activities] | |
| 270 | - has_unexpired_activity = any(unexpired_activities) | |
| 271 | - | |
| 272 | -        coupon_info = [{ | |
| 273 | - 'coupon_expire_at': act.final_coupon_expire_at(created_at=None), | |
| 274 | - 'coupon_value': act.coupon_value, | |
| 275 | - } for act in unexpired_activities] | |
| 248 | + coupon_infos = [act.coupon_info3 for act in activities if act.has_unexpired_activity(model.model_uni_name)] | |
| 276 | 249 |  | 
| 277 | 250 |      return response(200, data={ | 
| 278 | 251 | 'plaintext': plaintext, | 
| @@ -289,6 +262,6 @@ def decrypt2(request, v='v2'): | ||
| 289 | 262 | 'img': model.imgdata1 if model else '', | 
| 290 | 263 |              'img2': model.imgdata if model else {}, | 
| 291 | 264 | }, | 
| 292 | - 'has_unexpired_activity': has_unexpired_activity, | |
| 293 | - 'coupon_info': coupon_info, | |
| 265 | + 'has_unexpired_activity': False, | |
| 266 | + 'coupon_infos': coupon_infos, | |
| 294 | 267 | }) | 
| @@ -10,12 +10,14 @@ from django_response import response | ||
| 10 | 10 | from pywe_miniapp import get_phone_number | 
| 11 | 11 | from pywe_storage import RedisStorage | 
| 12 | 12 | from TimeConvert import TimeConvert as tc | 
| 13 | +import json | |
| 13 | 14 |  | 
| 14 | 15 | from logs.models import MchInfoEncryptLogInfo | 
| 15 | 16 | from account.models import UserInfo | 
| 16 | 17 | from integral.models import SaleclerkSubmitLogInfo | 
| 17 | 18 | from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, | 
| 18 | 19 | LatestAppInfo, LatestAppScreenInfo, ModelInfo, OperatorInfo) | 
| 20 | +from coupon.models import CouponInfo, UserCouponInfo | |
| 19 | 21 | from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo | 
| 20 | 22 | from utils.error.errno_utils import (AdministratorStatusCode, OperatorStatusCode, ProductBrandStatusCode, | 
| 21 | 23 | ProductModelStatusCode, UserStatusCode) | 
| @@ -213,8 +215,6 @@ def consumer_phone_api(request): | ||
| 213 | 215 | @transaction.atomic | 
| 214 | 216 | def consumer_info_api(request): | 
| 215 | 217 |      user_id = request.POST.get('user_id', '') | 
| 216 | -    iv = request.POST.get('iv', '') | |
| 217 | -    encryptedData = request.POST.get('encryptedData', '') | |
| 218 | 218 |      lat = request.POST.get('lat', .0) | 
| 219 | 219 |      lon = request.POST.get('lon', .0) | 
| 220 | 220 |      brandID = request.POST.get('brand_id', '') or request.POST.get('BrandID', '') | 
| @@ -222,26 +222,20 @@ def consumer_info_api(request): | ||
| 222 | 222 |      distributorID = request.POST.get('DistributorID', '') | 
| 223 | 223 |      serialNo = request.POST.get('SerialNo', '') | 
| 224 | 224 |      verifyResult = request.POST.get('verifyResult', 0) | 
| 225 | -    purePhoneNumber = request.POST.get('purePhoneNumber', '') | |
| 226 | 225 |      code_version = request.POST.get('code_version', '') | 
| 226 | +    activities = json.loads(request.POST.get('activities', '[]')) | |
| 227 | 227 |  | 
| 228 | 228 | if lat == 'undefined': | 
| 229 | 229 | lat = .0 | 
| 230 | 230 | if lon == 'undefined': | 
| 231 | 231 | lon = .0 | 
| 232 | 232 |  | 
| 233 | - purePhoneNumber = purePhoneNumber or getPhoneNumber(request) | |
| 234 | - | |
| 235 | 233 | # 校验用户是否存在 | 
| 236 | 234 | try: | 
| 237 | 235 | user = UserInfo.objects.get(user_id=user_id) | 
| 238 | 236 | except UserInfo.DoesNotExist: | 
| 239 | 237 | return response(UserStatusCode.USER_NOT_FOUND) | 
| 240 | 238 |  | 
| 241 | - # 更新用户手机号 | |
| 242 | - user.phone = purePhoneNumber | |
| 243 | - user.save() | |
| 244 | - | |
| 245 | 239 | try: | 
| 246 | 240 | brand = BrandInfo.objects.get(brand_id=brandID) | 
| 247 | 241 | except BrandInfo.DoesNotExist: | 
| @@ -295,17 +289,41 @@ def consumer_info_api(request): | ||
| 295 | 289 | act = None | 
| 296 | 290 | during_activity = False | 
| 297 | 291 | else: | 
| 298 | -        act = ActivityInfo.objects.filter(status=True).order_by('-pk').first() | |
| 299 | - during_activity = True if act and act.has_unexpired_activity(model.model_uni_name) else False | |
| 292 | + for act in activities: | |
| 293 | + try: | |
| 294 | + coupon = CouponInfo.objects.get(coupon_id=act['coupon_id']) | |
| 295 | + activity = ActivityInfo.objects.get(activity_id=act['activity_id']) | |
| 296 | + UserCouponInfo.objects.create( | |
| 297 | + brand_id=coupon.brand_id, | |
| 298 | + brand_name=coupon.brand_name, | |
| 299 | + coupon_id=coupon.coupon_id, | |
| 300 | + user_id=user_id, | |
| 301 | + coupon_title=coupon.coupon_title, | |
| 302 | + coupon_detail=coupon.coupon_detail, | |
| 303 | + coupon_value=coupon.coupon_value, | |
| 304 | + coupon_image=coupon.coupon_image, | |
| 305 | + active_at=tc.utc_datetime(), | |
| 306 | + expire_at=coupon.final_expire_at, | |
| 307 | + coupon_valid_period=coupon.coupon_valid_period, | |
| 308 | + coupon_limit_model_ids=coupon.coupon_limit_model_ids, | |
| 309 | + coupon_from='PROMOTION', | |
| 310 | + activity_id=activity.activity_id, | |
| 311 | + activity_name=activity.activity_name, | |
| 312 | + ) | |
| 313 | + except: | |
| 314 | + continue | |
| 315 | + | |
| 316 | + # 更新销售员提交的表 | |
| 317 | + logs = SaleclerkSubmitLogInfo.objects.filter(code=serialNo, model_pk=model.pk) | |
| 318 | + for log in logs: | |
| 319 | + log.has_scan = True | |
| 320 | + log.save() | |
| 300 | 321 |  | 
| 301 | 322 | ymd = tc.local_string(format='%Y%m%d') | 
| 302 | 323 |  | 
| 303 | 324 | # 记录用户信息提交记录 | 
| 304 | 325 | log = ConsumeInfoSubmitLogInfo.objects.create( | 
| 305 | 326 | user_id=user_id, | 
| 306 | - phone=purePhoneNumber, | |
| 307 | - iv=iv, | |
| 308 | - encryptedData=encryptedData, | |
| 309 | 327 | lat=lat, | 
| 310 | 328 | lon=lon, | 
| 311 | 329 | brand_id=brand.brand_id, | 
| @@ -320,10 +338,6 @@ def consumer_info_api(request): | ||
| 320 | 338 | serialNo=serialNo, | 
| 321 | 339 | verifyResult=verifyResult, | 
| 322 | 340 | dupload=dupload, | 
| 323 | - submit_during_activity=during_activity, | |
| 324 | - activity_id=act.pk if during_activity else 0, | |
| 325 | - coupon_expire_at=act.coupon_expire_at if during_activity else None, | |
| 326 | - coupon_value=act.coupon_value if during_activity else 0, | |
| 327 | 341 | test_user=user.test_user, | 
| 328 | 342 | code_version=code_version, | 
| 329 | 343 | ym=ymd[:6], | 
| @@ -417,12 +431,6 @@ def consumer_info_api(request): | ||
| 417 | 431 | 'model_id': model.model_id, | 
| 418 | 432 | }) | 
| 419 | 433 |  | 
| 420 | - # 更新销售员提交的表 | |
| 421 | - logs = SaleclerkSubmitLogInfo.objects.filter(code=serialNo, model_pk=model.pk) | |
| 422 | - for log in logs: | |
| 423 | - log.has_scan = True | |
| 424 | - log.save() | |
| 425 | - | |
| 426 | 434 | if not dupload: | 
| 427 | 435 | user.shots_num += 1 | 
| 428 | 436 | if user.level < UserInfo.MEMBER_BLACK_GOLD: | 
| @@ -0,0 +1,30 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2020-04-11 13:43 | |
| 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 | +        ('coupon', '0007_auto_20191230_1605'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.AddField( | |
| 16 | + model_name='usercouponinfo', | |
| 17 | + name='acitvity_id', | |
| 18 | + field=models.CharField(blank=True, db_index=True, default=b'MEMBER_BENEFITS', help_text='\u6d3b\u52a8\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='acitvity_id'), | |
| 19 | + ), | |
| 20 | + migrations.AddField( | |
| 21 | + model_name='usercouponinfo', | |
| 22 | + name='acitvity_name', | |
| 23 | + field=models.CharField(blank=True, db_index=True, default=b'MEMBER_BENEFITS', help_text='\u6d3b\u52a8\u540d\u79f0', max_length=32, null=True, verbose_name='activity_id'), | |
| 24 | + ), | |
| 25 | + migrations.AddField( | |
| 26 | + model_name='usercouponinfo', | |
| 27 | + name='coupon_from', | |
| 28 | + field=models.CharField(blank=True, db_index=True, default=b'MEMBER_BENEFITS', help_text='\u52b5\u6765\u6e90', max_length=32, null=True, verbose_name='coupon_from'), | |
| 29 | + ), | |
| 30 | + ] | 
| @@ -0,0 +1,25 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2020-04-11 14:54 | |
| 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 | +        ('coupon', '0008_auto_20200411_2143'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.AlterField( | |
| 16 | + model_name='usercouponinfo', | |
| 17 | + name='acitvity_id', | |
| 18 | + field=models.CharField(blank=True, db_index=True, help_text='\u6d3b\u52a8\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='acitvity_id'), | |
| 19 | + ), | |
| 20 | + migrations.AlterField( | |
| 21 | + model_name='usercouponinfo', | |
| 22 | + name='acitvity_name', | |
| 23 | + field=models.CharField(blank=True, db_index=True, help_text='\u6d3b\u52a8\u540d\u79f0', max_length=32, null=True, verbose_name='activity_id'), | |
| 24 | + ), | |
| 25 | + ] | 
| @@ -0,0 +1,20 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2020-04-11 14:54 | |
| 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 | +        ('coupon', '0009_auto_20200411_2254'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.AlterField( | |
| 16 | + model_name='usercouponinfo', | |
| 17 | + name='acitvity_name', | |
| 18 | + field=models.CharField(blank=True, db_index=True, help_text='\u6d3b\u52a8\u540d\u79f0', max_length=32, null=True, verbose_name='acitvity_name'), | |
| 19 | + ), | |
| 20 | + ] | 
| @@ -0,0 +1,33 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2020-04-11 15:16 | |
| 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 | +        ('coupon', '0010_auto_20200411_2254'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.RemoveField( | |
| 16 | + model_name='usercouponinfo', | |
| 17 | + name='acitvity_id', | |
| 18 | + ), | |
| 19 | + migrations.RemoveField( | |
| 20 | + model_name='usercouponinfo', | |
| 21 | + name='acitvity_name', | |
| 22 | + ), | |
| 23 | + migrations.AddField( | |
| 24 | + model_name='usercouponinfo', | |
| 25 | + name='activity_id', | |
| 26 | + field=models.CharField(blank=True, db_index=True, help_text='\u6d3b\u52a8\u552f\u4e00\u6807\u8bc6', max_length=32, null=True, verbose_name='activity_id'), | |
| 27 | + ), | |
| 28 | + migrations.AddField( | |
| 29 | + model_name='usercouponinfo', | |
| 30 | + name='activity_name', | |
| 31 | + field=models.CharField(blank=True, db_index=True, help_text='\u6d3b\u52a8\u540d\u79f0', max_length=32, null=True, verbose_name='activity_name'), | |
| 32 | + ), | |
| 33 | + ] | 
| @@ -42,6 +42,21 @@ class CouponInfo(BaseModelMixin): | ||
| 42 | 42 | def __unicode__(self): | 
| 43 | 43 | return unicode(self.pk) | 
| 44 | 44 |  | 
| 45 | + @property | |
| 46 | + def coupon_image_path(self): | |
| 47 | + return upload_file_path(self.coupon_image) | |
| 48 | + | |
| 49 | + @property | |
| 50 | + def coupon_image_url(self): | |
| 51 | + return upload_file_url(self.coupon_image) | |
| 52 | + | |
| 53 | + | |
| 54 | + @property | |
| 55 | + def final_expire_at(self): | |
| 56 | + if self.coupon_expire_type == CouponInfo.FIXED_EXPIRED_TIME: | |
| 57 | + return self.coupon_expire_at | |
| 58 | + return tc.utc_datetime(days=self.coupon_valid_period) | |
| 59 | + | |
| 45 | 60 |  | 
| 46 | 61 | class UserCouponInfo(BaseModelMixin): | 
| 47 | 62 | brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) | 
| @@ -66,6 +81,10 @@ class UserCouponInfo(BaseModelMixin): | ||
| 66 | 81 | admin_id = models.CharField(_(u'admin_id'), max_length=32, blank=True, null=True, help_text=u'核销员唯一标识', db_index=True) | 
| 67 | 82 | used_at = models.DateTimeField(_(u'used_at'), blank=True, null=True, help_text=u'维修券核销时间') | 
| 68 | 83 |  | 
| 84 | + coupon_from = models.CharField(_(u'coupon_from'), default='MEMBER_BENEFITS', max_length=32, blank=True, null=True, help_text=u'劵来源', db_index=True) | |
| 85 | + activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True) | |
| 86 | + activity_name = models.CharField(_(u'activity_name'), max_length=32, blank=True, null=True, help_text=u'活动名称', db_index=True) | |
| 87 | + | |
| 69 | 88 | class Meta: | 
| 70 | 89 | verbose_name = _(u'用户券信息') | 
| 71 | 90 | verbose_name_plural = _(u'用户券信息') | 
| @@ -227,7 +227,7 @@ class ConsumeInfoSubmitLogInfoAdmin(ReadOnlyModelAdmin, admin.ModelAdmin): | ||
| 227 | 227 |  | 
| 228 | 228 |  | 
| 229 | 229 | class ActivityInfoAdmin(admin.ModelAdmin): | 
| 230 | -    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') | |
| 230 | +    list_display = ('activity_id', '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') | |
| 231 | 231 |      list_filter = ('coupon_expire_type', 'status') | 
| 232 | 232 |  | 
| 233 | 233 |  | 
| @@ -0,0 +1,26 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +# Generated by Django 1.11.26 on 2020-04-11 13:43 | |
| 3 | +from __future__ import unicode_literals | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | +import shortuuidfield.fields | |
| 7 | + | |
| 8 | + | |
| 9 | +class Migration(migrations.Migration): | |
| 10 | + | |
| 11 | + dependencies = [ | |
| 12 | +        ('mch', '0053_auto_20200407_1118'), | |
| 13 | + ] | |
| 14 | + | |
| 15 | + operations = [ | |
| 16 | + migrations.AddField( | |
| 17 | + model_name='activityinfo', | |
| 18 | + name='activity_id', | |
| 19 | + field=shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='\u6d3b\u52a8\u552f\u4e00\u6807\u8bc6', max_length=22, null=True, unique=True), | |
| 20 | + ), | |
| 21 | + migrations.AlterField( | |
| 22 | + model_name='consumeinfosubmitloginfo', | |
| 23 | + name='province', | |
| 24 | + field=models.CharField(blank=True, db_index=True, help_text='\u7701\u4efd', max_length=32, null=True, verbose_name='province'), | |
| 25 | + ), | |
| 26 | + ] | 
| @@ -9,6 +9,8 @@ from jsonfield import JSONField | ||
| 9 | 9 | from shortuuidfield import ShortUUIDField | 
| 10 | 10 | from TimeConvert import TimeConvert as tc | 
| 11 | 11 |  | 
| 12 | +from coupon.models import CouponInfo | |
| 13 | + | |
| 12 | 14 |  | 
| 13 | 15 | class AdministratorInfo(BaseModelMixin): | 
| 14 | 16 | ADMINISTRATOR = 0 | 
| @@ -704,6 +706,7 @@ class ActivityInfo(BaseModelMixin): | ||
| 704 | 706 | (CHANGED_EXPIRED_TIME, u'可变结束时间'), | 
| 705 | 707 | ) | 
| 706 | 708 |  | 
| 709 | + activity_id = ShortUUIDField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True, unique=True) | |
| 707 | 710 | activity_name = models.CharField(_(u'activity_name'), max_length=255, blank=True, null=True, help_text=u'活动名称') | 
| 708 | 711 |  | 
| 709 | 712 | model_uni_names = JSONField(_(u'model_uni_names'), default=[], blank=True, null=True, help_text=u'型号统一名称列表') | 
| @@ -740,7 +743,7 @@ class ActivityInfo(BaseModelMixin): | ||
| 740 | 743 |          return u'{}年{}月{}日'.format(y, m, d) | 
| 741 | 744 |  | 
| 742 | 745 | def has_unexpired_activity(self, model_name): | 
| 743 | - return (self.model_uni_names and model_name in self.model_uni_names) and (self.start_at <= tc.utc_datetime() < self.end_at) | |
| 746 | + return ((self.model_uni_names and model_name in self.model_uni_names) or not self.model_uni_names) and (self.start_at <= tc.utc_datetime() < self.end_at) | |
| 744 | 747 |  | 
| 745 | 748 | def coupon_info(self, created_at=None): | 
| 746 | 749 |          return { | 
| @@ -748,6 +751,25 @@ class ActivityInfo(BaseModelMixin): | ||
| 748 | 751 | 'coupon_value': self.coupon_value, | 
| 749 | 752 | 'coupon_has_expired': tc.utc_datetime() >= self.final_expire_at(created_at=created_at), | 
| 750 | 753 | } | 
| 754 | + | |
| 751 | 755 |  | 
| 752 | 756 | def coupon_info2(self, created_at=None): | 
| 753 | 757 | return self.coupon_info(created_at=created_at), | 
| 758 | + | |
| 759 | + @property | |
| 760 | + def coupon_info3(self): | |
| 761 | + try: | |
| 762 | + coupon_info = CouponInfo.objects.get(coupon_id=self.coupon_id) | |
| 763 | +            return { | |
| 764 | + 'coupon_image': coupon_info.coupon_image_url, | |
| 765 | + 'coupon_expire_at': coupon_info.coupon_expire_at, | |
| 766 | + 'coupon_value': coupon_info.coupon_value, | |
| 767 | + 'coupon_title': coupon_info.coupon_title, | |
| 768 | + 'coupon_valid_period': coupon_info.coupon_valid_period, | |
| 769 | + 'coupon_id': coupon_info.coupon_id, | |
| 770 | + 'activity_id': self.activity_id, | |
| 771 | + 'activity_name': self.activity_name, | |
| 772 | + } | |
| 773 | + except: | |
| 774 | +            return {} | |
| 775 | + |