@@ -0,0 +1,101 @@
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 GroupInfo(CreateUpdateMixin):
11
+    APP_GROUP = 0
12
+    SESSION_GROUP = 1
13
+
14
+    GROUP_FROM = (
15
+        (APP_GROUP, u'APP 建群'),
16
+        (SESSION_GROUP, u'SESSION 建群'),
17
+    )
18
+
19
+    group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True, unique=True)
20
+    group_name = models.CharField(_(u'group_name'), max_length=255, blank=True, null=True, help_text=u'群组名称')
21
+    group_desc = models.TextField(_(u'group_desc'), blank=True, null=True, help_text=u'群组描述')
22
+    group_from = models.IntegerField(_(u'group_from'), choices=GROUP_FROM, default=APP_GROUP, help_text=u'群组来源')
23
+    session_id = models.CharField(_(u'session_id'), max_length=255, blank=True, null=True, help_text=u'照片组唯一标识', db_index=True)
24
+    group_lock = models.BooleanField(_(u'group_lock'), default=False, help_text=u'群组锁定')
25
+
26
+    class Meta:
27
+        verbose_name = _(u'groupinfo')
28
+        verbose_name_plural = _(u'groupinfo')
29
+
30
+    def __unicode__(self):
31
+        return unicode(self.group_id)
32
+
33
+    @property
34
+    def users(self):
35
+        all_users = GroupUserInfo.objects.filter(group_id=self.group_id)
36
+        applying_users = all_users.filter(user_status=GroupUserInfo.APPLYING)
37
+        passed_users = all_users.filter(user_status=GroupUserInfo.PASSED)
38
+        return {
39
+            'applying_count': applying_users.count(),
40
+            'passed_count': passed_users.count(),
41
+            'applying': [applying.user_info for applying in applying_users],
42
+            'passed': [passed.user_info for passed in passed_users],
43
+        }
44
+
45
+
46
+class GroupUserInfo(CreateUpdateMixin):
47
+    APPLYING = 0
48
+    PASSED = 1
49
+    REFUSED = 2
50
+
51
+    USER_STATUS = (
52
+        (APPLYING, u'申请中'),
53
+        (PASSED, u'已通过'),
54
+        (REFUSED, u'已拒绝'),
55
+    )
56
+
57
+    group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
58
+    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识')
59
+    nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
60
+    admin = models.BooleanField(_(u'admin'), default=False, help_text=u'群组管理员')
61
+    user_status = models.IntegerField(_(u'user_status'), choices=USER_STATUS, default=APPLYING)
62
+    passed_at = models.DateTimeField(_(u'passed_at'), blank=True, null=True, help_text=_(u'通过时间'))
63
+    refused_at = models.DateTimeField(_(u'refused_at'), blank=True, null=True, help_text=_(u'拒绝时间'))
64
+
65
+    class Meta:
66
+        verbose_name = _(u'groupuserinfo')
67
+        verbose_name_plural = _(u'groupuserinfo')
68
+
69
+    def __unicode__(self):
70
+        return unicode(self.pk)
71
+
72
+    @property
73
+    def user_info(self):
74
+        return {
75
+            'user_id': self.user_id,
76
+            'nickname': self.nickname,
77
+            'admin': self.admin,
78
+        }
79
+
80
+
81
+class GroupPhotoInfo(CreateUpdateMixin):
82
+    group_id = models.CharField(_(u'group_id'), max_length=255, blank=True, null=True, help_text=u'群组唯一标识', db_index=True)
83
+    user_id = models.CharField(_(u'user_id'), max_length=255, blank=True, null=True, help_text=u'用户唯一标识')
84
+    nickname = models.CharField(_(u'nickname'), max_length=255, blank=True, null=True, help_text=u'用户群组昵称')
85
+    photo_path = models.CharField(_(u'photo_path'), max_length=255, blank=True, null=True, help_text=u'照片存放路径')
86
+    photo_thumbnail_path = models.CharField(_(u'photo_thumbnail_path'), max_length=255, blank=True, null=True, help_text=u'照片缩略图存放路径')
87
+
88
+    class Meta:
89
+        verbose_name = _(u'groupuserinfo')
90
+        verbose_name_plural = _(u'groupuserinfo')
91
+
92
+    def __unicode__(self):
93
+        return unicode(self.pk)
94
+
95
+    @property
96
+    def photo_url(self):
97
+        return u'{0}/{1}'.format(settings.IMG_DOMAIN, self.photo_path) if self.photo_path else ''
98
+
99
+    @property
100
+    def photo_thumbnail_url(self):
101
+        return u'{0}/{1}'.format(settings.IMG_DOMAIN, self.photo_thumbnail_path) if self.photo_thumbnail_path else ''

+ 23 - 0
group/serializers.py

