| @@ -775,12 +775,16 @@ def member_activity_list(request, administrator): | ||
| 775 | 775 |      end_time = request.POST.get('end_time', '') | 
| 776 | 776 |      page = request.POST.get('page', 1) | 
| 777 | 777 |      num = request.POST.get('num', 20) | 
| 778 | +    activity_state = request.POST.get('activity_state', '') | |
| 778 | 779 |  | 
| 779 | 780 | logs = MemberActivityInfo.objects.filter(status=True) | 
| 780 | 781 |  | 
| 781 | 782 | if activity_type: | 
| 782 | 783 | logs = logs.filter(activity_type=activity_type) | 
| 783 | 784 |  | 
| 785 | + if activity_state: | |
| 786 | + logs = logs.filter(activity_state=activity_state) | |
| 787 | + | |
| 784 | 788 | if title: | 
| 785 | 789 | logs = logs.filter(title__icontains=title) | 
| 786 | 790 |  | 
| @@ -1445,8 +1449,16 @@ def member_goods_list(request, administrator): | ||
| 1445 | 1449 |      title = request.POST.get('title', '') | 
| 1446 | 1450 |      page = request.POST.get('page', 1) | 
| 1447 | 1451 |      num = request.POST.get('num', 20) | 
| 1452 | +    understock = request.POST.get('understock', 0) | |
| 1453 | +    good_state = request.POST.get('good_state', '') | |
| 1454 | + | |
| 1455 | +    logs = GoodsInfo.objects.filter(title__icontains=title).order_by('-pk') | |
| 1456 | + | |
| 1457 | + if understock: | |
| 1458 | + logs = logs.filter(left_num=0) | |
| 1448 | 1459 |  | 
| 1449 | -    logs = GoodsInfo.objects.filter(title__icontains=title, only_for_member=False).order_by('-pk') | |
| 1460 | + if good_state: | |
| 1461 | + logs = logs.filter(good_state=good_state) | |
| 1450 | 1462 |  | 
| 1451 | 1463 | count = logs.count() | 
| 1452 | 1464 | logs, left = pagination(logs, page, num) | 
| @@ -0,0 +1,30 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | + | |
| 3 | +# Generated by Django 3.2.6 on 2023-03-03 08:53 | |
| 4 | + | |
| 5 | +from django.db import migrations, models | |
| 6 | + | |
| 7 | + | |
| 8 | +class Migration(migrations.Migration): | |
| 9 | + | |
| 10 | + dependencies = [ | |
| 11 | +        ('member', '0053_alter_memberactivitygroupshareinfo_unique_together'), | |
| 12 | + ] | |
| 13 | + | |
| 14 | + operations = [ | |
| 15 | + migrations.AddField( | |
| 16 | + model_name='goodsinfo', | |
| 17 | + name='good_state', | |
| 18 | + field=models.IntegerField(choices=[(1, '上架'), (2, '下架')], db_index=True, default=1, help_text='商品类型', verbose_name='good_state'), | |
| 19 | + ), | |
| 20 | + migrations.AddField( | |
| 21 | + model_name='goodsinfo', | |
| 22 | + name='relate_good_title', | |
| 23 | + field=models.CharField(blank=True, help_text='商品名称', max_length=255, null=True, verbose_name='relate_good_title'), | |
| 24 | + ), | |
| 25 | + migrations.AddField( | |
| 26 | + model_name='goodsorderinfo', | |
| 27 | + name='relate_good_title', | |
| 28 | + field=models.CharField(blank=True, help_text='关联商品', max_length=255, null=True, verbose_name='relate_good_title'), | |
| 29 | + ), | |
| 30 | + ] | 
| @@ -26,6 +26,14 @@ class GoodsInfo(BaseModelMixin, BrandInfoMixin): | ||
| 26 | 26 | (VIRTUAL, u'虚拟'), | 
| 27 | 27 | ) | 
| 28 | 28 |  | 
| 29 | + SHELVES = 1 | |
| 30 | + OFF_SHELVES = 2 | |
| 31 | + | |
| 32 | + GOOD_STATE_TUPLE = ( | |
| 33 | + (SHELVES, u'上架'), | |
| 34 | + (OFF_SHELVES, u'下架'), | |
| 35 | + ) | |
| 36 | + | |
| 29 | 37 | good_id = ShortUUIDField(_(u'good_id'), max_length=32, blank=True, null=True, help_text=u'商品唯一标识', db_index=True, unique=True) | 
| 30 | 38 | good_type = models.IntegerField(_(u'good_type'), choices=GOOD_TYPE_TUPLE, default=VIRTUAL, help_text=u'商品类型', db_index=True) | 
| 31 | 39 |  | 
| @@ -49,8 +57,12 @@ class GoodsInfo(BaseModelMixin, BrandInfoMixin): | ||
| 49 | 57 | only_for_member = models.BooleanField(_(u'only_for_member'), default=False, help_text=u'会员专属') | 
| 50 | 58 | only_once = models.BooleanField(_(u'only_once'), default=False, help_text=u'仅支持兑换一次') | 
| 51 | 59 |  | 
| 60 | + relate_good_title = models.CharField(_(u'relate_good_title'), max_length=255, blank=True, null=True, help_text=u'商品名称') | |
| 61 | + | |
| 52 | 62 | position = models.IntegerField(_(u'position'), default=1, help_text=u'排序', db_index=True) | 
| 53 | 63 |  | 
| 64 | + good_state = models.IntegerField(_(u'good_state'), choices=GOOD_STATE_TUPLE, default=SHELVES, help_text=u'商品类型', db_index=True) | |
| 65 | + | |
| 54 | 66 | is_upload_qiniu = models.BooleanField(_(u'is_upload_qiniu'), default=False, help_text=u'是否已上传七牛') | 
| 55 | 67 |  | 
| 56 | 68 | class Meta: | 
| @@ -130,6 +142,8 @@ class GoodsInfo(BaseModelMixin, BrandInfoMixin): | ||
| 130 | 142 | 'fee': self.fee, | 
| 131 | 143 | 'value': self.value, | 
| 132 | 144 | 'left_num': self.left_num, | 
| 145 | + 'relate_good_title': self.relate_good_title, | |
| 146 | + 'good_state': self.good_state, | |
| 133 | 147 | 'coupon': coupon, | 
| 134 | 148 | 'created_at': tc.local_string(utc_dt=self.created_at), | 
| 135 | 149 | } | 
| @@ -144,6 +158,8 @@ class GoodsInfo(BaseModelMixin, BrandInfoMixin): | ||
| 144 | 158 | 'good_id': self.good_id, | 
| 145 | 159 | 'good_type': self.good_type, | 
| 146 | 160 | 'title': self.title, | 
| 161 | + 'relate_good_title': self.relate_good_title, | |
| 162 | + 'good_state': self.good_state, | |
| 147 | 163 | 'image': self.image_url, | 
| 148 | 164 | 'image_path': self.image_path, | 
| 149 | 165 | 'slider_image': self.slider_image_url, | 
| @@ -175,6 +191,7 @@ class GoodsOrderInfo(BaseModelMixin, BrandInfoMixin): | ||
| 175 | 191 | good_type = models.IntegerField(_(u'good_type'), choices=GOOD_TYPE_TUPLE, default=VIRTUAL, help_text=u'商品类型', db_index=True) | 
| 176 | 192 |  | 
| 177 | 193 | title = models.CharField(_(u'title'), max_length=255, blank=True, null=True, help_text=u'商品名称') | 
| 194 | + relate_good_title = models.CharField(_(u'relate_good_title'), max_length=255, blank=True, null=True, help_text=u'关联商品') | |
| 178 | 195 |  | 
| 179 | 196 | name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'姓名') | 
| 180 | 197 | phone = models.CharField(_(u'phone'), max_length=255, blank=True, null=True, help_text=u'电话') | 
| @@ -204,6 +221,7 @@ class GoodsOrderInfo(BaseModelMixin, BrandInfoMixin): | ||
| 204 | 221 | 'order_id': self.order_id, | 
| 205 | 222 | 'good_id': self.good_id, | 
| 206 | 223 | 'good_name': good.title, | 
| 224 | + 'relate_good_title': self.relate_good_title, | |
| 207 | 225 | 'good_type': good.good_type, | 
| 208 | 226 | 'user_id': self.user_id, | 
| 209 | 227 | 'user_name': self.name, |