Changeset 2295 for pykota

Show
Ignore:
Timestamp:
06/08/05 23:17:38 (19 years ago)
Author:
jerome
Message:

Finalized the --sum command line option to dumpykota.

Location:
pykota/trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • pykota/trunk/NEWS

    r2277 r2295  
    2222PyKota NEWS : 
    2323        
     24    - 1.23alpha8 : 
     25     
     26        - The data dumper can now summarize payments and history with the 
     27          help of the --sum command line option (or checkbox in the CGI). 
     28           
     29        - The message used when the job's filename, title and options are  
     30          hidden because of the privacy directive is now translated at 
     31          retrieval time, instead of at saving time. 
     32           
     33        - Minor fix in the LDAP backend code.   
     34           
    2435    - 1.23alpha7 : 
    2536     
  • pykota/trunk/pykota/dumper.py

    r2294 r2295  
    109109                mustclose = 1 
    110110                 
    111             retcode = getattr(self, "dump%s" % format.title())(self.summarizeDatas(entries, datatype, options["sum"]), datatype) 
     111            retcode = getattr(self, "dump%s" % format.title())(self.summarizeDatas(entries, datatype, extractonly, options["sum"]), datatype) 
    112112             
    113113            if mustclose : 
     
    117117        return 0 
    118118         
    119     def summarizeDatas(self, entries, datatype, sum=0) :     
     119    def summarizeDatas(self, entries, datatype, extractonly, sum=0) :     
    120120        """Transforms the datas into a summarized view (with totals). 
    121121         
     
    130130            fieldname = {} 
    131131            for i in range(nbheaders) : 
    132                 name = headers[i] 
    133                 fieldnumber[name] = i 
    134                 fieldname[i] = name 
    135                  
     132                fieldnumber[headers[i]] = i 
     133             
    136134            if datatype == "payments" : 
    137135                totalize = [ ("amount", float) ] 
    138                 ignored = [ "date" ] 
    139                 key = "username" 
     136                keys = [ "username" ] 
     137            else : # elif datatype == "history" 
     138                totalize = [ ("jobsize", int),  
     139                             ("jobprice", float), 
     140                             ("jobsizebytes", int), 
     141                           ] 
     142                keys = [ k for k in ("username", "printername", "hostname", "billingcode") if k in extractonly.keys() ] 
    140143                 
    141                 fnkey = fieldnumber[key] 
    142                 newentries = [ headers ] 
    143                 sortedentries = entries[1:] 
    144                 sortedentries.sort(lambda x, y, fnum=fnkey : cmp(x[fnum], y[fnum])) 
    145                 totals = {} 
    146                 for (k, t) in totalize : 
    147                     totals[k] = { "convert" : t, "value" : 0.0 } 
    148                 prevkey = sortedentries[0][fnkey] 
    149                 for entry in sortedentries : 
    150                     if entry[fnkey] != prevkey : 
    151                         summary = [None] * nbheaders 
    152                         summary[fnkey] = prevkey 
    153                         for ignore in ignored : 
    154                             summary[fieldnumber[ignore]] = '*' 
    155                         for k in totals.keys() :     
    156                             summary[fieldnumber[k]] = totals[k]["convert"](totals[k]["value"]) 
    157                         for i in range(nbheaders) :     
    158                             if summary[i] is None : 
    159                                 summary[i] = entry[i] 
    160                         newentries.append(summary) 
    161                         for k in totals.keys() :     
    162                             totals[k]["value"] = totals[k]["convert"](entry[fieldnumber[k]]) 
    163                     else :     
    164                         for k in totals.keys() :     
    165                             totals[k]["value"] += totals[k]["convert"](entry[fieldnumber[k]]) 
    166                     prevkey = entry[fnkey]     
    167                 summary = [None] * nbheaders 
    168                 summary[fnkey] = prevkey 
    169                 for ignore in ignored : 
    170                     summary[fieldnumber[ignore]] = '*' 
    171                 for k in totals.keys() :     
    172                     summary[fieldnumber[k]] = totals[k]["convert"](totals[k]["value"]) 
    173                 for i in range(nbheaders) :     
    174                     if summary[i] is None : 
    175                         summary[i] = entry[i] 
    176                 newentries.append(summary) 
    177             elif datatype == "history" : 
    178                 newentries = entries # Fake this for now 
    179             else : 
    180                 raise PyKotaToolError, _("Summarizing is not implemented for the [%s] data type, sorry.") % datatype 
     144            newentries = [ headers ] 
     145            sortedentries = entries[1:] 
     146            if keys : 
     147                # If we have several keys, we can sort only on the first one, because they 
     148                # will vary the same way. 
     149                sortedentries.sort(lambda x, y, fnum=fieldnumber[keys[0]] : cmp(x[fnum], y[fnum])) 
     150            totals = {} 
     151            for (k, t) in totalize : 
     152                totals[k] = { "convert" : t, "value" : 0.0 } 
     153            prevkeys = {} 
     154            for k in keys : 
     155                prevkeys[k] = sortedentries[0][fieldnumber[k]] 
     156            for entry in sortedentries : 
     157                curval = '-'.join([str(entry[fieldnumber[k]]) for k in keys]) 
     158                prevval = '-'.join([str(prevkeys[k]) for k in keys]) 
     159                if curval != prevval : 
     160                    summary = [ "*" ] * nbheaders 
     161                    for k in keys : 
     162                        summary[fieldnumber[k]] = prevkeys[k] 
     163                    for k in totals.keys() :     
     164                        summary[fieldnumber[k]] = totals[k]["convert"](totals[k]["value"]) 
     165                    newentries.append(summary) 
     166                    for k in totals.keys() :     
     167                        totals[k]["value"] = totals[k]["convert"](entry[fieldnumber[k]]) 
     168                else :     
     169                    for k in totals.keys() :     
     170                        totals[k]["value"] += totals[k]["convert"](entry[fieldnumber[k]]) 
     171                for k in keys : 
     172                    prevkeys[k] = entry[fieldnumber[k]] 
     173            summary = [ "*" ] * nbheaders 
     174            for k in keys : 
     175                summary[fieldnumber[k]] = prevkeys[k] 
     176            for k in totals.keys() :     
     177                summary[fieldnumber[k]] = totals[k]["convert"](totals[k]["value"]) 
     178            newentries.append(summary) 
    181179            return newentries 
    182180             
  • pykota/trunk/pykota/version.py

    r2277 r2295  
    2222# 
    2323 
    24 __version__ = "1.23alpha7_unofficial" 
     24__version__ = "1.23alpha8_unofficial" 
    2525 
    2626__doc__ = "PyKota : a complete Printing Quota Solution for CUPS and LPRng."