@@ -178,58 +178,32 @@ def lensman_photo_upload_api(request):  | 
            ||
| 178 | 178 | 
                 | 
            
| 179 | 179 | 
                     if photo and r.acquire_lock('{}:{}:{}'.format(group_id, user_id, photo.name), time=60):
               | 
            
| 180 | 180 | 
                # 写 PhotosInfo 表  | 
            
| 181 | 
                - m_photo_path, ext = file_save(photo, prefix='photo', ext='jpeg')  | 
            |
| 182 | 
                -        p_photo_path = 'photo/{}{}'.format(shortuuid.uuid(), ext)
               | 
            |
| 183 | 
                - watermark_wrap(  | 
            |
| 184 | 
                -            os.path.join(settings.MEDIA_ROOT, m_photo_path).replace('\\', '/'),
               | 
            |
| 185 | 
                - settings.WATERMARK_LOGO,  | 
            |
| 186 | 
                -            os.path.join(settings.MEDIA_ROOT, p_photo_path).replace('\\', '/')
               | 
            |
| 187 | 
                - )  | 
            |
| 181 | 
                + photo_info = file_save(photo, prefix='photo', ext='jpeg', watermark=True, thumbnail=True)  | 
            |
| 188 | 182 | 
                 | 
            
| 189 | 183 | 
                photo, created = PhotosInfo.objects.get_or_create(  | 
            
| 190 | 184 | 
                lensman_id=lensman_id,  | 
            
| 191 | 185 | 
                session_id=session_id,  | 
            
| 192 | 186 | 
                photo_id=photo_id,  | 
            
| 193 | 187 | 
                )  | 
            
| 194 | 
                - photo.p_photo_path = p_photo_path  | 
            |
| 195 | 
                - photo.m_photo_path = m_photo_path  | 
            |
| 188 | 
                + photo.m_photo_path = photo_info.photo_path  | 
            |
| 189 | 
                + photo.p_photo_path = photo_info.photo_watermark_path  | 
            |
| 196 | 190 | 
                photo.save()  | 
            
| 197 | 191 | 
                 | 
            
| 198 | 192 | 
                # 写 GroupPhotoInfo 表  | 
            
| 199 | 
                - photo_path = photo.p_photo_path  | 
            |
| 200 | 
                -        photo_thumbnail_path = photo_path.replace('.', '_thumbnail.')
               | 
            |
| 201 | 
                -        photo_thumbnail2_path = photo_path.replace('.', '_thumbnail2.')
               | 
            |
| 202 | 
                -  | 
            |
| 203 | 
                - # 群组照片缩略图生成  | 
            |
| 204 | 
                - # 双列: 540, 40-50K  | 
            |
| 205 | 
                - photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail(  | 
            |
| 206 | 
                -            os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
               | 
            |
| 207 | 
                -            os.path.join(settings.MEDIA_ROOT, photo_thumbnail_path).replace('\\', '/'),
               | 
            |
| 208 | 
                - settings.THUMBNAIL_MAX_WIDTH  | 
            |
| 209 | 
                - )  | 
            |
| 210 | 
                -  | 
            |
| 211 | 
                - # 单列: 1080, xx-100K  | 
            |
| 212 | 
                - photo_w, photo_h, photo_thumbnail2_w, photo_thumbnail2_h = make_thumbnail(  | 
            |
| 213 | 
                -            os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
               | 
            |
| 214 | 
                -            os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'),
               | 
            |
| 215 | 
                - settings.THUMBNAIL_MAX_WIDTH2  | 
            |
| 216 | 
                - )  | 
            |
| 217 | 
                -  | 
            |
| 218 | 
                - # 群组照片记录创建  | 
            |
