source: indico/indico/MaKaC/webinterface/rh/JSContent.py @ 988cfe

hello-world-walkthroughipv6v0.98-seriesv0.98.2v0.98.3v0.98b2v0.99v1.0v1.1
Last change on this file since 988cfe was 988cfe, checked in by Jose Benito <jose.benito.gonzalez@…>, 2 years ago

[IMP] Replaced Indico templates with Mako

  • conversion script
  • fixed some simple mistakes in templates
  • replaced all tabs to 4 spaces
  • refactored some old code in TemplateExec?
  • fixes #676
  • Property mode set to 100644
File size: 3.6 KB
Line 
1import os, datetime, time, hashlib
2
3from indico.web.wsgi import webinterface_handler_config as apache
4
5from MaKaC.common import Config
6from MaKaC.errors import MaKaCError
7
8from MaKaC.webinterface import urlHandlers
9from MaKaC.webinterface.rh import base
10
11from email.Utils import formatdate
12
13import MaKaC.common.TemplateExec as templateEngine
14
15class RHTemplateContentJS(base.RH):
16    _uh = urlHandlers.Build("JSContent.py")
17    _tplName = ''
18
19    def __init__(self, req):
20        base.RH.__init__(self, req)
21
22    def _needsRefresh( self, creationTime ):
23        # TODO: maybe add date verification as well?
24        return self._etag != self._generateEtag(creationTime)
25
26    def _generateEtag( self, value ):
27        """
28        Generates an Etag from a string (just an MD5 hash)
29        """
30        return hashlib.md5(str(value)).hexdigest()
31
32    def _checkParams( self, params ):
33
34        # Check incoming headers
35        self._etag = self._req.headers_in.get("If-None-Match", None)
36        # (not used)
37        self._modifiedSince = self._req.headers_in.get("If-Modified-Since", None)
38
39        cfg = Config.getInstance()
40        dirName = os.path.join(cfg.getTPLDir(),"js")
41        fileName = cfg.getTPLFile( self._tplName )
42
43        if fileName == "":
44            fileName = "%s.tpl"%self._tplName
45
46        self._tplFile = os.path.join(dirName, fileName)
47
48        self._htmlPath = os.path.join(cfg.getTempDir(), fileName+".tmp")
49
50        # if the file has already been generated
51        if os.access(self._htmlPath, os.R_OK):
52
53            self._regenerate = False;
54
55            # get the OS creation time
56            creationTime = datetime.datetime.fromtimestamp(os.path.getctime(self._htmlPath))
57            if not self._needsRefresh(creationTime):
58                # if the etag the same, send NOT_MODIFIED
59                self._req.status = apache.HTTP_NOT_MODIFIED
60                self._doProcess = False
61            else:
62                self._regenerate = True
63        else:
64            # file needs to be regenerated
65            self._regenerate = True
66
67
68    def _process( self ):
69        try:
70            # regenerate file if needed
71            if self._regenerate:
72                self._dict["__rh__"] = self
73                self._dict["user"] = None
74
75                htmlData = templateEngine.render(self._tplFile, self._dict)
76                fh = open(self._htmlPath, "w")
77                fh.write(htmlData)
78                fh.close()
79            else:
80                # otherwise just send it to the client
81                fh = open(self._htmlPath, "r")
82                htmlData = fh.read()
83                fh.close()
84
85            # send out the Etag and Last-Modified headers
86            creationTime = datetime.datetime.fromtimestamp(os.path.getctime(self._htmlPath))
87            self._req.headers_out["Etag"] = self._generateEtag(creationTime)
88            self._req.headers_out["Last-Modified"] = formatdate(time.mktime(creationTime.timetuple()))
89            self._req.content_type = "application/x-javascript"
90
91        except Exception, e:
92            return 'indicoError: %s' % e
93
94        return htmlData
95
96class RHGetVarsJs(RHTemplateContentJS):
97    _uh = urlHandlers.Derive(RHTemplateContentJS, "getVars")
98
99    _tplName = 'vars.js'
100
101    def __init__(self, req):
102        RHTemplateContentJS.__init__(self, req)
103        self._dict = {}
104
105    @classmethod
106    def removeTmpVarsFile(cls):
107        cfg = Config.getInstance()
108        fileName = cfg.getTPLFile( cls._tplName )
109
110        if fileName == "":
111            fileName = "%s.tpl"%cls._tplName
112
113        htmlPath = os.path.join(cfg.getTempDir(), fileName+".tmp")
114        if os.access(htmlPath, os.R_OK):
115            os.remove(htmlPath)
Note: See TracBrowser for help on using the repository browser.