Show
Ignore:
Timestamp:
06/29/07 16:05:08 (17 months ago)
Author:
JensDiemer
Message:

* new additional Stylesheet/JavaScript handling. A middleware puts the collected data into the page.
* middleware "pagestats" renamed to "additional_content".
* some code cleanup

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/0.8(django)/PyLucid/plugins_internal/page_style/page_style.py

    r1087 r1127  
    88    - Put the css html tag into the cms page. 
    99    - Send the current stylesheet directly to the client. 
     10 
     11    Note: 
     12    The page_style.lucidTag() method adds the additional_content ADD_DATA_TAG 
     13    into the page. 
     14    The middleware PyLucid.middlewares.additional_content replace the tag and 
     15    puts the collected CSS/JS contents into the page. 
    1016 
    1117    Last commit info: 
     
    2733from django.http import HttpResponse 
    2834 
     35from PyLucid.middlewares.additional_content import ADD_DATA_TAG 
    2936from PyLucid.models import Style 
    30  
    3137from PyLucid.system.BaseModule import PyLucidBaseModule 
    3238 
    3339class page_style(PyLucidBaseModule): 
    3440 
    35     #~ def __init__(self, *args, **kwargs): 
    36         #~ super(page_style, self).__init__(*args, **kwargs) 
    37  
    3841    def lucidTag(self): 
    39         # Schreibt den addCode-Tag, damit am Ende noch die CSS/JS Daten 
    40         # von Modulen eingefügt werden können 
    41         #~ self.response.write(self.response.addCode.tag) 
     42        """ 
     43        -Put a link to sendStyle into the page. 
     44        -Insert the ADD_DATA_TAG for the additional_content middleware 
     45        """ 
     46        self.response.write(ADD_DATA_TAG) 
    4247 
    4348        current_page = self.context["PAGE"] 
     
    4954        ) 
    5055        cssTag = '<link rel="stylesheet" type="text/css" href="%s" />\n' % url 
     56        self.response.write(cssTag) 
    5157 
    52         self.response.write(cssTag) 
    5358 
    5459    def print_current_style(self): 
    5560        """ 
    56         CSS direkt in die Seite einfügen 
     61        -Write the stylesheet directly into the page. 
     62        -Insert the ADD_DATA_TAG for the additional_content middleware 
     63        Used with the tag: {% lucidTag page_style.print_current_style %} 
    5764        """ 
    58         # Schreibt den addCode-Tag, damit am Ende noch die CSS/JS Daten 
    59         # von Modulen eingefügt werden können 
    60         self.response.write(self.response.addCode.tag) 
     65        self.response.write(ADD_DATA_TAG) 
    6166 
    62         page_id = self.session["page_id"] 
    63         getItems = ["content"] 
    64         css = self.db.side_style_by_id(page_id, getItems) 
    65         css = css["content"] 
     67        current_page = self.context["PAGE"] 
     68        stylesheet = current_page.style 
    6669 
    67         self.response.write('<style type="text/css">') 
    68         self.response.write(css) 
    69         self.response.write('</style>') 
     70        context = { 
     71            "content": stylesheet.content, 
     72        } 
     73        self._render_template("write_styles", context)#, debug=True) 
     74 
    7075 
    7176    def sendStyle(self, css_filename): 
    7277        """ 
    73         Sendet das CSS als Datei, da in die Seite nur ein Link eingefügt, der 
    74         jetzt "ausgeführt" wird. 
    75         Dabei wird eine "Browsercache-Anfrage" berücksichtigt. 
     78        send the stylesheet as a file to the client. 
     79        It's the request started with the link tag from self.lucidTag() ;) 
     80        TODO: Should insert some Headers for the browser cache. 
    7681        """ 
    7782        css_name = css_filename.split(".",1)[0] 
     
    9095        return response 
    9196 
    92         """ 
    93         timeFormat = "%a, %d %b %Y %H:%M:%S GMT" 
    94  
    95         # Ein "wirklich" frisches response-Object nehmen: 
    96         response = HttpResponse() 
    97         response.headers['Content-Type'] = 'text/css; charset=utf-8' 
    98  
    99         # Hop-by-hop Headers ist mit wsgiref nicht erlaubt: 
    100         #~ response.headers['Connection'] = "Keep-Alive" 
    101  
    102         page_id = self.session["page_id"] 
    103         getItems = ["id", "content", "lastupdatetime"] 
    104         cssData = self.db.side_style_by_id(page_id, getItems) 
    105  
    106         lastupdatetime = cssData["lastupdatetime"] # datetime-Object! 
    107  
    108         #~ raise str(repr(lastupdatetime)) 
    109  
    110         lastModified = lastupdatetime.strftime(timeFormat) 
    111         #~ print "lastModified:", lastModified 
    112  
    113         # 1Tag * 60Min * 60Sec = 3600Sec 
    114         response.headers['Cache-Control'] = 'max-age=3600' 
    115         delta = datetime.timedelta(days=1) 
    116         expires = lastupdatetime + delta 
    117         expires = expires.strftime(timeFormat) 
    118         #~ print "expires:", expires 
    119         response.headers['Expires'] = expires 
    120  
    121         # ID damit der Browser das Style eindeutige Identifizieren kann: 
    122         eTag = '"style-%s"' % cssData["id"] 
    123         response.headers['Etag'] = eTag 
    124  
    125         # Chaching im Browser überprüfen: 
    126         if "HTTP_IF_MODIFIED_SINCE" in self.environ and \ 
    127                                         "HTTP_IF_NONE_MATCH" in self.environ: 
    128             # Der Browser fragt nach, ob es die Daten aus seinem Chache nehmen 
    129             # soll. 
    130             send_modified = self.environ["HTTP_IF_MODIFIED_SINCE"] 
    131             send_eTag = self.environ["HTTP_IF_NONE_MATCH"] 
    132             if send_eTag == eTag and send_modified == lastModified: 
    133                 # CSS Daten haben sich nicht geändert! 
    134                 response.status = 304 # HTTP/1.x 304 Not Modified 
    135                 return response 
    136  
    137         # Die CSS Daten werden zum ersten mal gesendet oder diese haben 
    138         # sich seit dem letzten Aufruf geändert. 
    139  
    140         cssContent = cssData["content"] 
    141  
    142         # Content-Length kann nur in UTF8 und nicht richtig in Unicode 
    143         # ermittelt werden!!! 
    144         cssContent = cssContent.encode("utf8") 
    145         contentLen = len(cssContent) 
    146         response.headers['Content-Length'] = '%s' % contentLen 
    147  
    148         response.headers['Last-Modified'] = lastModified 
    149         response.headers['Content-Transfer-Encoding'] = '8bit' #'binary' 
    150         response.headers['Content-Type'] = \ 
    151             'text/css; charset=utf-8' 
    152  
    153         response.write(cssContent) 
    154  
    155         # force Windows input/output to binary 
    156         if sys.platform == "win32": 
    157             try: 
    158                 import msvcrt 
    159                 msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) 
    160                 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 
    161             except: 
    162                 pass 
    163  
    164         return response 
    165  
    166         """ 
    167  
    168  
    169  
    170  
    171