root / pykota / trunk / cgi-bin / pykotme.cgi @ 2413

Revision 2381, 7.1 kB (checked in by jerome, 19 years ago)

Doesn't display the list of printers when the CGI script doesn't require an
authentication, because the size of the job doesn't depend on the printer
being used. When there's authentication, the exact cost of a print job
depends on the printer(s) chosen and the user's overcharging factor.
Severity : minor

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Rev
Line 
1#! /usr/bin/python
2# -*- coding: ISO-8859-15 -*-
3
4# PyKota Print Quotes generator
5#
6# PyKota - Print Quotas for CUPS and LPRng
7#
8# (c) 2003, 2004, 2005 Jerome Alet <alet@librelogiciel.com>
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22#
23# $Id$
24#
25#
26
27import sys
28import os
29import cgi
30import urllib
31import cStringIO
32
33from pykota import version
34from pykota.tool import PyKotaTool, PyKotaToolError
35from pykota.cgifuncs import getLanguagePreference, getCharsetPreference
36
37try :
38    from pkpgpdls import analyzer, pdlparser
39except ImportError : # TODO : Remove the try/except after release 1.24.
40    sys.stderr.write("ERROR: pkpgcounter is now distributed separately, please grab it from http://www.librelogiciel.com/software/pkpgcounter/action_Download\n")
41   
42
43header = """Content-type: text/html
44
45<?xml version="1.0" encoding="%s"?>
46<html>
47  <head>
48    <title>%s</title>
49    <link rel="stylesheet" type="text/css" href="/pykota.css" />
50  </head>
51  <body>
52    <p>
53      <form action="pykotme.cgi" method="POST" enctype="multipart/form-data">
54        <table>
55          <tr>
56            <td>
57              <p>
58                <a href="%s"><img src="%s?version=%s" alt="PyKota's Logo" /></a>
59                <br />
60                <a href="%s">PyKota v%s</a>
61              </p>
62            </td>
63            <td colspan="2">
64              <h1>%s</h1>
65            </td>
66          </tr>
67          <tr>
68            <td colspan="3" align="center">
69              <input type="submit" name="report" value="%s" />
70            </td>
71          </tr>
72        </table>"""
73   
74footer = """
75        <table>
76          <tr>
77            <td colspan="3" align="center">
78              <input type="submit" name="report" value="%s" />
79            </td>
80          </tr>
81        </table> 
82      </form>
83    </p>
84    <hr width="25%%" />
85    <p>
86      <font size="-2">
87        <a href="http://www.librelogiciel.com/software/">%s</a>
88        &copy; %s %s
89      </font>
90    </p>
91  </body>
92</html>""" 
93
94class PyKotMeGUI(PyKotaTool) :
95    """PyKota Quote's Generator GUI"""
96    def guiDisplay(self) :
97        """Displays the administrative interface."""
98        global header, footer
99        print header % (self.getCharset(), _("PyKota Quotes"), \
100                        self.config.getLogoLink(), \
101                        self.config.getLogoURL(), version.__version__, \
102                        self.config.getLogoLink(), \
103                        version.__version__, _("PyKota Quotes"), \
104                        _("Quote"))
105        print self.body
106        print footer % (_("Quote"), version.__doc__, version.__years__, version.__author__)
107       
108    def error(self, message) :
109        """Adds an error message to the GUI's body."""
110        if message :
111            self.body = '<p><font color="red">%s</font></p>\n%s' % (message, self.body)
112       
113    def htmlListPrinters(self, selected=[], mask="*") :   
114        """Displays the printers multiple selection list."""
115        printers = self.storage.getMatchingPrinters(mask)
116        selectednames = [p.Name for p in selected]
117        message = '<table><tr><td valign="top">%s :</td><td valign="top"><select name="printers" multiple="multiple">' % _("Printer")
118        for printer in printers :
119            if printer.Name in selectednames :
120                message += '<option value="%s" selected="selected">%s (%s)</option>' % (printer.Name, printer.Name, printer.Description)
121            else :
122                message += '<option value="%s">%s (%s)</option>' % (printer.Name, printer.Name, printer.Description)
123        message += '</select></td></tr></table>'
124        return message
125       
126    def guiAction(self) :
127        """Main function"""
128        printers = inputfile = None
129        self.body = "<p>%s</p>\n" % _("Please click on the above button")
130        if self.form.has_key("report") :
131            if self.form.has_key("printers") :
132                printersfield = self.form["printers"]
133                if type(printersfield) != type([]) :
134                    printersfield = [ printersfield ]
135                printers = [self.storage.getPrinter(p.value) for p in printersfield]
136            else :   
137                printers = self.storage.getMatchingPrinters("*")
138            if self.form.has_key("inputfile") :   
139                inputfile = self.form["inputfile"].value
140               
141        if os.environ.get("REMOTE_USER") is not None :       
142            self.body += self.htmlListPrinters(printers or [])           
143            self.body += "<br />"
144        self.body += _("Filename") + " : "
145        self.body += '<input type="file" size="64" name="inputfile" />'
146        self.body += "<br />"
147        if inputfile :
148            try :
149                parser = analyzer.PDLAnalyzer(cStringIO.StringIO(inputfile))
150                jobsize = parser.getJobSize()
151            except pdlparser.PDLParserError, msg :   
152                self.body += '<p><font color="red">%s</font></p>' % msg
153                jobsize = 0 # unknown file format ?
154            else :   
155                self.body += "<p>%s</p>" % (_("Job size : %i pages") % jobsize)
156               
157            remuser = os.environ.get("REMOTE_USER", "root")   
158            # special hack to accomodate mod_auth_ldap Apache module
159            try :
160                remuser = remuser.split("=")[1].split(",")[0]
161            except IndexError :   
162                pass
163            if remuser == "root" :   
164                self.body += "<p>%s</p>" % _("The exact cost of a print job can only be determined for a particular user. Please retry while logged-in.")
165            else :   
166                try :   
167                    user = self.storage.getUser(remuser)
168                    if user.Exists :
169                        for printer in printers :
170                            upquota = self.storage.getUserPQuota(user, printer)
171                            if upquota.Exists :
172                                cost = upquota.computeJobPrice(jobsize)
173                                self.body += "<p>%s</p>" % (_("Cost on printer %s : %.2f") % (printer.Name, cost))
174                except :
175                    self.body += '<p><font color="red">%s</font></p>' % self.crashed("CGI Error").replace("\n", "<br />")
176           
177if __name__ == "__main__" :
178    os.environ["LC_ALL"] = getLanguagePreference()
179    admin = PyKotMeGUI(lang=os.environ["LC_ALL"], charset=getCharsetPreference())
180    admin.deferredInit()
181    admin.form = cgi.FieldStorage()
182    admin.guiAction()
183    admin.guiDisplay()
184    try :
185        admin.storage.close()
186    except (TypeError, NameError, AttributeError) :   
187        pass
188       
189    sys.exit(0)
Note: See TracBrowser for help on using the browser.