# -*- 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[^"]*"[^>]*>(.*?)', 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()