@@ -0,0 +1,40 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+# Generated by Django 3.2.16 on 2024-03-27 07:50 |
|
4 |
+ |
|
5 |
+from django.db import migrations, models |
|
6 |
+ |
|
7 |
+ |
|
8 |
+class Migration(migrations.Migration): |
|
9 |
+ |
|
10 |
+ dependencies = [ |
|
11 |
+ ('account', '0060_auto_20240312_1350'), |
|
12 |
+ ] |
|
13 |
+ |
|
14 |
+ operations = [ |
|
15 |
+ migrations.CreateModel( |
|
16 |
+ name='LensmanIntegralIncomeExpensesInfo', |
|
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 |
+ ('user_id', models.CharField(blank=True, db_index=True, help_text='用户唯一标识', max_length=32, null=True, verbose_name='user_id')), |
|
23 |
+ ('brand_id', models.CharField(blank=True, db_index=True, help_text='品牌唯一标识', max_length=32, null=True, verbose_name='brand_id')), |
|
24 |
+ ('brand_name', models.CharField(blank=True, help_text='品牌名称', max_length=255, null=True, verbose_name='brand_name')), |
|
25 |
+ ('integral', models.IntegerField(default=0, help_text='增减积分', verbose_name='integral')), |
|
26 |
+ ('remark', models.CharField(blank=True, help_text='备注', max_length=255, null=True, verbose_name='remark')), |
|
27 |
+ ('activity_id', models.CharField(blank=True, db_index=True, help_text='活动唯一标识', max_length=32, null=True, verbose_name='activity_id')), |
|
28 |
+ ('expired_at', models.DateField(blank=True, help_text='积分过期日期', null=True, verbose_name='expired_at')), |
|
29 |
+ ], |
|
30 |
+ options={ |
|
31 |
+ 'verbose_name': 'lensmanintegralincomeexpensesinfo', |
|
32 |
+ 'verbose_name_plural': 'lensmanintegralincomeexpensesinfo', |
|
33 |
+ }, |
|
34 |
+ ), |
|
35 |
+ migrations.AddField( |
|
36 |
+ model_name='lensmaninfo', |
|
37 |
+ name='integral', |
|
38 |
+ field=models.IntegerField(default=0, help_text='摄影师积分', verbose_name='integral'), |
|
39 |
+ ), |
|
40 |
+ ] |
@@ -383,6 +383,7 @@ class LensmanInfo(BaseModelMixin): |
||
383 | 383 |
|
384 | 384 |
name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'摄影师姓名') |
385 | 385 |
phone = models.CharField(_(u'phone'), max_length=11, blank=True, null=True, help_text=u'摄影师联系电话') |
386 |
+ integral = models.IntegerField(_(u'integral'), default=0, help_text=u'摄影师积分') |
|
386 | 387 |
|
387 | 388 |
lensman_status = models.IntegerField(_(u'lensman_status'), choices=LENSMAN_STATUS, default=UNVERIFIED, help_text=u'摄影师状态', db_index=True) |
388 | 389 |
|
@@ -412,6 +413,9 @@ class LensmanInfo(BaseModelMixin): |
||
412 | 413 |
'lensman_id': self.lensman_id, |
413 | 414 |
'name': self.name, |
414 | 415 |
'phone': self.phone, |
416 |
+ 'start_date': self.start_date, |
|
417 |
+ 'end_date': self.end_date, |
|
418 |
+ 'integral': self.integral, |
|
415 | 419 |
'is_expired': self.is_expired, |
416 | 420 |
'lensman_status': self.lensman_status, |
417 | 421 |
} |
@@ -423,6 +427,7 @@ class LensmanInfo(BaseModelMixin): |
||
423 | 427 |
'user_id': self.user_id, |
424 | 428 |
'name': self.name, |
425 | 429 |
'phone': self.phone, |
430 |
+ 'integral': self.integral, |
|
426 | 431 |
'lensman_status': self.lensman_status, |
427 | 432 |
'start_date': self.start_date, |
428 | 433 |
'end_date': self.end_date, |
@@ -496,3 +501,54 @@ class UserIntegralIncomeExpensesInfo(BaseModelMixin): |
||
496 | 501 |
'created_at': tc.local_string(utc_dt=self.created_at), |
497 | 502 |
} |
498 | 503 |
|
504 |
+ |
|
505 |
+class LensmanIntegralIncomeExpensesInfo(BaseModelMixin): |
|
506 |
+ user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) |
|
507 |
+ |
|
508 |
+ brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True) |
|
509 |
+ brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称') |
|
510 |
+ |
|
511 |
+ integral = models.IntegerField(_(u'integral'), default=0, help_text=u'增减积分') |
|
512 |
+ remark = models.CharField(_(u'remark'), max_length=255, blank=True, null=True, help_text=u'备注') |
|
513 |
+ |
|
514 |
+ activity_id = models.CharField(_(u'activity_id'), max_length=32, blank=True, null=True, help_text=u'活动唯一标识', db_index=True) |
|
515 |
+ expired_at = models.DateField(_(u'expired_at'), blank=True, null=True, help_text=u'积分过期日期') |
|
516 |
+ |
|
517 |
+ class Meta: |
|
518 |
+ verbose_name = _(u'lensmanintegralincomeexpensesinfo') |
|
519 |
+ verbose_name_plural = _(u'lensmanintegralincomeexpensesinfo') |
|
520 |
+ |
|
521 |
+ def __unicode__(self): |
|
522 |
+ return '%d' % self.pk |
|
523 |
+ |
|
524 |
+ @property |
|
525 |
+ def admindata(self): |
|
526 |
+ if self.activity_id: |
|
527 |
+ act = MemberActivityInfo.objects.get(activity_id=self.activity_id) |
|
528 |
+ else: |
|
529 |
+ act = None |
|
530 |
+ |
|
531 |
+ return { |
|
532 |
+ 'integral': self.integral, |
|
533 |
+ 'remark': self.remark, |
|
534 |
+ 'act_info': act.admindata if act else None, |
|
535 |
+ 'activity_id': self.activity_id, |
|
536 |
+ 'expired_at': self.expired_at if self.expired_at else '', |
|
537 |
+ 'created_at': tc.local_string(utc_dt=self.created_at), |
|
538 |
+ } |
|
539 |
+ |
|
540 |
+ @property |
|
541 |
+ def userdata(self): |
|
542 |
+ if self.activity_id: |
|
543 |
+ act = MemberActivityInfo.objects.get(activity_id=self.activity_id) |
|
544 |
+ else: |
|
545 |
+ act = None |
|
546 |
+ |
|
547 |
+ return { |
|
548 |
+ 'integral': self.integral, |
|
549 |
+ 'remark': self.remark, |
|
550 |
+ 'act_info': act.admindata if act else None, |
|
551 |
+ 'activity_id': self.activity_id, |
|
552 |
+ 'expired_at': self.expired_at if self.expired_at else '', |
|
553 |
+ 'created_at': tc.local_string(utc_dt=self.created_at), |
|
554 |
+ } |
@@ -2,13 +2,14 @@ |
||
2 | 2 |
|
3 | 3 |
from __future__ import division |
4 | 4 |
|
5 |
+from django.conf import settings |
|
5 | 6 |
from django_logit import logit |
6 | 7 |
from django_response import response |
7 | 8 |
from django.db.models import Q |
8 | 9 |
from paginator import pagination |
9 | 10 |
from TimeConvert import TimeConvert as tc |
10 | 11 |
|
11 |
-from account.models import LensmanInfo, UserIntegralIncomeExpensesInfo |
|
12 |
+from account.models import LensmanInfo, LensmanIntegralIncomeExpensesInfo |
|
12 | 13 |
from kodo.decorators import check_admin |
13 | 14 |
|
14 | 15 |
|
@@ -90,9 +91,36 @@ def lensman_integral_list(request, administrator): |
||
90 | 91 |
except LensmanInfo.DoesNotExist: |
91 | 92 |
return response(200, 'Lensman Not Found', u'摄影师不存在') |
92 | 93 |
|
93 |
- integrals = UserIntegralIncomeExpensesInfo.objects.filter(user_id=user_id, integral_from=UserIntegralIncomeExpensesInfo.LENSMAN_ACTIVITY, status=True) |
|
94 |
+ integrals = LensmanIntegralIncomeExpensesInfo.objects.filter(user_id=user_id, status=True) |
|
94 | 95 |
|
95 |
- integrals = [integral.lensman_admindata for integral in integrals] |
|
96 |
+ integrals = [integral.admindata for integral in integrals] |
|
96 | 97 |
|
97 | 98 |
|
98 |
- return response(200, 'Get Lensman Integral List Success', u'获取摄影师积分列表成功', data=integrals) |
|
99 |
+ return response(200, 'Get Lensman Integral List Success', u'获取摄影师积分列表成功', data=integrals) |
|
100 |
+ |
|
101 |
+ |
|
102 |
+@logit |
|
103 |
+def lensman_integral_update(request): |
|
104 |
+ user_id = request.POST.get('user_id', '') |
|
105 |
+ integral = int(request.POST.get('integral', 0)) |
|
106 |
+ remark = request.POST.get('remark', '') |
|
107 |
+ brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID |
|
108 |
+ |
|
109 |
+ try: |
|
110 |
+ lensman = LensmanInfo.objects.get(user_id=user_id, status=True) |
|
111 |
+ except LensmanInfo.DoesNotExist: |
|
112 |
+ return response(200, 'Lensman Not Found', u'摄影师不存在') |
|
113 |
+ |
|
114 |
+ lensman.integral += integral |
|
115 |
+ lensman.save() |
|
116 |
+ |
|
117 |
+ LensmanIntegralIncomeExpensesInfo.objects.create( |
|
118 |
+ brand_id=brand_id, |
|
119 |
+ user_id=user_id, |
|
120 |
+ integral=integral, |
|
121 |
+ remark=remark, |
|
122 |
+ expired_at=lensman.end_date, |
|
123 |
+ ) |
|
124 |
+ |
|
125 |
+ return response(200, 'Lensman Integral Update Success', u'摄影师积分更新成功') |
|
126 |
+ |
@@ -2,10 +2,11 @@ |
||
2 | 2 |
|
3 | 3 |
from __future__ import division |
4 | 4 |
|
5 |
+from django.conf import settings |
|
5 | 6 |
from django_logit import logit |
6 | 7 |
from django_response import response |
7 | 8 |
|
8 |
-from account.models import LensmanInfo, UserIntegralIncomeExpensesInfo |
|
9 |
+from account.models import LensmanInfo, LensmanIntegralIncomeExpensesInfo |
|
9 | 10 |
|
10 | 11 |
@logit |
11 | 12 |
def lensman_register(request): |
@@ -39,15 +40,16 @@ def lensman_detail(request): |
||
39 | 40 |
@logit |
40 | 41 |
def lensman_integral_list(request): |
41 | 42 |
user_id = request.POST.get('user_id', '') |
43 |
+ brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID |
|
42 | 44 |
|
43 | 45 |
try: |
44 | 46 |
lensman = LensmanInfo.objects.get(user_id=user_id, status=True) |
45 | 47 |
except LensmanInfo.DoesNotExist: |
46 | 48 |
return response(200, 'Lensman Not Found', u'摄影师不存在') |
47 | 49 |
|
48 |
- integrals = UserIntegralIncomeExpensesInfo.objects.filter(user_id=user_id, integral_from=UserIntegralIncomeExpensesInfo.LENSMAN_ACTIVITY, status=True) |
|
50 |
+ integrals = LensmanIntegralIncomeExpensesInfo.objects.filter(user_id=user_id, status=True) |
|
49 | 51 |
|
50 |
- integrals = [integral.lensman_userdata for integral in integrals] |
|
52 |
+ integrals = [integral.userdata for integral in integrals] |
|
51 | 53 |
|
52 | 54 |
|
53 |
- return response(200, 'Get Lensman Integral List Success', u'获取摄影师积分列表成功', data=integrals) |
|
55 |
+ return response(200, 'Get Lensman Integral List Success', u'获取摄影师积分列表成功', data=integrals) |
@@ -383,4 +383,5 @@ urlpatterns += [ |
||
383 | 383 |
url(r'^admin/lensman/audit$', lensman_admin_views.lensman_audit, name='admin_lensman_audit'), |
384 | 384 |
url(r'^admin/lensman/update$', lensman_admin_views.lensman_update, name='admin_lensman_update'), |
385 | 385 |
url(r'^admin/lensman/integral/list$', lensman_admin_views.lensman_integral_list, name='admin_lensman_integral_list'), |
386 |
+ url(r'^admin/lensman/integral/update$', lensman_admin_views.lensman_integral_update, name='admin_lensman_integral_update'), |
|
386 | 387 |
] |
@@ -9,10 +9,9 @@ from django_response import response |
||
9 | 9 |
from paginator import pagination |
10 | 10 |
from TimeConvert import TimeConvert as tc |
11 | 11 |
|
12 |
-from account.models import UserIntegralIncomeExpensesInfo, UserInfo, LensmanInfo |
|
13 |
-from member.models import MemberActivityInfo, MemberActivitySignupInfo, MemberActivityContributionInfo, MemberActivityDataInfo |
|
12 |
+from member.models import MemberActivityInfo, MemberActivitySignupInfo, MemberActivityContributionInfo |
|
14 | 13 |
from kodo.decorators import check_admin |
15 |
-from utils.error.errno_utils import MemberActivityStatusCode, UserStatusCode |
|
14 |
+from utils.error.errno_utils import MemberActivityStatusCode |
|
16 | 15 |
|
17 | 16 |
|
18 | 17 |
@check_admin |
@@ -87,6 +86,8 @@ def activity_update(request, administrator): |
||
87 | 86 |
end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE) |
88 | 87 |
start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE) |
89 | 88 |
end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE) |
89 |
+ start_data_submit_date = tc.to_date(request.POST.get('start_data_submit_date', '') or settings.DEFAULT_START_DATE) |
|
90 |
+ end_data_submit_date = tc.to_date(request.POST.get('end_data_submit_date', '') or settings.DEFAULT_END_DATE) |
|
90 | 91 |
city = request.POST.get('city', '') |
91 | 92 |
location = request.POST.get('location', '') |
92 | 93 |
integral = int(request.POST.get('integral', 0)) |
@@ -128,6 +129,8 @@ def activity_update(request, administrator): |
||
128 | 129 |
log.end_date = end_date |
129 | 130 |
log.start_display_date = start_display_date |
130 | 131 |
log.end_display_date = end_display_date |
132 |
+ log.start_data_submit_date = start_data_submit_date |
|
133 |
+ log.end_data_submit_date = end_data_submit_date |
|
131 | 134 |
log.city = city |
132 | 135 |
log.location = location |
133 | 136 |
log.integral = integral |
@@ -166,6 +169,8 @@ def activity_create(request, administrator): |
||
166 | 169 |
end_date = date = tc.to_date(request.POST.get('end_date', '') or settings.DEFAULT_END_DATE) |
167 | 170 |
start_display_date = tc.to_date(request.POST.get('start_display_date', '') or settings.DEFAULT_START_DATE) |
168 | 171 |
end_display_date = tc.to_date(request.POST.get('end_display_date', '') or settings.DEFAULT_END_DATE) |
172 |
+ start_data_submit_date = tc.to_date(request.POST.get('start_data_submit_date', '') or settings.DEFAULT_START_DATE) |
|
173 |
+ end_data_submit_date = tc.to_date(request.POST.get('end_data_submit_date', '') or settings.DEFAULT_END_DATE) |
|
169 | 174 |
city = request.POST.get('city', '') |
170 | 175 |
location = request.POST.get('location', '') |
171 | 176 |
integral = int(request.POST.get('integral', 0)) |
@@ -201,6 +206,8 @@ def activity_create(request, administrator): |
||
201 | 206 |
end_date=end_date, |
202 | 207 |
start_display_date=start_display_date, |
203 | 208 |
end_display_date=end_display_date, |
209 |
+ start_data_submit_date=start_data_submit_date, |
|
210 |
+ end_data_submit_date=end_data_submit_date, |
|
204 | 211 |
city=city, |
205 | 212 |
location=location, |
206 | 213 |
integral=integral, |
@@ -239,7 +246,7 @@ def activity_signup_list(request, administrator): |
||
239 | 246 |
num = int(request.POST.get('num', 20)) |
240 | 247 |
query = request.POST.get('query', '') |
241 | 248 |
is_signin = request.POST.get('is_signin', False) |
242 |
- passed = request.POST.get('passed', '') |
|
249 |
+ audit_status = request.POST.get('audit_status', '') |
|
243 | 250 |
|
244 | 251 |
logs = MemberActivitySignupInfo.objects.filter(activity_id=activity_id, status=True).exclude(fields='[]') |
245 | 252 |
|
@@ -249,8 +256,8 @@ def activity_signup_list(request, administrator): |
||
249 | 256 |
if is_signin: |
250 | 257 |
logs = logs.filter(is_signin=is_signin) |
251 | 258 |
|
252 |
- if passed: |
|
253 |
- logs = logs.filter(passed=passed) |
|
259 |
+ if audit_status: |
|
260 |
+ logs = logs.filter(audit_status=audit_status) |
|
254 | 261 |
|
255 | 262 |
|
256 | 263 |
count = logs.count() |
@@ -262,70 +269,3 @@ def activity_signup_list(request, administrator): |
||
262 | 269 |
'count': count, |
263 | 270 |
'left': left, |
264 | 271 |
}) |
265 |
- |
|
266 |
- |
|
267 |
-@check_admin |
|
268 |
-def activity_signup_pass(request, administrator): |
|
269 |
- activity_id = request.POST.get('activity_id', '') |
|
270 |
- signup_id = request.POST.get('signup_id', '') |
|
271 |
- |
|
272 |
- MemberActivitySignupInfo.objects.filter(activity_id=activity_id, signup_id=signup_id, status=True).update(passed=True) |
|
273 |
- |
|
274 |
- return response(200, 'Member Activity Signup Passed Success', u'活动报名通过成功') |
|
275 |
- |
|
276 |
- |
|
277 |
-@check_admin |
|
278 |
-def activity_data_list(request, administrator): |
|
279 |
- activity_id = request.POST.get('activity_id', '') |
|
280 |
- page = int(request.POST.get('page', 1)) |
|
281 |
- num = int(request.POST.get('num', 20)) |
|
282 |
- query = request.POST.get('query', '') |
|
283 |
- |
|
284 |
- logs = MemberActivityDataInfo.objects.filter(activity_id=activity_id, status=True) |
|
285 |
- if query: |
|
286 |
- logs = logs.filter(Q(lensman_name__icontains=query) | Q(lensman_phone__icontains=query)) |
|
287 |
- |
|
288 |
- count = logs.count() |
|
289 |
- logs, left = pagination(logs, page, num) |
|
290 |
- logs = [log.admindata for log in logs] |
|
291 |
- |
|
292 |
- return response(200, 'Get Member Activity Data List Success', u'获取会员活动数据列表成功', data={ |
|
293 |
- 'logs': logs, |
|
294 |
- 'count': count, |
|
295 |
- 'left': left, |
|
296 |
- }) |
|
297 |
- |
|
298 |
-@check_admin |
|
299 |
-def activity_integral_add(request, administrator): |
|
300 |
- activity_id = request.POST.get('activity_id', '') |
|
301 |
- user_id = request.POST.get('user_id', '') |
|
302 |
- lensman_id = request.POST.get('lensman_id', '') |
|
303 |
- integral = int(request.POST.get('integral', 0)) |
|
304 |
- remark = request.POST.get('remark', '') |
|
305 |
- brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID |
|
306 |
- |
|
307 |
- try: |
|
308 |
- user = UserInfo.objects.get(user_id=user_id, status=True) |
|
309 |
- except UserInfo.DoesNotExist: |
|
310 |
- return response(UserStatusCode.USER_NOT_FOUND) |
|
311 |
- |
|
312 |
- try: |
|
313 |
- lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True) |
|
314 |
- except LensmanInfo.DoesNotExist: |
|
315 |
- return response('400001', 'LensmanInfo Not Found', '摄影师不存在') |
|
316 |
- |
|
317 |
- user.integral += integral |
|
318 |
- user.save() |
|
319 |
- |
|
320 |
- UserIntegralIncomeExpensesInfo.objects.create( |
|
321 |
- brand_id=brand_id, |
|
322 |
- user_id=user_id, |
|
323 |
- integral_from=UserIntegralIncomeExpensesInfo.LENSMAN_ACTIVITY, |
|
324 |
- integral=integral, |
|
325 |
- final_integral=user.integral, |
|
326 |
- activity_id=activity_id, |
|
327 |
- remark=remark, |
|
328 |
- expired_at=lensman.end_date, |
|
329 |
- ) |
|
330 |
- |
|
331 |
- return response(200, 'Add Member Activity Integral Success', u'添加积分成功') |
@@ -129,54 +129,6 @@ def activity_signup_detail(request): |
||
129 | 129 |
|
130 | 130 |
|
131 | 131 |
@logit |
132 |
-def activity_data_submit(request): |
|
133 |
- user_id = request.POST.get('user_id', '') |
|
134 |
- lensman_id = request.POST.get('lensman_id', '') |
|
135 |
- activity_id = request.POST.get('activity_id', '') |
|
136 |
- data_fields = request.POST.get('data_fields', '[]') |
|
137 |
- |
|
138 |
- try: |
|
139 |
- act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True) |
|
140 |
- except MemberActivityInfo.DoesNotExist: |
|
141 |
- return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND) |
|
142 |
- |
|
143 |
- try: |
|
144 |
- lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True) |
|
145 |
- except LensmanInfo.DoesNotExist: |
|
146 |
- return response('400001', 'LensmanInfo Not Found', '摄影师不存在') |
|
147 |
- |
|
148 |
- if lensman.is_expired: |
|
149 |
- return response(40001, 'Lensman Has Expired', '摄影师合作已到期') |
|
150 |
- |
|
151 |
- MemberActivityDataInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={ |
|
152 |
- 'title': act.title, |
|
153 |
- 'lensman_id': lensman_id, |
|
154 |
- 'lensman_name': lensman.name, |
|
155 |
- 'lensman_phone': lensman.phone, |
|
156 |
- 'data_fields': data_fields, |
|
157 |
- }) |
|
158 |
- |
|
159 |
- return response(data={ |
|
160 |
- 'activity': act.data(user_id), |
|
161 |
- }) |
|
162 |
- |
|
163 |
- |
|
164 |
-@logit |
|
165 |
-def activity_data_detail(request): |
|
166 |
- user_id = request.POST.get('user_id', '') |
|
167 |
- activity_id = request.POST.get('activity_id', '') |
|
168 |
- |
|
169 |
- try: |
|
170 |
- data_info = MemberActivityDataInfo.objects.get(user_id=user_id, activity_id=activity_id, status=True) |
|
171 |
- except MemberActivityDataInfo.DoesNotExist: |
|
172 |
- return response() |
|
173 |
- |
|
174 |
- return response(data={ |
|
175 |
- 'data_info': data_info.data, |
|
176 |
- }) |
|
177 |
- |
|
178 |
- |
|
179 |
-@logit |
|
180 | 132 |
def activity_contribute_create(request): |
181 | 133 |
brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID |
182 | 134 |
user_id = request.POST.get('user_id', '') |
@@ -2,7 +2,7 @@ |
||
2 | 2 |
|
3 | 3 |
from django.conf.urls import url |
4 | 4 |
|
5 |
-from member import activity_admin_views |
|
5 |
+from member import activity_admin_views, lensman_activity_admin_views |
|
6 | 6 |
|
7 | 7 |
# activity |
8 | 8 |
urlpatterns = [ |
@@ -15,11 +15,11 @@ urlpatterns = [ |
||
15 | 15 |
# activity signup |
16 | 16 |
urlpatterns += [ |
17 | 17 |
url(r'^member/activity/signup/list$', activity_admin_views.activity_signup_list, name='admin_member_activity_signup_list'), |
18 |
- url(r'^member/activity/signup/pass$', activity_admin_views.activity_signup_pass, name='admin_member_activity_signup_pass'), |
|
18 |
+ url(r'^member/activity/signup/audit$', lensman_activity_admin_views.activity_signup_audit, name='admin_member_activity_signup_audit'), |
|
19 | 19 |
] |
20 | 20 |
|
21 | 21 |
#activity data |
22 | 22 |
urlpatterns += [ |
23 |
- url(r'^member/activity/data/list$', activity_admin_views.activity_data_list, name='admin_member_activity_data_list'), |
|
24 |
- url(r'^member/activity/integral/add$', activity_admin_views.activity_integral_add, name='admin_member_activity_integral_add'), |
|
23 |
+ url(r'^member/activity/data/list$', lensman_activity_admin_views.activity_data_list, name='admin_member_activity_data_list'), |
|
24 |
+ url(r'^member/activity/integral/add$', lensman_activity_admin_views.activity_integral_add, name='admin_member_activity_integral_add'), |
|
25 | 25 |
] |
@@ -0,0 +1,78 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+from django.conf import settings |
|
4 |
+from django.db.models import Q |
|
5 |
+from django_logit import logit |
|
6 |
+from django_response import response |
|
7 |
+from paginator import pagination |
|
8 |
+ |
|
9 |
+from account.models import LensmanIntegralIncomeExpensesInfo, UserInfo, LensmanInfo |
|
10 |
+from member.models import MemberActivitySignupInfo, MemberActivityDataInfo |
|
11 |
+from kodo.decorators import check_admin |
|
12 |
+from utils.error.errno_utils import UserStatusCode |
|
13 |
+ |
|
14 |
+ |
|
15 |
+@check_admin |
|
16 |
+def activity_signup_audit(request, administrator): |
|
17 |
+ activity_id = request.POST.get('activity_id', '') |
|
18 |
+ signup_id = request.POST.get('signup_id', '') |
|
19 |
+ audit_status = request.POST.get('audit_status', 0) |
|
20 |
+ |
|
21 |
+ MemberActivitySignupInfo.objects.filter(activity_id=activity_id, signup_id=signup_id, status=True).update(audit_status=audit_status) |
|
22 |
+ |
|
23 |
+ return response(200, 'Member Activity Signup Audit Success', u'活动审核成功') |
|
24 |
+ |
|
25 |
+ |
|
26 |
+@check_admin |
|
27 |
+def activity_data_list(request, administrator): |
|
28 |
+ activity_id = request.POST.get('activity_id', '') |
|
29 |
+ page = int(request.POST.get('page', 1)) |
|
30 |
+ num = int(request.POST.get('num', 20)) |
|
31 |
+ query = request.POST.get('query', '') |
|
32 |
+ |
|
33 |
+ logs = MemberActivityDataInfo.objects.filter(activity_id=activity_id, status=True) |
|
34 |
+ if query: |
|
35 |
+ logs = logs.filter(Q(lensman_name__icontains=query) | Q(lensman_phone__icontains=query)) |
|
36 |
+ |
|
37 |
+ count = logs.count() |
|
38 |
+ logs, left = pagination(logs, page, num) |
|
39 |
+ logs = [log.admindata for log in logs] |
|
40 |
+ |
|
41 |
+ return response(200, 'Get Member Activity Data List Success', u'获取会员活动数据列表成功', data={ |
|
42 |
+ 'logs': logs, |
|
43 |
+ 'count': count, |
|
44 |
+ 'left': left, |
|
45 |
+ }) |
|
46 |
+ |
|
47 |
+@check_admin |
|
48 |
+def activity_integral_add(request, administrator): |
|
49 |
+ activity_id = request.POST.get('activity_id', '') |
|
50 |
+ user_id = request.POST.get('user_id', '') |
|
51 |
+ lensman_id = request.POST.get('lensman_id', '') |
|
52 |
+ integral = int(request.POST.get('integral', 0)) |
|
53 |
+ remark = request.POST.get('remark', '') |
|
54 |
+ brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID |
|
55 |
+ |
|
56 |
+ try: |
|
57 |
+ user = UserInfo.objects.get(user_id=user_id, status=True) |
|
58 |
+ except UserInfo.DoesNotExist: |
|
59 |
+ return response(UserStatusCode.USER_NOT_FOUND) |
|
60 |
+ |
|
61 |
+ try: |
|
62 |
+ lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True) |
|
63 |
+ except LensmanInfo.DoesNotExist: |
|
64 |
+ return response('400001', 'LensmanInfo Not Found', '摄影师不存在') |
|
65 |
+ |
|
66 |
+ user.integral += integral |
|
67 |
+ user.save() |
|
68 |
+ |
|
69 |
+ LensmanIntegralIncomeExpensesInfo.objects.create( |
|
70 |
+ brand_id=brand_id, |
|
71 |
+ user_id=user_id, |
|
72 |
+ integral=integral, |
|
73 |
+ activity_id=activity_id, |
|
74 |
+ remark=remark, |
|
75 |
+ expired_at=lensman.end_date, |
|
76 |
+ ) |
|
77 |
+ |
|
78 |
+ return response(200, 'Add Member Activity Integral Success', u'添加积分成功') |
@@ -0,0 +1,82 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+from django.conf import settings |
|
4 |
+from django_logit import logit |
|
5 |
+from django.db.models import Q |
|
6 |
+from django_response import response |
|
7 |
+ |
|
8 |
+from account.models import LensmanInfo |
|
9 |
+from member.models import MemberActivityInfo, MemberActivityDataInfo, MemberActivitySignupInfo |
|
10 |
+from utils.error.errno_utils import MemberActivityStatusCode |
|
11 |
+ |
|
12 |
+@logit |
|
13 |
+def activity_data_submit(request): |
|
14 |
+ user_id = request.POST.get('user_id', '') |
|
15 |
+ lensman_id = request.POST.get('lensman_id', '') |
|
16 |
+ activity_id = request.POST.get('activity_id', '') |
|
17 |
+ data_fields = request.POST.get('data_fields', '[]') |
|
18 |
+ |
|
19 |
+ try: |
|
20 |
+ act = MemberActivityInfo.objects.get(activity_id=activity_id, status=True) |
|
21 |
+ except MemberActivityInfo.DoesNotExist: |
|
22 |
+ return response(MemberActivityStatusCode.ACTIVITY_NOT_FOUND) |
|
23 |
+ |
|
24 |
+ try: |
|
25 |
+ lensman = LensmanInfo.objects.get(lensman_id=lensman_id, status=True) |
|
26 |
+ except LensmanInfo.DoesNotExist: |
|
27 |
+ return response('400001', 'LensmanInfo Not Found', '摄影师不存在') |
|
28 |
+ |
|
29 |
+ if lensman.is_expired: |
|
30 |
+ return response(40001, 'Lensman Has Expired', '摄影师合作已到期') |
|
31 |
+ |
|
32 |
+ MemberActivityDataInfo.objects.update_or_create(user_id=user_id, activity_id=activity_id, defaults={ |
|
33 |
+ 'title': act.title, |
|
34 |
+ 'lensman_id': lensman_id, |
|
35 |
+ 'lensman_name': lensman.name, |
|
36 |
+ 'lensman_phone': lensman.phone, |
|
37 |
+ 'data_fields': data_fields, |
|
38 |
+ }) |
|
39 |
+ |
|
40 |
+ return response(data={ |
|
41 |
+ 'activity': act.data(user_id), |
|
42 |
+ }) |
|
43 |
+ |
|
44 |
+ |
|
45 |
+@logit |
|
46 |
+def activity_data_detail(request): |
|
47 |
+ user_id = request.POST.get('user_id', '') |
|
48 |
+ activity_id = request.POST.get('activity_id', '') |
|
49 |
+ |
|
50 |
+ try: |
|
51 |
+ data_info = MemberActivityDataInfo.objects.get(user_id=user_id, activity_id=activity_id, status=True) |
|
52 |
+ except MemberActivityDataInfo.DoesNotExist: |
|
53 |
+ return response() |
|
54 |
+ |
|
55 |
+ return response(data={ |
|
56 |
+ 'data_info': data_info.data, |
|
57 |
+ }) |
|
58 |
+ |
|
59 |
+ |
|
60 |
+@logit |
|
61 |
+def activity_signup_message(request): |
|
62 |
+ user_id = request.POST.get('user_id', '') |
|
63 |
+ |
|
64 |
+ lensman_acts = MemberActivityInfo.objects.values_list('activity_id', flat=True).filter(activity_section=4, status=True) |
|
65 |
+ infos = MemberActivitySignupInfo.objects.filter(Q(user_id=user_id) & Q(activity_id__in=lensman_acts) & Q(is_read=False)).exclude(audit_status=MemberActivitySignupInfo.UNAUDITED) |
|
66 |
+ |
|
67 |
+ infos = [info.data for info in infos] |
|
68 |
+ |
|
69 |
+ return response(data={ |
|
70 |
+ 'messages': infos |
|
71 |
+ }) |
|
72 |
+ |
|
73 |
+@logit |
|
74 |
+def activity_signup_message_read(request): |
|
75 |
+ user_id = request.POST.get('user_id', '') |
|
76 |
+ signup_id = request.POST.get('signup_id', '') |
|
77 |
+ |
|
78 |
+ MemberActivitySignupInfo.objects.filter(user_id=user_id, signup_id=signup_id).update(is_read=True) |
|
79 |
+ |
|
80 |
+ return response(200, 'Activity Signup Message Has Read Success', '活动报名消息已读') |
|
81 |
+ |
|
82 |
+ |
@@ -0,0 +1,44 @@ |
||
1 |
+# -*- coding: utf-8 -*- |
|
2 |
+ |
|
3 |
+# Generated by Django 3.2.16 on 2024-03-27 07:50 |
|
4 |
+ |
|
5 |
+from django.db import migrations, models |
|
6 |
+ |
|
7 |
+ |
|
8 |
+class Migration(migrations.Migration): |
|
9 |
+ |
|
10 |
+ dependencies = [ |
|
11 |
+ ('member', '0069_auto_20240312_1350'), |
|
12 |
+ ] |
|
13 |
+ |
|
14 |
+ operations = [ |
|
15 |
+ migrations.RemoveField( |
|
16 |
+ model_name='memberactivitysignupinfo', |
|
17 |
+ name='passed', |
|
18 |
+ ), |
|
19 |
+ migrations.AddField( |
|
20 |
+ model_name='memberactivityinfo', |
|
21 |
+ name='end_data_submit_date', |
|
22 |
+ field=models.DateField(blank=True, help_text='活动数据提交截止日期', null=True, verbose_name='end_data_submit_date'), |
|
23 |
+ ), |
|
24 |
+ migrations.AddField( |
|
25 |
+ model_name='memberactivityinfo', |
|
26 |
+ name='start_data_submit_date', |
|
27 |
+ field=models.DateField(blank=True, help_text='活动数据提交开始日期', null=True, verbose_name='start_data_submit_date'), |
|
28 |
+ ), |
|
29 |
+ migrations.AddField( |
|
30 |
+ model_name='memberactivitysignupinfo', |
|
31 |
+ name='audit_status', |
|
32 |
+ field=models.IntegerField(choices=[(0, '未审核'), (1, '已通过'), (2, '未通过')], db_index=True, default=0, help_text='审核状态', verbose_name='audit_status'), |
|
33 |
+ ), |
|
34 |
+ migrations.AddField( |
|
35 |
+ model_name='memberactivitysignupinfo', |
|
36 |
+ name='is_read', |
|
37 |
+ field=models.BooleanField(default=False, help_text='报名消息是否已读', verbose_name='is_read'), |
|
38 |
+ ), |
|
39 |
+ migrations.AlterField( |
|
40 |
+ model_name='memberactivityinfo', |
|
41 |
+ name='activity_section', |
|
42 |
+ field=models.IntegerField(choices=[(0, 'Tamron Life'), (1, 'Tamron LRC直播课'), (2, '会员投稿'), (3, '其他'), (4, '摄影师')], db_index=True, default=3, help_text='活动分区', verbose_name='activity_section'), |
|
43 |
+ ), |
|
44 |
+ ] |
@@ -379,7 +379,7 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin): |
||
379 | 379 |
(1, u'Tamron LRC直播课'), |
380 | 380 |
(2, u'会员投稿'), |
381 | 381 |
(3, u'其他'), |
382 |
- (4, u'会员投稿'), |
|
382 |
+ (4, u'摄影师'), |
|
383 | 383 |
) |
384 | 384 |
|
385 | 385 |
activity_id = ShortUUIDField(_(u'activity_id'), max_length=32, blank=True, help_text=u'活动唯一标识', db_index=True, unique=True) |
@@ -395,6 +395,8 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin): |
||
395 | 395 |
end_date = models.DateField(_(u'end_date'), blank=True, null=True, help_text=u'活动报名截止日期') |
396 | 396 |
start_display_date = models.DateField(_(u'start_display_date'), blank=True, null=True, help_text=u'活动展示开始日期') |
397 | 397 |
end_display_date = models.DateField(_(u'end_display_date'), blank=True, null=True, help_text=u'活动展示截止日期') |
398 |
+ start_data_submit_date = models.DateField(_(u'start_data_submit_date'), blank=True, null=True, help_text=u'活动数据提交开始日期') |
|
399 |
+ end_data_submit_date = models.DateField(_(u'end_data_submit_date'), blank=True, null=True, help_text=u'活动数据提交截止日期') |
|
398 | 400 |
|
399 | 401 |
city = models.CharField(_(u'city'), max_length=255, blank=True, default='', help_text=u'活动城市') |
400 | 402 |
location = models.CharField(_(u'location'), max_length=255, blank=True, default='', help_text=u'活动地点') |
@@ -507,7 +509,7 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin): |
||
507 | 509 |
return MemberActivityContributionInfo.objects.filter(user_id=user_id, activity_id=self.activity_id, status=True).exists() |
508 | 510 |
|
509 | 511 |
def is_signup_passed(self, user_id): |
510 |
- return MemberActivitySignupInfo.objects.filter(user_id=user_id, activity_id=self.activity_id, passed=True, status=True).exists() |
|
512 |
+ return MemberActivitySignupInfo.objects.filter(user_id=user_id, activity_id=self.activity_id, audit_status=MemberActivitySignupInfo.PASSED, status=True).exists() |
|
511 | 513 |
|
512 | 514 |
@property |
513 | 515 |
def welfares(self): |
@@ -544,6 +546,8 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin): |
||
544 | 546 |
'end_date': tc.local_date_string(self.end_date), |
545 | 547 |
'start_display_date': tc.local_date_string(self.start_display_date), |
546 | 548 |
'end_display_date': tc.local_date_string(self.end_display_date), |
549 |
+ 'start_data_submit_date': tc.local_date_string(self.start_data_submit_date), |
|
550 |
+ 'end_data_submit_date': tc.local_date_string(self.end_data_submit_date), |
|
547 | 551 |
'city': self.city, |
548 | 552 |
'location': self.location, |
549 | 553 |
'lat': self.lat, |
@@ -590,6 +594,8 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin): |
||
590 | 594 |
'end_date': tc.local_date_string(self.end_date), |
591 | 595 |
'start_display_date': tc.local_date_string(self.start_display_date), |
592 | 596 |
'end_display_date': tc.local_date_string(self.end_display_date), |
597 |
+ 'start_data_submit_date': tc.local_date_string(self.start_data_submit_date), |
|
598 |
+ 'end_data_submit_date': tc.local_date_string(self.end_data_submit_date), |
|
593 | 599 |
'city': self.city, |
594 | 600 |
'location': self.location, |
595 | 601 |
'lat': self.lat, |
@@ -638,6 +644,8 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin): |
||
638 | 644 |
'end_date': tc.local_date_string(self.end_date), |
639 | 645 |
'start_display_date': tc.local_date_string(self.start_display_date), |
640 | 646 |
'end_display_date': tc.local_date_string(self.end_display_date), |
647 |
+ 'start_data_submit_date': tc.local_date_string(self.start_data_submit_date), |
|
648 |
+ 'end_data_submit_date': tc.local_date_string(self.end_data_submit_date), |
|
641 | 649 |
'city': self.city, |
642 | 650 |
'location': self.location, |
643 | 651 |
'lat': self.lat, |
@@ -685,6 +693,8 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin): |
||
685 | 693 |
'end_date': tc.local_date_string(self.end_date), |
686 | 694 |
'start_display_date': tc.local_date_string(self.start_display_date), |
687 | 695 |
'end_display_date': tc.local_date_string(self.end_display_date), |
696 |
+ 'start_data_submit_date': tc.local_date_string(self.start_data_submit_date), |
|
697 |
+ 'end_data_submit_date': tc.local_date_string(self.end_data_submit_date), |
|
688 | 698 |
'city': self.city, |
689 | 699 |
'location': self.location, |
690 | 700 |
'lat': self.lat, |
@@ -723,6 +733,16 @@ class MemberActivityInfo(BaseModelMixin, BrandInfoMixin): |
||
723 | 733 |
|
724 | 734 |
|
725 | 735 |
class MemberActivitySignupInfo(BaseModelMixin, BrandInfoMixin): |
736 |
+ UNAUDITED = 0 |
|
737 |
+ PASSED = 1 |
|
738 |
+ UNPASSED = 2 |
|
739 |
+ |
|
740 |
+ AUDIT_STATUS = ( |
|
741 |
+ (UNAUDITED, '未审核'), |
|
742 |
+ (PASSED, '已通过'), |
|
743 |
+ (UNPASSED, '未通过'), |
|
744 |
+ ) |
|
745 |
+ |
|
726 | 746 |
signup_id = ShortUUIDField(_(u'signup_id'), max_length=32, blank=True, null=True, help_text=u'活动报名唯一标识', db_index=True, unique=True) |
727 | 747 |
|
728 | 748 |
user_id = models.CharField(_(u'user_id'), max_length=32, blank=True, null=True, help_text=u'用户唯一标识', db_index=True) |
@@ -738,10 +758,12 @@ class MemberActivitySignupInfo(BaseModelMixin, BrandInfoMixin): |
||
738 | 758 |
|
739 | 759 |
fields = JSONField(_(u'fields'), blank=True, null=True, default='[]', help_text=u'自定义报名字段') |
740 | 760 |
|
741 |
- passed = models.BooleanField(_(u'passed'), default=False, help_text=u'是否通过') |
|
761 |
+ audit_status = models.IntegerField(_(u'audit_status'), choices=AUDIT_STATUS, default=UNAUDITED, help_text=u'审核状态', db_index=True) |
|
742 | 762 |
|
743 | 763 |
is_signin = models.BooleanField(_(u'is_signin'), default=False, help_text=u'是否已签到') |
744 | 764 |
|
765 |
+ is_read = models.BooleanField(_(u'is_read'), default=False, help_text=u'报名消息是否已读') |
|
766 |
+ |
|
745 | 767 |
class Meta: |
746 | 768 |
verbose_name = _(u'会员活动报名信息') |
747 | 769 |
verbose_name_plural = _(u'会员活动报名信息') |
@@ -756,6 +778,7 @@ class MemberActivitySignupInfo(BaseModelMixin, BrandInfoMixin): |
||
756 | 778 |
@property |
757 | 779 |
def final_avatar(self): |
758 | 780 |
return self.avatar and self.avatar.replace(settings.QINIU_FILE_URL_BEFORE, settings.QINIU_FILE_URL_AFTER).replace(settings.QINIU_FILE_URL_BEFORE2, settings.QINIU_FILE_URL_AFTER) |
781 |
+ |
|
759 | 782 |
|
760 | 783 |
@property |
761 | 784 |
def data(self): |
@@ -767,7 +790,7 @@ class MemberActivitySignupInfo(BaseModelMixin, BrandInfoMixin): |
||
767 | 790 |
'name': self.name, |
768 | 791 |
'phone': self.phone, |
769 | 792 |
'fields': json.loads(self.fields) if self.fields else [], |
770 |
- 'passed': self.passed, |
|
793 |
+ 'audit_status': self.audit_status, |
|
771 | 794 |
} |
772 | 795 |
|
773 | 796 |
@property |
@@ -783,7 +806,7 @@ class MemberActivitySignupInfo(BaseModelMixin, BrandInfoMixin): |
||
783 | 806 |
'phone': self.phone, |
784 | 807 |
'fields': json.loads(self.fields) if self.fields else [], |
785 | 808 |
'is_signin': self.is_signin, |
786 |
- 'passed': self.passed, |
|
809 |
+ 'audit_status': self.audit_status, |
|
787 | 810 |
} |
788 | 811 |
|
789 | 812 |
class MemberActivityDataInfo(BaseModelMixin, BrandInfoMixin): |
@@ -2,7 +2,7 @@ |
||
2 | 2 |
|
3 | 3 |
from django.conf.urls import url |
4 | 4 |
|
5 |
-from member import activity_mp_views |
|
5 |
+from member import activity_mp_views, lensman_activity_mp_views |
|
6 | 6 |
|
7 | 7 |
# activity |
8 | 8 |
urlpatterns = [ |
@@ -22,8 +22,8 @@ urlpatterns += [ |
||
22 | 22 |
|
23 | 23 |
# activity data |
24 | 24 |
urlpatterns += [ |
25 |
- url(r'^member/activity/data/submit$', activity_mp_views.activity_data_submit, name='mp_member_activity_data_submit'), # 会员活动数据提交 |
|
26 |
- url(r'^member/activity/data/detail$', activity_mp_views.activity_data_detail, name='mp_member_activity_data_detail'), # 获取会员活动报名信息 |
|
25 |
+ url(r'^member/activity/data/submit$', lensman_activity_mp_views.activity_data_submit, name='mp_member_activity_data_submit'), # 会员活动数据提交 |
|
26 |
+ url(r'^member/activity/data/detail$', lensman_activity_mp_views.activity_data_detail, name='mp_member_activity_data_detail'), # 获取会员活动报名信息 |
|
27 | 27 |
] |
28 | 28 |
|
29 | 29 |
|
@@ -36,3 +36,9 @@ urlpatterns += [ |
||
36 | 36 |
|
37 | 37 |
url(r'^member/activity/contribute/detail/lastest$', activity_mp_views.activity_contribute_detail_lastest, name='member_activity_contribute_detail_lastest'), |
38 | 38 |
] |
39 |
+ |
|
40 |
+#activity message |
|
41 |
+urlpatterns += [ |
|
42 |
+ url(r'^member/activity/signup/message$', lensman_activity_mp_views.activity_signup_message, name='mp_member_activity_signup_message'), |
|
43 |
+ url(r'^member/activity/signup/message/read$', lensman_activity_mp_views.activity_signup_message_read, name='mp_member_activity_signup_message_read'), |
|
44 |
+] |