diff --git a/apps/ofm/migrations/0026_paperse.py b/apps/ofm/migrations/0026_paperse.py new file mode 100644 index 00000000..bab14bfa --- /dev/null +++ b/apps/ofm/migrations/0026_paperse.py @@ -0,0 +1,41 @@ +# Generated by Django 3.2.12 on 2025-10-29 03:13 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('wf', '0004_workflow_view_path2'), + ('ofm', '0025_alter_patentinfo_area'), + ] + + operations = [ + migrations.CreateModel( + name='PaperSe', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('paper_name', models.CharField(max_length=100, verbose_name='拟发表论文名称')), + ('publication_name', models.CharField(max_length=100, verbose_name='拟投期刊名称')), + ('author', models.CharField(max_length=100, verbose_name='作者')), + ('paper_type', models.CharField(max_length=100, verbose_name='拟发表文章类型')), + ('is_chinese_core', models.BooleanField(default=False, verbose_name='是否为中文核心')), + ('is_sci', models.BooleanField(default=False, verbose_name='是否被SCI/EI收录')), + ('tech_status', models.JSONField(blank=True, default=list, help_text='技术状态信息列表,每个条目包含name(名称)、status(状态)、file(文件)字段', verbose_name='技术状态')), + ('tech_file', models.JSONField(default=list, help_text='技术文件信息列表,每个条目包含name(名称)page(页数)字段', verbose_name='技术文件')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='paperse_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('ticket', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='paperse_ticket', to='wf.ticket', verbose_name='关联工单')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='paperse_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/ofm/models.py b/apps/ofm/models.py index 9b26349b..a4e3b6c8 100644 --- a/apps/ofm/models.py +++ b/apps/ofm/models.py @@ -182,39 +182,20 @@ class PatentInfo(CommonBDModel): ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', on_delete=models.SET_NULL, related_name='patentInfo_ticket', null=True, blank=True, db_constraint=False) -# class PaperOfm(CommonADModel): -# """TN: 论文申密审批表单""" -# PAPER_TYPE_CHOICES = ( -# ('research', '研究论文'), -# ('comprehensive', '综合'), -# ) -# name = models.CharField('拟申请专利名称', max_length=100) -# author = models.CharField('发明人(设计人)', max_length=100) -# paper_type = models.CharField('论文类型', max_length=50, choices=PAPER_TYPE_CHOICES, default='research') -# is_chinese_core = models.BooleanField('是否为中文核心', default=False) -# is_sci = models.BooleanField('是否被SCI/EI收录', default=False) -# has_appraisal = models.BooleanField('是否进行过科技成果鉴定', default=False) -# has_published_article = models.BooleanField('是否发表过文章', default=False) -# has_exhibited = models.BooleanField('是否参与过展会展出', default=False) -# has_applied_in_production = models.BooleanField('是否参与应用于生产/销售', default=False) -# has_technical_exchange = models.BooleanField('是否参与过技术交流', default=False) -# paper_page_count = models.PositiveIntegerField('论文页数', null=True, blank=True) -# image_count = models.PositiveIntegerField('图/照片张数', null=True, blank=True) +class PaperSe(CommonADModel): + """TN: 论文申密审批表单""" + paper_name = models.CharField('拟发表论文名称', max_length=100) + publication_name = models.CharField('拟投期刊名称', max_length=100) + author = models.CharField('作者', max_length=100) + paper_type = models.CharField('拟发表文章类型', max_length=100) + is_chinese_core = models.BooleanField('是否为中文核心', default=False) + is_sci = models.BooleanField('是否被SCI/EI收录', default=False) + tech_status = models.JSONField('技术状态', default=list, blank=True, help_text='技术状态信息列表,每个条目包含name(名称)、status(状态)、file(文件)字段') + tech_file = models.JSONField('技术文件', default=list, help_text='技术文件信息列表,每个条目包含name(名称)page(页数)字段') + ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', + on_delete=models.SET_NULL, related_name='paperse_ticket', null=True, blank=True, db_constraint=False) -# class Platform(CommonADModel): -# name = models.CharField(max_length=100) - -# def __str__(self): -# return self.name - -# class Project(CommonADModel): -# name = models.CharField(max_length=100) - -# def __str__(self): -# return self.name - - # class PatentRecord(CommonADModel): # """TN: 专利台账登记""" # volume_number = models.CharField(max_length=50, null=True, blank=True, verbose_name="卷号") diff --git a/apps/ofm/serializers.py b/apps/ofm/serializers.py index ec1c85f6..6598b0e4 100644 --- a/apps/ofm/serializers.py +++ b/apps/ofm/serializers.py @@ -1,4 +1,4 @@ -from .models import (Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord, Publicity, PatentInfo) +from .models import (Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord, Publicity, PatentInfo, PaperSe) # Publicity, PatetInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) from apps.utils.serializers import CustomModelSerializer from rest_framework import serializers @@ -132,11 +132,11 @@ class PatentInfoSerializer(CustomModelSerializer): read_only_fields = EXCLUDE_FIELDS -# class PaperSerializer(CustomModelSerializer): -# class Meta: -# model = PaperOfm -# fields = '__all__' -# read_only_fields = EXCLUDE_FIELDS +class PaperSeSerializer(CustomModelSerializer): + class Meta: + model = PaperSe + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS # class PlatformSerializer(serializers.ModelSerializer): diff --git a/apps/ofm/services.py b/apps/ofm/services.py index cfceda7a..ad99c482 100644 --- a/apps/ofm/services.py +++ b/apps/ofm/services.py @@ -1,7 +1,7 @@ from apps.wf.models import Ticket # TicketFlow, Transition, Workflow, CustomField, State, -from apps.ofm.models import LendingSeal, Vehicle, BorrowRecord, Publicity, MroomBooking, MroomSlot, PatentInfo +from apps.ofm.models import LendingSeal, Vehicle, BorrowRecord, Publicity, MroomBooking, MroomSlot, PatentInfo, PaperSe from rest_framework.exceptions import ParseError @@ -164,4 +164,29 @@ def patent_save_ticket_data(ticket: Ticket, new_ticket_data: dict, **kwargs): for k, v in data_save.items(): setattr(obj, k, v) obj.save() - \ No newline at end of file + + +def paperse_patent(ticket: Ticket, transition, new_ticket_data: dict): + ins = PaperSe.objects.get(id=new_ticket_data['t_id']) + ticket_data = ticket.ticket_data + ticket_data.update({ + 't_model': 'paperse', + 't_id': ins.id, + }) + ticket.ticket_data = ticket_data + ticket.create_by = ins.create_by + ticket.save() + if ins.ticket is None: + ins.ticket = ticket + ins.save() + +def paperse_save_ticket_data(ticket: Ticket, new_ticket_data: dict, **kwargs): + try: + obj = PaperSe.objects.get(id=new_ticket_data['t_id']) + except PaperSe.DoesNotExist: + raise ParseError("Publicity t_id 不存在") + data_save = {k: v for k, v in new_ticket_data.items() if k not in ['t_model', 't_id']} + + for k, v in data_save.items(): + setattr(obj, k, v) + obj.save() \ No newline at end of file diff --git a/apps/ofm/urls.py b/apps/ofm/urls.py index 35b956ef..040eb6e6 100644 --- a/apps/ofm/urls.py +++ b/apps/ofm/urls.py @@ -1,7 +1,7 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter from apps.ofm.views import (MroomViewSet, MroomBookingViewSet, MroomSlotViewSet,LendingSealViewSet, VehicleViewSet, FilerecordViewSet, - FileborrowViewSet, PublicityViewSet, PatentInfoViewSet) + FileborrowViewSet, PublicityViewSet, PatentInfoViewSet, PaperSeViewSet) # SealModelViewSet, # , PublicityViewSet, , PaperViewSet, PlatformViewSet, # ProjectViewSet, PatentRecordViewSet, PaperRecordViewSet, ProjectApprovalViewSet, ProjectInfoViewSet) @@ -20,7 +20,7 @@ router.register('filerecord', FilerecordViewSet, basename='filerecord') router.register('fileborrow', FileborrowViewSet, basename='fileborrow') router.register('publicity', PublicityViewSet, basename='publicity') router.register('patentinfo', PatentInfoViewSet, basename='patentinfo') -# router.register('paper', PaperViewSet, basename='paper') +router.register('paperse', PaperSeViewSet, basename='PaperSe') # router.register('platform', PlatformViewSet, basename='platform') # router.register('project', ProjectViewSet, basename='project') # router.register('patentrecord', PatentRecordViewSet, basename='patentrecord') diff --git a/apps/ofm/views.py b/apps/ofm/views.py index 7e9252c5..9fa530a9 100644 --- a/apps/ofm/views.py +++ b/apps/ofm/views.py @@ -1,9 +1,9 @@ from django.shortcuts import render from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet -from .models import Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord, Publicity, PatentInfo +from .models import Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord, Publicity, PatentInfo, PaperSe # Publicity, , PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) from .serializers import (MroomSerializer, MroomBookingSerializer, MroomSlotSerializer, LendingSealSerializer, - VehicleSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, PatentInfoSerializer) + VehicleSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, PatentInfoSerializer, PaperSeSerializer) # ,SealSerializer, # LendingSealSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, # PatentInfoSerializer, PaperSerializer, PlatformSerializer, ProjectSerializer, ProjectMemberSerializer, PaperRecordSerializer, ProjectApprovalSerializer, ProjectInfoSerializer) @@ -182,15 +182,15 @@ class PatentInfoViewSet(CustomModelViewSet): ordering = ["-create_time", "name", "author", "type"] -# class PaperViewSet(CustomModelViewSet): -# """list: 论文申密审批 +class PaperSeViewSet(CustomModelViewSet): + """list: 论文申密审批 -# 论文申密审批 -# """ -# queryset = PaperOfm.objects.all() -# serializer_class = PaperSerializer -# filterset_fields = ["name", "author"] -# ordering = ["create_time", "name"] + 论文申密审批 + """ + queryset = PaperSe.objects.all() + serializer_class = PaperSeSerializer + filterset_fields = ["paper_name", "author"] + ordering = ["create_time", "paper_name"] # class PlatformViewSet(CustomModelViewSet):