DocumentHandler

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

DocumentHandler

Annick
Hi, I would like to serve a custom dynamically generated PDF file, what is the best option ? Use a DocumentHandler ?
If yes how ?

Annick
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: DocumentHandler

Karsten Kusche
Hi Annick,

you basically need to respond with a file:

WACurrentRequestContext value respond: [:response | 
response document: aDocument.
]

aDocument would be something that responds to #seasideMimeDocument (like ByteArray, String, or WAMimeDocument).
In #document: you’ll also find all the methods you could/should sent to the response to configure the response.

I’d suggest you create your own WARequestHandler subclass, register it and handle your requests there.

Kind Regards
Karsten

— 

Georg Heeg eK
Wallstraße 22
06366 Köthen

Tel.: 03496/214328
FAX: 03496/214712
Amtsgericht Dortmund HRA 12812


Am 2. Juni 2020 um 11:20:47, Annick Fron ([hidden email]) schrieb:

Hi, I would like to serve a custom dynamically generated PDF file, what is the best option ? Use a DocumentHandler ?
If yes how ?

Annick
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: DocumentHandler

Esteban A. Maringolo
In reply to this post by Annick
If instead of setting a callback on an anchor, you set a document, it
will be treated slightly different.

E.g.

You can do something like:

html anchor
  document: documentContents mimeType:  ( Seaside.WAMimeType main:
'application' sub: 'pdf' ) fileName: 'YourFile.pdf';
  with: 'Download PDF'

This will be handled differently to a regular action continuation of a
callback and will trigger the download immediately, also the document
will be returned as a response to never expire.

In some cases you want to use `document:` and in others it could be
more flexible to use a regular `respond:` from the
WACurrentRequestContext (e.g. if the decision on the file format or
other things are deep down in the logic, away from the anchor).

E.g.

WACurrentRequestContext value respond: [:response |
  response
    attachmentWithFileName: self exportedFilename , '.pdf';
    doNotCache;
    contentType: ( Seaside.WAMimeType main: 'application' sub: 'pdf' );
    binary;
    nextPutAll: pdfContents;
    respond
]

Or directly pass an instance of WAMimeDocument to the response.

WACurrentRequestContext value respond: [:response |
  response document: aWAMimeDocument
]

Best regards,

Esteban A. Maringolo

On Tue, Jun 2, 2020 at 6:20 AM Annick Fron <[hidden email]> wrote:
>
> Hi, I would like to serve a custom dynamically generated PDF file, what is the best option ? Use a DocumentHandler ?
> If yes how ?
>
> Annick
> _______________________________________________
> seaside mailing list
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: DocumentHandler

Annick
Hi Esteban,

        This is the solution that I will use, thank you all for your answers !

        For your records, I just use the cairo library to draw the PDF.

        By the way, is anybody using the Bootstrap library with seaside ?

        Annick
       

> Le 2 juin 2020 à 13:47, Esteban Maringolo <[hidden email]> a écrit :
>
> If instead of setting a callback on an anchor, you set a document, it
> will be treated slightly different.
>
> E.g.
>
> You can do something like:
>
> html anchor
>  document: documentContents mimeType:  ( Seaside.WAMimeType main:
> 'application' sub: 'pdf' ) fileName: 'YourFile.pdf';
>  with: 'Download PDF'
>
> This will be handled differently to a regular action continuation of a
> callback and will trigger the download immediately, also the document
> will be returned as a response to never expire.
>
> In some cases you want to use `document:` and in others it could be
> more flexible to use a regular `respond:` from the
> WACurrentRequestContext (e.g. if the decision on the file format or
> other things are deep down in the logic, away from the anchor).
>
> E.g.
>
> WACurrentRequestContext value respond: [:response |
>  response
>    attachmentWithFileName: self exportedFilename , '.pdf';
>    doNotCache;
>    contentType: ( Seaside.WAMimeType main: 'application' sub: 'pdf' );
>    binary;
>    nextPutAll: pdfContents;
>    respond
> ]
>
> Or directly pass an instance of WAMimeDocument to the response.
>
> WACurrentRequestContext value respond: [:response |
>  response document: aWAMimeDocument
> ]
>
> Best regards,
>
> Esteban A. Maringolo
>
> On Tue, Jun 2, 2020 at 6:20 AM Annick Fron <[hidden email]> wrote:
>>
>> Hi, I would like to serve a custom dynamically generated PDF file, what is the best option ? Use a DocumentHandler ?
>> If yes how ?
>>
>> Annick
>> _______________________________________________
>> seaside mailing list
>> [hidden email]
>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> _______________________________________________
> seaside mailing list
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: DocumentHandler

