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