Changeset 2054 for pykota/trunk/pykota

Show
Ignore:
Timestamp:
02/13/05 23:02:29 (19 years ago)
Author:
jalet
Message:

Big database structure changes. Upgrade script is now included as well as
the new LDAP schema.
Introduction of the -o | --overcharge command line option to edpykota.
The output of repykota is more complete, but doesn't fit in 80 columns anymore.
Introduction of the new 'maxdenybanners' directive.

Location:
pykota/trunk/pykota
Files:
9 modified

Legend:

Unmodified
Added
Removed
  • pykota/trunk/pykota/config.py

    r1968 r2054  
    2222# 
    2323# $Log$ 
     24# Revision 1.59  2005/02/13 22:02:29  jalet 
     25# Big database structure changes. Upgrade script is now included as well as 
     26# the new LDAP schema. 
     27# Introduction of the -o | --overcharge command line option to edpykota. 
     28# The output of repykota is more complete, but doesn't fit in 80 columns anymore. 
     29# Introduction of the new 'maxdenybanners' directive. 
     30# 
    2431# Revision 1.58  2004/12/02 22:01:58  jalet 
    2532# TLS is now supported with the LDAP backend 
     
    507514            return (mailto, args) 
    508515         
     516    def getMaxDenyBanners(self, printername) :     
     517        """Returns the maximum number of deny banners to be printed for a particular user on a particular printer.""" 
     518        try : 
     519            maxdb = self.getPrinterOption(printername, "maxdenybanners") 
     520        except PyKotaConfigError :     
     521            return 0 # default value is to forbid printing a deny banner. 
     522        try : 
     523            value = int(maxdb.strip()) 
     524            if value < 0 : 
     525                raise ValueError 
     526        except (TypeError, ValueError) :     
     527            raise PyKotaConfigError, _("Invalid maximal deny banners counter %s") % maxdb 
     528        else :     
     529            return value 
     530             
    509531    def getGraceDelay(self, printername) :     
    510532        """Returns the grace delay in days.""" 
  • pykota/trunk/pykota/reporter.py

    r1692 r2054  
    2222# 
    2323# $Log$ 
     24# Revision 1.11  2005/02/13 22:02:29  jalet 
     25# Big database structure changes. Upgrade script is now included as well as 
     26# the new LDAP schema. 
     27# Introduction of the -o | --overcharge command line option to edpykota. 
     28# The output of repykota is more complete, but doesn't fit in 80 columns anymore. 
     29# Introduction of the new 'maxdenybanners' directive. 
     30# 
    2431# Revision 1.10  2004/09/02 10:09:30  jalet 
    2532# Fixed bug in LDAP user deletion code which didn't correctly delete the user's 
     
    8794    def getReportHeader(self) :         
    8895        if self.isgroup : 
    89             return _("Group           used    soft    hard    balance grace         total       paid") 
     96            return _("Group          overcharge   used    soft    hard    balance grace         total       paid warn") 
    9097        else :     
    91             return _("User            used    soft    hard    balance grace         total       paid") 
     98            return _("User           overcharge   used    soft    hard    balance grace         total       paid warn") 
    9299             
    93100    def getPrinterRealPageCounter(self, printer) :         
     
    109116        balance = float(entry.AccountBalance or 0.0) 
    110117        lifetimepaid = float(entry.LifeTimePaid or 0.0) 
     118        if not hasattr(entry, "OverCharge") : 
     119            overcharge = _("N/A")       # Not available for groups 
     120        else :     
     121            overcharge = float(entry.OverCharge or 0.0) 
     122        if not hasattr(quota, "WarnCount") :     
     123            warncount = _("N/A")        # Not available for groups 
     124        else :     
     125            warncount = int(quota.WarnCount or 0) 
    111126         
    112127        #balance 
     
    199214        strbalance = ("%5.2f" % balance)[:10] 
    200215        strlifetimepaid = ("%6.2f" % lifetimepaid)[:10] 
    201         return (lifepagecounter, lifetimepaid, entry.Name, reached, pagecounter, str(quota.SoftLimit), str(quota.HardLimit), strbalance, str(datelimit)[:10], lifepagecounter, strlifetimepaid) 
     216        strovercharge = ("%5s" % overcharge)[:5] 
     217        strwarncount = ("%4s" % warncount)[:4] 
     218        return (lifepagecounter, lifetimepaid, entry.Name, reached, \ 
     219                pagecounter, str(quota.SoftLimit), str(quota.HardLimit), \ 
     220                strbalance, str(datelimit)[:10], lifepagecounter, \ 
     221                strlifetimepaid, strovercharge, strwarncount) 
    202222         
    203223def openReporter(tool, reporttype, printers, ugnames, isgroup) : 
  • pykota/trunk/pykota/reporters/html.py

    r1278 r2054  
    2222# 
    2323# $Log$ 
     24# Revision 1.9  2005/02/13 22:02:29  jalet 
     25# Big database structure changes. Upgrade script is now included as well as 
     26# the new LDAP schema. 
     27# Introduction of the -o | --overcharge command line option to edpykota. 
     28# The output of repykota is more complete, but doesn't fit in 80 columns anymore. 
     29# Introduction of the new 'maxdenybanners' directive. 
     30# 
    2431# Revision 1.8  2004/01/12 15:28:45  jalet 
    2532# Now can output the user's history on several printers at the same time. 
     
    8188                else :     
    8289                    oddevenclass = "even" 
    83                 (pages, money, name, reached, pagecounter, soft, hard, balance, datelimit, lifepagecounter, lifetimepaid) = self.getQuota(entry, entrypquota) 
     90                (pages, money, name, reached, pagecounter, soft, hard, balance, datelimit, lifepagecounter, lifetimepaid, overcharge, warncount) = self.getQuota(entry, entrypquota) 
    8491                if datelimit : 
    8592                    if datelimit == "DENY" : 
     
    8996                if (not self.tool.config.getDisableHistory()) and (not self.isgroup) : 
    9097                    name = '<a href="%s?username=%s&printername=%s&history=1">%s</a>' % (os.environ.get("SCRIPT_NAME", ""), name, printer.Name, name) 
    91                 self.report.append('<tr class="%s">%s</tr>' % (oddevenclass, "".join(["<td>%s</td>" % h for h in (name, reached, pagecounter, soft, hard, balance, datelimit or "&nbsp;", lifepagecounter, lifetimepaid)]))) 
     98                self.report.append('<tr class="%s">%s</tr>' % (oddevenclass, "".join(["<td>%s</td>" % h for h in (name, reached, overcharge, pagecounter, soft, hard, balance, datelimit or "&nbsp;", lifepagecounter, lifetimepaid, warncount)]))) 
    9299                total += pages 
    93100                totalmoney += money 
     
    95102            if total or totalmoney :         
    96103                (tpage, tmoney) = self.getTotals(total, totalmoney) 
    97                 self.report.append('<tr class="totals"><td colspan="7">&nbsp;</td><td align="right">%s</td><td align="right">%s</td></tr>' % (tpage, tmoney)) 
    98             self.report.append('<tr class="realpagecounter"><td colspan="7">&nbsp;</td><td align="right">%s</td></tr>' % self.getPrinterRealPageCounter(printer)) 
     104                self.report.append('<tr class="totals"><td colspan="8">&nbsp;</td><td align="right">%s</td><td align="right">%s</td><td>&nbsp;</td></tr>' % (tpage, tmoney)) 
     105            self.report.append('<tr class="realpagecounter"><td colspan="8">&nbsp;</td><td align="right">%s</td><td>&nbsp;</td></tr>' % self.getPrinterRealPageCounter(printer)) 
    99106            self.report.append('</table>') 
    100107        if self.isgroup :     
  • pykota/trunk/pykota/reporters/text.py

    r1257 r2054  
    2222# 
    2323# $Log$ 
     24# Revision 1.10  2005/02/13 22:02:29  jalet 
     25# Big database structure changes. Upgrade script is now included as well as 
     26# the new LDAP schema. 
     27# Introduction of the -o | --overcharge command line option to edpykota. 
     28# The output of repykota is more complete, but doesn't fit in 80 columns anymore. 
     29# Introduction of the new 'maxdenybanners' directive. 
     30# 
    2431# Revision 1.9  2004/01/08 14:10:33  jalet 
    2532# Copyright year changed. 
     
    7885            self.report.append('-' * len(header)) 
    7986            for (entry, entrypquota) in getattr(self.tool.storage, "getPrinter%ssAndQuotas" % prefix)(printer, self.ugnames) : 
    80                 (pages, money, name, reached, pagecounter, soft, hard, balance, datelimit, lifepagecounter, lifetimepaid) = self.getQuota(entry, entrypquota) 
    81                 self.report.append("%-9.9s %s %7i %7s %7s %10s %-10.10s %8i %10s" % (name, reached, pagecounter, soft, hard, balance, datelimit, lifepagecounter, lifetimepaid)) 
     87                (pages, money, name, reached, pagecounter, soft, hard, balance, datelimit, lifepagecounter, lifetimepaid, overcharge, warncount) = self.getQuota(entry, entrypquota) 
     88                self.report.append("%-15.15s %s %5s %7i %7s %7s %10s %-10.10s %8i %10s %4s" % (name, reached, overcharge, pagecounter, soft, hard, balance, datelimit, lifepagecounter, lifetimepaid, warncount)) 
    8289                total += pages 
    8390                totalmoney += money 
     
    8592            if total or totalmoney :         
    8693                (tpage, tmoney) = self.getTotals(total, totalmoney) 
    87                 self.report.append((" " * 50) + tpage + tmoney) 
    88             self.report.append((" " * 51) + self.getPrinterRealPageCounter(printer)) 
     94                self.report.append((" " * 62) + tpage + tmoney) 
     95            self.report.append((" " * 63) + self.getPrinterRealPageCounter(printer)) 
    8996            self.report.append("")         
    9097        if self.isgroup :     
  • pykota/trunk/pykota/storage.py

    r2030 r2054  
    2222# 
    2323# $Log$ 
     24# Revision 1.68  2005/02/13 22:02:29  jalet 
     25# Big database structure changes. Upgrade script is now included as well as 
     26# the new LDAP schema. 
     27# Introduction of the -o | --overcharge command line option to edpykota. 
     28# The output of repykota is more complete, but doesn't fit in 80 columns anymore. 
     29# Introduction of the new 'maxdenybanners' directive. 
     30# 
    2431# Revision 1.67  2005/01/18 19:47:50  jalet 
    2532# Big bug fix wrt the datelimit attribute 
     
    276283        self.LifeTimePaid = None 
    277284        self.Email = None 
     285        self.OverCharge = 1.0 
    278286        self.Payments = [] # TODO : maybe handle this smartly for SQL, for now just don't retrieve them 
    279287         
     
    308316            self.LimitBy = limitby 
    309317         
     318    def setOverChargeFactor(self, factor) :     
     319        """Sets the user's overcharging coefficient.""" 
     320        self.parent.writeUserOverCharge(self, factor) 
     321        self.OverCharge = factor 
     322         
    310323    def delete(self) :     
    311324        """Deletes an user from the Quota Storage.""" 
     
    357370        self.PricePerJob = None 
    358371        self.Description = None 
     372        self.Coefficients = None 
    359373         
    360374    def __getattr__(self, name) :     
     
    424438        self.HardLimit = None 
    425439        self.DateLimit = None 
     440        self.WarnCount = None 
    426441         
    427442    def __getattr__(self, name) :     
     
    445460        self.HardLimit = hardlimit 
    446461        self.DateLimit = None 
     462        self.WarnCount = 0 
    447463         
    448464    def setUsage(self, used) : 
     
    454470                self.parent.increaseUserPQuotaPagesCounters(self, vused) 
    455471                self.parent.writeUserPQuotaDateLimit(self, None) 
     472                self.parent.writeUserPQuotaWarnCount(self, 0) 
    456473            except PyKotaStorageError, msg :     
    457474                self.parent.rollbackTransaction() 
     
    465482            self.PageCounter = self.LifePageCounter = vused 
    466483        self.DateLimit = None 
     484        self.WarnCount = 0 
    467485 
     486    def warn(self) : 
     487        """Increases the warn counter for this user quota.""" 
     488        self.parent.increaseUserPQuotaWarnCount(self) 
     489        self.WarnCount = (self.WarnCount or 0) + 1 
     490         
    468491    def reset(self) :     
    469492        """Resets page counter to 0.""" 
     
    482505        totalprice = 0.0     
    483506        if jobsize : 
    484             for upq in [ self ] + self.ParentPrintersUserPQuota : 
    485                 price = (float(upq.Printer.PricePerPage or 0.0) * jobsize) + float(upq.Printer.PricePerJob or 0.0) 
    486                 totalprice += price 
    487         return totalprice     
     507            if self.User.OverCharge != 0.0 :    # optimization, but TODO : beware of rounding errors 
     508                for upq in [ self ] + self.ParentPrintersUserPQuota : 
     509                    price = (float(upq.Printer.PricePerPage or 0.0) * jobsize) + float(upq.Printer.PricePerJob or 0.0) 
     510                    totalprice += price 
     511        if self.User.OverCharge != 1.0 : # TODO : beware of rounding errors 
     512            overcharged = totalprice * self.User.OverCharge         
     513            self.parent.tool.printInfo("Overcharging %s by a factor of %s ===> User %s will be charged for %s units." % (totalprice, self.User.OverCharge, self.User.Name, overcharged)) 
     514            return overcharged 
     515        else :     
     516            return totalprice 
    488517             
    489518    def increasePagesUsage(self, jobsize) : 
     
    589618        self.JobOptions = None 
    590619        self.JobHostName = None 
     620        self.JobMD5Sum = None 
     621        self.JobPages = None 
     622        self.JobBillingCode = None 
    591623         
    592624    def __getattr__(self, name) :     
  • pykota/trunk/pykota/storages/ldapstorage.py

    r2042 r2054  
    2222# 
    2323# $Log$ 
     24# Revision 1.100  2005/02/13 22:02:29  jalet 
     25# Big database structure changes. Upgrade script is now included as well as 
     26# the new LDAP schema. 
     27# Introduction of the -o | --overcharge command line option to edpykota. 
     28# The output of repykota is more complete, but doesn't fit in 80 columns anymore. 
     29# Introduction of the new 'maxdenybanners' directive. 
     30# 
    2431# Revision 1.99  2005/01/24 17:44:17  jalet 
    2532# Same fix for group print quota entries wrt LDAP performance 
     
    647654        """Extracts user information given its name.""" 
    648655        user = StorageUser(self, username) 
    649         result = self.doSearch("(&(objectClass=pykotaAccount)(|(pykotaUserName=%s)(%s=%s)))" % (username, self.info["userrdn"], username), ["pykotaUserName", "pykotaLimitBy", self.info["usermail"]], base=self.info["userbase"]) 
     656        result = self.doSearch("(&(objectClass=pykotaAccount)(|(pykotaUserName=%s)(%s=%s)))" % (username, self.info["userrdn"], username), ["pykotaUserName", "pykotaLimitBy", self.info["usermail"], "pykotaOverCharge"], base=self.info["userbase"]) 
    650657        if result : 
    651658            fields = result[0][1] 
    652659            user.ident = result[0][0] 
    653660            user.Name = fields.get("pykotaUserName", [username])[0]  
    654             user.Email = fields.get(self.info["usermail"]) 
    655             if user.Email is not None : 
    656                 user.Email = user.Email[0] 
    657             user.LimitBy = fields.get("pykotaLimitBy") 
    658             if user.LimitBy is not None : 
    659                 user.LimitBy = user.LimitBy[0] 
    660             else :     
    661                 user.LimitBy = "quota" 
     661            user.Email = fields.get(self.info["usermail"], [None])[0] 
     662            user.LimitBy = fields.get("pykotaLimitBy", ["quota"])[0] 
     663            user.OverCharge = float(fields.get("pykotaOverCharge", [1.0])[0]) 
    662664            result = self.doSearch("(&(objectClass=pykotaAccountBalance)(|(pykotaUserName=%s)(%s=%s)))" % (username, self.info["balancerdn"], username), ["pykotaBalance", "pykotaLifeTimePaid", "pykotaPayments"], base=self.info["balancebase"]) 
    663665            if not result : 
     
    695697            group.ident = result[0][0] 
    696698            group.Name = fields.get("pykotaGroupName", [groupname])[0]  
    697             group.LimitBy = fields.get("pykotaLimitBy") 
    698             if group.LimitBy is not None : 
    699                 group.LimitBy = group.LimitBy[0] 
    700             else :     
    701                 group.LimitBy = "quota" 
     699            group.LimitBy = fields.get("pykotaLimitBy", ["quota"])[0] 
    702700            group.AccountBalance = 0.0 
    703701            group.LifeTimePaid = 0.0 
     
    717715            printer.ident = result[0][0] 
    718716            printer.Name = fields.get("pykotaPrinterName", [printername])[0]  
    719             printer.PricePerJob = float(fields.get("pykotaPricePerJob", [0.0])[0] or 0.0) 
    720             printer.PricePerPage = float(fields.get("pykotaPricePerPage", [0.0])[0] or 0.0) 
     717            printer.PricePerJob = float(fields.get("pykotaPricePerJob", [0.0])[0]) 
     718            printer.PricePerPage = float(fields.get("pykotaPricePerPage", [0.0])[0]) 
    721719            printer.uniqueMember = fields.get("uniqueMember", []) 
    722720            printer.Description = self.databaseToUserCharset(fields.get("description", [""])[0])  
     
    732730            else :     
    733731                base = self.info["userquotabase"] 
    734             result = self.doSearch("(&(objectClass=pykotaUserPQuota)(pykotaUserName=%s)(pykotaPrinterName=%s))" % (user.Name, printer.Name), ["pykotaPageCounter", "pykotaLifePageCounter", "pykotaSoftLimit", "pykotaHardLimit", "pykotaDateLimit"], base=base) 
     732            result = self.doSearch("(&(objectClass=pykotaUserPQuota)(pykotaUserName=%s)(pykotaPrinterName=%s))" % (user.Name, printer.Name), ["pykotaPageCounter", "pykotaLifePageCounter", "pykotaSoftLimit", "pykotaHardLimit", "pykotaDateLimit", "pykotaWarnCount"], base=base) 
    735733            if result : 
    736734                fields = result[0][1] 
    737735                userpquota.ident = result[0][0] 
    738                 userpquota.PageCounter = int(fields.get("pykotaPageCounter", [0])[0] or 0) 
    739                 userpquota.LifePageCounter = int(fields.get("pykotaLifePageCounter", [0])[0] or 0) 
     736                userpquota.PageCounter = int(fields.get("pykotaPageCounter", [0])[0]) 
     737                userpquota.LifePageCounter = int(fields.get("pykotaLifePageCounter", [0])[0]) 
     738                userpquota.WarnCount = int(fields.get("pykotaWarnCount", [0])[0]) 
    740739                userpquota.SoftLimit = fields.get("pykotaSoftLimit") 
    741740                if userpquota.SoftLimit is not None : 
     
    815814            result = None 
    816815            try : 
    817                 result = self.doSearch("objectClass=pykotaJob", ["pykotaJobSizeBytes", "pykotaHostName", "pykotaUserName", "pykotaJobId", "pykotaPrinterPageCounter", "pykotaJobSize", "pykotaAction", "pykotaJobPrice", "pykotaFileName", "pykotaTitle", "pykotaCopies", "pykotaOptions", "createTimestamp"], base="cn=%s,%s" % (lastjobident, self.info["jobbase"]), scope=ldap.SCOPE_BASE) 
     816                result = self.doSearch("objectClass=pykotaJob", ["pykotaJobSizeBytes", "pykotaHostName", "pykotaUserName", "pykotaJobId", "pykotaPrinterPageCounter", "pykotaJobSize", "pykotaAction", "pykotaJobPrice", "pykotaFileName", "pykotaTitle", "pykotaCopies", "pykotaOptions", "pykotaBillingCode", "pykotaPages", "pykotaMD5Sum", "createTimestamp"], base="cn=%s,%s" % (lastjobident, self.info["jobbase"]), scope=ldap.SCOPE_BASE) 
    818817            except PyKotaStorageError :     
    819818                pass # Last job entry exists, but job probably doesn't exist anymore.  
     
    823822                lastjob.JobId = fields.get("pykotaJobId")[0] 
    824823                lastjob.UserName = fields.get("pykotaUserName")[0] 
    825                 lastjob.PrinterPageCounter = int(fields.get("pykotaPrinterPageCounter", [0])[0] or 0) 
     824                lastjob.PrinterPageCounter = int(fields.get("pykotaPrinterPageCounter", [0])[0]) 
    826825                try : 
    827826                    lastjob.JobSize = int(fields.get("pykotaJobSize", [0])[0]) 
     
    839838                lastjob.JobHostName = fields.get("pykotaHostName", [""])[0] 
    840839                lastjob.JobSizeBytes = fields.get("pykotaJobSizeBytes", [0L])[0] 
     840                lastjob.JobBillingCode = fields.get("pykotaMD5Sum", [None])[0] 
     841                lastjob.JobMD5Sum = fields.get("pykotaMD5Sum", [None])[0] 
     842                lastjob.JobPages = fields.get("pykotaPages", [""])[0] 
    841843                date = fields.get("createTimestamp", ["19700101000000"])[0] 
    842844                year = int(date[:4]) 
     
    924926        else : 
    925927           base = self.info["userquotabase"] 
    926         result = self.doSearch("(&(objectClass=pykotaUserPQuota)(pykotaPrinterName=%s)(|%s))" % (printer.Name, "".join(["(pykotaUserName=%s)" % uname for uname in names])), ["pykotaUserName", "pykotaPageCounter", "pykotaLifePageCounter", "pykotaSoftLimit", "pykotaHardLimit", "pykotaDateLimit"], base=base) 
     928        result = self.doSearch("(&(objectClass=pykotaUserPQuota)(pykotaPrinterName=%s)(|%s))" % (printer.Name, "".join(["(pykotaUserName=%s)" % uname for uname in names])), ["pykotaUserName", "pykotaPageCounter", "pykotaLifePageCounter", "pykotaSoftLimit", "pykotaHardLimit", "pykotaDateLimit", "pykotaWarnCount"], base=base) 
    927929        if result : 
    928930            for (userquotaid, fields) in result : 
     
    930932                userpquota = StorageUserPQuota(self, user, printer) 
    931933                userpquota.ident = userquotaid 
    932                 userpquota.PageCounter = int(fields.get("pykotaPageCounter", [0])[0] or 0) 
    933                 userpquota.LifePageCounter = int(fields.get("pykotaLifePageCounter", [0])[0] or 0) 
     934                userpquota.PageCounter = int(fields.get("pykotaPageCounter", [0])[0]) 
     935                userpquota.LifePageCounter = int(fields.get("pykotaLifePageCounter", [0])[0]) 
     936                userpquota.WarnCount = int(fields.get("pykotaWarnCount", [0])[0]) 
    934937                userpquota.SoftLimit = fields.get("pykotaSoftLimit") 
    935938                if userpquota.SoftLimit is not None : 
     
    990993                       "pykotaUserName" : user.Name, 
    991994                       "pykotaLimitBy" : (user.LimitBy or "quota"), 
     995                       "pykotaOverCharge" : str(user.OverCharge), 
    992996                    }    
    993997                        
     
    10481052        newfields = {  
    10491053                      "pykotaGroupName" : group.Name, 
    1050                       "pykotaLimitBY" : (group.LimitBy or "quota"), 
     1054                      "pykotaLimitBy" : (group.LimitBy or "quota"), 
    10511055                    }  
    10521056        mustadd = 1 
     
    11021106                   "pykotaPageCounter" : "0", 
    11031107                   "pykotaLifePageCounter" : "0", 
     1108                   "pykotaWarnCount" : "0", 
    11041109                 }  
    11051110        if self.info["userquotabase"].lower() == "user" : 
     
    11411146        self.doModify(printer.ident, fields) 
    11421147         
     1148    def writeUserOverCharge(self, user, factor) : 
     1149        """Sets the user's overcharging coefficient.""" 
     1150        fields = { 
     1151                   "pykotaOverCharge" : str(factor), 
     1152                 } 
     1153        self.doModify(user.ident, fields) 
     1154         
    11431155    def writeUserLimitBy(self, user, limitby) :     
    11441156        """Sets the user's limiting factor.""" 
     
    11831195                   "pykotaLifePageCounter" : str(newlifepagecounter), 
    11841196                   "pykotaDateLimit" : None, 
     1197                   "pykotaWarnCount" : "0", 
    11851198                 }   
    11861199        return self.doModify(userpquota.ident, fields)          
     
    12461259                   "pykotaHostName" : str(clienthost),  
    12471260                   "pykotaJobSizeBytes" : str(jobsizebytes), 
     1261                   # TODO : add the 3 missing fields 
    12481262                 } 
    12491263        if (not self.disablehistory) or (not printer.LastJob.Exists) : 
     
    12781292                   "pykotaHardLimit" : str(hardlimit), 
    12791293                   "pykotaDateLimit" : "None", 
     1294                   "pykotaWarnCount" : "0", 
    12801295                 } 
    12811296        self.doModify(userpquota.ident, fields) 
     1297         
     1298    def writeUserPQuotaWarnCount(self, userpquota, warncount) : 
     1299        """Sets the warn counter value for a user quota.""" 
     1300        fields = {  
     1301                   "pykotaWarnCount" : str(warncount or 0), 
     1302                 } 
     1303        self.doModify(userpquota.ident, fields) 
     1304         
     1305    def increaseUserPQuotaWarnCount(self, userpquota) : 
     1306        """Increases the warn counter value for a user quota.""" 
     1307        fields = { 
     1308                   "pykotaWarnCount" : { "operator" : "+", "value" : 1, "convert" : int }, 
     1309                 } 
     1310        return self.doModify(userpquota.ident, fields)          
    12821311         
    12831312    def writeGroupPQuotaLimits(self, grouppquota, softlimit, hardlimit) : 
  • pykota/trunk/pykota/storages/sql.py

    r2030 r2054  
    2222# 
    2323# $Log$ 
     24# Revision 1.65  2005/02/13 22:02:29  jalet 
     25# Big database structure changes. Upgrade script is now included as well as 
     26# the new LDAP schema. 
     27# Introduction of the -o | --overcharge command line option to edpykota. 
     28# The output of repykota is more complete, but doesn't fit in 80 columns anymore. 
     29# Introduction of the new 'maxdenybanners' directive. 
     30# 
    2431# Revision 1.64  2005/01/18 19:47:50  jalet 
    2532# Big bug fix wrt the datelimit attribute 
     
    273280            user.LifeTimePaid = fields.get("lifetimepaid") 
    274281            user.Email = fields.get("email") 
     282            user.OverCharge = fields.get("overcharge", 1.0) 
    275283            user.Exists = 1 
    276284        return user 
     
    317325                userpquota.HardLimit = fields.get("hardlimit") 
    318326                userpquota.DateLimit = fields.get("datelimit") 
     327                userpquota.WarnCount = fields.get("warncount") 
    319328                userpquota.Exists = 1 
    320329        return userpquota 
     
    359368            lastjob.JobHostName = fields.get("hostname") 
    360369            lastjob.JobSizeBytes = fields.get("jobsizebytes") 
     370            lastjob.JobMD5Sum = fields.get("md5sum") 
     371            lastjob.JobPages = fields.get("pages") 
     372            lastjob.JobBillingCode = fields.get("billingcode") 
    361373            lastjob.Exists = 1 
    362374        return lastjob 
     
    374386                user.LifeTimePaid = record.get("lifetimepaid") 
    375387                user.Email = record.get("email") 
     388                user.OverCharge = record.get("overcharge") 
    376389                user.Exists = 1 
    377390                groupmembers.append(user) 
     
    423436        """Returns the list of users who uses a given printer, along with their quotas.""" 
    424437        usersandquotas = [] 
    425         result = self.doSearch("SELECT users.id as uid,username,balance,lifetimepaid,limitby,email,userpquota.id,lifepagecounter,pagecounter,softlimit,hardlimit,datelimit FROM users JOIN userpquota ON users.id=userpquota.userid AND printerid=%s ORDER BY username ASC" % self.doQuote(printer.ident)) 
     438        result = self.doSearch("SELECT users.id as uid,username,balance,lifetimepaid,limitby,email,overcharge,userpquota.id,lifepagecounter,pagecounter,softlimit,hardlimit,datelimit,warncount FROM users JOIN userpquota ON users.id=userpquota.userid AND printerid=%s ORDER BY username ASC" % self.doQuote(printer.ident)) 
    426439        if result : 
    427440            for record in result : 
     
    433446                    user.LifeTimePaid = record.get("lifetimepaid") 
    434447                    user.Email = record.get("email")  
     448                    user.OverCharge = record.get("overcharge") 
    435449                    user.Exists = 1 
    436450                    userpquota = StorageUserPQuota(self, user, printer) 
     
    441455                    userpquota.HardLimit = record.get("hardlimit") 
    442456                    userpquota.DateLimit = record.get("datelimit") 
     457                    userpquota.WarnCount = record.get("warncount") 
    443458                    userpquota.Exists = 1 
    444459                    usersandquotas.append((user, userpquota)) 
     
    466481    def addUser(self, user) :         
    467482        """Adds a user to the quota storage, returns its id.""" 
    468         self.doModify("INSERT INTO users (username, limitby, balance, lifetimepaid, email) VALUES (%s, %s, %s, %s, %s)" % (self.doQuote(user.Name), self.doQuote(user.LimitBy or 'quota'), self.doQuote(user.AccountBalance or 0.0), self.doQuote(user.LifeTimePaid or 0.0), self.doQuote(user.Email))) 
     483        self.doModify("INSERT INTO users (username, limitby, balance, lifetimepaid, email, overcharge) VALUES (%s, %s, %s, %s, %s, %s)" % (self.doQuote(user.Name), self.doQuote(user.LimitBy or 'quota'), self.doQuote(user.AccountBalance or 0.0), self.doQuote(user.LifeTimePaid or 0.0), self.doQuote(user.Email), self.doQuote(user.OverCharge))) 
    469484        return self.getUser(user.Name) 
    470485         
     
    503518        self.doModify("UPDATE printers SET description=%s WHERE id=%s" % (self.doQuote(description), self.doQuote(printer.ident))) 
    504519         
     520    def writeUserOverCharge(self, user, factor) : 
     521        """Sets the user's overcharging coefficient.""" 
     522        self.doModify("UPDATE users SET overcharge=%s WHERE id=%s" % (self.doQuote(factor), self.doQuote(user.ident))) 
     523         
    505524    def writeUserLimitBy(self, user, limitby) :     
    506525        """Sets the user's limiting factor.""" 
     
    521540    def increaseUserPQuotaPagesCounters(self, userpquota, nbpages) :     
    522541        """Increase page counters for a user print quota.""" 
    523         self.doModify("UPDATE userpquota SET pagecounter=pagecounter+%s,lifepagecounter=lifepagecounter+%s WHERE id=%s" % (self.doQuote(nbpages), self.doQuote(nbpages), self.doQuote(userpquota.ident))) 
     542        self.doModify("UPDATE userpquota SET pagecounter=pagecounter + %s,lifepagecounter=lifepagecounter + %s WHERE id=%s" % (self.doQuote(nbpages), self.doQuote(nbpages), self.doQuote(userpquota.ident))) 
    524543        
    525544    def writeUserPQuotaPagesCounters(self, userpquota, newpagecounter, newlifepagecounter) :     
    526545        """Sets the new page counters permanently for a user print quota.""" 
    527         self.doModify("UPDATE userpquota SET pagecounter=%s, lifepagecounter=%s, datelimit=NULL WHERE id=%s" % (self.doQuote(newpagecounter), self.doQuote(newlifepagecounter), self.doQuote(userpquota.ident))) 
     546        self.doModify("UPDATE userpquota SET pagecounter=%s, lifepagecounter=%s, warncount=0, datelimit=NULL WHERE id=%s" % (self.doQuote(newpagecounter), self.doQuote(newlifepagecounter), self.doQuote(userpquota.ident))) 
    528547        
    529548    def decreaseUserAccountBalance(self, user, amount) :     
    530549        """Decreases user's account balance from an amount.""" 
    531         self.doModify("UPDATE users SET balance=balance-%s WHERE id=%s" % (self.doQuote(amount), self.doQuote(user.ident))) 
     550        self.doModify("UPDATE users SET balance=balance - %s WHERE id=%s" % (self.doQuote(amount), self.doQuote(user.ident))) 
    532551        
    533552    def writeUserAccountBalance(self, user, newbalance, newlifetimepaid=None) :     
     
    565584    def writeUserPQuotaLimits(self, userpquota, softlimit, hardlimit) : 
    566585        """Sets soft and hard limits for a user quota.""" 
    567         self.doModify("UPDATE userpquota SET softlimit=%s, hardlimit=%s, datelimit=NULL WHERE id=%s" % (self.doQuote(softlimit), self.doQuote(hardlimit), self.doQuote(userpquota.ident))) 
     586        self.doModify("UPDATE userpquota SET softlimit=%s, hardlimit=%s, warncount=0, datelimit=NULL WHERE id=%s" % (self.doQuote(softlimit), self.doQuote(hardlimit), self.doQuote(userpquota.ident))) 
     587         
     588    def writeUserPQuotaWarnCount(self, userpquota, warncount) : 
     589        """Sets the warn counter value for a user quota.""" 
     590        self.doModify("UPDATE userpquota SET warncount=%s WHERE id=%s" % (self.doQuote(warncount), self.doQuote(userpquota.ident))) 
     591         
     592    def increaseUserPQuotaWarnCount(self, userpquota) : 
     593        """Increases the warn counter value for a user quota.""" 
     594        self.doModify("UPDATE userpquota SET warncount=warncount+1 WHERE id=%s" % self.doQuote(userpquota.ident)) 
    568595         
    569596    def writeGroupPQuotaLimits(self, grouppquota, softlimit, hardlimit) : 
     
    620647                job.JobHostName = fields.get("hostname") 
    621648                job.JobSizeBytes = fields.get("jobsizebytes") 
     649                job.JobMD5Sum = fields.get("md5sum") 
     650                job.JobPages = fields.get("pages") 
     651                job.JobBillingCode = fields.get("billingcode") 
    622652                job.UserName = fields.get("username") 
    623653                job.PrinterName = fields.get("printername") 
  • pykota/trunk/pykota/tool.py

    r2008 r2054  
    2222# 
    2323# $Log$ 
     24# Revision 1.149  2005/02/13 22:02:29  jalet 
     25# Big database structure changes. Upgrade script is now included as well as 
     26# the new LDAP schema. 
     27# Introduction of the -o | --overcharge command line option to edpykota. 
     28# The output of repykota is more complete, but doesn't fit in 80 columns anymore. 
     29# Introduction of the new 'maxdenybanners' directive. 
     30# 
    2431# Revision 1.148  2005/01/06 23:24:21  jalet 
    2532# Regain priviledge the time to open the job's data file when printing in 
     
    10121019                return action         
    10131020            else :     
    1014                 val = float(user.AccountBalance or 0.0) 
    1015                 enforcement = self.config.getPrinterEnforcement(printer.Name) 
    1016                 if enforcement == "STRICT" :  
    1017                     val -= self.softwareJobPrice # use precomputed size. 
    1018                 if val <= 0.0 : 
    1019                     action = "DENY" 
    1020                 elif val <= self.config.getPoorMan() :     
    1021                     action = "WARN" 
     1021                if user.OverCharge == 0.0 : 
     1022                    self.printInfo(_("User %s will not be charged for printing.") % user.Name) 
     1023                    action = "ALLOW" 
    10221024                else : 
    1023                     action = "ALLOW" 
    1024                 if (enforcement == "STRICT") and (val == 0.0) : 
    1025                     action = "WARN" # we can still print until account is 0 
     1025                    val = float(user.AccountBalance or 0.0) 
     1026                    enforcement = self.config.getPrinterEnforcement(printer.Name) 
     1027                    if enforcement == "STRICT" :  
     1028                        val -= self.softwareJobPrice # use precomputed size. 
     1029                    if val <= 0.0 : 
     1030                        action = "DENY" 
     1031                    elif val <= self.config.getPoorMan() :     
     1032                        action = "WARN" 
     1033                    else : 
     1034                        action = "ALLOW" 
     1035                    if (enforcement == "STRICT") and (val == 0.0) : 
     1036                        action = "WARN" # we can still print until account is 0 
    10261037                return action     
    10271038        else : 
     
    11061117        if action.startswith("POLICY_") : 
    11071118            action = action[7:] 
     1119             
    11081120        if action == "DENY" : 
    11091121            adminmessage = _("Print Quota exceeded for user %s on printer %s") % (user.Name, printer.Name) 
     
    12861298    def exportUserInfo(self, userpquota) : 
    12871299        """Exports user information to the environment.""" 
     1300        os.environ["PYKOTAOVERCHARGE"] = str(userpquota.User.OverCharge) 
    12881301        os.environ["PYKOTALIMITBY"] = str(userpquota.User.LimitBy) 
    12891302        os.environ["PYKOTABALANCE"] = str(userpquota.User.AccountBalance or 0.0) 
     
    12941307        os.environ["PYKOTAHARDLIMIT"] = str(userpquota.HardLimit) 
    12951308        os.environ["PYKOTADATELIMIT"] = str(userpquota.DateLimit) 
     1309        os.environ["PYKOTAWARNCOUNT"] = str(userpquota.WarnCount) 
    12961310         
    12971311        # not really an user information, but anyway 
  • pykota/trunk/pykota/version.py

    r2044 r2054  
    2222# 
    2323 
    24 __version__ = "1.21alpha23_unofficial" 
     24__version__ = "1.21alpha24_unofficial" 
    2525 
    2626__doc__ = """PyKota : a complete Printing Quota Solution for CUPS and LPRng."""