Esteban A. Maringolo
I am using both BS3 and BS4 (in a newer application).
In both cases using Torsten's wrapper:

BS3: https://github.com/astares/Seaside-Bootstrap
BS4: https://github.com/astares/Seaside-Bootstrap4

Regards!

Esteban A. Maringolo

On Tue, Jun 2, 2020 at 9:47 AM Annick Fron <[hidden email]> wrote:

>
> Hi Esteban,
>
>         This is the solution that I will use, thank you all for your answers !
>
>         For your records, I just use the cairo library to draw the PDF.
>
>         By the way, is anybody using the Bootstrap library with seaside ?
>
>         Annick
>
>
> > Le 2 juin 2020 à 13:47, Esteban Maringolo <[hidden email]> a écrit :
> >
> > If instead of setting a callback on an anchor, you set a document, it
> > will be treated slightly different.
> >
> > E.g.
> >
> > You can do something like:
> >
> > html anchor
> >  document: documentContents mimeType:  ( Seaside.WAMimeType main:
> > 'application' sub: 'pdf' ) fileName: 'YourFile.pdf';
> >  with: 'Download PDF'
> >
> > This will be handled differently to a regular action continuation of a
> > callback and will trigger the download immediately, also the document
> > will be returned as a response to never expire.
> >
> > In some cases you want to use `document:` and in others it could be
> > more flexible to use a regular `respond:` from the
> > WACurrentRequestContext (e.g. if the decision on the file format or
> > other things are deep down in the logic, away from the anchor).
> >
> > E.g.
> >
> > WACurrentRequestContext value respond: [:response |
> >  response
> >    attachmentWithFileName: self exportedFilename , '.pdf';
> >    doNotCache;
> >    contentType: ( Seaside.WAMimeType main: 'application' sub: 'pdf' );
> >    binary;
> >    nextPutAll: pdfContents;
> >    respond
> > ]
> >
> > Or directly pass an instance of WAMimeDocument to the response.
> >
> > WACurrentRequestContext value respond: [:response |
> >  response document: aWAMimeDocument
> > ]
> >
> > Best regards,
> >
> > Esteban A. Maringolo
> >
> > On Tue, Jun 2, 2020 at 6:20 AM Annick Fron <[hidden email]> wrote:
> >>
> >> Hi, I would like to serve a custom dynamically generated PDF file, what is the best option ? Use a DocumentHandler ?
> >> If yes how ?
> >>
> >> Annick
> >> _______________________________________________
> >> seaside mailing list
> >> [hidden email]
> >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> > _______________________________________________
> > seaside mailing list
> > [hidden email]
> > http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
> _______________________________________________
> seaside mailing list
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: DocumentHandler

Annick
Hi Esteban,

        I have tried your code

>>> html anchor
>>> document: documentContents mimeType:  ( Seaside.WAMimeType main:
>>> 'application' sub: 'pdf' ) fileName: 'YourFile.pdf';
>>> with: 'Download PDF’

but the issue is that it generates the file when the page is created, and not when the user clicks.

So I have derived a new class DelayedDocumentHandler that takes a GRDelayedSend instead of a string or binary, and generates the document only if needed by evaluating the Delayed send.
I have added also delayedDocument:mimeType:fileName: on HtmlAnchorTag.

Annick