| 219 | 193 | 
                group_photo = GroupPhotoInfo.objects.create(  | 
            
| 220 | 194 | 
                group_id=group_id,  | 
            
| 221 | 195 | 
                user_id=user_id,  | 
            
| 222 | 196 | 
                nickname=user.final_nickname,  | 
            
| 223 | 197 | 
                avatar=user.avatar,  | 
            
| 224 | 
                - photo_path=photo_path,  | 
            |
| 225 | 
                - photo_w=photo_w,  | 
            |
| 226 | 
                - photo_h=photo_h,  | 
            |
| 227 | 
                - photo_thumbnail_path=photo_thumbnail_path,  | 
            |
| 228 | 
                - photo_thumbnail_w=photo_thumbnail_w,  | 
            |
| 229 | 
                - photo_thumbnail_h=photo_thumbnail_h,  | 
            |
| 230 | 
                - photo_thumbnail2_path=photo_thumbnail2_path,  | 
            |
| 231 | 
                - photo_thumbnail2_w=photo_thumbnail2_w,  | 
            |
| 232 | 
                - photo_thumbnail2_h=photo_thumbnail2_h,  | 
            |
| 198 | 
                + photo_path=photo_info.photo_path,  | 
            |
| 199 | 
                + photo_w=photo_info.photo_w,  | 
            |
| 200 | 
                + photo_h=photo_info.photo_h,  | 
            |
| 201 | 
                + photo_thumbnail_path=photo_info.photo_thumbnail_path,  | 
            |
| 202 | 
                + photo_thumbnail_w=photo_info.photo_thumbnail_w,  | 
            |
| 203 | 
                + photo_thumbnail_h=photo_info.photo_thumbnail_h,  | 
            |
| 204 | 
                + photo_thumbnail2_path=photo_info.photo_thumbnail2_path,  | 
            |
| 205 | 
                + photo_thumbnail2_w=photo_info.photo_thumbnail2_w,  | 
            |
| 206 | 
                + photo_thumbnail2_h=photo_info.photo_thumbnail2_h,  | 
            |
| 233 | 207 | 
                photo_from=GroupPhotoInfo.SESSION_GROUP,  | 
            
| 234 | 208 | 
                session_id=photo.session_id,  | 
            
| 235 | 209 | 
                lensman_id=photo.lensman_id,  | 
            
                @@ -320,14 +294,14 @@ def lensman_origin_photo_upload_api(request):  | 
            ||
| 320 | 294 | 
                 | 
            
| 321 | 295 | 
                     if photo and r.acquire_lock('{}:{}:{}'.format(order_id, user_id, photo.name), time=60):
               | 
            
| 322 | 296 | 
                # 写 PhotosInfo 表  | 
            
| 323 | 
                - r_photo_path, ext = file_save(photo, prefix='photo', ext='jpeg')  | 
            |
| 297 | 
                + photo_info = file_save(photo, prefix='photo', ext='jpeg')  | 
            |
| 324 | 298 | 
                 | 
            
| 325 | 299 | 
                PhotosInfo.objects.filter(  | 
            
| 326 | 300 | 
                lensman_id=lensman_id,  | 
            
| 327 | 301 | 
                session_id=session_id,  | 
            
| 328 | 302 | 
                photo_id=photo_id,  | 
            
| 329 | 303 | 
                ).update(  | 
            
| 330 | 
                - r_photo_path=r_photo_path  | 
            |
| 304 | 
                + r_photo_path=photo_info.photo_path  | 
            |
| 331 | 305 | 
                )  | 
            
| 332 | 306 | 
                 | 
            
| 333 | 307 | 
                porder, created = GroupPhotoOrderInfo.objects.select_for_update().get_or_create(  | 
            
                @@ -337,7 +311,7 @@ def lensman_origin_photo_upload_api(request):  | 
            ||
| 337 | 311 | 
                photo_id=order.photo_id,  | 
            
| 338 | 312 | 
                lensman_photo_id=photo_id,  | 
            
| 339 | 313 | 
                )  | 
            
| 340 | 
                - porder.r_photo_path = r_photo_path  | 
            |
| 314 | 
                + porder.r_photo_path = photo_info.photo_path  | 
            |
| 341 | 315 | 
                porder.save()  | 
            
| 342 | 316 | 
                 | 
            
| 343 | 317 | 
                set_lensman_order_record(porder)  | 
            
                @@ -189,7 +189,7 @@ def tg_group_update_api(request):  | 
            ||
| 189 | 189 | 
                group.group_desc = group_desc  | 
            
| 190 | 190 | 
                # 群组头像更新  | 
            
| 191 | 191 | 
                if group_avatar:  | 
            
| 192 | 
                - group.group_avatar = file_save(group_avatar, prefix='group', ext='jpeg')[0]  | 
            |
| 192 | 
                + group.group_avatar = file_save(group_avatar, prefix='group', ext='jpeg').photo_path  | 
            |
| 193 | 193 | 
                # 起止时间更新  | 
            
| 194 | 194 | 
                if started_at:  | 
            
| 195 | 195 | 
                group.started_at = started_at  | 
            
                @@ -200,10 +200,10 @@ def tg_group_update_api(request):  | 
            ||
| 200 | 200 | 
                group.total_persons = total_persons  | 
            
| 201 | 201 | 
                # 注意事项更新  | 
            
| 202 | 202 | 
                if attentions:  | 
            
| 203 | 
                - group.attentions_path = file_save(attentions, prefix='tour', ext='jpeg')[0]  | 
            |
| 203 | 
                + group.attentions_path = file_save(attentions, prefix='tour', ext='jpeg').photo_path  | 
            |
| 204 | 204 | 
                # 行程安排更新  | 
            
| 205 | 205 | 
                if schedules:  | 
            
| 206 | 
                - group.schedules_path = file_save(schedules, prefix='tour', ext='jpeg')[0]  | 
            |
| 206 | 
                + group.schedules_path = file_save(schedules, prefix='tour', ext='jpeg').photo_path  | 
            |
| 207 | 207 | 
                group.save()  | 
            
| 208 | 208 | 
                 | 
            
| 209 | 209 | 
                # Redis 群组数据缓存更新  | 
            
                @@ -134,7 +134,7 @@ def group_update_api(request):  | 
            ||
| 134 | 134 | 
                group.group_desc = group_desc  | 
            
| 135 | 135 | 
                # 群组头像更新  | 
            
| 136 | 136 | 
                if group_avatar:  | 
            
| 137 | 
                - group.group_avatar = file_save(group_avatar, prefix='group', ext='jpeg')[0]  | 
            |
| 137 | 
                + group.group_avatar = file_save(group_avatar, prefix='group', ext='jpeg').photo_path  | 
            |
| 138 | 138 | 
                group.save()  | 
            
| 139 | 139 | 
                 | 
            
| 140 | 140 | 
                # Redis 群组数据缓存更新  | 
            
                @@ -254,23 +254,7 @@ def flyimg_upload_api(request):  | 
            ||
| 254 | 254 | 
                return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)  | 
            
