309
+
257 310
     return JsonResponse({
258 311
         'status': 200,
259 312
         'message': u'解锁成功',
@@ -261,126 +314,155 @@ def group_unlock_api(request):
261 314
 
262 315
 
263 316
 def group_remove_api(request):
317
+    """
318
+    成员移除
319
+    :param request:
320
+    :return:
321
+    """
264 322
     group_id = request.POST.get('group_id', '')
265 323
     admin_id = request.POST.get('admin_id', '')
266 324
     user_id = request.POST.get('user_id', '')
267 325
 
268
-    try:
269
-        admin = UserInfo.objects.get(user_id=admin_id)
270
-    except UserInfo.DoesNotExist:
271
-        return response(UserStatusCode.USER_NOT_FOUND)
272
-    try:
273
-        user = UserInfo.objects.get(user_id=user_id)
274
-    except UserInfo.DoesNotExist:
275
-        return response(UserStatusCode.USER_NOT_FOUND)
276
-
326
+    # 群组校验
277 327
     try:
278 328
         group = GroupInfo.objects.get(group_id=group_id)
279 329
     except GroupInfo.DoesNotExist:
280 330
         return response(GroupStatusCode.GROUP_NOT_FOUND)
331
+
332
+    # 权限校验
281 333
     if group.admin_id != admin_id:
282
-        return JsonResponse({
283
-            'status': 40222,
284
-            'message': u'没有移除权限',
285
-        })
334
+        return response(GroupStatusCode.NO_REMOVE_PERMISSION)
286 335
 
336
+    # 群组用户校验
287 337
     try:
288 338
         group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
289 339
     except GroupUserInfo.DoesNotExist:
290
-        return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
340
+        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
341
+
342
+    # 群组用户移除
291 343
     group_user.user_status = GroupUserInfo.DELETED
292 344
     group_user.deleted_at = tc.utc_datetime()
293 345
     group_user.save()
294 346
 
347
+    # Redis 群组数据缓存更新
348
+    group_users = set_group_info(group)
349
+
350
+    # Redis 群组删除集合缓存
351
+    r.srem(GROUP_USERS_PASSED_SET % group_id, user_id)
352
+    r.sadd(GROUP_USERS_DELETED_SET % group_id, user_id)
353
+
295 354
     return JsonResponse({
296 355
         'status': 200,
297 356
         'message': u'用户移除成功',
298 357
         'data': {
299 358
             'group_id': group_id,
300
-            'users': group.users(admin_id),
359
+            'users': group_users,
301 360
         },
302 361
     })
303 362
 
304 363
 
305 364
 def group_pass_api(request):
365
+    """
366
+    申请通过
367
+    :param request:
368
+    :return:
369
+    """
306 370
     group_id = request.POST.get('group_id', '')
307 371
     admin_id = request.POST.get('admin_id', '')
308 372
     user_id = request.POST.get('user_id', '')
309 373
 
310
-    try:
311
-        admin = UserInfo.objects.get(user_id=admin_id)
312
-    except UserInfo.DoesNotExist:
313
-        return response(UserStatusCode.USER_NOT_FOUND)
314
-    try:
315
-        user = UserInfo.objects.get(user_id=user_id)
316
-    except UserInfo.DoesNotExist:
317
-        return response(UserStatusCode.USER_NOT_FOUND)
318
-
374
+    # 群组校验
319 375
     try:
320 376
         group = GroupInfo.objects.get(group_id=group_id)
321 377
     except GroupInfo.DoesNotExist:
322 378
         return response(GroupStatusCode.GROUP_NOT_FOUND)
379
+
380
+    # 权限校验
323 381
     if group.admin_id != admin_id:
324 382
         return response(GroupStatusCode.NO_PASS_PERMISSION)
325 383
 
384
+    # 群组用户校验
326 385
     try:
327 386
         group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.APPLYING)
328 387
     except GroupUserInfo.DoesNotExist:
329 388
         return response(GroupStatusCode.JOIN_REQUEST_NOT_FOUND)
389
+
390
+    # 群组用户通过
330 391
     group_user.user_status = GroupUserInfo.PASSED
331 392
     group_user.passed_at = tc.utc_datetime()
332 393
     group_user.save()
333 394
 
395
+    # Redis 群组数据缓存更新
396
+    group_users = set_group_info(group)
397
+
398
+    # Redis 群组通过集合缓存
399
+    r.srem(GROUP_USERS_APPLYING_SET % group_id, user_id)
400
+    r.sadd(GROUP_USERS_PASSED_SET % group_id, user_id)
401
+
334 402
     return JsonResponse({
335 403
         'status': 200,
336 404
         'message': u'申请通过成功',
337 405
         'data': {
338 406
             'group_id': group_id,
339
-            'users': group.users(admin_id),
407
+            'users': group_users,
340 408
         },
341 409
     })
342 410
 
343 411
 
344 412
 def group_refuse_api(request):
413
+    """
414
+    申请拒绝
415
+    :param request:
416
+    :return:
417
+    """
345 418
     group_id = request.POST.get('group_id', '')
346 419
     admin_id = request.POST.get('admin_id', '')
347 420
     user_id = request.POST.get('user_id', '')
348 421
 
349
-    try:
350
-        admin = UserInfo.objects.get(user_id=admin_id)
351
-    except UserInfo.DoesNotExist:
352
-        return response(UserStatusCode.USER_NOT_FOUND)
353
-    try:
354
-        user = UserInfo.objects.get(user_id=user_id)
355
-    except UserInfo.DoesNotExist:
356
-        return response(UserStatusCode.USER_NOT_FOUND)
357
-
422
+    # 群组校验
358 423
     try:
359 424
         group = GroupInfo.objects.get(group_id=group_id)
360 425
     except GroupInfo.DoesNotExist:
361 426
         return response(GroupStatusCode.GROUP_NOT_FOUND)
427
+
428
+    # 权限校验
362 429
     if group.admin_id != admin_id:
363 430
         return response(GroupStatusCode.NO_REFUSE_PERMISSION)
364 431
 
432
+    # 群组用户校验
365 433
     try:
366 434
         group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.APPLYING)
367 435
     except GroupUserInfo.DoesNotExist:
368 436
         return response(GroupStatusCode.JOIN_REQUEST_NOT_FOUND)