@@ -0,0 +1,23 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from rest_framework import serializers
4
+
5
+from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo
6
+
7
+
8
+class GroupInfoSerializer(serializers.HyperlinkedModelSerializer):
9
+    class Meta:
10
+        model = GroupInfo
11
+        fields = ('group_id', 'group_name', 'group_desc', 'group_from', 'group_lock', 'status', 'created_at', 'updated_at')
12
+
13
+
14
+class GroupUserInfoSerializer(serializers.HyperlinkedModelSerializer):
15
+    class Meta:
16
+        model = GroupUserInfo
17
+        fields = ('group_id', 'user_id', 'nickname', 'admin', 'user_status', 'passed_at', 'refused_at', 'status', 'created_at', 'updated_at')
18
+
19
+
20
+class GroupPhotoInfoSerializer(serializers.HyperlinkedModelSerializer):
21
+    class Meta:
22
+        model = GroupPhotoInfo
23
+        fields = ('group_id', 'user_id', 'nickname', 'photo_path', 'photo_thumbnail_path', 'status', 'created_at', 'updated_at')

+ 3 - 0
group/tests.py

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

+ 106 - 0
group/views.py

@@ -0,0 +1,106 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from django.db import transaction
4
+from django.http import JsonResponse
5
+
6
+from rest_framework import viewsets
7
+
8
+from account.models import UserInfo
9
+from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo
10
+from group.serializers import GroupInfoSerializer, GroupUserInfoSerializer, GroupPhotoInfoSerializer
11
+
12
+from utils.ip_utils import ip_addr
13
+
14
+from curtail_uuid import CurtailUUID
15
+from TimeConvert import TimeConvert as tc
16
+
17
+
18
+@transaction.atomic
19
+def group_create_api(request):
20
+    user_id = request.POST.get('user_id', '')
21
+
22
+    try:
23
+        user = UserInfo.objects.get(user_id=user_id)
24
+    except UserInfo.DoesNotExist:
25
+        return JsonResponse({
26
+            'status': 4011,
27
+            'message': u'用户不存在',
28
+        })
29
+
30
+    group_id = CurtailUUID.uuid(GroupInfo, 'group_id')
31
+    group = GroupInfo.objects.create(
32
+        group_id=group_id,
33
+        group_from=GroupInfo.APP_GROUP,
34
+    )
35
+    GroupUserInfo.objects.create(
36
+        group_id=group_id,
37
+        user_id=user_id,
38
+        nickname=user.username,
39
+        admin=True,
40
+        user_status=GroupUserInfo.PASSED,
41
+        passed_at=tc.utc_datetime(),
42
+    )
43
+
44
+    return JsonResponse({
45
+        'status': 200,
46
+        'message': u'群组创建成功',
47
+        'data': {
48
+            'group_id': group_id,
49
+            'users': group.users
50
+        },
51
+    })
52
+
53
+
54
+def group_join_api(request):
55
+    group_id = request.POST.get('group_id', '')
56
+    user_id = request.POST.get('user_id', '')
57
+    nickname = request.POST.get('nickname', '')
58
+
59
+    try:
60
+        user = UserInfo.objects.get(user_id=user_id)
61
+    except UserInfo.DoesNotExist:
62
+        return JsonResponse({
63
+            'status': 4011,
64
+            'message': u'用户不存在',
65
+        })
66
+
67
+    try:
68
+        group = GroupInfo.objects.get(group_id=group_id)
69
+    except GroupInfo.DoesNotExist:
70
+        return JsonResponse({
71
+            'status': 4020,
72
+            'message': u'群组不存在',
73
+        })
74
+    if group.group_lock:
75
+        return JsonResponse({
76
+            'status': 4021,
77
+            'message': u'群组已锁定',
78
+        })
79
+
80
+    GroupUserInfo.objects.create(
81
+        group_id=group_id,
82
+        user_id=user_id,
83
+        nickname=nickname or user.username,
84
+        admin=False,
85
+        user_status=GroupUserInfo.APPLYING,
86
+    )
87
+
88
+    return JsonResponse({
89
+        'status': 200,
90
+        'message': u'申请已提交',
91
+    })
92
+
93
+
94
+class GroupInfoViewSet(viewsets.ModelViewSet):
95
+    queryset = GroupInfo.objects.all().order_by('-created_at')
96
+    serializer_class = GroupInfoSerializer
97
+
98
+
99
+class GroupUserInfoViewSet(viewsets.ModelViewSet):
100
+    queryset = GroupUserInfo.objects.all().order_by('-created_at')
101
+    serializer_class = GroupUserInfoSerializer
102
+
103
+
104
+class GroupPhotoInfoViewSet(viewsets.ModelViewSet):
105
+    queryset = GroupPhotoInfo.objects.all().order_by('-created_at')
106
+    serializer_class = GroupPhotoInfoSerializer

+ 1 - 0
pai2/settings.py

@@ -43,6 +43,7 @@ INSTALLED_APPS = (
43 43
     'rest_framework',
44 44
     'api',
45 45
     'account',
46
+    'group',
46 47
     'photo',
47 48
 )
48 49
 