| 255 | 255 | 
                 | 
            
| 256 | 256 | 
                     if photo and r.acquire_lock('{}:{}:{}'.format(group_id, user_id, photo.name), time=60):
               | 
            
| 257 | 
                - photo_path, ext = file_save(photo, prefix='fly', ext='jpeg')  | 
            |
| 258 | 
                -        photo_thumbnail_path = photo_path.replace('.', '_thumbnail.')
               | 
            |
| 259 | 
                -        photo_thumbnail2_path = photo_path.replace('.', '_thumbnail2.')
               | 
            |
| 260 | 
                -  | 
            |
| 261 | 
                - # 群组照片缩略图生成  | 
            |
| 262 | 
                - # 双列: 540, 40-50K  | 
            |
| 263 | 
                - photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail(  | 
            |
| 264 | 
                -            os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
               | 
            |
| 265 | 
                -            os.path.join(settings.MEDIA_ROOT, photo_thumbnail_path).replace('\\', '/'),
               | 
            |
| 266 | 
                - settings.THUMBNAIL_MAX_WIDTH  | 
            |
| 267 | 
                - )  | 
            |
| 268 | 
                - # 单列: 1080, xx-100K  | 
            |
| 269 | 
                - photo_w, photo_h, photo_thumbnail2_w, photo_thumbnail2_h = make_thumbnail(  | 
            |
| 270 | 
                -            os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
               | 
            |
| 271 | 
                -            os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'),
               | 
            |
| 272 | 
                - settings.THUMBNAIL_MAX_WIDTH2  | 
            |
| 273 | 
                - )  | 
            |
| 257 | 
                + photo_info = file_save(photo, prefix='fly', ext='jpeg', thumbnail=True)  | 
            |
| 274 | 258 | 
                 | 
            
| 275 | 259 | 
                # 群组照片记录创建  | 
            