437
+
438
+    # 群组用户拒绝
369 439
     group_user.user_status = GroupUserInfo.REFUSED
370 440
     group_user.refused_at = tc.utc_datetime()
371 441
     group_user.save()
372 442
 
443
+    # Redis 群组数据缓存更新
444
+    group_users = set_group_info(group)
445
+
446
+    # Redis 群组拒绝集合缓存
447
+    r.srem(GROUP_USERS_APPLYING_SET % group_id, user_id)
448
+    r.sadd(GROUP_USERS_REFUSED_SET % group_id, user_id)
449
+
373 450
     return JsonResponse({
374 451
         'status': 200,
375 452
         'message': u'申请拒绝成功',
376 453
         'data': {
377 454
             'group_id': group_id,
378
-            'users': group.users(admin_id),
455
+            'users': group_users,
379 456
         },
380 457
     })
381 458
 
382 459
 
383 460
 def flyimg_upload_api(request):
461
+    """
462
+    飞图上传/飞图列表
463
+    :param request:
464
+    :return:
465
+    """
384 466
     group_id = request.POST.get('group_id', '')
385 467
     user_id = request.POST.get('user_id', '')
386 468
     nickname = request.POST.get('nickname', '')
@@ -389,20 +471,17 @@ def flyimg_upload_api(request):
389 471
 
390 472
     current_id = int(request.POST.get('current_id', -1))
391 473
 
474
+    # 用户校验
392 475
     try:
393 476
         user = UserInfo.objects.get(user_id=user_id)
394 477
     except UserInfo.DoesNotExist:
395 478
         return response(UserStatusCode.USER_NOT_FOUND)
396 479
 
397
-    try:
398
-        group = GroupInfo.objects.get(group_id=group_id)
399
-    except GroupInfo.DoesNotExist:
400
-        return response(GroupStatusCode.GROUP_NOT_FOUND)
401
-
480
+    # 群组用户校验
402 481
     try:
403 482
         group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
404 483
     except GroupUserInfo.DoesNotExist:
405
-        return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
484
+        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
406 485
 
407 486
     if photo:
408 487
         _, extension = os.path.splitext(photo.name)
@@ -424,6 +503,7 @@ def flyimg_upload_api(request):
424 503
             settings.THUMBNAIL_MAX_WIDTH
425 504
         )
426 505
 
506
+        # 群组照片记录创建
427 507
         group_photo = GroupPhotoInfo.objects.create(
428 508
             group_id=group_id,
429 509
             user_id=user_id,
@@ -437,6 +517,10 @@ def flyimg_upload_api(request):
437 517
             photo_thumbnail_h=photo_thumbnail_h,
438 518
         )
439 519
 