> Le 2 juin 2020 à 15:04, Esteban Maringolo <[hidden email]> a écrit :
>
> I am using both BS3 and BS4 (in a newer application).
> In both cases using Torsten's wrapper:
>
> BS3: https://github.com/astares/Seaside-Bootstrap
> BS4: https://github.com/astares/Seaside-Bootstrap4
>
> Regards!
>
> Esteban A. Maringolo
>
> On Tue, Jun 2, 2020 at 9:47 AM Annick Fron <[hidden email]> wrote:
>>
>> Hi Esteban,
>>
>>        This is the solution that I will use, thank you all for your answers !
>>
>>        For your records, I just use the cairo library to draw the PDF.
>>
>>        By the way, is anybody using the Bootstrap library with seaside ?
>>
>>        Annick
>>
>>
>>> Le 2 juin 2020 à 13:47, Esteban Maringolo <[hidden email]> a écrit :
>>>
>>> If instead of setting a callback on an anchor, you set a document, it
>>> will be treated slightly different.
>>>
>>> E.g.
>>>
>>> You can do something like:
>>>
>>> html anchor
>>> document: documentContents mimeType:  ( Seaside.WAMimeType main:
>>> 'application' sub: 'pdf' ) fileName: 'YourFile.pdf';
>>> with: 'Download PDF'
>>>
>>> This will be handled differently to a regular action continuation of a
>>> callback and will trigger the download immediately, also the document
>>> will be returned as a response to never expire.
>>>
>>> In some cases you want to use `document:` and in others it could be
>>> more flexible to use a regular `respond:` from the
>>> WACurrentRequestContext (e.g. if the decision on the file format or
>>> other things are deep down in the logic, away from the anchor).
>>>
>>> E.g.
>>>
>>> WACurrentRequestContext value respond: [:response |
>>> response
>>>   attachmentWithFileName: self exportedFilename , '.pdf';
>>>   doNotCache;
>>>   contentType: ( Seaside.WAMimeType main: 'application' sub: 'pdf' );
>>>   binary;
>>>   nextPutAll: pdfContents;
>>>   respond
>>> ]
>>>
>>> Or directly pass an instance of WAMimeDocument to the response.
>>>
>>> WACurrentRequestContext value respond: [:response |
>>> response document: aWAMimeDocument
>>> ]
>>>
>>> Best regards,
>>>
>>> Esteban A. Maringolo
>>>
>>> On Tue, Jun 2, 2020 at 6:20 AM Annick Fron <[hidden email]> wrote:
>>>>
>>>> Hi, I would like to serve a custom dynamically generated PDF file, what is the best option ? Use a DocumentHandler ?
>>>> If yes how ?
>>>>
>>>> Annick
>>>> _______________________________________________
>>>> seaside mailing list
>>>> [hidden email]
>>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>> _______________________________________________
>>> seaside mailing list
>>> [hidden email]
>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>
>> _______________________________________________
>> seaside mailing list
>> [hidden email]
>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> _______________________________________________
> seaside mailing list
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: DocumentHandler

Esteban A. Maringolo
Hi Annick,

Yes, the #document: registers a callback with that content "ahead of
time" (it is, before it is clicked), it is meant to be used when you
already know the contents, and ideally don't instantiate it several
times.

That's why for dynamically created docs you just use the other
approach, an anchor with a callback that does something like:

html anchor
    callback: [WACurrentRequestContext value respond: [:response |
response document: self buildWAMimeDocument ]];
    with: 'Generate and and download'

Regards,

Esteban A. Maringolo

On Thu, Jun 4, 2020 at 1:00 PM Annick Fron <[hidden email]> wrote:

