Currently there is a TemplateFunction implementation on product.product which read the fields from the template. Probably enabling a setter method will simplify your use special module.
This is what I usually explain but for me it’s hard to explain to users how to create a template directly from the sale order. Normally I recommend opening to the “Products” option to directly create the template and a variant (which is implicitly created by default).
I like this proposal but only if we move the product template to a separate module which is only activated when the database requires products and variants. This will simplify things for the all the setups which use a single variant for each template. It seems to me that they are more than with multiple variants. Of course, the new module can be added as extra_depends for the modules that may require it.
Having said that I think the new module will be responsible of creating the template with all the fields to be reused and add the template on the product.product. Other modules can add fields on template by using the extra depends. If a template is set on a product we can make the fields defined on template readonly at product level and use the values from the template. Probably it can be similar to the “Override Template” functionality of the account module.
This will also avoid the duplicity of the Template and Product fields on the Product Supplier and Customer Product models.
This will be a big refactor for Tryton, so it has to be though carefully.