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

Revision 2352, 7.0 kB (checked in by jerome, 19 years ago)

Fix to make pykotme and pykotme.cgi work with the now external pkpgcounter.
Removed unnecessary import in pkmail.
Removed deleted files from the installation tree.
Severity: Critical if you upgraded to 1.23alpha17 already.

  • 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        self.body += self.htmlListPrinters(printers or [])           
142        self.body += "<br />"
143        self.body += _("Filename") + " : "
144        self.body += '<input type="file" size="64" name="inputfile" />'
145        self.body += "<br />"
146        if inputfile :
147            try :
148                parser = analyzer.PDLAnalyzer(cStringIO.StringIO(inputfile))
149                jobsize = parser.getJobSize()
150            except pdlparser.PDLParserError, msg :   
151                self.body += '<p><font color="red">%s</font></p>' % msg
152            else :   
153                self.body += "<p>%s</p>" % (_("Job size : %i pages") % jobsize)
154               
155            remuser = os.environ.get("REMOTE_USER", "root")   
156            # special hack to accomodate mod_auth_ldap Apache module
157            try :
158                remuser = remuser.split("=")[1].split(",")[0]
159            except IndexError :   
160                pass
161            if remuser == "root" :   
162                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.")
163            else :   
164                try :   
165                    user = self.storage.getUser(remuser)
166                    if user.Exists :
167                        for printer in printers :
168                            upquota = self.storage.getUserPQuota(user, printer)
169                            if upquota.Exists :
170                                cost = upquota.computeJobPrice(jobsize)
171                                self.body += "<p>%s</p>" % (_("Cost on printer %s : %.2f") % (printer.Name, cost))
172                except :
173                    self.body += '<p><font color="red">%s</font></p>' % self.crashed("CGI Error").replace("\n", "<br />")
174           
175if __name__ == "__main__" :
176    os.environ["LC_ALL"] = getLanguagePreference()
177    admin = PyKotMeGUI(lang=os.environ["LC_ALL"], charset=getCharsetPreference())
178    admin.deferredInit()
179    admin.form = cgi.FieldStorage()
180    admin.guiAction()
181    admin.guiDisplay()
182    try :
183        admin.storage.close()
184    except (TypeError, NameError, AttributeError) :   
185        pass
186       
187    sys.exit(0)
Note: See TracBrowser for help on using the browser.