feat(api): 为汇总记录提交添加来源验证和来源字段

- 移除 api_submit_summary 的 csrf_exempt 装饰器
- 允许客户端提交来源字段
- 在提交工具中添加来源输入框
- 自动生成来源信息当未提供时
This commit is contained in:
2026-01-26 22:35:51 +08:00
parent 2348d7a419
commit 80d40b5daa
2 changed files with 27 additions and 9 deletions

View File

@@ -806,7 +806,6 @@ def pdf_list(request):
return render(request, 'core/pdf_list.html', context) return render(request, 'core/pdf_list.html', context)
@csrf_exempt
def api_submit_summary(request): def api_submit_summary(request):
"""API提交汇总记录 - 仅接受指定分类和发言人的记录""" """API提交汇总记录 - 仅接受指定分类和发言人的记录"""
logger.info("API: 收到汇总记录提交请求") logger.info("API: 收到汇总记录提交请求")
@@ -835,10 +834,17 @@ def api_submit_summary(request):
logger.error(f"API: 发言人 '{speaker_name}' 不存在") logger.error(f"API: 发言人 '{speaker_name}' 不存在")
return JsonResponse({'success': False, 'message': f"发言人 '{speaker_name}' 不存在"}, status=400) return JsonResponse({'success': False, 'message': f"发言人 '{speaker_name}' 不存在"}, status=400)
import socket # 获取来源,支持客户端提交
hostname = socket.gethostname() source = request.POST.get('source', '').strip()
local_ip = socket.gethostbyname(hostname) if not source:
source = f"{hostname} ({local_ip})" source = ""
# 如果没有提供来源,自动生成
if not source:
import socket
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
source = f"{hostname} ({local_ip})"
summary = Summary.objects.create( summary = Summary.objects.create(
date=timezone.now().date(), date=timezone.now().date(),

View File

@@ -153,10 +153,17 @@ class SubmitSummaryTool(QMainWindow):
self.content_edit.setPlaceholderText("输入要提交的内容...") self.content_edit.setPlaceholderText("输入要提交的内容...")
self.content_edit.setMaximumHeight(100) self.content_edit.setMaximumHeight(100)
source_layout = QHBoxLayout()
source_layout.addWidget(QLabel("来源:"))
self.source_edit = QLineEdit()
self.source_edit.setPlaceholderText("留空则自动生成")
source_layout.addWidget(self.source_edit)
submit_btn = QPushButton("提交汇总记录") submit_btn = QPushButton("提交汇总记录")
submit_btn.clicked.connect(self.manual_submit) submit_btn.clicked.connect(self.manual_submit)
layout.addWidget(self.content_edit) layout.addWidget(self.content_edit)
layout.addLayout(source_layout)
layout.addWidget(submit_btn) layout.addWidget(submit_btn)
group.setLayout(layout) group.setLayout(layout)
@@ -264,7 +271,7 @@ class SubmitSummaryTool(QMainWindow):
def auto_submit_content(self): def auto_submit_content(self):
"""自动提交系统监控内容""" """自动提交系统监控内容"""
content = self.get_system_content() content = self.get_system_content()
self.submit_summary(content) self.submit_summary(content, source=None)
def manual_submit(self): def manual_submit(self):
"""手动提交""" """手动提交"""
@@ -272,7 +279,8 @@ class SubmitSummaryTool(QMainWindow):
if not content: if not content:
QMessageBox.warning(self, "警告", "请输入要提交的内容") QMessageBox.warning(self, "警告", "请输入要提交的内容")
return return
self.submit_summary(content) source = self.source_edit.text().strip()
self.submit_summary(content, source)
self.content_edit.clear() self.content_edit.clear()
def get_csrf_token(self): def get_csrf_token(self):
@@ -299,7 +307,7 @@ class SubmitSummaryTool(QMainWindow):
self.log(f"获取CSRF token失败: {str(e)}") self.log(f"获取CSRF token失败: {str(e)}")
return None, None return None, None
def submit_summary(self, content): def submit_summary(self, content, source=""):
"""提交汇总记录到家庭日报系统""" """提交汇总记录到家庭日报系统"""
submit_url = f"{self.server_url}/api/v1/summary/submit/" submit_url = f"{self.server_url}/api/v1/summary/submit/"
@@ -321,7 +329,11 @@ class SubmitSummaryTool(QMainWindow):
self.log(f"设置CSRF header: X-CSRFToken = {csrf_token[:20]}...") self.log(f"设置CSRF header: X-CSRFToken = {csrf_token[:20]}...")
self.log(f"发送POST请求到: {submit_url}") self.log(f"发送POST请求到: {submit_url}")
response = session.post(submit_url, data={'content': content}, headers=headers, timeout=10) post_data = {'content': content}
if source:
post_data['source'] = source
self.log(f"提交来源: {source}")
response = session.post(submit_url, data=post_data, headers=headers, timeout=10)
self.log(f"服务器响应状态码: {response.status_code}") self.log(f"服务器响应状态码: {response.status_code}")
self.log(f"响应Headers: {dict(response.headers)}") self.log(f"响应Headers: {dict(response.headers)}")