| @@ -33,8 +33,10 @@ urlpatterns += [ | ||
| 33 | 33 | url(r'^l/wx/authorize$', lensman_views.lensman_wx_authorize_api, name='lensman_wx_authorize_api'), # 微信用户授权 | 
| 34 | 34 |  | 
| 35 | 35 | url(r'^l/upload$', lensman_views.lensman_photo_upload_api, name='lensman_photo_upload_api'), # 摄影师照片上传 | 
| 36 | + url(r'^l/origin_upload$', lensman_views.lensman_origin_photo_upload_api, name='lensman_origin_photo_upload_api'), # 摄影师原图上传 | |
| 36 | 37 |  | 
| 37 | 38 | url(r'^l/brief$', lensman_views.lensman_brief_api, name='lensman_brief_api'), # 摄影师简报 | 
| 39 | + url(r'^l/origin_wanted$', lensman_views.lensman_origin_wanted_api, name='lensman_origin_wanted_api'), # 摄影师原图订单 | |
| 38 | 40 | ] | 
| 39 | 41 |  | 
| 40 | 42 | # 群组相关 | 
| @@ -9,21 +9,23 @@ from curtail_uuid import CurtailUUID | ||
| 9 | 9 | from django.conf import settings | 
| 10 | 10 | from django.contrib.auth.hashers import check_password | 
| 11 | 11 | from django.core.files.storage import default_storage | 
| 12 | +from django.db import transaction | |
| 12 | 13 | from isoweek import Week | 
| 13 | 14 | from logit import logit | 
| 14 | 15 | from TimeConvert import TimeConvert as tc | 
| 15 | 16 |  | 
| 16 | -from account.models import LensmanInfo, UserInfo | |
| 17 | -from group.models import GroupInfo, GroupPhotoInfo, GroupUserInfo | |
| 17 | +from account.models import LensmanInfo, UserIncomeExpensesInfo, UserInfo | |
| 18 | +from group.models import GroupInfo, GroupPhotoInfo, GroupPhotoOrderInfo, GroupUserInfo | |
| 18 | 19 | from message.models import SystemMessageInfo | 
| 19 | 20 | from pay.models import OrderInfo | 
| 20 | 21 | from photo.models import PhotosInfo | 
| 21 | -from utils.error.errno_utils import LensmanStatusCode, UserStatusCode | |
| 22 | +from utils.error.errno_utils import LensmanStatusCode, OrderStatusCode, UserStatusCode | |
| 22 | 23 | from utils.error.response_utils import response | 
| 23 | 24 | from utils.message_utils import system_messages | 
| 24 | 25 | from utils.page_utils import pagination | 
| 25 | 26 | from utils.redis.rgroup import get_group_info, get_group_users_info, set_group_info, set_group_users_info | 
| 26 | 27 | from utils.redis.rkeys import GROUP_LAST_PHOTO_PK, TODAY_INCOME, TODAY_UPLOAD_PHOTO_AMOUNT, WEEK_INCOME, WEEK_SOLD | 
| 28 | +from utils.redis.rorder import set_lensman_order_record | |
| 27 | 29 | from utils.thumbnail_utils import make_thumbnail | 
| 28 | 30 | from utils.watermark_utils import watermark_wrap | 
| 29 | 31 |  | 
| @@ -254,6 +256,90 @@ def lensman_photo_upload_api(request): | ||
| 254 | 256 |  | 
| 255 | 257 |  | 
| 256 | 258 | @logit | 
| 259 | +@transaction.atomic | |
| 260 | +def lensman_origin_photo_upload_api(request): | |
| 261 | +    user_id = lensman_id = request.POST.get('user_id', '') | |
| 262 | +    session_id = request.POST.get('session_id', '') | |
| 263 | + | |
| 264 | +    photo_id = request.POST.get('photo_id', '') | |
| 265 | + | |
| 266 | +    deleted = int(request.POST.get('deleted', 0)) | |
| 267 | + | |
| 268 | +    photo = request.FILES.get('photo', '') | |
| 269 | + | |
| 270 | + try: | |
| 271 | + order = OrderInfo.objects.get(session_id=session_id, lensman_photo_id=photo_id) | |
| 272 | + except OrderInfo.DoesNotExist: | |
| 273 | + return response(OrderStatusCode.WX_ORDER_NOT_FOUND) | |
| 274 | + | |
| 275 | + if order.pay_status != OrderInfo.PAID: | |
| 276 | + return response(OrderStatusCode.WX_ORDER_NOT_PAY) | |
| 277 | + | |
| 278 | + from_uid = order.from_uid | |
| 279 | + # 原图已删除, 处理退款逻辑 | |
| 280 | + if deleted: | |
| 281 | + try: | |
| 282 | + user = UserInfo.objects.get(uid=from_uid) | |
| 283 | + except UserInfo.DoesNotExist: | |
| 284 | + pass | |
| 285 | + | |
| 286 | + if user: | |
| 287 | + # 增加余额 | |
| 288 | + user.balance += order.total_fee | |
| 289 | + user.save() | |
| 290 | + # 余额记录 | |
| 291 | + UserIncomeExpensesInfo.objects.create( | |
| 292 | + user_id=from_uid, | |
| 293 | + photo_id=order.photo_id, | |
| 294 | + type=UserIncomeExpensesInfo.INCOME, | |
| 295 | + amount=order.total_fee, | |
| 296 | + balance=user.balance, | |
| 297 | + remark=u'高清图购买退款', | |
| 298 | + ) | |
| 299 | + | |
| 300 | + order.photo_status = OrderInfo.DELETED | |
| 301 | + order.reback_status = True | |
| 302 | + order.reback_at = tc.utc_datetime() | |
| 303 | + order.save() | |
| 304 | + | |
| 305 | + if photo: | |
| 306 | + # 写 PhotosInfo 表 | |
| 307 | + _, extension = os.path.splitext(photo.name) | |
| 308 | + extension = extension or 'jpeg' | |
| 309 | + | |
| 310 | +        r_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension) | |
| 311 | + | |
| 312 | + if default_storage.exists(r_photo_path): | |
| 313 | + default_storage.delete(r_photo_path) | |
| 314 | + default_storage.save(r_photo_path, photo) | |
| 315 | + | |
| 316 | + PhotosInfo.objects.filter( | |
| 317 | + lensman_id=lensman_id, | |
| 318 | + session_id=session_id, | |
| 319 | + photo_id=photo_id, | |
| 320 | + ).update( | |
| 321 | + r_photo_path=r_photo_path | |
| 322 | + ) | |
| 323 | + | |
| 324 | + porder, created = GroupPhotoOrderInfo.objects.get_or_create( | |
| 325 | + group_id=order.group_id, | |
| 326 | + session_id=session_id, | |
| 327 | + user_id=from_uid, | |
| 328 | + photo_id=order.photo_id, | |
| 329 | + lensman_photo_id=photo_id, | |
| 330 | + ) | |
| 331 | + porder.r_photo_path = r_photo_path | |
| 332 | + porder.save() | |
| 333 | + | |
| 334 | + set_lensman_order_record(porder) | |
| 335 | + | |
| 336 | + order.photo_status = OrderInfo.FETCHED | |
| 337 | + order.save() | |
| 338 | + | |
| 339 | + return response(200, 'Lensman Upload Origin Photo Success', u'摄影师照片高清图上传成功') | |
| 340 | + | |
| 341 | + | |
| 342 | +@logit | |
| 257 | 343 | def lensman_brief_api(request): | 
| 258 | 344 |      user_id = request.POST.get('user_id', '') | 
| 259 | 345 |  | 
| @@ -289,3 +375,20 @@ def lensman_brief_api(request): | ||
| 289 | 375 | 'orders': orders, | 
| 290 | 376 | } | 
| 291 | 377 | }) | 
| 378 | + | |
| 379 | + | |
| 380 | +@logit | |
| 381 | +def lensman_origin_wanted_api(request): | |
| 382 | +    user_id = request.POST.get('user_id', '') | |
| 383 | + | |
| 384 | + orders = OrderInfo.objects.filter( | |
| 385 | + to_uid=user_id, | |
| 386 | + photo_type=OrderInfo.ORIGIN, | |
| 387 | + photo_status=OrderInfo.WANTED, | |
| 388 | + status=True | |
| 389 | +    ).order_by('pk') | |
| 390 | + wanted = [order.lensdata for order in orders] | |
| 391 | + | |
| 392 | +    return response(200, 'Get Origin Wanted Success', u'获取需要上传原图成功', { | |
| 393 | + 'wanted': wanted | |
| 394 | + }) | 
| @@ -0,0 +1,29 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +from __future__ import unicode_literals | |
| 3 | + | |
| 4 | +from django.db import models, migrations | |
| 5 | + | |
| 6 | + | |
| 7 | +class Migration(migrations.Migration): | |
| 8 | + | |
| 9 | + dependencies = [ | |
| 10 | +        ('group', '0021_photocommentinfo_to_uid'), | |
| 11 | + ] | |
| 12 | + | |
| 13 | + operations = [ | |
| 14 | + migrations.AddField( | |
| 15 | + model_name='groupphotoorderinfo', | |
| 16 | + name='lensman_photo_id', | |
| 17 | + field=models.CharField(max_length=255, blank=True, help_text='\u6444\u5f71\u5e08\u7167\u7247\u552f\u4e00\u6807\u8bc6\uff0c\u540c PhotosInfo \u8868', null=True, verbose_name='lensman_photo_id', db_index=True), | |
| 18 | + ), | |
| 19 | + migrations.AddField( | |
| 20 | + model_name='groupphotoorderinfo', | |
| 21 | + name='session_id', | |
| 22 | + field=models.CharField(max_length=255, blank=True, help_text='\u7167\u7247\u7ec4\u552f\u4e00\u6807\u8bc6\uff0c\u540c PhotosInfo \u8868', null=True, verbose_name='session_id', db_index=True), | |
| 23 | + ), | |
| 24 | + migrations.AlterField( | |
| 25 | + model_name='groupphotoorderinfo', | |
| 26 | + name='m_photo_path', | |
| 27 | + field=models.CharField(help_text='\u7167\u7247\u5b58\u653e\u8def\u5f84\uff0cBox\u4e0a\u4f20\uff0c\u65e0\u6c34\u5370', max_length=255, null=True, verbose_name='m_photo_path', blank=True), | |
| 28 | + ), | |
| 29 | + ] | 
| @@ -231,10 +231,12 @@ class GroupPhotoInfo(CreateUpdateMixin): | ||
| 231 | 231 |  | 
| 232 | 232 | class GroupPhotoOrderInfo(CreateUpdateMixin): | 
| 233 | 233 | group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True) | 
| 234 | + session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识,同 PhotosInfo 表', db_index=True) | |
| 234 | 235 | user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) | 
| 235 | 236 | photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'照片唯一标识', db_index=True) | 
| 237 | + lensman_photo_id = models.CharField(_(u'lensman_photo_id'), max_length=255, blank=True, null=True, help_text=u'摄影师照片唯一标识,同 PhotosInfo 表', db_index=True) | |
| 236 | 238 |  | 
| 237 | - m_photo_path = models.CharField(_(u'm_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,控制器上传,无水印') | |
| 239 | + m_photo_path = models.CharField(_(u'm_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,Box上传,无水印') | |
| 238 | 240 | l_photo_path = models.CharField(_(u'l_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,美化大图') | 
| 239 | 241 | r_photo_path = models.CharField(_(u'r_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,高清大图') | 
| 240 | 242 |  | 
| @@ -6,8 +6,8 @@ from pay.models import OrderInfo | ||
| 6 | 6 |  | 
| 7 | 7 |  | 
| 8 | 8 | class OrderInfoAdmin(admin.ModelAdmin): | 
| 9 | -    list_display = ('order_id', 'from_uid', 'to_uid', 'pay_status', 'paid_at', 'status', 'created_at', 'updated_at') | |
| 10 | -    list_filter = ('pay_status', 'status') | |
| 9 | +    list_display = ('order_id', 'photo_type', 'photo_status', 'from_uid', 'to_uid', 'pay_status', 'paid_at', 'reback_status', 'reback_at', 'status', 'created_at', 'updated_at') | |
| 10 | +    list_filter = ('photo_type', 'photo_status', 'pay_status', 'reback_status', 'status') | |
| 11 | 11 |  | 
| 12 | 12 |  | 
| 13 | 13 | admin.site.register(OrderInfo, OrderInfoAdmin) | 
| @@ -0,0 +1,39 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +from __future__ import unicode_literals | |
| 3 | + | |
| 4 | +from django.db import models, migrations | |
| 5 | + | |
| 6 | + | |
| 7 | +class Migration(migrations.Migration): | |
| 8 | + | |
| 9 | + dependencies = [ | |
| 10 | +        ('pay', '0005_remove_orderinfo_to_lid'), | |
| 11 | + ] | |
| 12 | + | |
| 13 | + operations = [ | |
| 14 | + migrations.AddField( | |
| 15 | + model_name='orderinfo', | |
| 16 | + name='photo_status', | |
| 17 | + field=models.IntegerField(default=0, help_text='\u8d2d\u4e70\u7167\u7247\u72b6\u6001, \u6807\u8bc6\u7528\u6237\u662f\u5426\u5df2\u7ecf\u83b7\u5f97\u7167\u7247', db_index=True, verbose_name='photo_status', choices=[(0, '\u5f85\u4e0a\u4f20'), (1, '\u5df2\u4e0a\u4f20'), (2, '\u5df2\u5220\u9664')]), | |
| 18 | + ), | |
| 19 | + migrations.AddField( | |
| 20 | + model_name='orderinfo', | |
| 21 | + name='reback_at', | |
| 22 | + field=models.DateTimeField(help_text='\u9000\u6b3e\u65f6\u95f4', null=True, verbose_name='reback_at', blank=True), | |
| 23 | + ), | |
| 24 | + migrations.AddField( | |
| 25 | + model_name='orderinfo', | |
| 26 | + name='reback_status', | |
| 27 | + field=models.BooleanField(default=False, help_text='\u9000\u6b3e\u72b6\u6001', db_index=True, verbose_name='reback_status'), | |
| 28 | + ), | |
| 29 | + migrations.AddField( | |
| 30 | + model_name='orderinfo', | |
| 31 | + name='session_id', | |
| 32 | + field=models.CharField(max_length=255, blank=True, help_text='\u7167\u7247\u7ec4\u552f\u4e00\u6807\u8bc6\uff0c\u540c PhotosInfo \u8868', null=True, verbose_name='session_id', db_index=True), | |
| 33 | + ), | |
| 34 | + migrations.AlterField( | |
| 35 | + model_name='orderinfo', | |
| 36 | + name='photo_type', | |
| 37 | + field=models.IntegerField(default=0, help_text='\u8d2d\u4e70\u7167\u7247\u7c7b\u578b', db_index=True, verbose_name='photo_type', choices=[(0, '\u53bb\u9664\u6c34\u5370'), (1, '\u83b7\u53d6\u9ad8\u6e05\u56fe')]), | |
| 38 | + ), | |
| 39 | + ] | 
| @@ -1,6 +1,5 @@ | ||
| 1 | 1 | # -*- coding: utf-8 -*- | 
| 2 | 2 |  | 
| 3 | -from django.conf import settings | |
| 4 | 3 | from django.db import models | 
| 5 | 4 | from django.utils.translation import ugettext_lazy as _ | 
| 6 | 5 | from shortuuidfield import ShortUUIDField | 
| @@ -18,6 +17,16 @@ class OrderInfo(CreateUpdateMixin): | ||
| 18 | 17 | (ORIGIN, u'获取高清图'), | 
| 19 | 18 | ) | 
| 20 | 19 |  | 
| 20 | + WANTED = 0 | |
| 21 | + FETCHED = 1 | |
| 22 | + DELETED = 2 | |
| 23 | + | |
| 24 | + PHOTO_STATUS = ( | |
| 25 | + (WANTED, u'待上传'), | |
| 26 | + (FETCHED, u'已上传'), | |
| 27 | + (DELETED, u'已删除'), | |
| 28 | + ) | |
| 29 | + | |
| 21 | 30 | """ | 
| 22 | 31 | # Trade State of Wechat Query | 
| 23 | 32 | SUCCESS ——— 支付成功 | 
| @@ -44,10 +53,12 @@ class OrderInfo(CreateUpdateMixin): | ||
| 44 | 53 | order_id = ShortUUIDField(_(u'order_id'), max_length=255, help_text=u'订单唯一标识', db_index=True) | 
| 45 | 54 |  | 
| 46 | 55 | group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True) | 
| 56 | + session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识,同 PhotosInfo 表', db_index=True) | |
| 47 | 57 | photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识', db_index=True) | 
| 48 | 58 | lensman_photo_id = models.CharField(_(u'lensman_photo_id'), max_length=255, blank=True, null=True, help_text=u'摄影师照片唯一标识,同 PhotosInfo 表', db_index=True) | 
| 49 | 59 |  | 
| 50 | -    photo_type = models.IntegerField(_('photo_type'), choices=PHOTO_TYPE, default=NOMARK, help_text=u'购买照片类型') | |
| 60 | +    photo_type = models.IntegerField(_('photo_type'), choices=PHOTO_TYPE, default=NOMARK, help_text=u'购买照片类型', db_index=True) | |
| 61 | + photo_status = models.IntegerField(_(u'photo_status'), choices=PHOTO_STATUS, default=WANTED, help_text=_(u'购买照片状态, 标识用户是否已经获得照片'), db_index=True) | |
| 51 | 62 |  | 
| 52 | 63 | from_uid = models.CharField(_(u'from_uid'), max_length=255, help_text=u'付款用户唯一标识', db_index=True) | 
| 53 | 64 | to_uid = models.CharField(_(u'to_uid'), max_length=255, blank=True, null=True, help_text=u'收款用户唯一标识', db_index=True) | 
| @@ -60,6 +71,9 @@ class OrderInfo(CreateUpdateMixin): | ||
| 60 | 71 | pay_status = models.IntegerField(_(u'pay_status'), choices=PAY_STATUS, default=WAITING_PAY, help_text=u'支付状态', db_index=True) | 
| 61 | 72 | paid_at = models.DateTimeField(_(u'paid_at'), blank=True, null=True, help_text=_(u'支付时间')) | 
| 62 | 73 |  | 
| 74 | + reback_status = models.BooleanField(_(u'reback_status'), default=False, help_text=u'退款状态', db_index=True) | |
| 75 | + reback_at = models.DateTimeField(_(u'reback_at'), blank=True, null=True, help_text=_(u'退款时间')) | |
| 76 | + | |
| 63 | 77 | class Meta: | 
| 64 | 78 |          verbose_name = _('orderinfo') | 
| 65 | 79 |          verbose_name_plural = _('orderinfo') | 
| @@ -85,3 +99,10 @@ class OrderInfo(CreateUpdateMixin): | ||
| 85 | 99 | 'paid_at': self.paid_at and self.paid_at.replace(microsecond=0), | 
| 86 | 100 | 'created_at': self.created_at.replace(microsecond=0), | 
| 87 | 101 | } | 
| 102 | + | |
| 103 | + @property | |
| 104 | + def lensdata(self): | |
| 105 | +        return { | |
| 106 | + 'session_id': self.session_id, | |
| 107 | + 'photo_id': self.lensman_photo_id | |
| 108 | + } | 
| @@ -70,6 +70,7 @@ def wx_order_create_api(request): | ||
| 70 | 70 | photo_type=1 if photo_type == 'origin' else 0, | 
| 71 | 71 | from_uid=from_uid, | 
| 72 | 72 | to_uid=to_uid, | 
| 73 | + session_id=group_photo.session_id, | |
| 73 | 74 | total_fee=total_fee, | 
| 74 | 75 | trade_type=trade_type, | 
| 75 | 76 | ) | 
| @@ -103,14 +104,18 @@ def order_paid_success(order): | ||
| 103 | 104 | if order.pay_status == OrderInfo.PAID: | 
| 104 | 105 | return | 
| 105 | 106 |  | 
| 107 | + if order.photo_type == OrderInfo.NOMARK: | |
| 108 | + order.photo_status = OrderInfo.FETCHED | |
| 106 | 109 | order.pay_status = OrderInfo.PAID | 
| 107 | 110 | order.paid_at = tc.utc_datetime() | 
| 108 | 111 | order.save() | 
| 109 | 112 |  | 
| 110 | 113 | porder, created = GroupPhotoOrderInfo.objects.get_or_create( | 
| 111 | 114 | group_id=order.group_id, | 
| 115 | + session_id=order.session_id, | |
| 112 | 116 | user_id=order.from_uid, | 
| 113 | 117 | photo_id=order.photo_id, | 
| 118 | + lensman_photo_id=order.lensman_photo_id, | |
| 114 | 119 | ) | 
| 115 | 120 | photo = PhotosInfo.objects.get( | 
| 116 | 121 | photo_id=order.lensman_photo_id, | 
| @@ -0,0 +1,24 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +from __future__ import unicode_literals | |
| 3 | + | |
| 4 | +from django.db import models, migrations | |
| 5 | + | |
| 6 | + | |
| 7 | +class Migration(migrations.Migration): | |
| 8 | + | |
| 9 | + dependencies = [ | |
| 10 | +        ('photo', '0007_auto_20160422_1322'), | |
| 11 | + ] | |
| 12 | + | |
| 13 | + operations = [ | |
| 14 | + migrations.AlterField( | |
| 15 | + model_name='photosinfo', | |
| 16 | + name='m_photo_path', | |
| 17 | + field=models.CharField(help_text='\u7167\u7247\u5b58\u653e\u8def\u5f84\uff0cBox\u4e0a\u4f20\uff0c\u65e0\u6c34\u5370', max_length=255, null=True, verbose_name='m_photo_path', blank=True), | |
| 18 | + ), | |
| 19 | + migrations.AlterField( | |
| 20 | + model_name='photosinfo', | |
| 21 | + name='p_photo_path', | |
| 22 | + field=models.CharField(help_text='\u7167\u7247\u5b58\u653e\u8def\u5f84\uff0cBox\u4e0a\u4f20\uff0c\u6709\u6c34\u5370\uff0c\u670d\u52a1\u5668\u6dfb\u52a0', max_length=255, null=True, verbose_name='p_photo_path', blank=True), | |
| 23 | + ), | |
| 24 | + ] | 
| @@ -33,8 +33,8 @@ class PhotosInfo(CreateUpdateMixin): | ||
| 33 | 33 | lensman_id = models.CharField(_(u'lensman_id'), max_length=255, blank=True, null=True, help_text=u'摄影师唯一标识', db_index=True) | 
| 34 | 34 | session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识', db_index=True) | 
| 35 | 35 | photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'照片唯一标识', db_index=True, unique=True) | 
| 36 | - p_photo_path = models.CharField(_(u'p_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,控制器上传,有水印,服务器添加') | |
| 37 | - m_photo_path = models.CharField(_(u'm_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,控制器上传,无水印') | |
| 36 | + p_photo_path = models.CharField(_(u'p_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,Box上传,有水印,服务器添加') | |
| 37 | + m_photo_path = models.CharField(_(u'm_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,Box上传,无水印') | |
| 38 | 38 | l_photo_path = models.CharField(_(u'l_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,美化大图') | 
| 39 | 39 | r_photo_path = models.CharField(_(u'r_photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,高清大图') | 
| 40 | 40 |  |