+ 7 - 0
pai2/urls.py

@@ -22,13 +22,20 @@ from django.contrib import admin
22 22
 
23 23
 from rest_framework import routers
24 24
 from account import views as account_views
25
+from group import views as group_views
25 26
 from photo import views as photo_views
26 27
 
27 28
 router = routers.DefaultRouter()
28 29
 # router.register(r'users', account_views.UserViewSet)
29 30
 # router.register(r'groups', account_views.GroupViewSet)
31
+
30 32
 router.register(r'lensmans', account_views.LensmanInfoViewSet)
31 33
 router.register(r'users', account_views.UserInfoViewSet)
34
+
35
+router.register(r'groups', group_views.GroupInfoViewSet)
36
+router.register(r'group_users', group_views.GroupUserInfoViewSet)
37
+router.register(r'group_photos', group_views.GroupPhotoInfoViewSet)
38
+
32 39
 router.register(r'photos', photo_views.PhotoInfoViewSet)
33 40
 
34 41
 urlpatterns = [

Kodo/kodo - Gogs: Go Git Service

1793 Ревизии (a318acba53c88503fd3410fcdade1f823f186dbe)

Автор SHA1 Съобщение Дата
  FFIB a318acba53 lensman_list 增加筛选项 преди 2 години
  FFIB 88cddfbe6f update lensman_integral_update преди 2 години
  FFIB a908582469 update lensman_update преди 2 години
  FFIB f3ebf58988 新增积分起止时间 преди 2 години
  FFIB df4d1efdbc sendwxasubscribemessage截取 20 个字符 преди 2 години
  FFIB 7ff56cf0d7 增加福利解锁模板消息返回结果 преди 2 години
  FFIB 34df52eb9b MemberActivityInfo 返回 welfare преди 2 години
  FFIB 50a9025559 更新 TEMPLATE_ID_UNLOCKING_WELFARE преди 2 години
  FFIB ca7680d3d2 update template id преди 2 години
  FFIB c7e99b3dbf UPDATE template id преди 2 години
  FFIB 168f21d28d fix activity_contribute_detail_lastest none преди 2 години
  FFIB 6689065d8f update преди 2 години
  FFIB fba3fa9b02 update преди 2 години
  FFIB d0585f71ab update преди 2 години
  FFIB 1ab943c20b u преди 2 години
  FFIB 2cef602dc4 update преди 2 години
  FFIB fbf44c6da4 fix AUDIT_PASS преди 2 години
  FFIB f092e316c1 lensman_integral_list add order_by преди 2 години
  FFIB 4a7b65e9b3 摄影师版块新增备注,会员活动投稿新增消息 преди 2 години
  FFIB c0e75a540a 新增摄影师积分体系 преди 2 години
  huangqimin001 899ea80e16 :art: Support pngquant преди 2 години
  FFIB 86f387f24f fix start_date is None преди 2 години
  FFIB c3ce0715c0 新增 shot_request_delete 接口 преди 2 години
  FFIB 3b6d93a51e update преди 2 години
  FFIB b4ecee6990 创建更新会员活动,增加data_fields преди 2 години
  FFIB 75fa3cdcac update преди 2 години
  FFIB 0c91ed9208 增加摄影师活动积分 преди 2 години
  FFIB 0e72063f33 django 管理后台新增活动数据 преди 2 години
  FFIB b8c998fdd3 增加会员活动数据提交 преди 2 години
  FFIB 09e1479367 activity_signup_list 增加筛选字段 passed преди 2 години
  FFIB 0330f36822 增加报名通过接口 преди 2 години
  FFIB d491a3d79a 摄影师活动报名 преди 2 години
  FFIB b2c06ede0d 新增摄影师模块 преди 2 години
  FFIB 481be2942f MemberActivityInfo新增数据表单字段data_fields,新增摄影师活动 преди 2 години
  FFIB 9e90a53e89 增加activity_list_v2 преди 2 години
  FFIB f0af1430a1 add activity_series_list преди 2 години
  FFIB d91b0bc92e shot_request_send 支持更新request_number преди 2 години
  FFIB aa2fd2f167 shot_create 防止重复录入 преди 2 години
  FFIB 16935a36d3 小程序接口,新增经销商列表,销售员注册,获取销售信息 преди 2 години
  huangqimin001 648c227b37 :art: SSH преди 2 години
  huangqimin001 96cbf029bb :art: Make tag normal преди 2 години
  huangqimin001 ffe1e50851 :art: Update SaleclerkInfo.data преди 2 години
  FFIB c7d827db27 update преди 2 години
  FFIB b1ce286443 update преди 2 години
  FFIB b5a47c52af update преди 2 години
  FFIB 0121b709c8 update преди 2 години
  FFIB 538007b8b9 update преди 2 години
  FFIB 54e8ea1c66 update преди 2 години
  FFIB f3de5f6083 update 错误提示 преди 2 години
  FFIB 7d711b429f 增加错误提示 преди 2 години