add api message_list_api/message_type_list_api/message_read_api

Brightcells 9 年之前
父節點
當前提交
30daca135b
共有 12 個文件被更改,包括 265 次插入2 次删除
  1. 14 0
      api/urls.py
  2. 4 1
      docs/errorcode
  3. 38 0
      group/views.py
  4. 0 0
      message/__init__.py
  5. 3 0
      message/admin.py
  6. 36 0
      message/migrations/0001_initial.py
  7. 0 0
      message/migrations/__init__.py
  8. 68 0
      message/models.py
  9. 3 0
      message/tests.py
  10. 73 0
      message/views.py
  11. 11 1
      pai2/settings.py
  12. 15 0
      utils/page_utils.py

+ 14 - 0
api/urls.py

@@ -4,10 +4,12 @@ from django.conf.urls import url
4 4
 
5 5
 from account import views as account_views
6 6
 from group import views as group_views
7
+from message import views as message_views
7 8
 from photo import views as photo_views
8 9
 from operation import views as op_views
9 10
 
10 11
 
12
+# 帐户相关
11 13
 urlpatterns = [
12 14
     url(r'^login$', account_views.lesman_login_api, name='lesman_login_api'),  # 摄影师登录
13 15
     url(r'^u/is_registered$', account_views.user_is_registered_api, name='user_is_registered_api'),  # 用户是否已经注册
@@ -17,6 +19,7 @@ urlpatterns = [
17 19
     url(r'^u/wx/authorize$', account_views.wx_authorize_api, name='wx_authorize_api'),  # 微信用户授权
18 20
 ]
19 21
 
22
+# 群组相关
20 23
 urlpatterns += [
21 24
     url(r'^g/create$', group_views.group_create_api, name='group_create_api'),  # 群组创建
22 25
     url(r'^g/detail$', group_views.group_detail_api, name='group_detail_api'),  # 群组详情
@@ -30,6 +33,7 @@ urlpatterns += [
30 33
     url(r'^g/refuse$', group_views.group_refuse_api, name='group_refuse_api'),  # 申请拒绝
31 34
 ]
32 35
 
36
+# 飞图相关
33 37
 urlpatterns += [
34 38
     url(r'^f/upload$', group_views.flyimg_upload_api, name='flyimg_upload_api'),  # 飞图上传
35 39
     url(r'^f/list$', group_views.flyimg_upload_api, name='flyimg_list_api'),  # 飞图列表
@@ -40,17 +44,27 @@ urlpatterns += [
40 44
     url(r'^f/thumbup/cancel$', group_views.thumbup_cancel_api, name='thumbup_cancel_api'),  # 飞图点赞取消
41 45
 ]
42 46
 
47
+# 消息相关
48
+urlpatterns += [
49
+    url(r'^msg/list$', message_views.message_list_api, name='message_list_api'),  # 消息列表
50
+    url(r'^msg/list/(?P<msg_type>\w+)$', message_views.message_type_list_api, name='message_type_list_api'),  # 分类消息列表
51
+    url(r'^msg/read$', message_views.message_read_api, name='message_read_api'),  # 消息读取
52
+]
53
+
54
+# 控制器相关
43 55
 urlpatterns += [
44 56
     url(r'^uuid_init$', photo_views.uuid_init, name='uuid_init'),  # 生成唯一标识
45 57
     url(r'^uuid$', photo_views.uuid, name='uuid'),  # 获取唯一标识
46 58
     url(r'^photos/upload$', photo_views.upload_photo, name='upload_photo'),  # 上传图片
47 59
 ]
48 60
 
61
+# 二维码相关
49 62
 urlpatterns += [
50 63
     url(r'^s/(?P<session>\w+)$', photo_views.session_detail_api, name='session_detail_api'),  # Session 详情
51 64
     url(r'^p/(?P<photo>\w+)$', photo_views.photo_standard_api, name='photo_standard_api'),  # standard thumbnail, available for free
52 65
 ]
53 66
 
67
+# 系统相关
54 68
 urlpatterns += [
55 69
     url(r'^op/upgrade$', op_views.upgrade_api, name='upgrade_api'),  # APP 升级
56 70
     url(r'^op/splash$', op_views.splash_api, name='splash_api'),  # 启动页面

+ 4 - 1
docs/errorcode

@@ -27,4 +27,7 @@
27 27
     4029 —— 该用户不在群组
28 28
 
29 29
 4、飞图信息 —— 403
30
-    4030 —— 飞图不存在
30
+    4030 —— 飞图不存在
31
+
32
+5、消息相关 —— 409
33
+    4091 —— 消息不存在

+ 38 - 0
group/views.py

@@ -9,6 +9,8 @@ from rest_framework import viewsets
9 9
 
10 10
 from account.models import UserInfo
11 11
 from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo, PhotoCommentInfo, PhotoThumbUpInfo
12
+from message.models import UserMessageInfo
13
+
12 14
 from group.serializers import GroupInfoSerializer, GroupUserInfoSerializer, GroupPhotoInfoSerializer
13 15
 
14 16
 from utils.thumbnail_utils import make_thumb
@@ -556,6 +558,18 @@ def comment_submit_api(request):
556 558
             comment=comment,
557 559
         )
558 560
 
561
+        UserMessageInfo.objects.create(
562
+            from_uid=user_id,
563
+            from_nickname=group_user.nickname,
564
+            from_avatar=group_user.avatar,
565
+            to_uid=group_photo.user_id,
566
+            group_id=group_photo.group_id,
567
+            photo_id=group_photo.pk,
568
+            msg_type=UserMessageInfo.COMMENT,
569
+            msg_title=u'评论',
570
+            msg_content=comment,
571
+        )
572
+
559 573
     photo_comments = PhotoCommentInfo.objects.filter(
560 574
         photo_id=photo_id,
561 575
     )
@@ -611,6 +625,18 @@ def thumbup_submit_api(request):
611 625
     photo_thumbup.thumbup = True
612 626
     photo_thumbup.save()
613 627
 
628
+    UserMessageInfo.objects.create(
629
+        from_uid=user_id,
630
+        from_nickname=group_user.nickname,
631
+        from_avatar=group_user.avatar,
632
+        to_uid=group_photo.user_id,
633
+        group_id=group_photo.group_id,
634
+        photo_id=group_photo.pk,
635
+        msg_type=UserMessageInfo.THUMBUP,
636
+        msg_title=u'点赞',
637
+        msg_content=u'点赞',
638
+    )
639
+
614 640
     photo_thumbups = PhotoThumbUpInfo.objects.filter(
615 641
         photo_id=photo_id,
616 642
         thumbup=True,
@@ -714,6 +740,18 @@ def thumbup_cancel_api(request):
714 740
     photo_thumbup.thumbup = False
715 741
     photo_thumbup.save()
716 742
 
743
+    UserMessageInfo.objects.create(
744
+        from_uid=user_id,
745
+        from_nickname=group_user.nickname,
746
+        from_avatar=group_user.avatar,
747
+        to_uid=group_photo.user_id,
748
+        group_id=group_photo.group_id,
749
+        photo_id=group_photo.pk,
750
+        msg_type=UserMessageInfo.THUMBUP,
751
+        msg_title=u'取消点赞',
752
+        msg_content=u'取消点赞',
753
+    )
754
+
717 755
     photo_thumbups = PhotoThumbUpInfo.objects.filter(
718 756
         photo_id=photo_id,
719 757
         thumbup=True,

+ 0 - 0
message/__init__.py


+ 3 - 0
message/admin.py

@@ -0,0 +1,3 @@
1
+from django.contrib import admin
2
+
3
+# Register your models here.

+ 36 - 0
message/migrations/0001_initial.py

@@ -0,0 +1,36 @@
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
+    ]
11
+
12
+    operations = [
13
+        migrations.CreateModel(
14
+            name='UserMessageInfo',
15
+            fields=[
16
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
17
+                ('status', models.BooleanField(default=True, help_text='\u72b6\u6001', verbose_name='status')),
18
+                ('created_at', models.DateTimeField(help_text='\u521b\u5efa\u65f6\u95f4', verbose_name='created_at', auto_now_add=True)),
19
+                ('updated_at', models.DateTimeField(help_text='\u66f4\u65b0\u65f6\u95f4', verbose_name='updated_at', auto_now=True)),
20
+                ('from_uid', models.CharField(max_length=255, blank=True, help_text='\u53d1\u9001\u6d88\u606f\u7528\u6237\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='from_uid', db_index=True)),
21
+                ('from_nickname', models.CharField(help_text='\u53d1\u9001\u6d88\u606f\u7528\u6237\u6635\u79f0', max_length=255, null=True, verbose_name='from_nickname', blank=True)),
22
+                ('from_avatar', models.CharField(help_text='\u53d1\u9001\u6d88\u606f\u7528\u6237\u5934\u50cf', max_length=255, null=True, verbose_name='from_avatar', blank=True)),
23
+                ('to_uid', models.CharField(max_length=255, blank=True, help_text='\u63a5\u6536\u6d88\u606f\u7528\u6237\u552f\u4e00\u6807\u8bc6', null=True, verbose_name='to_uid', db_index=True)),
24
+                ('group_id', models.CharField(help_text='\u7fa4\u7ec4\u552f\u4e00\u6807\u8bc6', max_length=255, null=True, verbose_name='group_id', blank=True)),
25
+                ('photo_id', models.CharField(help_text='\u98de\u56fe\u552f\u4e00\u6807\u8bc6', max_length=255, null=True, verbose_name='photo_id', blank=True)),
26
+                ('msg_type', models.CharField(default=b'system', help_text='\u6d88\u606f\u7c7b\u578b', max_length=255, verbose_name='msg_type', db_index=True)),
27
+                ('msg_title', models.CharField(help_text='\u6d88\u606f\u6807\u9898', max_length=255, null=True, verbose_name='msg_title', blank=True)),
28
+                ('msg_content', models.TextField(help_text='\u6d88\u606f\u5185\u5bb9', null=True, verbose_name='msg_content', blank=True)),
29
+                ('read', models.BooleanField(default=False, help_text='\u6d88\u606f\u662f\u5426\u5df2\u8bfb', verbose_name='read')),
30
+            ],
31
+            options={
32
+                'verbose_name': 'usermessageinfo',
33
+                'verbose_name_plural': 'usermessageinfo',
34
+            },
35
+        ),
36
+    ]

+ 0 - 0
message/migrations/__init__.py


+ 68 - 0
message/models.py

@@ -0,0 +1,68 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.conf import settings
4
+from django.db import models
5
+from django.utils.translation import ugettext_lazy as _
6
+
7
+from pai2.basemodels import CreateUpdateMixin
8
+
9
+
10
+class UserMessageInfo(CreateUpdateMixin):
11
+    SYSTEM = 'system'
12
+    COMMENT = 'comment'
13
+    THUMBUP = 'thumbup'
14
+
15
+    MESSAGE_TYPE = (
16
+        (SYSTEM, u'系统'),
17
+        (COMMENT, u'评论'),
18
+        (THUMBUP, u'点赞'),
19
+    )
20
+
21
+    MESSAGE_TYPE_INFO = [
22
+        {
23
+            'msg_type': SYSTEM,
24
+            'msg_avatar': settings.SYSTEM_MESSAGE_AVATAR
25
+        }, {
26
+            'msg_type': COMMENT,
27
+            'msg_avatar': settings.COMMENT_MESSAGE_AVATAR
28
+        }, {
29
+            'msg_type': THUMBUP,
30
+            'msg_avatar': settings.THUMBUP_MESSAGE_AVATAR
31
+        }
32
+    ]
33
+
34
+    from_uid = models.CharField(_(u'from_uid'), max_length=255, blank=True, null=True, help_text=u'发送消息用户唯一标识', db_index=True)
35
+    from_nickname = models.CharField(_(u'from_nickname'), max_length=255, blank=True, null=True, help_text=u'发送消息用户昵称')
36
+    from_avatar = models.CharField(_(u'from_avatar'), max_length=255, blank=True, null=True, help_text=u'发送消息用户头像')
37
+
38
+    to_uid = models.CharField(_(u'to_uid'), max_length=255, blank=True, null=True, help_text=u'接收消息用户唯一标识', db_index=True)
39
+
40
+    group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识')
41
+    photo_id = models.CharField(_(u'photo_id'), max_length=255, blank=True, null=True, help_text=u'飞图唯一标识')
42
+
43
+    msg_type = models.CharField(_(u'msg_type'), max_length=255, default='system', help_text=u'消息类型', db_index=True)
44
+    msg_title = models.CharField(_(u'msg_title'), max_length=255, blank=True, null=True, help_text=u'消息标题')
45
+    msg_content = models.TextField(_(u'msg_content'), blank=True, null=True, help_text=u'消息内容')
46
+    read = models.BooleanField(_(u'read'), default=False, help_text=u'消息是否已读')
47
+
48
+    class Meta:
49
+        verbose_name = _('usermessageinfo')
50
+        verbose_name_plural = _('usermessageinfo')
51
+
52
+    def __unicode__(self):
53
+        return u'{0.title}'.format(self)
54
+
55
+    @property
56
+    def msg_info(self):
57
+        return {
58
+            'pk': self.pk,
59
+            'from_uid': self.from_uid,
60
+            'from_nickname': self.from_nickname,
61
+            'from_avatar': self.from_avatar,
62
+            'group_id': self.group_id,
63
+            'photo_id': self.photo_id,
64
+            'msg_title': self.msg_title,
65
+            'msg_content': self.msg_content,
66
+            'read': self.read,
67
+            'created_at': self.created_at,
68
+        }

+ 3 - 0
message/tests.py

@@ -0,0 +1,3 @@
1
+from django.test import TestCase
2
+
3
+# Create your tests here.

+ 73 - 0
message/views.py

@@ -0,0 +1,73 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.conf import settings
4
+from django.http import JsonResponse
5
+
6
+from message.models import UserMessageInfo
7
+
8
+from utils.page_utils import pagination
9
+
10
+
11
+def message_list_api(request):
12
+    messages = UserMessageInfo.MESSAGE_TYPE_INFO
13
+
14
+    final_messages = []
15
+    for message in messages:
16
+        type_messages = UserMessageInfo.objects.filter(
17
+            msg_type=message['msg_type']
18
+        ).order_by(
19
+            '-updated_at'
20
+        )[:settings.MESSAGE_NUM_PER_PAGE]
21
+        type_messages = [msg.msg_info for msg in type_messages]
22
+        message['msg_list'] = type_messages
23
+        final_messages.append(message)
24
+
25
+    return JsonResponse({
26
+        'status': 200,
27
+        'message': u'获取消息列表成功',
28
+        'data': {
29
+            'messages': final_messages,
30
+        },
31
+    })
32
+
33
+
34
+def message_type_list_api(request, msg_type):
35
+    page = int(request.GET.get('page', 1))
36
+    num = int(request.GET.get('num', settings.MESSAGE_NUM_PER_PAGE))
37
+
38
+    type_messages = UserMessageInfo.objects.filter(
39
+        msg_type=msg_type
40
+    ).order_by(
41
+        '-updated_at'
42
+    )
43
+    type_messages, left = pagination(type_messages, page, num)
44
+    type_messages = [msg.msg_info for msg in type_messages]
45
+
46
+    return JsonResponse({
47
+        'status': 200,
48
+        'message': u'获取消息列表成功',
49
+        'data': {
50
+            'messages': type_messages,
51
+            'left': left,
52
+        },
53
+    })
54
+
55
+
56
+def message_read_api(request):
57
+    pk = int(request.GET.get('pk', -1))
58
+
59
+    try:
60
+        message = UserMessageInfo.objects.get(pk=pk)
61
+    except UserMessageInfo.DoesNotExist:
62
+        return JsonResponse({
63
+            'status': 4091,
64
+            'message': u'该消息不存在'
65
+        })
66
+
67
+    message.read = True
68
+    message.save()
69
+
70
+    return JsonResponse({
71
+        'status': 200,
72
+        'message': u'已读消息成功',
73
+    })

+ 11 - 1
pai2/settings.py

@@ -44,8 +44,9 @@ INSTALLED_APPS = (
44 44
     'api',
45 45
     'account',
46 46
     'group',
47
-    'photo',
47
+    'message',
48 48
     'operation',
49
+    'photo',
49 50
 )
50 51
 
51 52
 INSTALLED_APPS += ('multidomain', )
@@ -172,6 +173,15 @@ THUMBNAIL_MAX_WIDTH = 360
172 173
 DOMAIN = 'http://pai.ai'
173 174
 IMG_DOMAIN = 'http://img.pai.ai'
174 175
 
176
+# 消息图片设置
177
+PAI2_LOGO_URL = DOMAIN + '/static/pai2/img/paiai_96_96.png'
178
+
179
+SYSTEM_MESSAGE_AVATAR = PAI2_LOGO_URL
180
+COMMENT_MESSAGE_AVATAR = PAI2_LOGO_URL
181
+THUMBUP_MESSAGE_AVATAR = PAI2_LOGO_URL
182
+
183
+MESSAGE_NUM_PER_PAGE = 10
184
+
175 185
 try:
176 186
     from local_settings import *
177 187
 except ImportError:

+ 15 - 0
utils/page_utils.py

@@ -0,0 +1,15 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.db.models.query import QuerySet
4
+
5
+
6
+def pagination(queryset, page, num=10):
7
+    """
8
+    DIY Pagination Funciton
9
+    :param queryset:
10
+    :param page:
11
+    :param num: the number of query for one page
12
+    :return: the query of the page, the number of query left after the page
13
+    """
14
+    start, end, total = num * (page - 1), num * page, queryset.count() if isinstance(queryset, QuerySet) else len(queryset)
15
+    return queryset[start: end], max(total - end, 0)