root / pykota / trunk / cgi-bin / printquota.cgi @ 1235

Revision 1235, 8.0 kB (checked in by jalet, 20 years ago)

Some code refactoring.
New HTML reporter added, which is now used in the CGI script for web based
print quota reports. It will need some de-uglyfication though...

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
Line 
1#! /usr/bin/python
2
3# PyKota Print Quota Reports generator
4#
5# PyKota - Print Quotas for CUPS and LPRng
6#
7# (c) 2003 Jerome Alet <alet@librelogiciel.com>
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
21#
22# $Id$
23#
24# $Log$
25# Revision 1.16  2003/12/02 14:40:20  jalet
26# Some code refactoring.
27# New HTML reporter added, which is now used in the CGI script for web based
28# print quota reports. It will need some de-uglyfication though...
29#
30# Revision 1.15  2003/10/24 22:06:42  jalet
31# Initial support for browser's language preference added.
32#
33# Revision 1.14  2003/10/10 19:48:07  jalet
34# Now displays version number
35#
36# Revision 1.13  2003/08/25 11:23:05  jalet
37# More powerful CGI script for quota reports
38#
39# Revision 1.12  2003/07/29 20:55:17  jalet
40# 1.14 is out !
41#
42# Revision 1.11  2003/07/01 12:37:31  jalet
43# Nicer UI
44#
45# Revision 1.10  2003/07/01 07:30:32  jalet
46# Message changed.
47#
48# Revision 1.9  2003/06/30 13:47:26  jalet
49# Allows multiple user / group names masks in the input field
50#
51# Revision 1.8  2003/06/30 13:32:01  jalet
52# Much more powerful CGI script for quota reports
53#
54# Revision 1.7  2003/06/30 12:46:15  jalet
55# Extracted reporting code.
56#
57# Revision 1.6  2003/04/23 22:13:56  jalet
58# Preliminary support for LPRng added BUT STILL UNTESTED.
59#
60# Revision 1.5  2003/04/17 21:30:09  jalet
61# Now includes the logo
62#
63# Revision 1.4  2003/04/08 21:20:25  jalet
64# CGI Script now displays a link to PyKota's website.
65#
66# Revision 1.3  2003/03/29 13:45:27  jalet
67# GPL paragraphs were incorrectly (from memory) copied into the sources.
68# Two README files were added.
69# Upgrade script for PostgreSQL pre 1.01 schema was added.
70#
71# Revision 1.2  2003/02/12 11:31:51  jalet
72# doesn't use the jaxml module anymore
73#
74# Revision 1.1  2003/02/10 13:41:38  jalet
75# repykota cgi script added.
76# cleaner doc.
77#
78
79import sys
80import os
81import cgi
82
83from pykota import version
84from pykota.tool import PyKotaTool, PyKotaToolError
85from pykota.reporter import PyKotaReporterError, openReporter
86
87header = """Content-type: text/html
88
89<?xml version="1.0" encoding="iso-8859-1"?>
90<html>
91  <head>
92    <title>PyKota Reports</title>
93  </head>
94  <body>
95    <form action="printquota.cgi" method="POST">
96      <table>
97        <tr>
98          <td>
99            <p>
100              <a href="http://www.librelogiciel.com/software/"><img src="http://www.librelogiciel.com/software/PyKota/calllogo" alt="PyKota's Logo" /></a>
101              <br />
102              <a href="http://www.librelogiciel.com/software/">PyKota version %s</a>
103            </p>
104          </td>
105          <td colspan="2">
106            <h2>PyKota Reports</h2>
107          </td>
108        </tr>
109        <tr>
110          <td colspan="3" align="center">
111            <input type="submit" name="action" value="Report" />
112          </td>
113        </tr>
114      </table>"""
115   
116footer = """
117    </form>
118  </body>
119</html>""" 
120
121def getLanguagePreference() :
122    """Returns the preferred language."""
123    languages = os.environ.get("HTTP_ACCEPT_LANGUAGE", "")
124    langs = [l.strip().split(';')[0] for l in languages.split(",")]
125    return "%s_%s" % (langs[0], langs[0].upper())
126
127class PyKotaReportGUI(PyKotaTool) :
128    """PyKota Administrative GUI"""
129       
130    def guiDisplay(self) :
131        """Displays the administrative interface."""
132        global header, footer
133        print header % version.__version__
134        print self.body
135        print footer
136       
137    def error(self, message) :
138        """Adds an error message to the GUI's body."""
139        if message :
140            self.body = '<p><font color="red">%s</font></p>\n%s' % (message, self.body)
141       
142    def htmlListPrinters(self, selected=[], mask="*") :   
143        """Displays the printers multiple selection list."""
144        printers = self.storage.getMatchingPrinters(mask)
145        selectednames = [p.Name for p in selected]
146        message = '<table><tr><td valign="top">Printer :</td><td valign="top"><select name="printers" multiple="multiple">'
147        for printer in printers :
148            if printer.Name in selectednames :
149                message += '<option value="%s" selected="selected">%s</option>' % (printer.Name, printer.Name)
150            else :
151                message += '<option value="%s">%s</option>' % (printer.Name, printer.Name)
152        message += '</select></td></tr></table>'
153        return message
154       
155    def htmlUGNamesInput(self, value="*") :   
156        """Input field for user/group names wildcard."""
157        return 'User / Group names mask : <input type="text" name="ugmask" size="20" value="%s" /> <em>e.g. <strong>jo*</strong></em>' % (value or "*")
158       
159    def htmlGroupsCheckbox(self, isgroup=0) :
160        """Groups checkbox."""
161        if isgroup :
162            return 'Groups report : <input type="checkbox" checked="checked" name="isgroup" />'
163        else :   
164            return 'Groups report : <input type="checkbox" name="isgroup" />'
165           
166    def guiAction(self) :
167        """Main function"""
168        printers = ugmask = isgroup = None
169        self.body = "<p>Please click on the button above</p>\n"
170        if self.form.has_key("action") :
171            action = self.form["action"].value
172            if action == "Report" :
173                if self.form.has_key("printers") :
174                    printersfield = self.form["printers"]
175                    if type(printersfield) != type([]) :
176                        printersfield = [ printersfield ]
177                    printers = [self.storage.getPrinter(p.value) for p in printersfield]
178                else :   
179                    printers = self.storage.getMatchingPrinters("*")
180                remuser = os.environ.get("REMOTE_USER", "root")   
181                if remuser == "root" :
182                    if self.form.has_key("ugmask") :     
183                        ugmask = self.form["ugmask"].value
184                    else :     
185                        ugmask = "*"
186                else :       
187                    if self.form.has_key("isgroup") :   
188                        user = self.storage.getUser(remuser)
189                        if user.Exists :
190                            ugmask = " ".join([ g.Name for g in self.storage.getUserGroups(user) ])
191                        else :   
192                            ugmask = remuser # result will probably be empty, we don't care
193                    else :   
194                        ugmask = remuser
195                if self.form.has_key("isgroup") :   
196                    isgroup = 1
197                else :   
198                    isgroup = 0
199            else :
200                self.error(body, "Invalid action [%s]" % action)
201        self.body += self.htmlListPrinters(printers or [])           
202        self.body += "<br />"
203        self.body += self.htmlUGNamesInput(ugmask)
204        self.body += "<br />"
205        self.body += self.htmlGroupsCheckbox(isgroup)
206        if printers and ugmask :
207            self.reportingtool = openReporter(admin, "html", printers, ugmask.split(), isgroup)
208            # self.body += "<pre>%s</pre>" % self.reportingtool.generateReport()
209            self.body += "%s" % self.reportingtool.generateReport()
210           
211if __name__ == "__main__" :
212    os.environ["LC_ALL"] = getLanguagePreference()
213    admin = PyKotaReportGUI(lang=os.environ["LC_ALL"])
214    admin.form = cgi.FieldStorage()
215    admin.guiAction()
216    admin.guiDisplay()
217    try :
218        admin.storage.close()
219    except (TypeError, NameError, AttributeError) :   
220        pass
221       
222    sys.exit(0)
Note: See TracBrowser for help on using the browser.