| 276 | 260 | 
                group_photo = GroupPhotoInfo.objects.create(  | 
            
                @@ -278,15 +262,15 @@ def flyimg_upload_api(request):  | 
            ||
| 278 | 262 | 
                user_id=user_id,  | 
            
| 279 | 263 | 
                nickname=nickname or user.final_nickname,  | 
            
| 280 | 264 | 
                avatar=user.avatar,  | 
            
| 281 | 
                - photo_path=photo_path,  | 
            |
| 282 | 
                - photo_w=photo_w,  | 
            |
| 283 | 
                - photo_h=photo_h,  | 
            |
| 284 | 
                - photo_thumbnail_path=photo_thumbnail_path,  | 
            |
| 285 | 
                - photo_thumbnail_w=photo_thumbnail_w,  | 
            |
| 286 | 
                - photo_thumbnail_h=photo_thumbnail_h,  | 
            |
| 287 | 
                - photo_thumbnail2_path=photo_thumbnail2_path,  | 
            |
| 288 | 
                - photo_thumbnail2_w=photo_thumbnail2_w,  | 
            |
| 289 | 
                - photo_thumbnail2_h=photo_thumbnail2_h,  | 
            |
| 265 | 
                + photo_path=photo_info.photo_path,  | 
            |
| 266 | 
                + photo_w=photo_info.photo_w,  | 
            |
| 267 | 
                + photo_h=photo_info.photo_h,  | 
            |
| 268 | 
                + photo_thumbnail_path=photo_info.photo_thumbnail_path,  | 
            |
| 269 | 
                + photo_thumbnail_w=photo_info.photo_thumbnail_w,  | 
            |
| 270 | 
                + photo_thumbnail_h=photo_info.photo_thumbnail_h,  | 
            |
| 271 | 
                + photo_thumbnail2_path=photo_info.photo_thumbnail2_path,  | 
            |
| 272 | 
                + photo_thumbnail2_w=photo_info.photo_thumbnail2_w,  | 
            |
| 273 | 
                + photo_thumbnail2_h=photo_info.photo_thumbnail2_h,  | 
            |
| 290 | 274 | 
                )  | 
            
| 291 | 275 | 
                 | 
            
| 292 | 276 | 
                # 设置群组最后一张照片PK  | 
            
                @@ -11,7 +11,7 @@ class UUIDInfoAdmin(admin.ModelAdmin):  | 
            ||
| 11 | 11 | 
                 | 
            
| 12 | 12 | 
                 | 
            
| 13 | 13 | 
                class PhotoUUIDInfoAdmin(admin.ModelAdmin):  | 
            
| 14 | 
                -    list_display = ('photo_md5', 'photo_path', 'status', 'created_at', 'updated_at')
               | 
            |
| 14 | 
                +    list_display = ('photo_md5', 'photo_path', 'photo_watermark_path', 'photo_thumbnail_path', 'photo_thumbnail2_path', 'status', 'created_at', 'updated_at')
               | 
            |
| 15 | 15 | 
                     list_filter = ('status', )
               | 
            
| 16 | 16 | 
                 | 
            
| 17 | 17 | 
                 | 
            
                @@ -0,0 +1,69 @@  | 
            ||
| 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', '0010_photouuidinfo'),
               | 
            |
| 11 | 
                + ]  | 
            |
| 12 | 
                +  | 
            |
