Files
order_system/tools/test_approve_stamp.py
T

101 lines
3.5 KiB
Python

# -*- coding: utf-8 -*-
"""模拟:经理批准也需先加章;批准通过后 PDF 上审核章与批准章并排。
用法:python test_approve_stamp.py 8099
"""
import os
import re
import sqlite3
import sys
import requests
BASE = "http://127.0.0.1:%s" % (sys.argv[1] if len(sys.argv) > 1 else "8099")
HERE = os.path.dirname(os.path.abspath(__file__))
OUT = os.path.join(HERE, "out")
os.makedirs(OUT, exist_ok=True)
DB = os.path.join(os.path.dirname(HERE), "po_app", "instance", "po.db")
FAILS = []
def check(label, cond, extra=""):
print((" OK " if cond else " FAIL ") + label + (" " + str(extra) if extra else ""))
if not cond:
FAILS.append(label)
def sess(u, p):
s = requests.Session()
s.post(BASE + "/login", data={"username": u, "password": p})
return s
def flash_of(h):
return " | ".join(re.sub(r"<[^>]+>", "", m.group(1)).strip()
for m in re.finditer(r'class="flash[^"]*"[^>]*>(.*?)</div>', h, re.S))
def dbq(sql, a=()):
con = sqlite3.connect(DB)
cur = con.cursor()
cur.execute(sql, a)
r = cur.fetchone()
con.close()
return r
def main():
admin = sess("admin", "admin123")
r = admin.post(BASE + "/orders/new", data={"doc_type": "purchase"})
oid = int(re.search(r"/orders/(\d+)/edit", r.url).group(1))
admin.post(BASE + "/orders/%d" % oid, data={
"supplier_name": u"测试供应商",
"item_code": ["M-1001"], "item_spec": [u"测试物料"], "item_unit": [u"件"],
"item_qty": ["10"], "item_price": ["12.5"], "item_date": [""], "item_remark": [""],
})
admin.post(BASE + "/orders/%d/submit" % oid, data={"comment": u"模拟"})
print("\n[1] 主管审核(加章)")
rv = sess("reviewer", "123456")
rv.post(BASE + "/orders/%d/review" % oid, data={"comment": u"ok", "stamped": "1"})
check("审核通过", dbq("SELECT status FROM orders WHERE id=?", (oid,))[0] == "pending_approval")
print("\n[2] 经理批准:未加章应被拒绝")
ap = sess("approver", "123456")
h = ap.post(BASE + "/orders/%d/approve" % oid, data={"comment": u"直接批", "stamped": "0"}).text
check("未加章 → 提示", u"请先加盖批准章" in flash_of(h), flash_of(h))
check("状态未变", dbq("SELECT status FROM orders WHERE id=?", (oid,))[0] == "pending_approval")
print("\n[3] 加章后批准")
ap.post(BASE + "/orders/%d/approve" % oid, data={"comment": u"同意", "stamped": "1"})
row = dbq("SELECT status, approved_by FROM orders WHERE id=?", (oid,))
check("已批准", row[0] == "approved", row)
print("\n[4] 导出 PDF(应含两枚章)")
b = admin.get(BASE + "/orders/%d/pdf" % oid).content
p = os.path.join(OUT, "seal_both.pdf")
open(p, "wb").write(b)
check("PDF 生成", len(b) > 10000, "%d bytes" % len(b))
try:
import pymupdf
doc = pymupdf.open(p)
doc[-1].get_pixmap(dpi=130).save(os.path.join(OUT, "seal_both.png"))
print(" 预览:", os.path.join(OUT, "seal_both.png"), "%d 页" % doc.page_count)
doc.close()
except Exception as e:
print(" 渲染失败:", e)
print("\n[5] 清理")
con = sqlite3.connect(DB)
cur = con.cursor()
cur.execute("DELETE FROM order_items WHERE order_id=?", (oid,))
cur.execute("DELETE FROM orders WHERE id=?", (oid,))
con.commit()
con.close()
print(" 已删除订单 %d" % oid)
print("\n" + ("全部通过" if not FAILS else "失败: " + "; ".join(FAILS)))
if __name__ == "__main__":
main()