新增摄影师模块

用户信息返回摄影师信息

update

update

update

增加接口

update

update

u

update

update

update

update

FFIB 1 gadu atpakaļ
vecāks
revīzija
b2c06ede0d

+ 7 - 1
account/admin.py

@@ -3,7 +3,7 @@
3 3
 from django.contrib import admin
4 4
 from django_admin import ChangeOnlyModelAdmin, ReadOnlyModelAdmin
5 5
 
6
-from account.models import UserInfo, UserIntegralIncomeExpensesInfo
6
+from account.models import UserInfo, UserIntegralIncomeExpensesInfo, LensmanInfo
7 7
 from mch.models import ConsumeInfoSubmitLogInfo
8 8
 
9 9
 
@@ -19,6 +19,11 @@ class UserInfoAdmin(ChangeOnlyModelAdmin, admin.ModelAdmin):
19 19
             ConsumeInfoSubmitLogInfo.objects.filter(user_id=obj.user_id).update(test_user=True)
20 20
 
21 21
 
22
+class LensmanInfoAdmin(ChangeOnlyModelAdmin, admin.ModelAdmin):
23
+    list_display = ('lensman_id', 'user_id', 'name', 'phone', 'lensman_status', 'start_date', 'end_date', 'status', 'updated_at', 'created_at')
24
+    list_filter = ('lensman_status', 'status')
25
+    search_fields = ('user_id', 'name', 'phone')
26
+
22 27
 class UserIntegralIncomeExpensesInfoAdmin(ChangeOnlyModelAdmin, admin.ModelAdmin):
23 28
     list_display = ('user_id', 'brand_id', 'brand_name', 'model_id', 'model_name', 'code', 'integral_from', 'integral', 'final_integral', 'remark', 'updated_at', 'created_at')
24 29
     list_filter = ('integral_from', 'status')
@@ -26,4 +31,5 @@ class UserIntegralIncomeExpensesInfoAdmin(ChangeOnlyModelAdmin, admin.ModelAdmin
26 31
 
27 32
 
28 33
 admin.site.register(UserInfo, UserInfoAdmin)
34
+admin.site.register(LensmanInfo, LensmanInfoAdmin)
29 35
 admin.site.register(UserIntegralIncomeExpensesInfo, UserIntegralIncomeExpensesInfoAdmin)

+ 36 - 0
account/migrations/0059_lensmaninfo.py

@@ -0,0 +1,36 @@
1
+# -*- coding: utf-8 -*-
2
+# Generated by Django 3.2.16 on 2024-03-05 02:42
3
+
4
+from django.db import migrations, models
5
+import shortuuidfield.fields
6
+
7
+
8
+class Migration(migrations.Migration):
9
+
10
+    dependencies = [
11
+        ('account', '0058_userinfo_tenancy_shot_permission'),
12
+    ]
13
+
14
+    operations = [
15
+        migrations.CreateModel(
16
+            name='LensmanInfo',
17
+            fields=[
18
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19
+                ('status', models.BooleanField(default=True, help_text='Status', verbose_name='status')),
20
+                ('created_at', models.DateTimeField(auto_now_add=True, help_text='Create Time', verbose_name='created_at')),
21
+                ('updated_at', models.DateTimeField(auto_now=True, help_text='Update Time', verbose_name='updated_at')),
22
+                ('lensman_id', shortuuidfield.fields.ShortUUIDField(blank=True, db_index=True, editable=False, help_text='摄影师唯一标识', max_length=22, null=True, unique=True)),
23
+                ('user_id', models.CharField(blank=True, db_index=True, help_text='用户唯一标识', max_length=32, null=True, verbose_name='user_id')),
24
+                ('name', models.CharField(blank=True, help_text='摄影师姓名', max_length=255, null=True, verbose_name='name')),
25
+                ('phone', models.CharField(blank=True, help_text='摄影师联系电话', max_length=11, null=True, verbose_name='phone')),
26
+                ('lensman_status', models.IntegerField(choices=[(-1, '已拒绝'), (0, '未验证'), (1, '已激活'), (2, '已禁用')], db_index=True, default=0, help_text='摄影师状态', verbose_name='lensman_status')),
27
+                ('start_date', models.DateField(blank=True, help_text='合作开始日期', null=True, verbose_name='start_date')),
28
+                ('end_date', models.DateField(blank=True, help_text='合作截止日期', null=True, verbose_name='end_date')),
29
+            ],
30
+            options={
31
+                'verbose_name': 'LensmanInfo',
32
+                'verbose_name_plural': 'LensmanInfo',
33
+                'unique_together': {('lensman_id',)},
34
+            },
35
+        ),
36
+    ]

+ 70 - 0
account/models.py

@@ -4,6 +4,7 @@ from django.conf import settings
4 4
 from django.db import models
5 5
 from django.utils.translation import ugettext_lazy as _
6 6
 from django_models_ext import BaseModelMixin, SexModelMixin
7
+from shortuuidfield import ShortUUIDField
7 8
 from TimeConvert import TimeConvert as tc
8 9
 
9 10
 from kodo.basemodels import LensmanTypeBoolMixin
@@ -210,6 +211,14 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
210 211
             }
