101 lines
3.5 KiB
Python
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()
|