Changeset 3120 for trunk


Ignore:
Timestamp:
12/10/10 00:57:00 (9 years ago)
Author:
jukka
Message:

Fixed collection pdfs

Location:
trunk
Files:
1 added
1 deleted
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Collection.py

    r3115 r3120  
    2626from LargeSectionFolder import LeMillFolder 
    2727from Products.ZCatalog.CatalogBrains import AbstractCatalogBrain 
     28from Acquisition import aq_base, aq_inner, aq_parent 
     29 
    2830 
    2931from config import PROJECTNAME, ALL_CONTENT_TYPES, CONTENT_TYPES, DEFAULT_ICONS, ACTIVITY_TYPES, TOOLS_TYPES, REPOSITORY, TTF_FONTS, to_unicode 
     
    3335from cStringIO import StringIO 
    3436import os, urllib, shutil, sys, zipfile, sre, random, time 
     37import urlparse, tempfile, urllib2 
    3538from types import ListType, TupleType 
    3639 
     
    671674        return pdf_enabled 
    672675 
     676    def downloadPage(self): 
     677        """ Just returns collection_pdf -page. We don't have links to this template to avoid bots""" 
     678        return self.collection_page() 
     679 
     680 
    673681    def downloadPDF(self): 
    674682        """ This method is the front-end for pisa, PDF file generator """ 
    675683        if not pdf_enabled: 
    676684            return None 
     685        image_cache={} 
     686        portal=self.portal_url 
     687        portal_url=self.portal_url() 
     688 
     689        def getFSSPath(piece, size_name): 
     690            """Get path to actual file""" 
     691            field=piece.getField('image') 
     692            stor=field.getStorage(piece) 
     693            info = stor.getFSSInfo(size_name, piece)     
     694            if info is None: 
     695                return ''     
     696            strategy = stor.getStorageStrategy(size_name, piece) 
     697            props = stor.getStorageStrategyProperties(size_name, piece, info) 
     698            path = strategy.getValueFilePath(**props) 
     699            return path 
     700 
    677701 
    678702        class Callback(pisa.pisaLinkLoader): 
    679             """ Our own version of pisa's callback method, as it doesn't handle well latex-cgi -links which have spaces and new lines."""                
    680             def callback(self, name, relative=None): 
     703            """ Our own version of pisa's callback method. If links are local, get them from zope and if they use 
     704                FileSystemStorage, point to that file instead of building a temp."""                
     705            def __del__(self): 
     706                # Please DO NOT remove originals from file system :/ 
     707                for path in self.tfileList: 
     708                    if path.split('/')[-1].startswith('pisa-'): 
     709                        os.remove(path) 
     710 
     711                     
     712            def getFileName(self, name, relative=None): 
    681713                name=name.replace("\n","") 
    682714                name=name.replace(" ", "%20") 
    683                 return self.getFileName(name, relative) 
     715                if name.startswith('fonts/'): 
     716                    return os.path.join(TTF_FONTS, name.split('/')[-1]) 
     717                if name in image_cache: 
     718                    return image_cache[name] 
     719                url = urlparse.urljoin(relative or self.src, name) 
     720                url_path=url.split('/') 
     721                if url_path[-1] in ['image_large', 'image_small','image_slide'] and url.startswith(portal_url): 
     722                    portal_path=portal_url.split('/') 
     723                    url_path=url_path[len(portal_path):] 
     724                    obj=portal.unrestrictedTraverse(url_path)                     
     725                    piece=portal.unrestrictedTraverse(url_path[:-1]) 
     726                    size_name=url_path[-1] 
     727                    path=getFSSPath(piece, size_name) 
     728                    image_cache[name]=path 
     729                    self.tfileList.append(path) 
     730                    return path 
     731                path = urlparse.urlsplit(url)[2] 
     732                suffix = "" 
     733                if "." in path: 
     734                    new_suffix = "." + path.split(".")[-1].lower() 
     735                    if new_suffix in (".css", ".gif", ".jpg", ".png"): 
     736                        suffix = new_suffix                     
     737                path = tempfile.mktemp(prefix="pisa-", suffix = suffix)   
     738                tfile = file(path, "wb") 
     739                if url.startswith(portal_url): 
     740                    portal_path=portal_url.split('/') 
     741                    url_path=url_path[len(portal_path):] 
     742                    obj=portal.unrestrictedTraverse(url_path)                     
     743                    if hasattr(obj, 'data') and obj.data: 
     744                        data=StringIO(str(obj.data))                   
     745                    elif hasattr(obj, '_data') and obj._data: 
     746                        data=StringIO(str(obj._data)) 
     747                    else: 
     748                        data=StringIO(str(obj)) 
     749                    while True: 
     750                        d=data.read(1024) 
     751                        if not d: 
     752                            break 
     753                        tfile.write(d) 
     754                    data.close() 
     755                    tfile.close() 
     756                else: 
     757                    ufile = urllib.urlopen(url) 
     758                    while True: 
     759                        data = ufile.read(1024) 
     760                        if not data: 
     761                            break 
     762                        tfile.write(data) 
     763                    ufile.close() 
     764                    tfile.close() 
     765                self.tfileList.append(path) 
     766                image_cache[name]=path 
     767                return path 
    684768        # This is a hack not to get over keyError with 'defavusans' font face 
    685         pdfmetrics.registerFont(ttfonts.TTFont("dejavusans", os.path.join(TTF_FONTS, "DejaVuSans.ttf"))) 
     769        #pdfmetrics.registerFont(ttfonts.TTFont("DejaVuSans", os.path.join(TTF_FONTS, "DejaVuSans.ttf"))) 
    686770        filename = ".".join((self.id,'pdf')) 
     771        portal_url=self.portal_url() 
     772        portal=self.portal_url 
    687773        result_stringio = StringIO() 
    688774        url= '/'.join((self.absolute_url(), 'collection_pdf')) 
    689775        source_text=self.collection_pdf() 
    690         #print source_text 
    691776        pdf = pisa.CreatePDF( 
    692777            src=source_text,  
    693778            dest=result_stringio, 
    694779            path=url,  
    695             xhtml=True,  
     780            link_callback=Callback(url).getFileName, 
     781            quiet=True, 
     782            #xhtml=True,  
    696783            #encoding='utf-8',  
    697             link_callback=Callback(url).callback 
    698784            ) 
    699785 
     
    717803        if PACKAGE_TYPE == "PDF": 
    718804            return self.downloadPDF() 
     805 
     806        elif PACKAGE_TYPE == "PAGE": 
     807            return self.downloadPage() 
     808 
     809        else: 
     810            # we'll fix zips and scorms later 
     811            return 
    719812 
    720813        def splitHTML(htmlPage, pageURL): 
  • trunk/skins/lemill/collection_download.pt

    r2810 r3120  
    1212<p i18n:translate="text_explanation_download_collection">Download collection to your machine.</p> 
    1313 
    14 <form method="get" action="" tal:attributes="action string:${here_url}/download"> 
    15  
     14<form class="selections" method="get" action="" tal:attributes="action string:${here_url}/download"> 
    1615<p tal:condition="here/isPDFEnabled"> 
    1716    <label> 
     
    2120</p> 
    2221<p> 
    23     <label> 
    24             <input type="radio" name="PACKAGE_TYPE" id="PACKAGE_TYPE" tal:attributes="checked python:test(here.isPDFEnabled(), 0, 1)" value="HTML" /> 
    25         <span i18n:translate="label_collection_download_option_html_package">HTML (zip) package</span> 
    26     </label> 
    27 </p> 
    28 <p> 
    2922    <label> 
    30         <input type="radio" name="PACKAGE_TYPE" id="PACKAGE_TYPE" value="SCORM" /> 
    31         <span i18n:translate="label_collection_download_option_scorm_package">SCORM package</span> 
     23                <input type="radio" name="PACKAGE_TYPE" id="PACKAGE_TYPE" value="PAGE"/> 
     24                <span i18n:translate="label_collection_download_option_one_page">One long page</span> 
    3225    </label> 
    3326</p> 
    3427 
    3528    <div> 
    36         <input class="context" type="submit" value="Download" onclick="javascript:document.getElementById('wait_text').style.display = 'block';" i18n:domain="plone" i18n:attributes="value Download" /> 
     29        <input class="context" type="submit" value="Download" onclick="$('p#wait_text').show();$('form.selections').hide()" i18n:domain="plone" i18n:attributes="value Download" /> 
    3730        <input class="context" type="button" value="Cancel" onclick="javascript:history.back()" i18n:domain="plone" i18n:attributes="value label_cancel;" /> 
    3831    </div> 
     32</form> 
     33 
    3934    <div> 
    40         <p class="byTextsFont" style="display: none;" id="wait_text"> 
     35        <p style="display: none;" id="wait_text"> 
    4136<span i18n:translate="label_collection_download_waiting">Please wait while your download begins.</span> 
    4237<br/><br/> 
     
    4540 
    4641 
    47 </form> 
    4842        </metal:main_macro> 
    4943    </metal:fill> 
  • trunk/skins/lemill/collection_pdf_stylesheet.css

    r2923 r3120  
    22    @font-face { 
    33        font-family: DejaVuSans; 
    4         src: url("fonts/DejaVuSans.ttf"); 
     4        src: url(fonts/DejaVuSans.ttf); 
    55    } 
    66    /* Bold */ 
    77    @font-face { 
    88        font-family: DejaVuSans; 
    9         src: url("fonts/DejaVuSans-Bold.ttf"); 
     9        src: url(fonts/DejaVuSans-Bold.ttf); 
    1010        font-weight: bold; 
    1111    } 
     
    1313    @font-face { 
    1414        font-family: DejaVuSans; 
    15         src: url("fonts/DejaVuSans-Oblique.ttf"); 
     15        src: url(fonts/DejaVuSans-Oblique.ttf); 
    1616        font-style: italic; 
    1717    } 
     
    1919    @font-face { 
    2020        font-family: DejaVuSans; 
    21         src: url("fonts/DejaVuSans-BoldOblique.ttf"); 
     21        src: url(fonts/DejaVuSans-BoldOblique.ttf); 
    2222        font-weight: bold; 
    2323        font-style: italic; 
     
    3737        font-family: DejaVuSans; 
    3838        font-size: 12pt; 
    39         font-weight: normal; 
    4039    } 
    41     h1, 
    42     h2, 
    43     h3, 
    44     h4, 
    45     h5, 
    46     h6 { 
    47         -pdf-outline:false; 
     40    body { 
     41        width: auto; 
    4842    } 
     43    div,p,table,tr,td,span,pre,code { 
     44        font-family: DejaVuSans; 
     45    } 
     46 
     47    h1 {-pdf-outline-level:1} 
     48    h2 {-pdf-outline-level:2} 
     49    h3 {-pdf-outline-level:3;font-family: DejaVuSans;} 
     50    h4 {-pdf-outline-level:4;font-family: DejaVuSans;} 
     51    h5 {-pdf-outline-level:5;font-family: DejaVuSans;} 
     52    h6 {-pdf-outline:false} 
    4953    /* H1 */ 
    5054    h1 { 
     
    5761        font-family: DejaVuSans; 
    5862        font-size: 14pt; 
    59         font-weight:bold; 
     63        font-weight: bold; 
    6064    } 
    6165    .resource_heading { 
     
    6872    pdftoc { 
    6973        color: black; 
     74        font-family: DejaVuSans; 
    7075    } 
    7176    pdftoc.pdftoclevel0 { 
     
    7681    } 
    7782    /* IMG */ 
    78     img { zoom: 80%; } 
     83    /* img { zoom: 80%; } */ 
    7984    /* PAGE */ 
    8085    @page { 
     
    8388        margin-left: 3.17cm; 
    8489        margin-right: 3.17cm; 
     90        font-family: DejaVuSans; 
    8591        /* FOOTER */ 
    8692        @frame footer { 
  • trunk/skins/lemill/lemill_grid.css

    r3115 r3120  
    939939/*.defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} */ 
    940940.defaultSkin a.mceButtonActive {border:1px solid #0A246A; background-color:#C2CBE0} 
    941 .defaultSkin .mceButtonDisabled span {opacity:0.3; color:#cccccc} 
    942  
     941.defaultSkin .mceButtonDisabled span {color:#cccccc} 
     942/*opacity:0.3; */ 
    943943/* Separator */ 
    944944.defaultSkin .mceSeparator {display:block; background:url(images/icons.gif) -280px 0; width:2px; height:20px; margin:0 2px 0 4px} 
Note: See TracChangeset for help on using the changeset viewer.