55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
"""打印中心模型:PrintSettings(租户抬头)+ PrintTemplate(单据模板)。"""
|
|
|
|
from django.db import models
|
|
|
|
from apps.core.base_models import TenantScopedModel
|
|
|
|
|
|
class PrintSettings(TenantScopedModel):
|
|
"""租户打印抬头(单例:每租户一条,code 固定 default)。"""
|
|
|
|
company_name = models.CharField(max_length=128, blank=True, default="")
|
|
phone = models.CharField(max_length=64, blank=True, default="")
|
|
address = models.CharField(max_length=255, blank=True, default="")
|
|
bank_info = models.CharField(max_length=255, blank=True, default="", help_text="开户行/账号")
|
|
footer_note = models.CharField(max_length=255, blank=True, default="", help_text="页脚备注(如:货已验收,概不退换)")
|
|
logo_url = models.URLField(blank=True, default="")
|
|
|
|
class Meta:
|
|
db_table = "printing_settings"
|
|
verbose_name_plural = "打印抬头"
|
|
ordering = ["id"]
|
|
|
|
def __str__(self):
|
|
return f"{self.company_name or '未设置抬头'}"
|
|
|
|
|
|
class PrintTemplate(TenantScopedModel):
|
|
"""打印模板(用户可编辑的 HTML 片段,使用安全占位符语法)。
|
|
|
|
doc_type: sales_bill / purchase_bill
|
|
语法:{{path}} 取值、{{#each lines}}…{{/each}} 行循环(循环内用 {{item.xxx}})。
|
|
自研占位符渲染,不走 Django 模板引擎,杜绝模板注入。
|
|
"""
|
|
|
|
DOC_TYPE_CHOICES = [
|
|
("sales_bill", "销售单/送货单"),
|
|
("purchase_bill", "采购单/进货单"),
|
|
]
|
|
|
|
code = models.CharField(max_length=64, help_text="模板代码(租户内唯一)")
|
|
name = models.CharField(max_length=128)
|
|
doc_type = models.CharField(max_length=32, choices=DOC_TYPE_CHOICES)
|
|
body_html = models.TextField(help_text="模板正文(安全占位符语法)")
|
|
paper_size = models.CharField(max_length=16, default="A4")
|
|
is_default = models.BooleanField(default=False, help_text="该单据类型的默认模板")
|
|
|
|
class Meta:
|
|
db_table = "printing_template"
|
|
unique_together = [("tenant", "code")]
|
|
verbose_name_plural = "打印模板"
|
|
ordering = ["doc_type", "code"]
|
|
|
|
def __str__(self):
|
|
return f"[{self.doc_type}] {self.code}"
|