211 212
         ]
212 213
 
214
+    @property
215
+    def lensmaninfo(self):
216
+        try:
217
+            lensman = LensmanInfo.objects.get(user_id=self.user_id, lensman_status=LensmanInfo.ACTIVATED)
218
+        except LensmanInfo.DoesNotExist:
219
+            lensman = None
220
+        return lensman.data if lensman else {}
221
+
213 222
     def srinfo(self, brand_id=None):
214 223
         try:
215 224
             sr = SalesResponsibilityInfo.objects.get(brand_id=brand_id, unionid=self.unionid, user_status=SalesResponsibilityInfo.ACTIVATED)
@@ -260,6 +269,9 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
260 269
             'identity_card_name': self.identity_card_name,
261 270
 
262 271
             'tenancy_shot_permission': self.tenancy_shot_permission,
272
+            #摄影师
273
+            'is_lensman': bool(self.lensmaninfo),
274
+            'lensman_info': self.lensmaninfo,
263 275
         }
264 276
 
265 277
     def brand_qydata(self, brand_id=None):
@@ -349,6 +361,64 @@ class UserInfo(BaseModelMixin, LensmanTypeBoolMixin):
349 361
         }
350 362
 
351 363
 
364
+class LensmanInfo(BaseModelMixin):
365
+    REFUSED = -1
366
+    UNVERIFIED = 0
367
+    ACTIVATED = 1
368
+    DISABLED = 2
369
+
370
+    LENSMAN_STATUS = (
371
+        (REFUSED, u'已拒绝'),
372
+        (UNVERIFIED, u'未验证'),
373
+        (ACTIVATED, u'已激活'),
374
+        (DISABLED, u'已禁用'),
375
+    )
376
+
377
+
378
+    lensman_id = ShortUUIDField(_(u'lensman_id'), max_length=32, blank=True, null=True, help_text=u'摄影师唯一标识', db_index=True, unique=True)
379
+
380
+    user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True)
381
+
382
+    name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'摄影师姓名')
383
+    phone = models.CharField(_(u'phone'), max_length=11, blank=True, null=True, help_text=u'摄影师联系电话')
384
+
385
+    lensman_status = models.IntegerField(_(u'lensman_status'), choices=LENSMAN_STATUS, default=UNVERIFIED, help_text=u'摄影师状态', db_index=True)
386
+
387
+    start_date = models.DateField(_(u'start_date'), blank=True, null=True, help_text=u'合作开始日期')
388
+    end_date = models.DateField(_(u'end_date'), blank=True, null=True, help_text=u'合作截止日期')
389
+
390
+    class Meta:
391
+        verbose_name = _(u'LensmanInfo')
392
+        verbose_name_plural = _(u'LensmanInfo')
393
+
394
+        unique_together = (
395
+            ('lensman_id'),
396
+        )
397
+
398
+    def __unicode__(self):
399
+        return '%d' % self.pk
400
+
401
+    @property
402
+    def data(self):
403
+        return {
404
+            'lensman_id': self.lensman_id,
405
+            'name': self.name,
406
+            'phone': self.phone,
407
+            'lensman_status': self.lensman_status,
408
+        }
409
+
410
+    @property
411
+    def admindata(self):
412
+        return {
413
+            'lensman_id': self.lensman_id,
414
+            'name': self.name,
415
+            'phone': self.phone,
416
+            'lensman_status': self.lensman_status,
417
+            'start_date': self.start_date,
418
+            'end_date': self.end_date,
419
+            'created_at': tc.local_string(utc_dt=self.created_at),
420
+        }
421
+
352 422
 class UserIntegralIncomeExpensesInfo(BaseModelMixin):