>
> Hi Esteban,
>
>         I have tried your code
>
> >>> html anchor
> >>> document: documentContents mimeType:  ( Seaside.WAMimeType main:
> >>> 'application' sub: 'pdf' ) fileName: 'YourFile.pdf';
> >>> with: 'Download PDF’
>
> but the issue is that it generates the file when the page is created, and not when the user clicks.
>
> So I have derived a new class DelayedDocumentHandler that takes a GRDelayedSend instead of a string or binary, and generates the document only if needed by evaluating the Delayed send.
> I have added also delayedDocument:mimeType:fileName: on HtmlAnchorTag.
>
> Annick
>
>
> > Le 2 juin 2020 à 15:04, Esteban Maringolo <[hidden email]> a écrit :
> >
> > I am using both BS3 and BS4 (in a newer application).
> > In both cases using Torsten's wrapper:
> >
> > BS3: https://github.com/astares/Seaside-Bootstrap
> > BS4: https://github.com/astares/Seaside-Bootstrap4
> >
> > Regards!
> >
> > Esteban A. Maringolo
> >
> > On Tue, Jun 2, 2020 at 9:47 AM Annick Fron <[hidden email]> wrote:
> >>
> >> Hi Esteban,
> >>
> >>        This is the solution that I will use, thank you all for your answers !
> >>
> >>        For your records, I just use the cairo library to draw the PDF.
> >>
> >>        By the way, is anybody using the Bootstrap library with seaside ?
> >>
> >>        Annick
> >>
> >>
> >>> Le 2 juin 2020 à 13:47, Esteban Maringolo <[hidden email]> a écrit :
> >>>
> >>> If instead of setting a callback on an anchor, you set a document, it
> >>> will be treated slightly different.
> >>>
> >>> E.g.
> >>>
> >>> You can do something like:
> >>>
> >>> html anchor
> >>> document: documentContents mimeType:  ( Seaside.WAMimeType main:
> >>> 'application' sub: 'pdf' ) fileName: 'YourFile.pdf';
> >>> with: 'Download PDF'
> >>>
> >>> This will be handled differently to a regular action continuation of a
> >>> callback and will trigger the download immediately, also the document
> >>> will be returned as a response to never expire.
> >>>
> >>> In some cases you want to use `document:` and in others it could be
> >>> more flexible to use a regular `respond:` from the
> >>> WACurrentRequestContext (e.g. if the decision on the file format or
> >>> other things are deep down in the logic, away from the anchor).
> >>>
> >>> E.g.
> >>>
> >>> WACurrentRequestContext value respond: [:response |
> >>> response
> >>>   attachmentWithFileName: self exportedFilename , '.pdf';
> >>>   doNotCache;
> >>>   contentType: ( Seaside.WAMimeType main: 'application' sub: 'pdf' );
> >>>   binary;
> >>>   nextPutAll: pdfContents;
> >>>   respond
> >>> ]
> >>>
> >>> Or directly pass an instance of WAMimeDocument to the response.
> >>>
> >>> WACurrentRequestContext value respond: [:response |
> >>> response document: aWAMimeDocument
> >>> ]
> >>>
> >>> Best regards,
> >>>
> >>> Esteban A. Maringolo
> >>>
> >>> On Tue, Jun 2, 2020 at 6:20 AM Annick Fron <[hidden email]> wrote:
> >>>>
> >>>> Hi, I would like to serve a custom dynamically generated PDF file, what is the best option ? Use a DocumentHandler ?
> >>>> If yes how ?
> >>>>
> >>>> Annick
> >>>> _______________________________________________
> >>>> seaside mailing list
> >>>> [hidden email]
> >>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >>> _______________________________________________
> >>> seaside mailing list
> >>> [hidden email]
> >>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> >>
> >> _______________________________________________
> >> seaside mailing list
> >> [hidden email]
> >> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> > _______________________________________________
> > seaside mailing list
> > [hidden email]
> > http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>
> _______________________________________________
> seaside mailing list
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
Reply | Threaded
Open this post in threaded view
|

Re: DocumentHandler

Annick
Thank you Esteban

