作者 vanwhebin

update

# 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,17 @@ 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="月销量预估")
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", "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)
... ...
# Generated by Django 3.1.1 on 2020-10-21 13:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('usercenter', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='media',
name='file_name',
field=models.CharField(default='', max_length=100, verbose_name='文件名'),
),
]
... ...
... ... @@ -108,6 +108,7 @@ class Media(models.Model):
file = models.FileField(max_length=200, upload_to="%Y-%m-%d", verbose_name="文件地址")
size = models.PositiveIntegerField(verbose_name="文件大小", null=True, blank=True)
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name="uploader", verbose_name="上传用户")
file_name = models.CharField(max_length=100, default="", verbose_name="文件名")
extension = models.CharField(max_length=10, verbose_name="文件扩展名", choices=UPLOAD_MEDIA_CHOICES)
create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
hash = models.CharField(max_length=200, verbose_name="文件哈希", null=True, blank=True)
... ...
... ... @@ -54,7 +54,7 @@ class GroupSerializer(serializers.ModelSerializer):
class MediaSerializer(serializers.ModelSerializer):
class Meta:
model = Media
fields = ('file', 'size', 'create_time')
fields = ('file', 'size', 'create_time', 'file_name')
... ...
... ... @@ -46,6 +46,7 @@ class UploadMedia(CreateAPIView):
if not file:
file = Media.objects.create(
file=uploaded_file,
file_name=uploaded_file.name,
hash=file_hash,
user=request.user,
size=file_size,
... ...