353 423
     PRODUCT = 0
354 424
     SHARE = 1

+ 81 - 0
api/lensman_admin_views.py

@@ -0,0 +1,81 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from __future__ import division
4
+
5
+from django_logit import logit
6
+from django_response import response
7
+from django.db.models import Q
8
+from paginator import pagination
9
+from TimeConvert import TimeConvert as tc
10
+
11
+from account.models import LensmanInfo
12
+from kodo.decorators import check_admin
13
+
14
+
15
+@logit
16
+@check_admin
17
+def lensman_list(request, administrator):
18
+    page = request.POST.get('page', 1)
19
+    num = request.POST.get('num', 20)
20
+    query = request.POST.get('query', '')
21
+
22
+    logs = LensmanInfo.objects.filter(status=True).order_by('-pk')
23
+
24
+    if query:
25
+      logs = logs.filter(Q(name__icontains=query) | Q(phone__icontains=query))
26
+
27
+    count = logs.count()
28
+    logs, left = pagination(logs, page, num)
29
+    logs = [log.admindata for log in logs]
30
+
31
+    return response(data={
32
+        'logs': logs,
33
+        'left': left,
34
+        'count': count,
35
+    })
36
+
37
+
38
+@logit
39
+@check_admin
40
+def lensman_audit(request, administrator):
41
+    lensman_id = request.POST.get('lensman_id', '')
42
+    start_date = tc.to_date(request.POST.get('start_date', ''))
43
+    end_date = tc.to_date(request.POST.get('end_date', ''))
44
+
45
+    try:
46
+      lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True)
47
+    except LensmanInfo.DoesNotExist:
48
+      return response(200, 'Lensman Not Found', u'摄影师不存在')
49
+    
50
+    lensman.lensman_status = LensmanInfo.ACTIVATED
51
+    lensman.start_date = start_date
52
+    lensman.end_date = end_date
53
+
54
+    lensman.save()
55
+
56
+    return response(200, 'Lensman Audit Pass Suceess', u'摄影师审核通过')
57
+
58
+
59
+@logit
60
+@check_admin
61
+def lensman_update(request, administrator):
62
+    lensman_id = request.POST.get('lensman_id', '')
63
+    start_date = tc.to_date(request.POST.get('start_date', ''))
64
+    end_date = tc.to_date(request.POST.get('end_date', ''))
65
+    name = request.POST.get('name', '')
66
+    phone = request.POST.get('phone', '')
67
+        
68
+    try:
69
+      lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True)
70
+    except LensmanInfo.DoesNotExist:
71
+      return response(200, 'Lensman Not Found', u'摄影师不存在')
72
+    
73
+    lensman.start_date = start_date
74
+    lensman.end_date = end_date
75
+    lensman.name = name
76
+    lensman.phone = phone
77
+
78
+    lensman.save()
79
+
80
+    return response(200, 'Lensman Info Update Suceess', u'摄影师信息更新成功')
81
+

+ 36 - 0
api/lensman_mp_views.py