520
+        # 设置群组最后一张照片PK
521
+        r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk)
522
+
523
+    # 获取从 current_id 到 now 的群组照片列表
440 524
     group_photos = GroupPhotoInfo.objects.filter(
441 525
         group_id=group_id,
442 526
         status=True,
@@ -455,27 +539,30 @@ def flyimg_upload_api(request):
455 539
 
456 540
 
457 541
 def comment_submit_api(request):
542
+    """
543
+    飞图评论提交/飞图评论列表
544
+    :param request:
545
+    :return:
546
+    """
458 547
     group_id = request.POST.get('group_id', '')
459 548
     user_id = request.POST.get('user_id', '')
460 549
     photo_id = request.POST.get('photo_id', '')
461 550
     comment = request.POST.get('comment', '')
462 551
 
463
-    try:
464
-        group = GroupInfo.objects.get(group_id=group_id)
465
-    except GroupInfo.DoesNotExist:
466
-        return response(GroupStatusCode.GROUP_NOT_FOUND)
467
-
552
+    # 群组用户校验
468 553
     try:
469 554
         group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
470 555
     except GroupUserInfo.DoesNotExist:
471
-        return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
556
+        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
472 557
 
558
+    # 群组照片校验
473 559
     try:
474 560
         group_photo = GroupPhotoInfo.objects.get(pk=photo_id)
475 561
     except GroupPhotoInfo.DoesNotExist:
476
-        return response(GroupPhotoStatusCode.MESSAGE_NOT_FOUND)
562
+        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
477 563
 
478 564
     if comment:
565
+        # 群组照片评论记录创建
479 566
         PhotoCommentInfo.objects.create(
480 567
             photo_id=photo_id,
481 568
             user_id=user_id,
@@ -484,21 +571,25 @@ def comment_submit_api(request):
484 571
             comment=comment,
485 572
         )
486 573
 
574
+        # 群组照片评论数更新
487 575
         group_photo.comment_num += 1
488 576
         group_photo.save()
489 577
 
490
-        UserMessageInfo.objects.create(
491
-            from_uid=user_id,
492
-            from_nickname=group_user.nickname,
493
-            from_avatar=group_user.avatar,
494
-            to_uid=group_photo.user_id,
495
-            group_id=group_photo.group_id,
496
-            photo_id=group_photo.pk,
497
-            msg_type=UserMessageInfo.COMMENT,
498
-            msg_title=u'评论',
499
-            msg_content=comment,
500
-        )
501
-
578
+        # 判断群组照片发布者是否已经被管理员移除,如若移除,则不给发布者提醒
579
+        if r.sismember(GROUP_USERS_PASSED_SET % group_photo.group_id, group_photo.user_id):
580
+            UserMessageInfo.objects.create(
581
+                from_uid=user_id,
582
+                from_nickname=group_user.nickname,
583
+                from_avatar=group_user.avatar,
584
+                to_uid=group_photo.user_id,
585
+                group_id=group_photo.group_id,
586
+                photo_id=group_photo.pk,
587
+                msg_type=UserMessageInfo.COMMENT,
588
+                msg_title=u'评论',
589
+                msg_content=comment,
590
+            )
591
+
592
+    # 群组照片评论列表
502 593
     photo_comments = PhotoCommentInfo.objects.filter(
503 594
         photo_id=photo_id,
504 595
     )
@@ -513,25 +604,28 @@ def comment_submit_api(request):
513 604
 
514 605
 
515 606
 def thumbup_submit_api(request):
607
+    """
608
+    飞图点赞提交
609
+    :param request:
610
+    :return:
611
+    """
516 612
     group_id = request.POST.get('group_id', '')
517 613
     user_id = request.POST.get('user_id', '')
518 614
     photo_id = request.POST.get('photo_id', '')
519 615
 
520
-    try:
521
-        group = GroupInfo.objects.get(group_id=group_id)
522
-    except GroupInfo.DoesNotExist:
523
-        return response(GroupStatusCode.GROUP_NOT_FOUND)
524
-
616
+    # 群组用户校验
525 617
     try:
526 618
         group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
527 619
     except GroupUserInfo.DoesNotExist:
528
-        return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
620
+        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
529 621
 
622
+    # 群组照片校验
530 623
     try:
531 624
         group_photo = GroupPhotoInfo.objects.get(pk=photo_id)
532 625
     except GroupPhotoInfo.DoesNotExist:
533
-        return response(GroupPhotoStatusCode.MESSAGE_NOT_FOUND)
626
+        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
534 627
 
628
+    # 群组照片点赞记录创建/更新
535 629
     photo_thumbup, created = PhotoThumbUpInfo.objects.get_or_create(
536 630
         photo_id=photo_id,
537 631
         user_id=user_id,
@@ -541,21 +635,25 @@ def thumbup_submit_api(request):
541 635
     photo_thumbup.thumbup = True
542 636
     photo_thumbup.save()
543 637
 
638
+    # 群组照片点赞数更新
544 639
     group_photo.thumbup_num += 1
545 640
     group_photo.save()
546 641
 
547
-    UserMessageInfo.objects.create(
548
-        from_uid=user_id,
549
-        from_nickname=group_user.nickname,
550
-        from_avatar=group_user.avatar,
551
-        to_uid=group_photo.user_id,
552
-        group_id=group_photo.group_id,
553
-        photo_id=group_photo.pk,
554
-        msg_type=UserMessageInfo.THUMBUP,
555
-        msg_title=u'点赞',
556
-        msg_content=u'点赞',
557
-    )
642
+    # 判断群组照片发布者是否已经被管理员移除,如若移除,则不给发布者提醒
643
+    if r.sismember(GROUP_USERS_PASSED_SET % group_photo.group_id, group_photo.user_id):
644
+        UserMessageInfo.objects.create(
645
+            from_uid=user_id,
646
+            from_nickname=group_user.nickname,
647
+            from_avatar=group_user.avatar,
648
+            to_uid=group_photo.user_id,
649
+            group_id=group_photo.group_id,
650
+            photo_id=group_photo.pk,
651
+            msg_type=UserMessageInfo.THUMBUP,
652
+            msg_title=u'点赞',
653
+            msg_content=u'点赞',
654
+        )
558 655
 
656
+    # 群组照片点赞列表
559 657
     photo_thumbups = PhotoThumbUpInfo.objects.filter(
560 658
         photo_id=photo_id,
561 659
         thumbup=True,
@@ -572,33 +670,22 @@ def thumbup_submit_api(request):
572 670
 
573 671
 
574 672
 def thumbup_list_api(request):
673
+    """
674
+    飞图点赞列表
675
+    :param request:
676
+    :return:
677
+    """
575 678
     group_id = request.POST.get('group_id', '')
576 679
     user_id = request.POST.get('user_id', '')
577 680
     photo_id = request.POST.get('photo_id', '')
578 681
 
579
-    try:
580
-        group = GroupInfo.objects.get(group_id=group_id)
581
-    except GroupInfo.DoesNotExist:
582
-        return response(GroupStatusCode.GROUP_NOT_FOUND)
583
-
584
-    try:
585
-        group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
586
-    except GroupUserInfo.DoesNotExist:
587
-        return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
588
-
589
-    try:
590
-        group_photo = GroupPhotoInfo.objects.get(pk=photo_id)
591
-    except GroupPhotoInfo.DoesNotExist:
592
-        return response(GroupPhotoStatusCode.MESSAGE_NOT_FOUND)
593
-
594
-    try:
595
-        thumbup = PhotoThumbUpInfo.objects.get(
596
-            photo_id=photo_id,
597
-            user_id=user_id,
598
-        ).thumbup
599
-    except PhotoThumbUpInfo.DoesNotExist:
600
-        thumbup = False
682
+    # user_id 是否点赞 photo_id
683
+    thumbup = PhotoThumbUpInfo.objects.filter(
684
+        photo_id=photo_id,
685
+        user_id=user_id,
686
+    ).exists()
601 687
 
688
+    # 群组照片点赞列表
602 689
     photo_thumbups = PhotoThumbUpInfo.objects.filter(
603 690
         photo_id=photo_id,
604 691
         thumbup=True,
@@ -615,25 +702,28 @@ def thumbup_list_api(request):
615 702
 
616 703
 
617 704
 def thumbup_cancel_api(request):
705
+    """
706
+    飞图点赞取消
707
+    :param request:
708
+    :return:
709
+    """
618 710
     group_id = request.POST.get('group_id', '')
619 711
     user_id = request.POST.get('user_id', '')
620 712
     photo_id = request.POST.get('photo_id', '')
621 713
 
622
-    try:
623
-        group = GroupInfo.objects.get(group_id=group_id)
624
-    except GroupInfo.DoesNotExist:
625
-        return response(GroupStatusCode.GROUP_NOT_FOUND)
626
-
714
+    # 群组用户校验
627 715
     try:
628 716
         group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED)
629 717
     except GroupUserInfo.DoesNotExist:
630
-        return response(GroupStatusCode.GROUP_USER_NOT_FOUND)
718
+        return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
631 719
 
720
+    # 群组照片校验
632 721
     try:
633 722
         group_photo = GroupPhotoInfo.objects.get(pk=photo_id)
634 723
     except GroupPhotoInfo.DoesNotExist:
635
-        return response(GroupPhotoStatusCode.MESSAGE_NOT_FOUND)
724
+        return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND)
636 725
 
726
+    # 群组照片点赞取消
637 727
     photo_thumbup, created = PhotoThumbUpInfo.objects.get_or_create(
638 728
         photo_id=photo_id,
639 729
         user_id=user_id,
@@ -641,21 +731,25 @@ def thumbup_cancel_api(request):
641 731
     photo_thumbup.thumbup = False
642 732
     photo_thumbup.save()
643 733
 
734
+    # 群组照片点赞数更新
644 735
     group_photo.thumbup_num -= 1
645 736
     group_photo.save()
646 737
 
647
-    UserMessageInfo.objects.create(
648
-        from_uid=user_id,
649
-        from_nickname=group_user.nickname,
650
-        from_avatar=group_user.avatar,
651
-        to_uid=group_photo.user_id,
652
-        group_id=group_photo.group_id,
653
-        photo_id=group_photo.pk,
654
-        msg_type=UserMessageInfo.THUMBUP,
655
-        msg_title=u'取消点赞',
656
-        msg_content=u'取消点赞',
657
-    )
738
+    # 判断群组照片发布者是否已经被管理员移除,如若移除,则不给发布者提醒
739
+    if r.sismember(GROUP_USERS_PASSED_SET % group_photo.group_id, group_photo.user_id):
740
+        UserMessageInfo.objects.create(
741
+            from_uid=user_id,
742
+            from_nickname=group_user.nickname,
743
+            from_avatar=group_user.avatar,
744
+            to_uid=group_photo.user_id,
745
+            group_id=group_photo.group_id,
746
+            photo_id=group_photo.pk,
747
+            msg_type=UserMessageInfo.THUMBUP,
748
+            msg_title=u'取消点赞',
749
+            msg_content=u'取消点赞',
750
+        )
658 751
 
752
+    # 群组照片点赞列表
659 753
     photo_thumbups = PhotoThumbUpInfo.objects.filter(
660 754
         photo_id=photo_id,
661 755
         thumbup=True,
@@ -672,10 +766,16 @@ def thumbup_cancel_api(request):
672 766
 
673 767
 
674 768
 def pai2_home_api(request):
769
+    """
770
+    首页信息
771
+    :param request:
772
+    :return:
773
+    """
675 774
     user_id = request.POST.get('user_id', '')
676 775
     page = int(request.POST.get('page', 1))
677 776
     num = int(request.POST.get('num', settings.PAI2_HOME_PER_PAGE))
678 777
 
778
+    # 执行原生 SQL 语句,获取首页照片列表
679 779
     cursor = connection.cursor()
680 780
     cursor.execute(PAI2_HOME_API.format(
681 781
         user_id=user_id,
@@ -684,8 +784,10 @@ def pai2_home_api(request):
684 784
     ))
685 785
     rows = cursor.fetchall()
686 786
 
787
+    # 首页照片分页
687 788
     rows, left = pagination(rows, page, num)
688 789
 
790
+    # 首页照片信息
689 791
     rows = [{
690 792
         'group_id': row[0],
691 793
         'group_name': row[1],

+ 16 - 0
message/views.py

@@ -12,6 +12,11 @@ from utils.error.response_utils import response
12 12
 
13 13
 
14 14
 def message_list_api(request):
15
+    """
16
+    消息列表
17
+    :param request:
18
+    :return:
19
+    """
15 20
     user_id = request.POST.get('user_id', '') or request.GET.get('user_id', '')
16 21
 
17 22
     messages = UserMessageInfo.MESSAGE_TYPE_INFO
@@ -38,6 +43,12 @@ def message_list_api(request):
38 43
 
39 44
 
40 45
 def message_type_list_api(request, msg_type):
46
+    """
47
+    分类消息列表
48
+    :param request:
49
+    :param msg_type:
50
+    :return:
51
+    """
41 52
     user_id = request.POST.get('user_id', '') or request.GET.get('user_id', '')
42 53
     page = int(request.POST.get('page', 0) or request.GET.get('page', 0) or 1)
43 54
     num = int(request.POST.get('num', 0) or request.GET.get('num', 0) or settings.MESSAGE_NUM_PER_PAGE)
@@ -62,6 +73,11 @@ def message_type_list_api(request, msg_type):
62 73
 
63 74
 
64 75
 def message_read_api(request):
76
+    """
77
+    消息读取
78
+    :param request:
79
+    :return:
80
+    """
65 81
     pk = int(request.POST.get('pk', 0) or request.GET.get('pk', 0) or -1)
66 82
     user_id = request.POST.get('user_id', '') or request.GET.get('user_id', '')
67 83
 

+ 10 - 0
operation/views.py

@@ -6,6 +6,11 @@ from operation.models import LatestAppInfo, SplashInfo
6 6
 
7 7
 
8 8
 def upgrade_api(request):
9
+    """
10
+    APP 升级
11
+    :param request:
12
+    :return:
13
+    """
9 14
     try:
10 15
         appinfo = LatestAppInfo.objects.all()[0].data
11 16
     except IndexError:
@@ -21,6 +26,11 @@ def upgrade_api(request):
21 26
 
22 27
 
23 28
 def splash_api(request):
29
+    """
30
+    启动页面
31
+    :param request:
32
+    :return:
33
+    """
24 34
     splashes = SplashInfo.objects.all()
25 35
     splashes = [splash.data for splash in splashes]
26 36
 

+ 10 - 0
pay/views.py

@@ -22,6 +22,11 @@ wxpay = WeChatPay(WECHAT['appID'], WECHAT['apiKey'], WECHAT['mchID'])
22 22
 
23 23
 @transaction.atomic
24 24
 def wx_order_create_api(request):
25
+    """
26
+    订单创建
27
+    :param request:
28
+    :return:
29
+    """
25 30
     from_uid = request.POST.get('from_uid', '')
26 31
     to_lid = request.POST.get('to_lid', '')
27 32
     to_uid = request.POST.get('to_uid', '')
@@ -71,6 +76,11 @@ def order_paid_success(order):
71 76
 
72 77
 @transaction.atomic
73 78
 def wx_notify_url_api(request):
79
+    """
80
+    支付异步通知回调地址
81
+    :param request:
82
+    :return:
83
+    """
74 84
     try:
75 85
         data = xmltodict.parse(request.body)['xml']
76 86
     except xmltodict.ParsingInterrupted:

+ 30 - 4
photo/views.py

@@ -19,6 +19,9 @@ from utils.watermark_utils import watermark_wrap
19 19
 from utils.error.errno_utils import PhotoStatusCode
20 20
 from utils.error.response_utils import response
21 21
 
22
+from utils.redis.rkeys import GROUP_LAST_PHOTO_PK
23
+from utils.redis.rgroup import get_group_info, get_group_users_info
24
+
22 25
 from curtail_uuid import CurtailUUID
23 26
 
24 27
 from TimeConvert import TimeConvert as tc
@@ -27,7 +30,15 @@ import os
27 30
 import shortuuid
28 31
 
29 32
 
33
+r = settings.REDIS_CACHE
34
+
35
+
30 36
 def uuid_init(request):
37
+    """
38
+    生成唯一标识
39
+    :param request:
40
+    :return:
41
+    """
31 42
     num = int(request.GET.get('num', 1000))
32 43
 
33 44
     for i in xrange(num):
@@ -43,6 +54,11 @@ def uuid_init(request):
43 54
 # curl -X POST -F user=xxxxxxx -F num=100 http://api.pai.ai/uuid
44 55
 @transaction.atomic
45 56
 def uuid(request):
57
+    """
58
+    获取唯一标识
59
+    :param request:
60
+    :return:
61
+    """
46 62
     lensman_id = request.POST.get('user', '')
47 63
     num = int(request.POST.get('num', 100))
48 64
 
@@ -72,6 +88,11 @@ def uuid(request):
72 88
 #
73 89
 # curl -X POST -F user=xxxxxxx -F session=xxxxxxx -F photo_id=xxxxxxx -F photo=@xxxxxxx.jpg http://api.pai.ai/photos/upload
74 90
 def upload_photo(request):
91
+    """
92
+    上传图片
93
+    :param request:
94
+    :return:
95
+    """
75 96
     lensman_id = request.POST.get('user', '')
76 97
     session_id = request.POST.get('session', '')
77 98
     photo_id = request.POST.get('photo_id', '')
@@ -121,6 +142,12 @@ def upload_photo(request):
121 142
 
122 143
 
123 144
 def session_detail_api(request, session):
145
+    """
146
+    Session 详情
147
+    :param request:
148
+    :param session:
149
+    :return:
150
+    """
124 151
     user_id = request.POST.get('user_id', '')
125 152
 
126 153
     # 判断 user_id 是否存在,如果不存在,则直接分配帐户
@@ -142,9 +169,8 @@ def session_detail_api(request, session):
142 169
     group_id = group.group_id
143 170
 
144 171
     # 判断 group_id/user_id 的群组用户是否存在,如果不存在,则直接创建
145
-    group_photo = GroupPhotoInfo.objects.filter(group_id=group_id).last()
146 172
     group_user = GroupUserInfo.objects.get_or_create(group_id=group_id, user_id=user_id, defaults={
147
-        'current_id': group_photo and group_photo.id or -1,
173
+        'current_id': int(r.get(GROUP_LAST_PHOTO_PK % group_id) or -1),
148 174
         'nickname': user.final_nickname,
149 175
         'admin': False,
150 176
         'user_status': GroupUserInfo.PASSED,
@@ -159,9 +185,9 @@ def session_detail_api(request, session):
159 185
             'count': photos.count(),
160 186
             'photos': [p.detail for p in photos],
161 187
             'group_id': group_id,
162
-            'group': group.data,
188
+            'group': get_group_info(group_id),
163 189
             'user_id': user_id,
164
-            'users': group.users(user_id),
190
+            'users': get_group_users_info(group_id, user_id),
165 191
         }
166 192
     })
167 193
 

+ 0 - 1
utils/error/errno_utils.py

@@ -45,7 +45,6 @@ class GroupStatusCode(BaseStatusCode):
45 45
     NO_REFUSE_PERMISSION = StatusCodeField(402009, u'No Refuse Permission', description=u'没有拒绝权限')
46 46
     DUPLICATE_JOIN_REQUEST = StatusCodeField(402010, u'Duplicate Join Request', description=u'重复加群申请')
47 47
     JOIN_REQUEST_NOT_FOUND = StatusCodeField(402011, u'Join Request Not Found', description=u'加群申请不存在')
48
-    GROUP_USER_NOT_FOUND = StatusCodeField(402012, u'Group User Not Found', description=u'该用户不在群组')
49 48
 
50 49
 
51 50
 class GroupUserStatusCode(BaseStatusCode):

+ 2 - 1
utils/error/response_utils.py

@@ -6,6 +6,7 @@ from django.http import JsonResponse
6 6
 def response(status_code, data={}):
7 7
     return JsonResponse({
8 8
         'status': status_code,
9
-        'message': status_code.description,
9
+        'message': status_code.message,
10
+        'description': status_code.description,
10 11
         'data': data,
11 12
     })

+ 0 - 7
utils/redis/keys.py

@@ -1,7 +0,0 @@
1
-# -*- coding: utf-8 -*-
2
-
3
-# 用户相关
4
-PROFILE_USER_INFO = 'profile:user:info:%s'  # 用户信息,uid
5
-
6
-# 群组相关
7
-GROUP_INFO = 'group:info:%s'  # 群组信息,group_id

+ 33 - 0
utils/redis/retrieve.py

@@ -0,0 +1,33 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.conf import settings
4
+
5
+from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo
6
+
7
+from utils.redis.rkeys import GROUP_USERS_APPLYING_SET, GROUP_USERS_PASSED_SET, GROUP_USERS_REFUSED_SET, GROUP_USERS_DELETED_SET
8
+from utils.redis.rkeys import GROUP_LAST_PHOTO_PK
9
+
10
+
11
+r = settings.REDIS_CACHE
12
+
13
+
14
+def retrieve_redis_data():
15
+    # 群组/群组照片相关
16
+    groups = GroupInfo.objects.filter(status=True)
17
+    for group in groups:
18
+        group_photo = GroupPhotoInfo.objects.filter(group_id=group.group_id).last()
19
+        # 设置群组最后一张照片PK
20
+        r.set(GROUP_LAST_PHOTO_PK % group.group_id, group_photo and group_photo.pk or -1)
21
+
22
+    # 群组用户相关
23
+    group_users = GroupUserInfo.objects.filter(status=True)
24
+    for group_user in group_users:
25
+        group_id, user_id = group_user.group_id, group_user.user_id
26
+        if group_user.user_status == GroupUserInfo.PASSED:
27
+            r.sadd(GROUP_USERS_PASSED_SET % group_id, user_id)
28
+        elif group_user.user_status == GroupUserInfo.DELETED:
29
+            r.sadd(GROUP_USERS_DELETED_SET % group_id, user_id)
30
+        elif group_user.user_status == GroupUserInfo.APPLYING:
31
+            r.sadd(GROUP_USERS_APPLYING_SET % group_id, user_id)
32
+        elif group_user.user_status == GroupUserInfo.REFUSED:
33
+            r.sadd(GROUP_USERS_REFUSED_SET % group_id, user_id)

+ 68 - 0
utils/redis/rgroup.py

@@ -0,0 +1,68 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.conf import settings
4
+from django.core.serializers.json import DjangoJSONEncoder
5
+
6
+from utils.redis.rkeys import GROUP_INFO, GROUP_USERS_INFO, GROUP_LAST_PHOTO_PK
7
+
8
+import json
9
+
10
+
11
+r = settings.REDIS_CACHE
12
+
13
+
14
+# 群组信息相关
15
+
16
+
17
+def set_group_info(group):
18
+    """ 设置群组信息 """
19
+    group_data = group.data
20
+    r.set(GROUP_INFO % group.group_id, json.dumps(group_data, cls=DjangoJSONEncoder))
21
+    return group_data
22
+
23
+
24
+def set_group_info_by_id(group_id):
25
+    """ 设置群组信息 """
26
+    from group.models import GroupInfo
27
+    try:
28
+        group = GroupInfo.objects.get(group_id=group_id)
29
+    except GroupInfo.DoesNotExist:
30
+        return {}
31
+    return set_group_info(group)
32
+
33
+
34
+def get_group_info(group_id):
35
+    """ 获取群组信息 """
36
+    return json.loads(r.get(GROUP_INFO % group_id) or '{}') or set_group_info_by_id(group_id)
37
+
38
+
39
+# 群组用户信息相关
40
+
41
+
42
+def set_group_users_info(group):
43
+    """ 设置群组用户信息 """
44
+    group_users = group.users(admin=False)
45
+    r.set(GROUP_USERS_INFO % group.group_id, json.dumps({
46
+        'group_users': group_users,
47
+        'admin_id': group.admin_id,
48
+    }, cls=DjangoJSONEncoder))
49
+    return group_users
50
+
51
+
52
+def set_group_users_info_by_id(group_id):
53
+    """ 设置群组用户信息 """
54
+    from group.models import GroupInfo
55
+    try:
56
+        group = GroupInfo.objects.get(group_id=group_id)
57
+    except GroupInfo.DoesNotExist:
58
+        return {}
59
+    return set_group_users_info(group)
60
+
61
+
62
+def get_group_users_info(group_id, user_id):
63
+    """ 获取群组用户信息 """
64
+    group_users_data = json.loads(r.get(GROUP_USERS_INFO % group_id) or '{}') or set_group_users_info_by_id(group_id)
65
+    group_users, admin_id = group_users_data.get('group_users', {}), group_users_data.get('admin_id', '')
66
+    if group_users and user_id != admin_id:
67
+        [group_users.pop(k) for k in ['applying_count', 'applying']]
68
+    return group_users

+ 17 - 0
utils/redis/rkeys.py

@@ -0,0 +1,17 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+# 用户相关
4
+PROFILE_INFO = 'profile:info:%s'  # STRING,用户信息,uid
5
+
6
+# 群组相关
7
+GROUP_INFO = 'group:info:%s'  # STRING,群组信息,group_id
8
+
9
+# 群组用户相关
10
+GROUP_USERS_INFO = 'group:users:info:%s'  # STRING,群组用户信息,group_id
11
+GROUP_USERS_APPLYING_SET = 'group:users:applying:set:%s'  # SET,群组用户申请集合,group_id
12
+GROUP_USERS_PASSED_SET = 'group:users:passed:set:%s'  # SET,群组用户通过集合,group_id
13
+GROUP_USERS_REFUSED_SET = 'group:users:refused:set:%s'  # SET,群组用户拒绝集合,group_id
14
+GROUP_USERS_DELETED_SET = 'group:users:deleted:set:%s'  # SET,群组用户移除集合,group_id
15
+
16
+# 群组照片相关
17
+GROUP_LAST_PHOTO_PK = 'group:last:photo:pk:%s'  # STRING,群组最后一张照片PK,group_id

kodo - Gogs: Go Git Service

Sin Descripción

0013_auto_20160711_1436.py 3.2KB

    # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models, migrations import jsonfield.fields class Migration(migrations.Migration): dependencies = [ ('account', '0012_auto_20160627_1419'), ] operations = [ migrations.CreateModel( name='WechatInfo', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('status', models.BooleanField(default=True, help_text='\u72b6\u6001', db_index=True, verbose_name='status')), ('created_at', models.DateTimeField(help_text='\u521b\u5efa\u65f6\u95f4', verbose_name='created_at', auto_now_add=True)), ('updated_at', models.DateTimeField(help_text='\u66f4\u65b0\u65f6\u95f4', verbose_name='updated_at', auto_now=True)), ('unionid', models.CharField(help_text='\u5fae\u4fe1 Union ID', max_length=255, null=True, verbose_name='unionid', blank=True)), ('openids', jsonfield.fields.JSONField(help_text='\u5fae\u4fe1 Open IDs', null=True, verbose_name='openids', blank=True)), ('sex', models.IntegerField(default=1, help_text='\u7528\u6237\u6027\u522b', verbose_name='sex', choices=[(1, '\u7537'), (0, '\u5973')])), ('nickname', models.CharField(help_text='\u7528\u6237\u6635\u79f0', max_length=255, null=True, verbose_name='nickname', blank=True)), ('headimgurl', models.CharField(help_text='\u7528\u6237\u5934\u50cf', max_length=255, null=True, verbose_name='headimgurl', blank=True)), ('country', models.CharField(help_text='\u7528\u6237\u56fd\u5bb6', max_length=255, null=True, verbose_name='country', blank=True)), ('province', models.CharField(help_text='\u7528\u6237\u7701\u4efd', max_length=255, null=True, verbose_name='province', blank=True)), ('city', models.CharField(help_text='\u7528\u6237\u57ce\u5e02', max_length=255, null=True, verbose_name='city', blank=True)), ('location', models.CharField(help_text='\u7528\u6237\u5730\u5740', max_length=255, null=True, verbose_name='location', blank=True)), ], options={ 'verbose_name': 'wechatinfo', 'verbose_name_plural': 'wechatinfo', }, ), migrations.AddField( model_name='lensmaninfo', name='unionid', field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Union ID', unique=True, verbose_name='unionid', db_index=True), ), migrations.AddField( model_name='lensmaninfo', name='user_status', field=models.IntegerField(default=0, verbose_name='user_status', choices=[(0, '\u672a\u9a8c\u8bc1'), (1, '\u5df2\u6fc0\u6d3b'), (2, '\u5df2\u7981\u7528'), (3, '\u5df2\u5220\u9664'), (10, '\u5df2\u5206\u914d')]), ), migrations.AlterField( model_name='userinfo', name='unionid', field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Union ID', unique=True, verbose_name='unionid', db_index=True), ), ]
kodo - Gogs: Go Git Service

Nenhuma Descrição

mch_views.py 13KB

    # -*- coding: utf-8 -*- from __future__ import division from django.conf import settings from django.contrib.auth.hashers import check_password from django.db import transaction from django_logit import logit from django_response import response from pywe_miniapp import get_phone_number from pywe_storage import RedisStorage from TimeConvert import TimeConvert as tc from account.models import UserInfo from mch.models import (ActivityInfo, AdministratorInfo, BrandInfo, ConsumeInfoSubmitLogInfo, DistributorInfo, LatestAppInfo, LatestAppScreenInfo, ModelInfo, OperatorInfo) from statistic.models import ConsumeModelSaleStatisticInfo, ConsumeSaleStatisticInfo, ConsumeUserStatisticInfo from utils.error.errno_utils import (AdministratorStatusCode, OperatorStatusCode, ProductBrandStatusCode, ProductModelStatusCode, UserStatusCode) from utils.redis.connect import r from utils.redis.rkeys import MINI_PROGRAM_GIS_LIST WECHAT = settings.WECHAT @logit def optor_login_api(request): brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) if brand_id != settings.KODO_DEFAULT_BRAND_ID: return response(ProductBrandStatusCode.BRAND_NOT_MATCH) phone = request.POST.get('phone', '') password = request.POST.get('password', '') try: operator = OperatorInfo.objects.get(phone=phone, status=True) except OperatorInfo.DoesNotExist: return response(OperatorStatusCode.OPERATOR_NOT_FOUND) if operator.user_status == OperatorInfo.DISABLED: return response(OperatorStatusCode.OPERATOR_NOT_ACTIVATED) elif operator.user_status == OperatorInfo.DELETED: return response(OperatorStatusCode.OPERATOR_HAS_DELETED) if not check_password(password, operator.encryption): return response(OperatorStatusCode.OPERATOR_PASSWORD_ERROR) return response(200, 'Optor Login Success', u'操作员登录成功', data=operator.kododata) @logit def admin_login_api(request): brand_id = request.POST.get('brand_id', settings.KODO_DEFAULT_BRAND_ID) if brand_id != settings.KODO_DEFAULT_BRAND_ID: return response(ProductBrandStatusCode.BRAND_NOT_MATCH) phone = request.POST.get('phone', '') password = request.POST.get('password', '') try: administrator = AdministratorInfo.objects.get(phone=phone, status=True) except AdministratorInfo.DoesNotExist: return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND) if administrator.user_status == AdministratorInfo.DISABLED: return response(AdministratorStatusCode.ADMINISTRATOR_NOT_ACTIVATED) elif administrator.user_status == AdministratorInfo.DELETED: return response(AdministratorStatusCode.ADMINISTRATOR_HAS_DELETED) if not check_password(password, administrator.encryption): return response(AdministratorStatusCode.ADMINISTRATOR_PASSWORD_ERROR) request.session['admin_id'] = administrator.admin_id return response(200, 'Admin Login Success', u'管理员登录成功', data={ 'admin_id': administrator.admin_id, 'admin_type': administrator.admin_type, 'qrurl': settings.KODO_CLERK_AUTH_URL.format(administrator.brand_id), }) @logit def bmd_infos(request): optor_id = request.POST.get('optor_id', '') try: operator = OperatorInfo.objects.get(operator_id=optor_id, status=True) except OperatorInfo.DoesNotExist: return response(OperatorStatusCode.OPERATOR_NOT_FOUND) if operator.user_status == OperatorInfo.DISABLED: return response(OperatorStatusCode.OPERATOR_NOT_ACTIVATED) brands = BrandInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position') brands = [brand.data for brand in brands] tmpmodels = ModelInfo.objects.filter(brand_id=operator.brand_id, display=True, status=True).order_by('position') models = [model.data for model in tmpmodels] # jancodes = {model.jancode: model.data for model in tmpmodels} distributors = DistributorInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position') distributors = [distributor.data for distributor in distributors] return response(200, data={ 'optor_id': operator.operator_id, 'brands': brands, 'models': models, # 'jancodes': jancodes, 'distributors': distributors, }) @logit def brands_list(request): brands = BrandInfo.objects.filter(status=True).order_by('position') brands = [brand.data for brand in brands] return response(200, data={ 'brands': brands, }) @logit def models_list(request): models = ModelInfo.objects.filter(status=True).order_by('position') models = [model.data for model in models] return response(200, data={ 'models': models, }) @logit def distributors_list(request): distributors = DistributorInfo.objects.filter(status=True).order_by('position') distributors = [distributor.data for distributor in distributors] return response(200, data={ 'distributors': distributors, }) @logit def upgrade_api(request): """ APP 升级 """ src = request.POST.get('src', '') if src == 'datascreen': latestappmodel = LatestAppScreenInfo else: latestappmodel = LatestAppInfo try: appinfo = latestappmodel.objects.filter(status=True)[0].adr except IndexError: appinfo = { 'latest_version_code': '', 'latest_version_name': '', 'latest_url': '', } return response(200, 'Get Latest App Success', u'获取最新版信息成功', { 'appinfo': appinfo, }) def getPhoneNumber(request): user_id = request.POST.get('user_id', '') wxcfg = WECHAT.get('MINIAPP', {}) appid = wxcfg.get('appID') # Just for compatible because of store session_key has changed session_key = None if user_id else RedisStorage(r).get('{0}:{1}:sessionKey'.format(appid, '')) wxcfg = WECHAT.get('MINIAPP', {}) appid = wxcfg.get('appID') secret = wxcfg.get('appsecret') iv = request.POST.get('iv', '') encryptedData = request.POST.get('encryptedData', '') # { # "phoneNumber": "13580006666", # "purePhoneNumber": "13580006666", # "countryCode": "86", # "watermark": # { # "appid": "APPID", # "timestamp": TIMESTAMP # } # } phone_number = get_phone_number(appid=appid, secret=secret, unid=user_id, session_key=session_key, encryptedData=encryptedData, iv=iv, storage=RedisStorage(r)) return phone_number.get('purePhoneNumber', '') @logit(res=True) def consumer_phone_api(request): return response(200, 'Get Consumer Phone Success', u'获取消费者手机号成功', { 'purePhoneNumber': getPhoneNumber(request), }) @logit(res=True) @transaction.atomic def consumer_info_api(request): user_id = request.POST.get('user_id', '') iv = request.POST.get('iv', '') encryptedData = request.POST.get('encryptedData', '') lat = request.POST.get('lat', .0) lon = request.POST.get('lon', .0) brandID = request.POST.get('BrandID', '') modelID = request.POST.get('ModelID', '') distributorID = request.POST.get('DistributorID', '') serialNo = request.POST.get('SerialNo', '') verifyResult = request.POST.get('verifyResult', '') purePhoneNumber = request.POST.get('purePhoneNumber', '') if lat == 'undefined': lat = .0 if lon == 'undefined': lon = .0 purePhoneNumber = purePhoneNumber or getPhoneNumber(request) # 校验用户是否存在 try: user = UserInfo.objects.get(user_id=user_id) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) # 更新用户手机号 user.phone = purePhoneNumber user.save() try: brand = BrandInfo.objects.get(pk=brandID) except BrandInfo.DoesNotExist: brand = None except ValueError: brand = None if not brand: try: brand = BrandInfo.objects.get(brand_id=brandID) except BrandInfo.DoesNotExist: return response(ProductBrandStatusCode.BRAND_NOT_FOUND) try: model = ModelInfo.objects.get(pk=modelID) except ModelInfo.DoesNotExist: return response(ProductModelStatusCode.MODEL_NOT_FOUND) except ValueError: return response(ProductModelStatusCode.MODEL_NOT_FOUND) # try: # distributor = DistributorInfo.objects.get(pk=distributorID) # except DistributorInfo.DoesNotExist: # return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND) # except ValueError: # return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND) dupload = ConsumeInfoSubmitLogInfo.objects.filter( brand_id=brand.brand_id, model_id=model.model_id, # distributor_id=distributor.distributor_id, distributor_id='', serialNo=serialNo, verifyResult=1, test_user=False, ).exists() if dupload: act = None during_activity = False else: act = ActivityInfo.objects.filter(status=True).order_by('-pk').first() during_activity = True if act and act.has_unexpired_activity(model.model_uni_name) else False # 记录用户信息提交记录 log = ConsumeInfoSubmitLogInfo.objects.create( user_id=user_id, phone=purePhoneNumber, iv=iv, encryptedData=encryptedData, lat=lat, lon=lon, brand_id=brand.brand_id, brand_name=brand.brand_name, model_id=model.model_id, model_name=model.model_name, # distributor_id=distributor.distributor_id, # distributor_name=distributor.distributor_name, distributor_id='', distributor_name='', serialNo=serialNo, verifyResult=verifyResult, dupload=dupload, submit_during_activity=during_activity, activity_id=act.pk if during_activity else 0, coupon_expire_at=act.coupon_expire_at if during_activity else None, coupon_value=act.coupon_value if during_activity else 0, test_user=user.test_user, ) if not user.test_user and not dupload: # TODO: Make statistic async ymd = tc.local_string(format='%Y%m%d') cusi, _ = ConsumeUserStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, ymd=ymd, ) cusi.users = list(set(cusi.users + [log.user_id])) cusi.num = len(cusi.users) cusi.save() cusi, _ = ConsumeUserStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, ymd=ymd[:6], ) cusi.users = list(set(cusi.users + [log.user_id])) cusi.num = len(cusi.users) cusi.save() cusi, _ = ConsumeUserStatisticInfo.objects.get_or_create( brand_id=brand.brand_id, ymd=ymd[:4], ) cusi.users = list(set(cusi.users + [log.user_id])) cusi.num = len(cusi.users) cusi.save() # 日销量统计 cssi, _ = ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, ymd=ymd, ) cssi.num += 1 cssi.save() # 月销量统计 cssi, _ = ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, ymd=ymd[:6], ) cssi.num += 1 cssi.save() # 年销量统计 cssi, _ = ConsumeSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, ymd=ymd[:4], ) cssi.num += 1 cssi.save() # 日型号销量统计 cmssi, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, model_name=model.model_uni_name, ymd=ymd, ) cmssi.num += 1 cmssi.save() # 月型号销量统计 cmssi, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, model_name=model.model_uni_name, ymd=ymd[:6], ) cmssi.num += 1 cmssi.save() # 年型号销量统计 cmssi, _ = ConsumeModelSaleStatisticInfo.objects.select_for_update().get_or_create( brand_id=brand.brand_id, model_name=model.model_uni_name, ymd=ymd[:4], ) cmssi.num += 1 cmssi.save() r.rpushjson(MINI_PROGRAM_GIS_LIST, { 'brand_id': log.brand_id, 'user_id': log.user_id, 'lat': log.lat, 'lon': log.lon, 'phone': log.phone, 'ymd': ymd, }) return response(200, 'Submit Consumer Info Success', u'提交消费者信息成功') @logit(res=True) @transaction.atomic def consumer_snlist_api(request): user_id = request.POST.get('user_id', '') # 校验用户是否存在 try: user = UserInfo.objects.get(user_id=user_id) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) # 用户信息提交列表 logs = ConsumeInfoSubmitLogInfo.objects.filter(user_id=user_id, status=True).distinct() seen = set() seen_add = seen.add logs = [log.data for log in logs if not (log.serialNo in seen or seen_add(log.serialNo))] return response(200, 'Get Consumer Submit List Success', u'获取消费者提交列表成功', { 'logs': logs, })