| 13 | 
                + operations = [  | 
            |
| 14 | 
                + migrations.AddField(  | 
            |
| 15 | 
                + model_name='photouuidinfo',  | 
            |
| 16 | 
                + name='photo_h',  | 
            |
| 17 | 
                + field=models.IntegerField(default=0, help_text='\u7167\u7247\u9ad8\u5ea6', verbose_name='photo_h'),  | 
            |
| 18 | 
                + ),  | 
            |
| 19 | 
                + migrations.AddField(  | 
            |
| 20 | 
                + model_name='photouuidinfo',  | 
            |
| 21 | 
                + name='photo_thumbnail2_h',  | 
            |
| 22 | 
                + field=models.IntegerField(default=0, help_text='\u7167\u7247\u7f29\u7565\u56fe\u9ad8\u5ea6', verbose_name='photo_thumbnail2_h'),  | 
            |
| 23 | 
                + ),  | 
            |
| 24 | 
                + migrations.AddField(  | 
            |
| 25 | 
                + model_name='photouuidinfo',  | 
            |
| 26 | 
                + name='photo_thumbnail2_path',  | 
            |
| 27 | 
                + field=models.CharField(help_text='\u7167\u7247\u7f29\u7565\u56fe\u5b58\u653e\u8def\u5f84', max_length=255, null=True, verbose_name='photo_thumbnail2_path', blank=True),  | 
            |
| 28 | 
                + ),  | 
            |
| 29 | 
                + migrations.AddField(  | 
            |
| 30 | 
                + model_name='photouuidinfo',  | 
            |
| 31 | 
                + name='photo_thumbnail2_w',  | 
            |
| 32 | 
                + field=models.IntegerField(default=0, help_text='\u7167\u7247\u7f29\u7565\u56fe\u5bbd\u5ea6', verbose_name='photo_thumbnail2_w'),  | 
            |
| 33 | 
                + ),  | 
            |
| 34 | 
                + migrations.AddField(  | 
            |
| 35 | 
                + model_name='photouuidinfo',  | 
            |
| 36 | 
                + name='photo_thumbnail_h',  | 
            |
| 37 | 
                + field=models.IntegerField(default=0, help_text='\u7167\u7247\u7f29\u7565\u56fe\u9ad8\u5ea6', verbose_name='photo_thumbnail_h'),  | 
            |
| 38 | 
                + ),  | 
            |
| 39 | 
                + migrations.AddField(  | 
            |
| 40 | 
                + model_name='photouuidinfo',  | 
            |
| 41 | 
                + name='photo_thumbnail_path',  | 
            |
| 42 | 
                + field=models.CharField(help_text='\u7167\u7247\u7f29\u7565\u56fe\u5b58\u653e\u8def\u5f84', max_length=255, null=True, verbose_name='photo_thumbnail_path', blank=True),  | 
            |
| 43 | 
                + ),  | 
            |
| 44 | 
                + migrations.AddField(  | 
            |
| 45 | 
                + model_name='photouuidinfo',  | 
            |
| 46 | 
                + name='photo_thumbnail_w',  | 
            |
| 47 | 
                + field=models.IntegerField(default=0, help_text='\u7167\u7247\u7f29\u7565\u56fe\u5bbd\u5ea6', verbose_name='photo_thumbnail_w'),  | 
            |
| 48 | 
                + ),  | 
            |
| 49 | 
                + migrations.AddField(  | 
            |
| 50 | 
                + model_name='photouuidinfo',  | 
            |
| 51 | 
                + name='photo_w',  | 
            |
| 52 | 
                + field=models.IntegerField(default=0, help_text='\u7167\u7247\u5bbd\u5ea6', verbose_name='photo_w'),  | 
            |
| 53 | 
                + ),  | 
            |
| 54 | 
                + migrations.AddField(  | 
            |
| 55 | 
                + model_name='photouuidinfo',  | 
            |
| 56 | 
                + name='photo_watermark_h',  | 
            |
| 57 | 
                + field=models.IntegerField(default=0, help_text='\u7167\u7247\u6c34\u5370\u56fe\u9ad8\u5ea6', verbose_name='photo_watermark_h'),  | 
            |
| 58 | 
                + ),  | 
            |
| 59 | 
                + migrations.AddField(  | 
            |
| 60 | 
                + model_name='photouuidinfo',  | 
            |
| 61 | 
                + name='photo_watermark_path',  | 
            |
| 62 | 
                + 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='photo_watermark_path', blank=True),  | 
            |
| 63 | 
                + ),  | 
            |
| 64 | 
                + migrations.AddField(  | 
            |
| 65 | 
                + model_name='photouuidinfo',  | 
            |
| 66 | 
                + name='photo_watermark_w',  | 
            |
| 67 | 
                + field=models.IntegerField(default=0, help_text='\u7167\u7247\u6c34\u5370\u56fe\u5bbd\u5ea6', verbose_name='photo_watermark_w'),  | 
            |
| 68 | 
                + ),  | 
            |
| 69 | 
                + ]  | 
            
                @@ -29,7 +29,22 @@ class UUIDInfo(CreateUpdateMixin):  | 
            ||
| 29 | 29 | 
                 | 
            
| 30 | 30 | 
                class PhotoUUIDInfo(CreateUpdateMixin):  | 
            
| 31 | 31 | 
                photo_md5 = models.CharField(_(u'photo_md5'), max_length=255, blank=True, null=True, help_text=u'照片唯一标识', db_index=True, unique=True)  | 
            
| 32 | 
                +  | 
            |
