| @@ -14,7 +14,7 @@ urlpatterns = [ | ||
| 14 | 14 | url(r'^u/login$', account_views.user_login_api, name='user_login_api'), # 用户登录 | 
| 15 | 15 | ] | 
| 16 | 16 |  | 
| 17 | -urlpatterns = [ | |
| 17 | +urlpatterns += [ | |
| 18 | 18 | url(r'^g/create$', group_views.group_create_api, name='group_create_api'), # 群组创建 | 
| 19 | 19 | url(r'^g/detail$', group_views.group_detail_api, name='group_detail_api'), # 群组详情 | 
| 20 | 20 | url(r'^g/update$', group_views.group_update_api, name='group_update_api'), # 群组更新 | 
| @@ -26,6 +26,11 @@ urlpatterns = [ | ||
| 26 | 26 | ] | 
| 27 | 27 |  | 
| 28 | 28 | urlpatterns += [ | 
| 29 | + url(r'^f/upload$', group_views.flyimg_upload_api, name='flyimg_upload_api'), # 飞图上传 | |
| 30 | + url(r'^f/list$', group_views.flyimg_upload_api, name='flyimg_list_api'), # 飞图列表 | |
| 31 | +] | |
| 32 | + | |
| 33 | +urlpatterns += [ | |
| 29 | 34 | url(r'^uuid_init$', photo_views.uuid_init, name='uuid_init'), # 生成唯一标识 | 
| 30 | 35 | url(r'^uuid$', photo_views.uuid, name='uuid'), # 获取唯一标识 | 
| 31 | 36 | url(r'^photos/upload$', photo_views.upload_photo, name='upload_photo'), # 上传图片 | 
| @@ -125,3 +125,11 @@ class GroupPhotoInfo(CreateUpdateMixin): | ||
| 125 | 125 | @property | 
| 126 | 126 | def photo_thumbnail_url(self): | 
| 127 | 127 |          return u'{0}/{1}'.format(settings.IMG_DOMAIN, self.photo_thumbnail_path) if self.photo_thumbnail_path else '' | 
| 128 | + | |
| 129 | + @property | |
| 130 | + def photo_info(self): | |
| 131 | +        return { | |
| 132 | + 'photo_id': self.pk, | |
| 133 | + 'photo_path': self.photo_url, | |
| 134 | + 'photo_thumbnail_path': self.photo_thumbnail_url, | |
| 135 | + } | 
| @@ -1,5 +1,6 @@ | ||
| 1 | 1 | # -*- coding: utf-8 -*- | 
| 2 | 2 |  | 
| 3 | +from django.core.files.storage import default_storage | |
| 3 | 4 | from django.db import transaction | 
| 4 | 5 | from django.http import JsonResponse | 
| 5 | 6 |  | 
| @@ -14,6 +15,9 @@ from utils.ip_utils import ip_addr | ||
| 14 | 15 | from curtail_uuid import CurtailUUID | 
| 15 | 16 | from TimeConvert import TimeConvert as tc | 
| 16 | 17 |  | 
| 18 | +import os | |
| 19 | +import shortuuid | |
| 20 | + | |
| 17 | 21 |  | 
| 18 | 22 | @transaction.atomic | 
| 19 | 23 | def group_create_api(request): | 
| @@ -48,7 +52,7 @@ def group_create_api(request): | ||
| 48 | 52 |          'data': { | 
| 49 | 53 | 'group_id': group_id, | 
| 50 | 54 | 'group': group.data, | 
| 51 | - 'users': group.users(user_id) | |
| 55 | + 'users': group.users(user_id), | |
| 52 | 56 | }, | 
| 53 | 57 | }) | 
| 54 | 58 |  | 
| @@ -79,7 +83,7 @@ def group_detail_api(request): | ||
| 79 | 83 |          'data': { | 
| 80 | 84 | 'group_id': group_id, | 
| 81 | 85 | 'group': group.data, | 
| 82 | - 'users': group.users(user_id) | |
| 86 | + 'users': group.users(user_id), | |
| 83 | 87 | }, | 
| 84 | 88 | }) | 
| 85 | 89 |  | 
| @@ -122,7 +126,7 @@ def group_update_api(request): | ||
| 122 | 126 |          'data': { | 
| 123 | 127 | 'group_id': group_id, | 
| 124 | 128 | 'group': group.data, | 
| 125 | - 'users': group.users(admin_id) | |
| 129 | + 'users': group.users(admin_id), | |
| 126 | 130 | }, | 
| 127 | 131 | }) | 
| 128 | 132 |  | 
| @@ -256,7 +260,7 @@ def group_remove_api(request): | ||
| 256 | 260 | 'message': u'用户移除成功', | 
| 257 | 261 |          'data': { | 
| 258 | 262 | 'group_id': group_id, | 
| 259 | - 'users': group.users(admin_id) | |
| 263 | + 'users': group.users(admin_id), | |
| 260 | 264 | }, | 
| 261 | 265 | }) | 
| 262 | 266 |  | 
| @@ -310,7 +314,7 @@ def group_pass_api(request): | ||
| 310 | 314 | 'message': u'申请通过成功', | 
| 311 | 315 |          'data': { | 
| 312 | 316 | 'group_id': group_id, | 
| 313 | - 'users': group.users(admin_id) | |
| 317 | + 'users': group.users(admin_id), | |
| 314 | 318 | }, | 
| 315 | 319 | }) | 
| 316 | 320 |  | 
| @@ -364,11 +368,73 @@ def group_refuse_api(request): | ||
| 364 | 368 | 'message': u'申请拒绝成功', | 
| 365 | 369 |          'data': { | 
| 366 | 370 | 'group_id': group_id, | 
| 367 | - 'users': group.users(admin_id) | |
| 371 | + 'users': group.users(admin_id), | |
| 368 | 372 | }, | 
| 369 | 373 | }) | 
| 370 | 374 |  | 
| 371 | 375 |  | 
| 376 | +def flyimg_upload_api(request): | |
| 377 | +    group_id = request.POST.get('group_id', '') | |
| 378 | +    user_id = request.POST.get('user_id', '') | |
| 379 | +    nickname = request.POST.get('nickname', '') | |
| 380 | + | |
| 381 | +    photo = request.FILES.get('photo', '') | |
| 382 | + | |
| 383 | +    photo_id = int(request.POST.get('photo_id', -1)) | |
| 384 | + | |
| 385 | + try: | |
| 386 | + user = UserInfo.objects.get(user_id=user_id) | |
| 387 | + except UserInfo.DoesNotExist: | |
| 388 | +        return JsonResponse({ | |
| 389 | + 'status': 4011, | |
| 390 | + 'message': u'用户不存在', | |
| 391 | + }) | |
| 392 | + | |
| 393 | + try: | |
| 394 | + group = GroupInfo.objects.get(group_id=group_id) | |
| 395 | + except GroupInfo.DoesNotExist: | |
| 396 | +        return JsonResponse({ | |
| 397 | + 'status': 4020, | |
| 398 | + 'message': u'群组不存在', | |
| 399 | + }) | |
| 400 | + | |
| 401 | + if photo: | |
| 402 | + _, extension = os.path.splitext(photo.name) | |
| 403 | + | |
| 404 | + uuid = shortuuid.uuid() | |
| 405 | +        photo_path = 'fly/{uuid}{extension}'.format(uuid=uuid, extension=extension) | |
| 406 | +        photo_thumbnail_path = 'fly/{uuid}_thumbnail{extension}'.format(uuid=uuid, extension=extension) | |
| 407 | + | |
| 408 | + if default_storage.exists(photo_path): | |
| 409 | + default_storage.delete(photo_path) | |
| 410 | + default_storage.save(photo_path, photo) | |
| 411 | + | |
| 412 | + if default_storage.exists(photo_thumbnail_path): | |
| 413 | + default_storage.delete(photo_thumbnail_path) | |
| 414 | + default_storage.save(photo_thumbnail_path, photo) | |
| 415 | + | |
| 416 | + group_photo = GroupPhotoInfo.objects.create( | |
| 417 | + group_id=group_id, | |
| 418 | + user_id=user_id, | |
| 419 | + nickname=nickname, | |
| 420 | + photo_path=photo_path, | |
| 421 | + photo_thumbnail_path=photo_thumbnail_path, | |
| 422 | + ) | |
| 423 | + | |
| 424 | + group_photos = GroupPhotoInfo.objects.filter( | |
| 425 | + group_id=group_id, | |
| 426 | + pk__gt=photo_id, | |
| 427 | + ).order_by( | |
| 428 | + 'created_at' | |
| 429 | + ) | |
| 430 | + | |
| 431 | +    return JsonResponse({ | |
| 432 | + 'status': 200, | |
| 433 | + 'message': u'飞图上传成功', | |
| 434 | + 'data': [photo.photo_info for photo in group_photos], | |
| 435 | + }) | |
| 436 | + | |
| 437 | + | |
| 372 | 438 | class GroupInfoViewSet(viewsets.ModelViewSet): | 
| 373 | 439 |      queryset = GroupInfo.objects.all().order_by('-created_at') | 
| 374 | 440 | serializer_class = GroupInfoSerializer | 
| @@ -123,7 +123,7 @@ def session_detail_api(request, session): | ||
| 123 | 123 | 'message': u'获取照片列表成功', | 
| 124 | 124 |          'data': { | 
| 125 | 125 | 'count': photos.count(), | 
| 126 | - 'photos': [p.detail for p in photos] | |
| 126 | + 'photos': [p.detail for p in photos], | |
| 127 | 127 | } | 
| 128 | 128 | }) | 
| 129 | 129 |  | 
| @@ -144,7 +144,7 @@ def photo_standard_api(request, photo): | ||
| 144 | 144 | 'status': 200, | 
| 145 | 145 | 'message': u'获取照片详情成功', | 
| 146 | 146 |          'data': { | 
| 147 | - 'photo': photo.detail | |
| 147 | + 'photo': photo.detail, | |
| 148 | 148 | } | 
| 149 | 149 | }) | 
| 150 | 150 |  |