拍爱

views.py 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  1. # -*- coding: utf-8 -*-
  2. from django.conf import settings
  3. from django.core.files.storage import default_storage
  4. from django.db import transaction
  5. from django.http import JsonResponse
  6. from rest_framework import viewsets
  7. from account.models import UserInfo
  8. from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo, PhotoCommentInfo, PhotoThumbUpInfo
  9. from message.models import UserMessageInfo
  10. from group.serializers import GroupInfoSerializer, GroupUserInfoSerializer, GroupPhotoInfoSerializer
  11. from utils.errno_utils import UserStatusCode, GroupStatusCode, GroupPhotoStatusCode
  12. from utils.response_utils import response
  13. from utils.thumbnail_utils import make_thumb
  14. from curtail_uuid import CurtailUUID
  15. from TimeConvert import TimeConvert as tc
  16. import os
  17. import shortuuid
  18. r = settings.REDIS_CACHE
  19. @transaction.atomic
  20. def group_create_api(request):
  21. user_id = request.POST.get('user_id', '')
  22. group_name = request.POST.get('group_name', '')
  23. try:
  24. user = UserInfo.objects.get(user_id=user_id)
  25. except UserInfo.DoesNotExist:
  26. return response(UserStatusCode.USER_NOT_FOUND)
  27. group_id = CurtailUUID.uuid(GroupInfo, 'group_id')
  28. group = GroupInfo.objects.create(
  29. group_id=group_id,
  30. admin_id=user_id,
  31. group_name=group_name,
  32. group_from=GroupInfo.APP_GROUP,
  33. )
  34. GroupUserInfo.objects.create(
  35. group_id=group_id,
  36. user_id=user_id,
  37. nickname=user.final_nickname,
  38. avatar=user.avatar,
  39. admin=True,
  40. user_status=GroupUserInfo.PASSED,
  41. passed_at=tc.utc_datetime(),
  42. )
  43. return JsonResponse({
  44. 'status': 200,
  45. 'message': u'群组创建成功',
  46. 'data': {
  47. 'group_id': group_id,
  48. 'group': group.data,
  49. 'users': group.users(user_id),
  50. },
  51. })
  52. def group_detail_api(request):
  53. group_id = request.POST.get('group_id', '')
  54. user_id = request.POST.get('user_id', '')
  55. try:
  56. user = UserInfo.objects.get(user_id=user_id)
  57. except UserInfo.DoesNotExist:
  58. return response(UserStatusCode.USER_NOT_FOUND)
  59. try:
  60. group = GroupInfo.objects.get(group_id=group_id)
  61. except GroupInfo.DoesNotExist:
  62. return response(GroupStatusCode.GROUP_NOT_FOUND)
  63. # 判断用户是否已被丛群组移除
  64. return JsonResponse({
  65. 'status': 200,
  66. 'message': u'获取群组详情成功',
  67. 'data': {
  68. 'group_id': group_id,
  69. 'group': group.data,
  70. 'users': group.users(user_id),
  71. },
  72. })
  73. def group_update_api(request):
  74. group_id = request.POST.get('group_id', '')
  75. admin_id = request.POST.get('admin_id', '')
  76. group_name = request.POST.get('group_name', '')
  77. group_desc = request.POST.get('group_desc', '')
  78. try:
  79. admin = UserInfo.objects.get(user_id=admin_id)
  80. except UserInfo.DoesNotExist:
  81. return response(UserStatusCode.USER_NOT_FOUND)
  82. try:
  83. group = GroupInfo.objects.get(group_id=group_id)
  84. except GroupInfo.DoesNotExist:
  85. return response(GroupStatusCode.GROUP_NOT_FOUND)
  86. if group.admin_id != admin_id:
  87. return response(GroupStatusCode.NO_UPDATE_PERMISSION)
  88. if group_name:
  89. group.group_name = group_name
  90. if group_desc:
  91. group.group_desc = group_desc
  92. group.save()
  93. return JsonResponse({
  94. 'status': 200,
  95. 'message': u'用户更新成功',
  96. 'data': {
  97. 'group_id': group_id,
  98. 'group': group.data,
  99. 'users': group.users(admin_id),
  100. },
  101. })
  102. def group_list_api(request):
  103. user_id = request.POST.get('user_id', '')
  104. group_users = GroupUserInfo.objects.filter(user_id=user_id)
  105. groups = []
  106. for group_user in group_users:
  107. try:
  108. groups.append(GroupInfo.objects.get(group_id=group_user.group_id).data)
  109. except GroupInfo.DoesNotExist:
  110. pass
  111. return JsonResponse({
  112. 'status': 200,
  113. 'message': u'获取群组列表成功',
  114. 'data': {
  115. 'groups': groups,
  116. },
  117. })
  118. def group_join_api(request):
  119. group_id = request.POST.get('group_id', '')
  120. user_id = request.POST.get('user_id', '')
  121. nickname = request.POST.get('nickname', '')
  122. try:
  123. user = UserInfo.objects.get(user_id=user_id)
  124. except UserInfo.DoesNotExist:
  125. return response(UserStatusCode.USER_NOT_FOUND)
  126. try:
  127. group = GroupInfo.objects.get(group_id=group_id)
  128. except GroupInfo.DoesNotExist:
  129. return response(GroupStatusCode.GROUP_NOT_FOUND)
  130. if group.group_lock:
  131. return response(GroupStatusCode.GROUP_HAS_LOCKED)
  132. if GroupUserInfo.objects.filter(group_id=group_id, user_id=user_id, user_status__in=[GroupUserInfo.APPLYING, GroupUserInfo.PASSED]).exists():
  133. return response(GroupStatusCode.DUPLICATE_JOIN_REQUEST)
  134. group_photo = GroupPhotoInfo.objects.filter(group_id=group_id).last()
  135. GroupUserInfo.objects.create(
  136. group_id=group_id,
  137. user_id=user_id,
  138. current_id=group_photo and group_photo.id or -1,
  139. nickname=nickname or user.final_nickname,
  140. avatar=user.avatar,
  141. admin=False,
  142. user_status=GroupUserInfo.PASSED,
  143. passed_at=tc.utc_datetime(),
  144. )
  145. return JsonResponse({
  146. 'status': 200,
  147. 'message': u'申请已提交',
  148. })
  149. def group_lock_api(request):
  150. group_id = request.POST.get('group_id', '')
  151. user_id = request.POST.get('user_id', '')
  152. try:
  153. user = UserInfo.objects.get(user_id=user_id)
  154. except UserInfo.DoesNotExist:
  155. return response(UserStatusCode.USER_NOT_FOUND)
  156. try:
  157. group = GroupInfo.objects.get(group_id=group_id)
  158. except GroupInfo.DoesNotExist:
  159. return response(GroupStatusCode.GROUP_NOT_FOUND)
  160. if group.admin_id != user_id:
  161. return JsonResponse({
  162. 'status': 40221,
  163. 'message': u'没有锁定权限',
  164. })
  165. group.group_lock = True
  166. group.save()
  167. return JsonResponse({
  168. 'status': 200,
  169. 'message': u'锁定成功',
  170. })
  171. def group_unlock_api(request):
  172. group_id = request.POST.get('group_id', '')
  173. user_id = request.POST.get('user_id', '')
  174. try:
  175. user = UserInfo.objects.get(user_id=user_id)
  176. except UserInfo.DoesNotExist:
  177. return response(UserStatusCode.USER_NOT_FOUND)
  178. try:
  179. group = GroupInfo.objects.get(group_id=group_id)
  180. except GroupInfo.DoesNotExist:
  181. return response(GroupStatusCode.GROUP_NOT_FOUND)
  182. if group.admin_id != user_id:
  183. return response(GroupStatusCode.NO_UNLOCK_PERMISSION)
  184. group.group_lock = False
  185. group.save()
  186. return JsonResponse({
  187. 'status': 200,
  188. 'message': u'解锁成功',
  189. })
  190. def group_remove_api(request):
  191. group_id = request.POST.get('group_id', '')
  192. admin_id = request.POST.get('admin_id', '')
  193. user_id = request.POST.get('user_id', '')
  194. try:
  195. admin = UserInfo.objects.get(user_id=admin_id)
  196. except UserInfo.DoesNotExist:
  197. return response(UserStatusCode.USER_NOT_FOUND)
  198. try:
  199. user = UserInfo.objects.get(user_id=user_id)
  200. except UserInfo.DoesNotExist:
  201. return response(UserStatusCode.USER_NOT_FOUND)
  202. try:
  203. group = GroupInfo.objects.get(group_id=group_id)
  204. except GroupInfo.DoesNotExist:
  205. return response(GroupStatusCode.GROUP_NOT_FOUND)
  206. if group.admin_id != admin_id:
  207. return JsonResponse({
  208. 'status': 40222,
  209. 'message': u'没有移除权限',
  210. })
  211. try:
  212. group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
  213. except GroupUserInfo.DoesNotExist:
  214. return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
  215. group_user.user_status = GroupUserInfo.DELETED
  216. group_user.deleted_at = tc.utc_datetime()
  217. group_user.save()
  218. return JsonResponse({
  219. 'status': 200,
  220. 'message': u'用户移除成功',
  221. 'data': {
  222. 'group_id': group_id,
  223. 'users': group.users(admin_id),
  224. },
  225. })
  226. def group_pass_api(request):
  227. group_id = request.POST.get('group_id', '')
  228. admin_id = request.POST.get('admin_id', '')
  229. user_id = request.POST.get('user_id', '')
  230. try:
  231. admin = UserInfo.objects.get(user_id=admin_id)
  232. except UserInfo.DoesNotExist:
  233. return response(UserStatusCode.USER_NOT_FOUND)
  234. try:
  235. user = UserInfo.objects.get(user_id=user_id)
  236. except UserInfo.DoesNotExist:
  237. return response(UserStatusCode.USER_NOT_FOUND)
  238. try:
  239. group = GroupInfo.objects.get(group_id=group_id)
  240. except GroupInfo.DoesNotExist:
  241. return response(GroupStatusCode.GROUP_NOT_FOUND)
  242. if group.admin_id != admin_id:
  243. return response(GroupStatusCode.NO_PASS_PERMISSION)
  244. try:
  245. group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.APPLYING)
  246. except GroupUserInfo.DoesNotExist:
  247. return response(GroupStatusCode.JOIN_REQUEST_NOT_FOUND)
  248. group_user.user_status = GroupUserInfo.PASSED
  249. group_user.passed_at = tc.utc_datetime()
  250. group_user.save()
  251. return JsonResponse({
  252. 'status': 200,
  253. 'message': u'申请通过成功',
  254. 'data': {
  255. 'group_id': group_id,
  256. 'users': group.users(admin_id),
  257. },
  258. })
  259. def group_refuse_api(request):
  260. group_id = request.POST.get('group_id', '')
  261. admin_id = request.POST.get('admin_id', '')
  262. user_id = request.POST.get('user_id', '')
  263. try:
  264. admin = UserInfo.objects.get(user_id=admin_id)
  265. except UserInfo.DoesNotExist:
  266. return response(UserStatusCode.USER_NOT_FOUND)
  267. try:
  268. user = UserInfo.objects.get(user_id=user_id)
  269. except UserInfo.DoesNotExist:
  270. return response(UserStatusCode.USER_NOT_FOUND)
  271. try:
  272. group = GroupInfo.objects.get(group_id=group_id)
  273. except GroupInfo.DoesNotExist:
  274. return response(GroupStatusCode.GROUP_NOT_FOUND)
  275. if group.admin_id != admin_id:
  276. return response(GroupStatusCode.NO_REFUSE_PERMISSION)
  277. try:
  278. group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.APPLYING)
  279. except GroupUserInfo.DoesNotExist:
  280. return response(GroupStatusCode.JOIN_REQUEST_NOT_FOUND)
  281. group_user.user_status = GroupUserInfo.REFUSED
  282. group_user.refused_at = tc.utc_datetime()
  283. group_user.save()
  284. return JsonResponse({
  285. 'status': 200,
  286. 'message': u'申请拒绝成功',
  287. 'data': {
  288. 'group_id': group_id,
  289. 'users': group.users(admin_id),
  290. },
  291. })
  292. def flyimg_upload_api(request):
  293. group_id = request.POST.get('group_id', '')
  294. user_id = request.POST.get('user_id', '')
  295. nickname = request.POST.get('nickname', '')
  296. photo = request.FILES.get('photo', '')
  297. current_id = int(request.POST.get('current_id', -1))
  298. try:
  299. user = UserInfo.objects.get(user_id=user_id)
  300. except UserInfo.DoesNotExist:
  301. return response(UserStatusCode.USER_NOT_FOUND)
  302. try:
  303. group = GroupInfo.objects.get(group_id=group_id)
  304. except GroupInfo.DoesNotExist:
  305. return response(GroupStatusCode.GROUP_NOT_FOUND)
  306. try:
  307. group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
  308. except GroupUserInfo.DoesNotExist:
  309. return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
  310. if photo:
  311. _, extension = os.path.splitext(photo.name)
  312. uuid = shortuuid.uuid()
  313. photo_path = 'fly/{uuid}{extension}'.format(uuid=uuid, extension=extension)
  314. photo_thumbnail_path = 'fly/{uuid}_thumbnail{extension}'.format(uuid=uuid, extension=extension)
  315. if default_storage.exists(photo_path):
  316. default_storage.delete(photo_path)
  317. default_storage.save(photo_path, photo)
  318. if default_storage.exists(photo_thumbnail_path):
  319. default_storage.delete(photo_thumbnail_path)
  320. default_storage.save(photo_thumbnail_path, photo)
  321. make_thumb(
  322. os.path.join(settings.MEDIA_ROOT, photo_thumbnail_path).replace('\\', '/'),
  323. settings.THUMBNAIL_MAX_WIDTH
  324. )
  325. group_photo = GroupPhotoInfo.objects.create(
  326. group_id=group_id,
  327. user_id=user_id,
  328. nickname=nickname,
  329. photo_path=photo_path,
  330. photo_thumbnail_path=photo_thumbnail_path,
  331. )
  332. group_photos = GroupPhotoInfo.objects.filter(
  333. group_id=group_id,
  334. pk__gt=max(current_id, group_user.current_id),
  335. )
  336. latest_photo = group_photos.last()
  337. return JsonResponse({
  338. 'status': 200,
  339. 'message': u'飞图上传成功',
  340. 'data': {
  341. 'current_id': latest_photo and latest_photo.pk or current_id,
  342. 'photos': [photo.photo_info for photo in group_photos],
  343. }
  344. })
  345. def comment_submit_api(request):
  346. group_id = request.POST.get('group_id', '')
  347. user_id = request.POST.get('user_id', '')
  348. photo_id = request.POST.get('photo_id', '')
  349. comment = request.POST.get('comment', '')
  350. try:
  351. group = GroupInfo.objects.get(group_id=group_id)
  352. except GroupInfo.DoesNotExist:
  353. return response(GroupStatusCode.GROUP_NOT_FOUND)
  354. try:
  355. group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
  356. except GroupUserInfo.DoesNotExist:
  357. return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
  358. try:
  359. group_photo = GroupPhotoInfo.objects.get(pk=photo_id)
  360. except GroupPhotoInfo.DoesNotExist:
  361. return response(GroupPhotoStatusCode.MESSAGE_NOT_FOUND)
  362. if comment:
  363. PhotoCommentInfo.objects.create(
  364. photo_id=photo_id,
  365. user_id=user_id,
  366. nickname=group_user.nickname,
  367. avatar=group_user.avatar,
  368. comment=comment,
  369. )
  370. UserMessageInfo.objects.create(
  371. from_uid=user_id,
  372. from_nickname=group_user.nickname,
  373. from_avatar=group_user.avatar,
  374. to_uid=group_photo.user_id,
  375. group_id=group_photo.group_id,
  376. photo_id=group_photo.pk,
  377. msg_type=UserMessageInfo.COMMENT,
  378. msg_title=u'评论',
  379. msg_content=comment,
  380. )
  381. photo_comments = PhotoCommentInfo.objects.filter(
  382. photo_id=photo_id,
  383. )
  384. return JsonResponse({
  385. 'status': 200,
  386. 'message': u'评论成功',
  387. 'data': {
  388. 'comments': [comment.comment_info for comment in photo_comments],
  389. }
  390. })
  391. def thumbup_submit_api(request):
  392. group_id = request.POST.get('group_id', '')
  393. user_id = request.POST.get('user_id', '')
  394. photo_id = request.POST.get('photo_id', '')
  395. try:
  396. group = GroupInfo.objects.get(group_id=group_id)
  397. except GroupInfo.DoesNotExist:
  398. return response(GroupStatusCode.GROUP_NOT_FOUND)
  399. try:
  400. group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
  401. except GroupUserInfo.DoesNotExist:
  402. return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
  403. try:
  404. group_photo = GroupPhotoInfo.objects.get(pk=photo_id)
  405. except GroupPhotoInfo.DoesNotExist:
  406. return response(GroupPhotoStatusCode.MESSAGE_NOT_FOUND)
  407. photo_thumbup, created = PhotoThumbUpInfo.objects.get_or_create(
  408. photo_id=photo_id,
  409. user_id=user_id,
  410. # defaults={
  411. # 'nickname': group_user.nickname,
  412. # 'avatar': group_user.avatar,
  413. # }
  414. )
  415. photo_thumbup.nickname = group_user.nickname
  416. photo_thumbup.avatar = group_user.avatar
  417. photo_thumbup.thumbup = True
  418. photo_thumbup.save()
  419. UserMessageInfo.objects.create(
  420. from_uid=user_id,
  421. from_nickname=group_user.nickname,
  422. from_avatar=group_user.avatar,
  423. to_uid=group_photo.user_id,
  424. group_id=group_photo.group_id,
  425. photo_id=group_photo.pk,
  426. msg_type=UserMessageInfo.THUMBUP,
  427. msg_title=u'点赞',
  428. msg_content=u'点赞',
  429. )
  430. photo_thumbups = PhotoThumbUpInfo.objects.filter(
  431. photo_id=photo_id,
  432. thumbup=True,
  433. )
  434. return JsonResponse({
  435. 'status': 200,
  436. 'message': u'点赞提交成功',
  437. 'data': {
  438. 'thumbup': True,
  439. 'thumbups': [thumbup.thumbup_info for thumbup in photo_thumbups],
  440. }
  441. })
  442. def thumbup_list_api(request):
  443. group_id = request.POST.get('group_id', '')
  444. user_id = request.POST.get('user_id', '')
  445. photo_id = request.POST.get('photo_id', '')
  446. try:
  447. group = GroupInfo.objects.get(group_id=group_id)
  448. except GroupInfo.DoesNotExist:
  449. return response(GroupStatusCode.GROUP_NOT_FOUND)
  450. try:
  451. group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
  452. except GroupUserInfo.DoesNotExist:
  453. return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
  454. try:
  455. group_photo = GroupPhotoInfo.objects.get(pk=photo_id)
  456. except GroupPhotoInfo.DoesNotExist:
  457. return response(GroupPhotoStatusCode.MESSAGE_NOT_FOUND)
  458. try:
  459. thumbup = PhotoThumbUpInfo.objects.get(
  460. photo_id=photo_id,
  461. user_id=user_id,
  462. ).thumbup
  463. except PhotoThumbUpInfo.DoesNotExist:
  464. thumbup = False
  465. photo_thumbups = PhotoThumbUpInfo.objects.filter(
  466. photo_id=photo_id,
  467. thumbup=True,
  468. )
  469. return JsonResponse({
  470. 'status': 200,
  471. 'message': u'获取点赞列表成功',
  472. 'data': {
  473. 'thumbup': thumbup,
  474. 'thumbups': [thumbup.thumbup_info for thumbup in photo_thumbups],
  475. }
  476. })
  477. def thumbup_cancel_api(request):
  478. group_id = request.POST.get('group_id', '')
  479. user_id = request.POST.get('user_id', '')
  480. photo_id = request.POST.get('photo_id', '')
  481. try:
  482. group = GroupInfo.objects.get(group_id=group_id)
  483. except GroupInfo.DoesNotExist:
  484. return response(GroupStatusCode.GROUP_NOT_FOUND)
  485. try:
  486. group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
  487. except GroupUserInfo.DoesNotExist:
  488. return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
  489. try:
  490. group_photo = GroupPhotoInfo.objects.get(pk=photo_id)
  491. except GroupPhotoInfo.DoesNotExist:
  492. return response(GroupPhotoStatusCode.MESSAGE_NOT_FOUND)
  493. photo_thumbup, created = PhotoThumbUpInfo.objects.get_or_create(
  494. photo_id=photo_id,
  495. user_id=user_id,
  496. )
  497. photo_thumbup.thumbup = False
  498. photo_thumbup.save()
  499. UserMessageInfo.objects.create(
  500. from_uid=user_id,
  501. from_nickname=group_user.nickname,
  502. from_avatar=group_user.avatar,
  503. to_uid=group_photo.user_id,
  504. group_id=group_photo.group_id,
  505. photo_id=group_photo.pk,
  506. msg_type=UserMessageInfo.THUMBUP,
  507. msg_title=u'取消点赞',
  508. msg_content=u'取消点赞',
  509. )
  510. photo_thumbups = PhotoThumbUpInfo.objects.filter(
  511. photo_id=photo_id,
  512. thumbup=True,
  513. )
  514. return JsonResponse({
  515. 'status': 200,
  516. 'message': u'点赞取消成功',
  517. 'data': {
  518. 'thumbup': False,
  519. 'thumbups': [thumbup.thumbup_info for thumbup in photo_thumbups],
  520. }
  521. })
  522. class GroupInfoViewSet(viewsets.ModelViewSet):
  523. queryset = GroupInfo.objects.all().order_by('-pk')
  524. serializer_class = GroupInfoSerializer
  525. class GroupUserInfoViewSet(viewsets.ModelViewSet):
  526. queryset = GroupUserInfo.objects.all().order_by('-pk')
  527. serializer_class = GroupUserInfoSerializer
  528. class GroupPhotoInfoViewSet(viewsets.ModelViewSet):
  529. queryset = GroupPhotoInfo.objects.all().order_by('-pk')
  530. serializer_class = GroupPhotoInfoSerializer