@@ -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) |
@@ -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 |
+ ] |
@@ -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 |
@@ -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 |
+ |
@@ -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) |
@@ -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 |
+] |
@@ -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 |
|
@@ -0,0 +1 @@ |
||
1 |
+Subproject commit ee1882e02e3c73910b1d6df86bbdce784edbb881 |