| 32 | 33 | 
                photo_path = models.CharField(_(u'photo_path'), max_length=255, blank=True, null=True, help_text=u'照片路径')  | 
            
| 34 | 
                + photo_w = models.IntegerField(_(u'photo_w'), default=0, help_text=u'照片宽度')  | 
            |
| 35 | 
                + photo_h = models.IntegerField(_(u'photo_h'), default=0, help_text=u'照片高度')  | 
            |
| 36 | 
                +  | 
            |
| 37 | 
                + photo_watermark_path = models.CharField(_(u'photo_watermark_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径,Box上传,有水印,服务器添加')  | 
            |
| 38 | 
                + photo_watermark_w = models.IntegerField(_(u'photo_watermark_w'), default=0, help_text=u'照片水印图宽度')  | 
            |
| 39 | 
                + photo_watermark_h = models.IntegerField(_(u'photo_watermark_h'), default=0, help_text=u'照片水印图高度')  | 
            |
| 40 | 
                +  | 
            |
| 41 | 
                + photo_thumbnail_path = models.CharField(_(u'photo_thumbnail_path'), max_length=255, blank=True, null=True, help_text=u'照片缩略图存放路径')  | 
            |
| 42 | 
                + photo_thumbnail_w = models.IntegerField(_(u'photo_thumbnail_w'), default=0, help_text=u'照片缩略图宽度')  | 
            |
| 43 | 
                + photo_thumbnail_h = models.IntegerField(_(u'photo_thumbnail_h'), default=0, help_text=u'照片缩略图高度')  | 
            |
| 44 | 
                +  | 
            |
| 45 | 
                + photo_thumbnail2_path = models.CharField(_(u'photo_thumbnail2_path'), max_length=255, blank=True, null=True, help_text=u'照片缩略图存放路径')  | 
            |
| 46 | 
                + photo_thumbnail2_w = models.IntegerField(_(u'photo_thumbnail2_w'), default=0, help_text=u'照片缩略图宽度')  | 
            |
| 47 | 
                + photo_thumbnail2_h = models.IntegerField(_(u'photo_thumbnail2_h'), default=0, help_text=u'照片缩略图高度')  | 
            |
| 33 | 48 | 
                 | 
            
| 34 | 49 | 
                class Meta:  | 
            
| 35 | 50 | 
                         verbose_name = _('photouuidinfo')
               | 
            
                @@ -91,21 +91,14 @@ def upload_photo(request):  | 
            ||
| 91 | 91 | 
                except LensmanInfo.DoesNotExist:  | 
            
| 92 | 92 | 
                return response(LensmanStatusCode.LENSMAN_NOT_FOUND)  | 
            
| 93 | 93 | 
                 | 
            
| 94 | 
                - m_photo_path, ext = file_save(photo, prefix='photo', ext='jpeg')  | 
            |
| 95 | 
                -  | 
            |
| 96 | 
                -    p_photo_path = 'photo/{}{}'.format(shortuuid.uuid(), ext)
               | 
            |
| 97 | 
                - watermark_wrap(  | 
            |
| 98 | 
                -        os.path.join(settings.MEDIA_ROOT, m_photo_path).replace('\\', '/'),
               | 
            |
| 99 | 
                - settings.WATERMARK_LOGO,  | 
            |
| 100 | 
                -        os.path.join(settings.MEDIA_ROOT, p_photo_path).replace('\\', '/')
               | 
            |
| 101 | 
                - )  | 
            |
| 94 | 
                + photo_info = file_save(photo, prefix='photo', ext='jpeg', watermark=True)  | 
            |
| 102 | 95 | 
                 | 
            
| 103 | 96 | 
                photo, created = PhotosInfo.objects.get_or_create(  | 
            
| 104 | 97 | 
                lensman_id=lensman_id,  | 
            
| 105 | 98 | 
                session_id=session_id,  | 
            
| 106 | 99 | 
                photo_id=photo_id,  | 
            
| 107 | 
                - p_photo_path=p_photo_path,  | 
            |
| 108 | 
                - m_photo_path=m_photo_path,  | 
            |
| 100 | 
                + p_photo_path=photo_info.photo_watermark_path,  | 
            |
| 101 | 
                + m_photo_path=photo_info.photo_path,  | 
            |
| 109 | 102 | 
                )  | 
            
| 110 | 103 | 
                 | 
            
| 111 | 104 | 
                return response(200, 'Photo Upload Success', u'照片上传成功', photo.data)  | 
            
                @@ -29,7 +29,7 @@ mock==2.0.0  | 
            ||
| 29 | 29 | 
                pep8==1.7.0  | 
            
| 30 | 30 | 
                pywe-oauth==1.0.2  | 
            
| 31 | 31 | 
                records==0.4.3  | 
            
| 32 | 
                -redis-extensions==1.0.36  | 
            |
| 32 | 
                +redis-extensions==1.0.37  | 
            |
| 33 | 33 | 
                requests==2.12.4  | 
            
| 34 | 34 | 
                rlog==0.2  | 
            
| 35 | 35 | 
                shortuuid==0.4.3  | 
            
                @@ -3,26 +3,94 @@  | 
            ||
| 3 | 3 | 
                import os  | 
            
| 4 | 4 | 
                 | 
            
| 5 | 5 | 
                import shortuuid  | 
            
| 6 | 
                +from django.conf import settings  | 
            |
| 6 | 7 | 
                from django.core.files.storage import default_storage  | 
            
| 7 | 8 | 
                from django.db import transaction  | 
            
| 8 | 9 | 
                from filemd5 import calculate_md5  | 
            
| 9 | 10 | 
                 | 
            
| 10 | 11 | 
                from photo.models import PhotoUUIDInfo  | 
            
| 12 | 
                +from utils.thumbnail_utils import make_thumbnail  | 
            |
| 13 | 
                +from utils.watermark_utils import watermark_wrap  | 
            |
| 14 | 
                +  | 
            |
| 15 | 
                +  | 
            |
| 16 | 
                +class DotDict(dict):  | 
            |
| 17 | 
                + """ dot.notation access to dictionary attributes """  | 
            |
| 18 | 
                + def __getattr__(self, attr):  | 
            |
| 19 | 
                + return self.get(attr)  | 
            |
| 20 | 
                + __setattr__ = dict.__setitem__  | 
            |
| 21 | 
                + __delattr__ = dict.__delitem__  | 
            |
| 11 | 22 | 
                 | 
            
| 12 | 23 | 
                 | 
            
| 13 | 24 | 
                @transaction.atomic  | 
            
| 14 | 
                -def file_save(file_, prefix='img', ext='jpeg'):  | 
            |
| 25 | 
                +def file_save(file_, prefix='img', ext='jpeg', watermark=False, thumbnail=False):  | 
            |
| 15 | 26 | 
                ext = os.path.splitext(file_.name)[-1] or ext  | 
            
| 16 | 27 | 
                 | 
            
| 17 | 28 | 
                photo, created = PhotoUUIDInfo.objects.select_for_update().get_or_create(photo_md5=calculate_md5(file_))  | 
            
| 18 | 29 | 
                 | 
            
| 19 | 
                - if not photo.photo_path:  | 
            |
| 20 | 
                -        path = '{}/{}{}'.format(prefix, shortuuid.uuid(), ext)
               | 
            |
| 21 | 
                - if default_storage.exists(path):  | 
            |
| 22 | 
                - default_storage.delete(path)  | 
            |
| 23 | 
                - default_storage.save(path, file_)  | 
            |
| 30 | 
                + photo_path = photo.photo_path  | 
            |
| 31 | 
                + if not photo_path:  | 
            |
| 32 | 
                +        photo_path = '{}/{}{}'.format(prefix, shortuuid.uuid(), ext)
               | 
            |
| 33 | 
                + if default_storage.exists(photo_path):  | 
            |
| 34 | 
                + default_storage.delete(photo_path)  | 
            |
| 35 | 
                + default_storage.save(photo_path, file_)  | 
            |
| 36 | 
                +  | 
            |
| 37 | 
                + photo.photo_path = photo_path  | 
            |
| 38 | 
                + photo.save()  | 
            |
| 39 | 
                +  | 
            |
| 40 | 
                + if watermark:  | 
            |
| 41 | 
                + if not photo.photo_watermark_path:  | 
            |
| 42 | 
                +            photo_watermark_path = 'photo/{}{}'.format(shortuuid.uuid(), ext)
               | 
            |
| 43 | 
                + watermark_wrap(  | 
            |
| 44 | 
                +                os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
               | 
            |
| 45 | 
                + settings.WATERMARK_LOGO,  | 
            |
| 46 | 
                +                os.path.join(settings.MEDIA_ROOT, photo_watermark_path).replace('\\', '/')
               | 
            |
| 47 | 
                + )  | 
            |
| 48 | 
                + photo.photo_watermark_path  | 
            |
| 49 | 
                + photo.save()  | 
            |
| 24 | 50 | 
                 | 
            
| 25 | 
                - photo.photo_path = path  | 
            |
| 51 | 
                + if thumbnail:  | 
            |
| 52 | 
                + if not photo.photo_thumbnail_path:  | 
            |
| 53 | 
                + # 双列: 540, 40-50K  | 
            |
| 54 | 
                +            photo_thumbnail_path = photo_path.replace('.', '_thumbnail.')
               | 
            |
| 55 | 
                + photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail(  | 
            |
| 56 | 
                +                os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
               | 
            |
| 57 | 
                +                os.path.join(settings.MEDIA_ROOT, photo_thumbnail_path).replace('\\', '/'),
               | 
            |
| 58 | 
                + settings.THUMBNAIL_MAX_WIDTH  | 
            |
| 59 | 
                + )  | 
            |
| 60 | 
                + photo.photo_w = photo_w  | 
            |
| 61 | 
                + photo.photo_h = photo_h  | 
            |
| 62 | 
                + photo.photo_thumbnail_path = photo_thumbnail_path  | 
            |
| 63 | 
                + photo.photo_thumbnail_w = photo_thumbnail_w  | 
            |
| 64 | 
                + photo.photo_thumbnail_h = photo_thumbnail_h  | 
            |
| 65 | 
                + if not photo.photo_thumbnail2_path:  | 
            |
| 66 | 
                + # 单列: 1080, xx-100K  | 
            |
| 67 | 
                +            photo_thumbnail2_path = photo_path.replace('.', '_thumbnail2.')
               | 
            |
| 68 | 
                + photo_w, photo_h, photo_thumbnail2_w, photo_thumbnail2_h = make_thumbnail(  | 
            |
| 69 | 
                +                os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
               | 
            |
| 70 | 
                +                os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'),
               | 
            |
| 71 | 
                + settings.THUMBNAIL_MAX_WIDTH2  | 
            |
| 72 | 
                + )  | 
            |
| 73 | 
                + photo.photo_w = photo_w  | 
            |
| 74 | 
                + photo.photo_h = photo_h  | 
            |
| 75 | 
                + photo.photo_thumbnail2_path = photo_thumbnail2_path  | 
            |
| 76 | 
                + photo.photo_thumbnail2_w = photo_thumbnail2_w  | 
            |
| 77 | 
                + photo.photo_thumbnail2_h = photo_thumbnail2_h  | 
            |
| 26 | 78 | 
                photo.save()  | 
            
| 27 | 79 | 
                 | 
            
| 28 | 
                - return photo.photo_path, ext  | 
            |
| 80 | 
                +    return DotDict({
               | 
            |
| 81 | 
                + 'ext': ext,  | 
            |
| 82 | 
                +  | 
            |
| 83 | 
                + 'photo_path': photo_path,  | 
            |
| 84 | 
                + 'photo_w': photo.photo_w,  | 
            |
| 85 | 
                + 'photo_h': photo.photo_h,  | 
            |
| 86 | 
                +  | 
            |
| 87 | 
                + 'photo_watermark_path': photo.photo_watermark_path,  | 
            |
| 88 | 
                +  | 
            |
| 89 | 
                + 'photo_thumbnail_path': photo.photo_thumbnail_path,  | 
            |
| 90 | 
                + 'photo_thumbnail_w': photo.photo_thumbnail_w,  | 
            |
| 91 | 
                + 'photo_thumbnail_h': photo.photo_thumbnail_h,  | 
            |
| 92 | 
                +  | 
            |
| 93 | 
                + 'photo_thumbnail2_path': photo.photo_thumbnail2_path,  | 
            |
| 94 | 
                + 'photo_thumbnail2_w': photo.photo_thumbnail2_w,  | 
            |
| 95 | 
                + 'photo_thumbnail2_h': photo.photo_thumbnail2_h,  | 
            |
| 96 | 
                + })  |