作者 vanwhebin

修改后台数据满足多种类型审核 以及上传接口修改返回文件名

# Generated by Django 3.1.1 on 2020-10-21 11:40
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('project', '0004_auto_20201014_1513'),
]
operations = [
migrations.AddField(
model_name='auditor',
name='type',
field=models.PositiveSmallIntegerField(choices=[(1, '市场容量小于300万美金'), (2, '市场容量大于等于300万美金')], default=1, verbose_name='项目类型'),
),
migrations.AddField(
model_name='project',
name='first_orders',
field=models.PositiveIntegerField(default=0, verbose_name='首单数量'),
),
migrations.AddField(
model_name='project',
name='orders_estimate',
field=models.CharField(default='', max_length=255, verbose_name='月销量预估'),
),
migrations.AddField(
model_name='project',
name='roi_report',
field=models.CharField(default='', max_length=255, verbose_name='ROI报告'),
),
migrations.AddField(
model_name='project',
name='type',
field=models.PositiveSmallIntegerField(choices=[(1, '市场容量小于300万美金'), (2, '市场容量大于等于300万美金')], default=1, verbose_name='项目类型'),
),
migrations.AlterField(
model_name='auditor',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='aud', to=settings.AUTH_USER_MODEL, verbose_name='审批人员'),
),
]
... ...
from django.db import models
from usercenter.models import User
# users = User.objects.filter(is_active=True).values('username', 'id').all()
# AUDITOR_CHOICE = [(i['id'], i['username']) for i in users]
AUDITOR_CHOICE = [(2, '邓望明'), (3, '杜波')]
PROJECT_TYPE = (
(1, u"市场容量小于300万美金"),
(2, u"市场容量大于等于300万美金"),
)
class Auditor(models.Model):
... ... @@ -12,7 +13,6 @@ class Auditor(models.Model):
User,
on_delete=models.CASCADE,
related_name="aud",
choices=AUDITOR_CHOICE,
verbose_name="审批人员")
leader = models.ForeignKey(
'self',
... ... @@ -21,6 +21,7 @@ class Auditor(models.Model):
null=True,
blank=True,
verbose_name="上级领导")
type = models.PositiveSmallIntegerField(default=1, choices=PROJECT_TYPE, verbose_name="项目类型")
order = models.PositiveSmallIntegerField(default=0, null=True, blank=True, verbose_name="排序")
def __str__(self):
... ... @@ -31,13 +32,18 @@ class Auditor(models.Model):
class Project(models.Model):
category = models.CharField(max_length=100, default="", verbose_name="产品类目")
model_type = models.CharField(max_length=50, default="", verbose_name="产品型号")
market_share_analysis = models.TextField(default="", verbose_name="产品市场占有率分析")
context_analysis = models.TextField(default="", verbose_name="产品场景分析")
attachments = models.CharField(max_length=800, default="", verbose_name="附件地址")
first_orders = models.PositiveIntegerField(default=0, verbose_name="首单数量")
orders_estimate = models.CharField(default="", max_length=255, verbose_name="月销量预估")
roi_report = models.CharField(default="", max_length=255, verbose_name="ROI报告")
auditor = models.ManyToManyField(Auditor, related_name="project_auditor", blank=True, verbose_name="审核人员")
is_done = models.BooleanField(default=False, blank=True, verbose_name="是否完成")
type = models.PositiveSmallIntegerField(default=1, choices=PROJECT_TYPE, verbose_name="项目类型")
is_pass = models.BooleanField(null=True, blank=True, verbose_name="是否通过")
create_time = models.DateTimeField(auto_now_add=True)
creator = models.ForeignKey(User, related_name="project_creator", on_delete=models.CASCADE, verbose_name="创建人员")
... ...
... ... @@ -23,7 +23,7 @@ class ProjectSerializer(serializers.ModelSerializer):
model = Project
fields = (
'id', 'result', 'creator_name', 'category', 'model_type', 'market_share_analysis', 'context_analysis',
'attachments', 'create_time', "is_done", "is_pass"
'attachments', 'create_time', "is_done", "is_pass", "roi_report", "type", "orders_estimate", "first_orders"
)
depth = 1
... ...
... ... @@ -35,17 +35,18 @@ class CreateProject(CreateAPIView):
if not serializer.is_valid():
raise ValidationError(serializer.errors)
else:
serializer.save(creator=request.user, auditor=Auditor.objects.order_by('-order').all())
# 企业微信推送
obj_dict = serializer.data
for i in AUDITORS:
auditors = Auditor.objects.filter(type=obj_dict['type']).order_by('order')
serializer.save(creator=request.user, auditor=auditors)
# 企业微信推送
for i in auditors:
Result.objects.create(
auditor_id=i[0],
auditor_id=i.pk,
project_id=obj_dict['id']
)
url = re.sub("PK", str(obj_dict['id']), FRONT_URL['flow_detail'])
url = re.sub("REDIRECT_URL", parse.quote(url, safe=''), FRONT_URL['wx_authorize'])
first_auditor = Auditor.objects.filter(pk=AUDITORS[0][0]).first()
first_auditor = auditors[0]
wx_client.push_card(first_auditor.user.wx_token, url, f"{request.user.username}提交了一个产品立项申请")
wx_client.push_card(request.user.wx_token, url, u"流程创建成功")
... ... @@ -61,8 +62,7 @@ class ProjectDetail(RetrieveAPIView):
obj = self.get_object()
obj.creator_name = obj.creator.username
obj.result = []
auditors = Auditor.objects.all()
# result = Result.objects.filter(project=obj)
auditors = Auditor.objects.filter(type=obj.type)
for i in auditors:
res = i.result_auditor.filter(project=obj).values('is_accept', 'memo').first()
obj.result.append({
... ... @@ -94,12 +94,14 @@ class AuditProject(UpdateAPIView):
('reject', '否决')
)
accept_param = accept_choices[0][0] if request.data.get('is_accept') else accept_choices[1][0]
target = Project.objects.filter(auditor__user_id=request.user.id, pk=obj.id)
if not target:
# target = Project.objects.filter(auditor__user_id=request.user.id, pk=obj.id)
if not obj:
raise PermissionError
else:
auditor = Auditor.objects.get(user=request.user)
result = Result.objects.filter(auditor=auditor, project=obj).first()
result = Result.objects.filter(auditor=auditor, project=obj, is_accept__isnull=True).order_by('pk').first()
if not result:
raise PermissionError("不允许修改已审核的项目")
result.is_accept = accept_param
result.memo = request.data.get('memo', '')
result.save()
... ... @@ -117,7 +119,9 @@ class AuditProject(UpdateAPIView):
obj.is_done = True
obj.is_pass = False
else:
second_auditor = Auditor.objects.filter(pk=AUDITORS[1][0]).first()
next_auditor_id = Result.objects.filter(project=obj, is_accept__isnull=True)\
.values_list('auditor_id', flat=True).order_by('pk').first()
second_auditor = Auditor.objects.filter(pk=next_auditor_id).first()
wx_client.push_card(second_auditor.user.wx_token, url, f"{request.user.username}已审核了一个产品立项申请")
obj.save()
wx_client.push_card(obj.creator.wx_token, url, desc)
... ...