@@ -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 |