WhyNotHugo / django-afip

⚖️ AFIP invoice integration for django.
https://django-afip.readthedocs.io/
ISC License
47 stars 24 forks source link

Introduce a PdfBuilder type #199

Closed WhyNotHugo closed 11 months ago

WhyNotHugo commented 11 months ago

This allows applications to customise PDF generation.

See: https://github.com/WhyNotHugo/django-afip/issues/195

erebodino commented 11 months ago

Ahí estuve viendo, en ese caso en PdfBuilder se puede agregar en el init entries_per_page (default = 15) y el nuevo método en get_context y cada usuario si tiene que hacer modificaciones hereda desde PdfBuildery lo pasa a save_pdf.

    class PdfBuilder:
        def __init__(self, receipt: Receipt, entries_per_page:int = 15) -> None:
              self.receipt = receipt
              self.entries_per_page = entries_per_page

       def get_context(self):
             (...)
             context["entries"] = create_entries_context_for_render(paginator)

Entonces por ejemplo, al momento de guardar el pdf en caso de que alguien herede de PdfBuilder a digamos PdfBuilderCustom

    class PdfBuilderCustom(PdfBuilder):
        def __init__(self,entries_per_page:int = 5) -> None:
             super().__init__(entries_per_page)

y por ultimo en la vista del usuario:

    save_pdf(builder_class = PdfBuilderCustom)

De esa forma ya estaria por default los 15 ReceiptEntry, todo funciona igual y en caso de que el usuario decida un nuevo comportamiento, hereda desde PdfBuilder y hace un override sobre lo que considere necesario.

WhyNotHugo commented 11 months ago

Con esta versión deberías poder hacer:

class PdfBuilder:
    def __init__(self, entries_per_page:int = 15) -> None:
          self.entries_per_page = entries_per_page

   def get_context(self):
         (...)
         context["entries"] = create_entries_context_for_render(paginator)

Y usarlo:

custom_builder = PdfBuilder(entries_per_page=5)
save_pdf(builder = custom_builder)