@@ -0,0 +1,36 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from __future__ import division
4
+
5
+from django_logit import logit
6
+from django_response import response
7
+
8
+from account.models import LensmanInfo
9
+
10
+@logit
11
+def lensman_register(request):
12
+    user_id = request.POST.get('user_id', '')
13
+    name = request.POST.get('name', '')
14
+    phone = request.POST.get('phone', '')
15
+
16
+    fields = {
17
+        'user_id': user_id,
18
+        'name': name,
19
+        'phone': phone,
20
+    }
21
+
22
+    lensman, _ = LensmanInfo.objects.update_or_create(user_id=user_id, defaults=fields)
23
+
24
+    return response(200, 'Submit Success', u'提交成功', data=lensman.data)
25
+
26
+
27
+@logit
28
+def lensman_detail(request):
29
+  user_id = request.POST.get('user_id', '')
30
+
31
+  try:
32
+    lensman = LensmanInfo.objects.get(user_id=user_id, status=True)
33
+  except LensmanInfo.DoesNotExist:
34
+    return response(200, 'Lensman Not Found', u'摄影师不存在')
35
+
36
+  return response(200, 'Get Lensman Detail Success', u'获取摄影师信息成功', data=lensman.data)

+ 13 - 1
api/urls.py

@@ -6,7 +6,7 @@ from django_file_upload import views as file_views
6 6
 from api import (admin_views, clerk_views, complement_views, distributor_views, encrypt_views, express_views, log_views,
7 7
                  maintenance_point_views, maintenance_views, mch_views, member_views, model_views, operator_views,
8 8
                  refresh_views, sr_views, staff_views, tenancy_admin_views, tenancy_views, tencentcloud_views, wx_views,
9
-                 wxa_views, consumer_admin_view, salesman_mp_views)
9
+                 wxa_views, consumer_admin_view, salesman_mp_views, lensman_mp_views, lensman_admin_views)
10 10
 from miniapp import qy_views
11 11
 from miniapp import views as mini_views
12 12
 from page import oauth_views, sale_views, screen_views
@@ -369,3 +369,15 @@ urlpatterns += [
369 369
 urlpatterns += [
370 370
     url(r'', include(('member.urls', 'member'), namespace='member')),
371 371
 ]
372
+
373
+#摄影师模块
374
+urlpatterns += [
375
+    #小程序
376
+    url(r'^mp/lensman/detail$', lensman_mp_views.lensman_detail, name='mp_lensman_detail'),
377
+    url(r'^mp/lensman/register$', lensman_mp_views.lensman_register, name='mp_lensman_register'),
378
+
379
+    #管理后台
380
+    url(r'^admin/lensman/list$', lensman_admin_views.lensman_list, name='admin_lensman_list'),
381
+    url(r'^admin/lensman/audit$', lensman_admin_views.lensman_audit, name='admin_lensman_audit'),
382
+    url(r'^admin/lensman/update$', lensman_admin_views.lensman_update, name='admin_lensman_update'),
383
+]

+ 6 - 0
member/activity_mp_views.py

@@ -85,6 +85,9 @@ def activity_detail(request):
85 85
 def activity_signup(request):
86 86
     brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
87 87
     user_id = request.POST.get('user_id', '')
88
+    lensman_id = request.POST.get('lensman_id', '')
89
+    name = request.POST.get('name', '')
90
+    phone = request.POST.get('phone', '')
88 91
     activity_id = request.POST.get('activity_id', '')
89 92
     fields = request.POST.get('fields', '[]')
90 93
 
@@ -95,6 +98,9 @@ def activity_signup(request):
95 98
 
96 99
     MemberActivitySignupInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={
97 100
         'title': act.title,
101
+        'lensman_id': lensman_id,
102
+        'name': name,
103
+        'phone': phone,
98 104
         'fields': fields,
99 105
     })
100 106
 

+ 1 - 0
src/mysqlclient

@@ -0,0 +1 @@
1
+Subproject commit ee1882e02e3c73910b1d6df86bbdce784edbb881