">
return img_url(self.group_avatar)
@property
+ def group_attentions_url(self):
+ return img_url(self.attentions_path)
+
+ @property
+ def group_schedules_url(self):
+ return img_url(self.schedules_path)
+
+ @property
def data(self):
return {
'group_id': self.group_id,
@@ -79,8 +90,10 @@ class GroupInfo(CreateUpdateMixin):
'gather_lon': self.gather_lon,
'gather_lat': self.gather_lat,
'created_at': tc.remove_microsecond(self.created_at),
- # TODO: tour guide upload banners, include travel route, matters need attention, and so on
- 'banners': [],
+ 'banners': {
+ 'attentions': self.group_attentions_url,
+ 'schedules': self.group_schedules_url,
+ },
}
def users(self, admin=True, user_id=None):
@@ -3,12 +3,10 @@ |
||
| 3 | 3 |
from __future__ import division |
| 4 | 4 |
|
| 5 | 5 |
import json |
| 6 |
-import os |
|
| 7 | 6 |
|
| 8 | 7 |
import shortuuid |
| 9 | 8 |
from curtail_uuid import CurtailUUID |
| 10 | 9 |
from django.conf import settings |
| 11 |
-from django.core.files.storage import default_storage |
|
| 12 | 10 |
from django.core.serializers.json import DjangoJSONEncoder |
| 13 | 11 |
from logit import logit |
| 14 | 12 |
from TimeConvert import TimeConvert as tc |
@@ -21,6 +19,7 @@ from utils.redis.rgroup import get_group_info, get_group_users_info, set_group_i |
||
| 21 | 19 |
from utils.redis.rkeys import (TOUR_GUIDE_GROUP_CUR_GATHER_INFO, TOUR_GUIDE_GROUP_CUR_SESSION, |
| 22 | 20 |
TOUR_GUIDE_GROUP_USER_BELONG) |
| 23 | 21 |
from utils.redis.rtourguide import get_tour_guide_own_group, set_tour_guide_own_group |
| 22 |
+from utils.storage_utils import file_save |
|
| 24 | 23 |
|
| 25 | 24 |
|
| 26 | 25 |
r = settings.REDIS_CACHE |
@@ -146,6 +145,9 @@ def tg_group_update_api(request): |
||
| 146 | 145 |
ended_at = tc.utc_string_to_utc_datetime(request.POST.get('ended_at', '')) # UTC, %Y-%m-%dT%H:%M:%SZ
|
| 147 | 146 |
total_persons = request.POST.get('total_persons', '')
|
| 148 | 147 |
|
| 148 |
+ attentions = request.FILES.get('attentions', '')
|
|
| 149 |
+ schedules = request.FILES.get('schedules', '')
|
|
| 150 |
+ |
|
| 149 | 151 |
# 群组校验 |
| 150 | 152 |
try: |
| 151 | 153 |
group = GroupInfo.objects.get(group_id=group_id) |
@@ -164,19 +166,21 @@ def tg_group_update_api(request): |
||
| 164 | 166 |
group.group_desc = group_desc |
| 165 | 167 |
# 群组头像更新 |
| 166 | 168 |
if group_avatar: |
| 167 |
- _, extension = os.path.splitext(group_avatar.name) |
|
| 168 |
- group_avatar_path = 'group/{uuid}_{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
|
|
| 169 |
- if default_storage.exists(group_avatar_path): |
|
| 170 |
- default_storage.delete(group_avatar_path) |
|
| 171 |
- default_storage.save(group_avatar_path, group_avatar) |
|
| 172 |
- group.group_avatar = group_avatar_path |
|
| 169 |
+ group.group_avatar = file_save(group_avatar, prefix='group', ext='jpeg')[0] |
|
| 173 | 170 |
# 起止时间更新 |
| 174 | 171 |
if started_at: |
| 175 | 172 |
group.started_at = started_at |
| 176 | 173 |
if ended_at: |
| 177 | 174 |
group.ended_at = ended_at |
| 175 |
+ # 旅行团总人数更新 |
|
| 178 | 176 |
if total_persons: |
| 179 | 177 |
group.total_persons = total_persons |
| 178 |
+ # 注意事项更新 |
|
| 179 |
+ if attentions: |
|
| 180 |
+ group.attentions = file_save(attentions, prefix='tour', ext='jpeg')[0] |
|
| 181 |
+ # 行程安排更新 |
|
| 182 |
+ if schedules: |
|
| 183 |
+ group.schedules = file_save(schedules, prefix='tour', ext='jpeg')[0] |
|
| 180 | 184 |
group.save() |
| 181 | 185 |
|
| 182 | 186 |
# Redis 群组数据缓存更新 |
@@ -5,10 +5,8 @@ from __future__ import division |
||
| 5 | 5 |
import os |
| 6 | 6 |
import random |
| 7 | 7 |
|
| 8 |
-import shortuuid |
|
| 9 | 8 |
from curtail_uuid import CurtailUUID |
| 10 | 9 |
from django.conf import settings |
| 11 |
-from django.core.files.storage import default_storage |
|
| 12 | 10 |
from django.db import connection, transaction |
| 13 | 11 |
from logit import logit |
| 14 | 12 |
from rest_framework import viewsets |
@@ -32,6 +30,7 @@ from utils.redis.rkeys import (GROUP_LAST_PHOTO_PK, GROUP_PHOTO_WATCHER_SET, GRO |
||
| 32 | 30 |
from utils.redis.rorder import get_lensman_order_record |
| 33 | 31 |
from utils.redis.rprice import get_lensman_price_fixed |
| 34 | 32 |
from utils.sql.raw import PAI2_HOME_API |
| 33 |
+from utils.storage_utils import file_save |
|
| 35 | 34 |
from utils.thumbnail_utils import make_thumbnail |
| 36 | 35 |
from utils.time_utils import origin_expired_stamps |
| 37 | 36 |
from utils.url_utils import img_url, share_url |
@@ -135,12 +134,7 @@ def group_update_api(request): |
||
| 135 | 134 |
group.group_desc = group_desc |
| 136 | 135 |
# 群组头像更新 |
| 137 | 136 |
if group_avatar: |
| 138 |
- _, extension = os.path.splitext(group_avatar.name) |
|
| 139 |
- group_avatar_path = 'group/{uuid}_{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
|
|
| 140 |
- if default_storage.exists(group_avatar_path): |
|
| 141 |
- default_storage.delete(group_avatar_path) |
|
| 142 |
- default_storage.save(group_avatar_path, group_avatar) |
|
| 143 |
- group.group_avatar = group_avatar_path |
|
| 137 |
+ group.group_avatar = file_save(group_avatar, prefix='group', ext='jpeg')[0] |
|
| 144 | 138 |
group.save() |
| 145 | 139 |
|
| 146 | 140 |
# Redis 群组数据缓存更新 |
@@ -260,18 +254,10 @@ def flyimg_upload_api(request): |
||
| 260 | 254 |
return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND) |
| 261 | 255 |
|
| 262 | 256 |
if photo: |
| 263 |
- photo_path = 'fly/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=os.path.splitext(photo.name)[1] or 'jpeg')
|
|
| 257 |
+ photo_path, ext = file_save(photo, prefix='fly', ext='jpeg') |
|
| 264 | 258 |
photo_thumbnail_path = photo_path.replace('.', '_thumbnail.')
|
| 265 | 259 |
photo_thumbnail2_path = photo_path.replace('.', '_thumbnail2.')
|
| 266 | 260 |
|
| 267 |
- if default_storage.exists(photo_path): |
|
| 268 |
- default_storage.delete(photo_path) |
|
| 269 |
- default_storage.save(photo_path, photo) |
|
| 270 |
- |
|
| 271 |
- # if default_storage.exists(photo_thumbnail_path): |
|
| 272 |
- # default_storage.delete(photo_thumbnail_path) |
|
| 273 |
- # default_storage.save(photo_thumbnail_path, photo) |
|
| 274 |
- |
|
| 275 | 261 |
# 群组照片缩略图生成 |
| 276 | 262 |
# 双列: 540, 40-50K |
| 277 | 263 |
photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail( |
@@ -5,7 +5,6 @@ import os |
||
| 5 | 5 |
import shortuuid |
| 6 | 6 |
from curtail_uuid import CurtailUUID |
| 7 | 7 |
from django.conf import settings |
| 8 |
-from django.core.files.storage import default_storage |
|
| 9 | 8 |
from django.db import transaction |
| 10 | 9 |
from django.shortcuts import render |
| 11 | 10 |
from django_q.tasks import async |
@@ -24,6 +23,7 @@ from utils.redis.rgroup import get_group_info, set_group_info, set_group_users_i |
||
| 24 | 23 |
from utils.redis.rkeys import (GROUP_LAST_PHOTO_PK, GROUP_USERS_DELETED_SET, GROUP_USERS_PASSED_SET, |
| 25 | 24 |
GROUP_USERS_QUIT_SET, GROUP_USERS_REFUSED_SET, UUID_LIST) |
| 26 | 25 |
from utils.redis.ruuid import generate_uuids, update_uuids |
| 26 |
+from utils.storage_utils import file_save |
|
| 27 | 27 |
from utils.thumbnail_utils import make_thumbnail |
| 28 | 28 |
from utils.watermark_utils import watermark_wrap |
| 29 | 29 |
|
@@ -93,18 +93,9 @@ def upload_photo(request): |
||
| 93 | 93 |
except LensmanInfo.DoesNotExist: |
| 94 | 94 |
return response(LensmanStatusCode.LENSMAN_NOT_FOUND) |
| 95 | 95 |
|
| 96 |
- # photo_id = curtailUUID(PhotosInfo, 'photo_id') |
|
| 96 |
+ m_photo_path, ext = file_save(photo, prefix='photo', ext='jpeg') |
|
| 97 | 97 |
|
| 98 |
- _, extension = os.path.splitext(photo.name) |
|
| 99 |
- extension = extension or 'jpeg' |
|
| 100 |
- |
|
| 101 |
- m_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
|
|
| 102 |
- |
|
| 103 |
- if default_storage.exists(m_photo_path): |
|
| 104 |
- default_storage.delete(m_photo_path) |
|
| 105 |
- default_storage.save(m_photo_path, photo) |
|
| 106 |
- |
|
| 107 |
- p_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
|
|
| 98 |
+ p_photo_path = 'photo/{}{}'.format(shortuuid.uuid(), ext)
|
|
| 108 | 99 |
watermark_wrap( |
| 109 | 100 |
os.path.join(settings.MEDIA_ROOT, m_photo_path).replace('\\', '/'),
|
| 110 | 101 |
settings.WATERMARK_LOGO, |
@@ -0,0 +1,15 @@ |
||
| 1 |
+# -*- coding: utf-8 -*- |
|
| 2 |
+ |
|
| 3 |
+import os |
|
| 4 |
+ |
|
| 5 |
+import shortuuid |
|
| 6 |
+from django.core.files.storage import default_storage |
|
| 7 |
+ |
|
| 8 |
+ |
|
| 9 |
+def file_save(file_, prefix='img', ext='jpeg'): |
|
| 10 |
+ ext = os.path.splitext(file_.name)[-1] or ext |
|
| 11 |
+ path = '{}/{}{}'.format(prefix, shortuuid.uuid(), ext)
|
|
| 12 |
+ if default_storage.exists(path): |
|
| 13 |
+ default_storage.delete(path) |
|
| 14 |
+ default_storage.save(path, file_) |
|
| 15 |
+ return path, ext |