@@ -5,6 +5,7 @@ from __future__ import division |
||
| 5 | 5 |
from curtail_uuid import CurtailUUID |
| 6 | 6 |
from django.contrib.auth.hashers import check_password |
| 7 | 7 |
from django.db import transaction |
| 8 |
+from filemd5 import calculate_md5 |
|
| 8 | 9 |
from isoweek import Week |
| 9 | 10 |
from logit import logit |
| 10 | 11 |
from paginator import pagination |
@@ -184,34 +185,38 @@ def lensman_photo_upload_api(request): |
||
| 184 | 185 |
photo.save() |
| 185 | 186 |
|
| 186 | 187 |
# 写 GroupPhotoInfo 表 |
| 187 |
- group_photo = GroupPhotoInfo.objects.create( |
|
| 188 |
+ group_photo, created = GroupPhotoInfo.objects.get_or_create( |
|
| 188 | 189 |
group_id=group_id, |
| 189 | 190 |
user_id=user_id, |
| 190 |
- nickname=user.final_nickname, |
|
| 191 |
- avatar=user.avatar, |
|
| 192 |
- photo_path=photo_info.photo_path, |
|
| 193 |
- photo_w=photo_info.photo_w, |
|
| 194 |
- photo_h=photo_info.photo_h, |
|
| 195 |
- photo_thumbnail_path=photo_info.photo_thumbnail_path, |
|
| 196 |
- photo_thumbnail_w=photo_info.photo_thumbnail_w, |
|
| 197 |
- photo_thumbnail_h=photo_info.photo_thumbnail_h, |
|
| 198 |
- photo_thumbnail2_path=photo_info.photo_thumbnail2_path, |
|
| 199 |
- photo_thumbnail2_w=photo_info.photo_thumbnail2_w, |
|
| 200 |
- photo_thumbnail2_h=photo_info.photo_thumbnail2_h, |
|
| 201 |
- photo_from=GroupPhotoInfo.SESSION_GROUP, |
|
| 202 |
- session_id=photo.session_id, |
|
| 203 |
- lensman_id=photo.lensman_id, |
|
| 204 |
- lensman_photo_id=photo.photo_id, |
|
| 191 |
+ photo_md5=photo_info.photo_md5, |
|
| 192 |
+ defaults={
|
|
| 193 |
+ 'nickname': user.final_nickname, |
|
| 194 |
+ 'avatar': user.avatar, |
|
| 195 |
+ 'photo_path': photo_info.photo_path, |
|
| 196 |
+ 'photo_w': photo_info.photo_w, |
|
| 197 |
+ 'photo_h': photo_info.photo_h, |
|
| 198 |
+ 'photo_thumbnail_path': photo_info.photo_thumbnail_path, |
|
| 199 |
+ 'photo_thumbnail_w': photo_info.photo_thumbnail_w, |
|
| 200 |
+ 'photo_thumbnail_h': photo_info.photo_thumbnail_h, |
|
| 201 |
+ 'photo_thumbnail2_path': photo_info.photo_thumbnail2_path, |
|
| 202 |
+ 'photo_thumbnail2_w': photo_info.photo_thumbnail2_w, |
|
| 203 |
+ 'photo_thumbnail2_h': photo_info.photo_thumbnail2_h, |
|
| 204 |
+ 'photo_from': GroupPhotoInfo.SESSION_GROUP, |
|
| 205 |
+ 'session_id': photo.session_id, |
|
| 206 |
+ 'lensman_id': photo.lensman_id, |
|
| 207 |
+ 'lensman_photo_id': photo.photo_id, |
|
| 208 |
+ } |
|
| 205 | 209 |
) |
| 206 | 210 |
|
| 207 |
- # 设置群组最后一张照片PK |
|
| 208 |
- r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk) |
|
| 211 |
+ if created: |
|
| 212 |
+ # 设置群组最后一张照片PK |
|
| 213 |
+ r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk) |
|
| 209 | 214 |
|
| 210 |
- # 更新今日上传照片数量 |
|
| 211 |
- r.incr(TODAY_UPLOAD_PHOTO_AMOUNT % (user_id, tc.local_string(format='%Y%m%d'))) |
|
| 215 |
+ # 更新今日上传照片数量 |
|
| 216 |
+ r.incr(TODAY_UPLOAD_PHOTO_AMOUNT % (user_id, tc.local_string(format='%Y%m%d'))) |
|
| 212 | 217 |
|
| 213 |
- # Redis 群组数据缓存 |
|
| 214 |
- set_group_info_by_id(group_id) |
|
| 218 |
+ # Redis 群组数据缓存 |
|
| 219 |
+ set_group_info_by_id(group_id) |
|
| 215 | 220 |
|
| 216 | 221 |
return response(200, 'Lensman Upload Photo Success', u'摄影师照片上传成功', {
|
| 217 | 222 |
'group_id': group_id, |
@@ -0,0 +1,19 @@ |
||
| 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', '0030_groupinfo_gather_location'),
|
|
| 11 |
+ ] |
|
| 12 |
+ |
|
| 13 |
+ operations = [ |
|
| 14 |
+ migrations.AddField( |
|
| 15 |
+ model_name='groupphotoinfo', |
|
| 16 |
+ name='photo_md5', |
|
| 17 |
+ field=models.CharField(max_length=255, blank=True, help_text='\u7167\u7247 MD5', null=True, verbose_name='photo_md5', db_index=True), |
|
| 18 |
+ ), |
|
| 19 |
+ ] |
@@ -213,6 +213,8 @@ class GroupPhotoInfo(CreateUpdateMixin): |
||
| 213 | 213 |
nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称') |
| 214 | 214 |
avatar = models.CharField(_(u'avatar'), max_length=255, blank=True, null=True, help_text=u'用户头像') |
| 215 | 215 |
|
| 216 |
+ photo_md5 = models.CharField(_(u'photo_md5'), max_length=255, blank=True, null=True, help_text=u'照片 MD5', db_index=True) |
|
| 217 |
+ |
|
| 216 | 218 |
photo_path = models.CharField(_(u'photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径') |
| 217 | 219 |
photo_w = models.IntegerField(_(u'photo_w'), default=0, help_text=u'照片宽度') |
| 218 | 220 |
photo_h = models.IntegerField(_(u'photo_h'), default=0, help_text=u'照片高度') |
@@ -285,27 +285,31 @@ def flyimg_upload_api(request): |
||
| 285 | 285 |
photo_info = file_save(photo, prefix='fly', ext='jpeg', thumbnail=True) |
| 286 | 286 |
|
| 287 | 287 |
# 群组照片记录创建 |
| 288 |
- group_photo = GroupPhotoInfo.objects.create( |
|
| 288 |
+ group_photo, created = GroupPhotoInfo.objects.get_or_create( |
|
| 289 | 289 |
group_id=group_id, |
| 290 | 290 |
user_id=user_id, |
| 291 |
- nickname=nickname or user.final_nickname, |
|
| 292 |
- avatar=user.avatar, |
|
| 293 |
- photo_path=photo_info.photo_path, |
|
| 294 |
- photo_w=photo_info.photo_w, |
|
| 295 |
- photo_h=photo_info.photo_h, |
|
| 296 |
- photo_thumbnail_path=photo_info.photo_thumbnail_path, |
|
| 297 |
- photo_thumbnail_w=photo_info.photo_thumbnail_w, |
|
| 298 |
- photo_thumbnail_h=photo_info.photo_thumbnail_h, |
|
| 299 |
- photo_thumbnail2_path=photo_info.photo_thumbnail2_path, |
|
| 300 |
- photo_thumbnail2_w=photo_info.photo_thumbnail2_w, |
|
| 301 |
- photo_thumbnail2_h=photo_info.photo_thumbnail2_h, |
|
| 291 |
+ photo_md5=photo_info.photo_md5, |
|
| 292 |
+ defaults={
|
|
| 293 |
+ 'nickname': nickname or user.final_nickname, |
|
| 294 |
+ 'avatar': user.avatar, |
|
| 295 |
+ 'photo_path': photo_info.photo_path, |
|
| 296 |
+ 'photo_w': photo_info.photo_w, |
|
| 297 |
+ 'photo_h': photo_info.photo_h, |
|
| 298 |
+ 'photo_thumbnail_path': photo_info.photo_thumbnail_path, |
|
| 299 |
+ 'photo_thumbnail_w': photo_info.photo_thumbnail_w, |
|
| 300 |
+ 'photo_thumbnail_h': photo_info.photo_thumbnail_h, |
|
| 301 |
+ 'photo_thumbnail2_path': photo_info.photo_thumbnail2_path, |
|
| 302 |
+ 'photo_thumbnail2_w': photo_info.photo_thumbnail2_w, |
|
| 303 |
+ 'photo_thumbnail2_h': photo_info.photo_thumbnail2_h, |
|
| 304 |
+ } |
|
| 302 | 305 |
) |
| 303 | 306 |
|
| 304 |
- # 设置群组最后一张照片PK |
|
| 305 |
- r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk) |
|
| 307 |
+ if created: |
|
| 308 |
+ # 设置群组最后一张照片PK |
|
| 309 |
+ r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk) |
|
| 306 | 310 |
|
| 307 |
- # Redis 群组数据缓存 |
|
| 308 |
- set_group_info_by_id(group_id) |
|
| 311 |
+ # Redis 群组数据缓存 |
|
| 312 |
+ set_group_info_by_id(group_id) |
|
| 309 | 313 |
|
| 310 | 314 |
curinfo = get_current_photos(group_id, user_id, group_user.current_id, request=request) |
| 311 | 315 |
|
@@ -9,7 +9,7 @@ TimeConvert==1.3.12 |
||
| 9 | 9 |
cryptography==1.5.2 |
| 10 | 10 |
django-curtail-uuid==1.0.0 |
| 11 | 11 |
django-detect==1.0.5 |
| 12 |
-django-file-md5==1.0.0 |
|
| 12 |
+django-file-md5==1.0.1 |
|
| 13 | 13 |
django-ip==1.0.0 |
| 14 | 14 |
django-json-response==1.1.4 |
| 15 | 15 |
django-logit==1.0.6 |
@@ -29,12 +29,14 @@ def file_save(file_=None, file_path=None, prefix='img', ext='jpeg', watermark=Fa |
||
| 29 | 29 |
# Ext |
| 30 | 30 |
ext = os.path.splitext(file_.name)[-1] or ext |
| 31 | 31 |
|
| 32 |
+ # Photo MD5 |
|
| 33 |
+ photo_md5 = calculate_md5(file_) |
|
| 34 |
+ |
|
| 32 | 35 |
# Photo UUID Get or Create |
| 33 |
- photo, created = PhotoUUIDInfo.objects.select_for_update().get_or_create(photo_md5=calculate_md5(file_)) |
|
| 36 |
+ photo, created = PhotoUUIDInfo.objects.select_for_update().get_or_create(photo_md5=photo_md5) |
|
| 34 | 37 |
|
| 35 | 38 |
# 照片路径 |
| 36 |
- photo_path = photo.photo_path |
|
| 37 |
- if not photo_path: |
|
| 39 |
+ if not photo.photo_path: |
|
| 38 | 40 |
photo_path = '{}/{}{}'.format(prefix, shortuuid.uuid(), ext)
|
| 39 | 41 |
if default_storage.exists(photo_path): |
| 40 | 42 |
default_storage.delete(photo_path) |
@@ -88,7 +90,9 @@ def file_save(file_=None, file_path=None, prefix='img', ext='jpeg', watermark=Fa |
||
| 88 | 90 |
return DotDict({
|
| 89 | 91 |
'ext': ext, |
| 90 | 92 |
|
| 91 |
- 'photo_path': photo_path, |
|
| 93 |
+ 'photo_md5': photo_md5, |
|
| 94 |
+ |
|
| 95 |
+ 'photo_path': photo.photo_path, |
|
| 92 | 96 |
'photo_w': photo.photo_w, |
| 93 | 97 |
'photo_h': photo.photo_h, |
| 94 | 98 |
|