> Le 4 juin 2020 à 18:26, Esteban Maringolo <[hidden email]> a écrit :
>
> Hi Annick,
>
> Yes, the #document: registers a callback with that content "ahead of
> time" (it is, before it is clicked), it is meant to be used when you
> already know the contents, and ideally don't instantiate it several
> times.
>
> That's why for dynamically created docs you just use the other
> approach, an anchor with a callback that does something like:
>
> html anchor
>    callback: [WACurrentRequestContext value respond: [:response |
> response document: self buildWAMimeDocument ]];
>    with: 'Generate and and download'
>
> Regards,
>
> Esteban A. Maringolo
>
> On Thu, Jun 4, 2020 at 1:00 PM Annick Fron <[hidden email]> wrote:
>>
>> Hi Esteban,
>>
>>        I have tried your code
>>
>>>>> html anchor
>>>>> document: documentContents mimeType:  ( Seaside.WAMimeType main:
>>>>> 'application' sub: 'pdf' ) fileName: 'YourFile.pdf';
>>>>> with: 'Download PDF’
>>
>> but the issue is that it generates the file when the page is created, and not when the user clicks.
>>
>> So I have derived a new class DelayedDocumentHandler that takes a GRDelayedSend instead of a string or binary, and generates the document only if needed by evaluating the Delayed send.
>> I have added also delayedDocument:mimeType:fileName: on HtmlAnchorTag.
>>
>> Annick
>>
>>
>>> Le 2 juin 2020 à 15:04, Esteban Maringolo <[hidden email]> a écrit :
>>>
>>> I am using both BS3 and BS4 (in a newer application).
>>> In both cases using Torsten's wrapper:
>>>
>>> BS3: https://github.com/astares/Seaside-Bootstrap
>>> BS4: https://github.com/astares/Seaside-Bootstrap4
>>>
>>> Regards!
>>>
>>> Esteban A. Maringolo
>>>
>>> On Tue, Jun 2, 2020 at 9:47 AM Annick Fron <[hidden email]> wrote:
>>>>
>>>> Hi Esteban,
>>>>
>>>>       This is the solution that I will use, thank you all for your answers !
>>>>
>>>>       For your records, I just use the cairo library to draw the PDF.
>>>>
>>>>       By the way, is anybody using the Bootstrap library with seaside ?
>>>>
>>>>       Annick
>>>>
>>>>
>>>>> Le 2 juin 2020 à 13:47, Esteban Maringolo <[hidden email]> a écrit :
>>>>>
>>>>> If instead of setting a callback on an anchor, you set a document, it
>>>>> will be treated slightly different.
>>>>>
>>>>> E.g.
>>>>>
>>>>> You can do something like:
>>>>>
>>>>> html anchor
>>>>> document: documentContents mimeType:  ( Seaside.WAMimeType main:
>>>>> 'application' sub: 'pdf' ) fileName: 'YourFile.pdf';
>>>>> with: 'Download PDF'
>>>>>
>>>>> This will be handled differently to a regular action continuation of a
>>>>> callback and will trigger the download immediately, also the document
>>>>> will be returned as a response to never expire.
>>>>>
>>>>> In some cases you want to use `document:` and in others it could be
>>>>> more flexible to use a regular `respond:` from the
>>>>> WACurrentRequestContext (e.g. if the decision on the file format or
>>>>> other things are deep down in the logic, away from the anchor).
>>>>>
>>>>> E.g.
>>>>>
>>>>> WACurrentRequestContext value respond: [:response |
>>>>> response
>>>>>  attachmentWithFileName: self exportedFilename , '.pdf';
>>>>>  doNotCache;
>>>>>  contentType: ( Seaside.WAMimeType main: 'application' sub: 'pdf' );
>>>>>  binary;
>>>>>  nextPutAll: pdfContents;
>>>>>  respond
>>>>> ]
>>>>>
>>>>> Or directly pass an instance of WAMimeDocument to the response.
>>>>>
>>>>> WACurrentRequestContext value respond: [:response |
>>>>> response document: aWAMimeDocument
>>>>> ]
>>>>>
>>>>> Best regards,
>>>>>
>>>>> Esteban A. Maringolo
>>>>>
>>>>> On Tue, Jun 2, 2020 at 6:20 AM Annick Fron <[hidden email]> wrote:
>>>>>>
>>>>>> Hi, I would like to serve a custom dynamically generated PDF file, what is the best option ? Use a DocumentHandler ?
>>>>>> If yes how ?
>>>>>>
>>>>>> Annick
>>>>>> _______________________________________________
>>>>>> seaside mailing list
>>>>>> [hidden email]
>>>>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>>>> _______________________________________________
>>>>> seaside mailing list
>>>>> [hidden email]
>>>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>>>
>>>> _______________________________________________
>>>> seaside mailing list
>>>> [hidden email]
>>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>> _______________________________________________
>>> seaside mailing list
>>> [hidden email]
>>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
>>
>> _______________________________________________
>> seaside mailing list
>> [hidden email]
>> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside
> _______________________________________________
> seaside mailing list
> [hidden email]
> http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside

_______________________________________________
seaside mailing list
[hidden email]
http://lists.squeakfoundation.org/cgi-bin/mailman/listinfo/seaside