cupsami.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #!/usr/bin/python
  2. #python local cupsatore
  3. #ask to cups server user's jobs infos
  4. #20110311 giorgio_ruffa
  5. #5 realise
  6. # debuggato da blue (28 Gen 2014): il server non restituiva piu' job-name tra gli attributi,
  7. # ho tolto tutto quello che lo riguardava dallo script
  8. from cups import Connection , getUser , setUser
  9. from datetime import datetime
  10. from sys import exit , argv
  11. import getopt
  12. from django.utils.encoding import smart_str #senza non riusciva a printare i nomi dei file in unicode
  13. #===================================================
  14. class Colors :
  15. red = "\033[1;31m"
  16. blue = "\033[1;34m"
  17. pink = "\033[1;35m"
  18. green = "\033[1;32m"
  19. end = "\033[0m"
  20. class Printer_rec:
  21. def __init__(self, u_job_date=datetime.now() , \
  22. u_sheets=0):
  23. self.job_date = u_job_date
  24. self.job_sheets = u_sheets
  25. def __init__(self, job_attr={} ):
  26. if job_attr == None :
  27. self.job_date = datetime.today()
  28. self.job_sheets = 0
  29. else :
  30. if job_attr["time-at-completed"] == None :
  31. print Colors.red + "Warning: " + "the job " ,\
  32. job_attr["job-id"] , " has no time" + Colors.end
  33. print Colors.red + "Warning: will be used today date" +\
  34. Colors.end
  35. self.job_date = datetime.today()
  36. else :
  37. self.job_date = datetime.fromtimestamp(job_attr["time-at-completed"])
  38. self.job_sheets = job_attr["job-media-sheets-completed"]
  39. def __repr__(self):
  40. return "date: " + str(self.job_date) \
  41. + " sheets: " + str(self.job_sheets)
  42. #===================================================
  43. def Usage() :
  44. print "\nCupsami: tells you how many " + \
  45. "sheets you have printed in the last 30 days"
  46. print "\nCupsami: restituisce il numero di pagine" + \
  47. "stampate negli ultimi 30 giorni"
  48. print '\nUsage: '+argv[0]+' [flags]'
  49. print ' -h\tthis help'
  50. exit(1)
  51. #===================================================
  52. debug = False
  53. #debug = True
  54. #getopt //tnxs jacopogh
  55. try: params = getopt.getopt(argv[1:],'h')
  56. except getopt.GetoptError:
  57. print 'Wrong parameter'
  58. Usage()
  59. #help mode (-h)
  60. if "-h" in str(params[0]): Usage()
  61. #get today
  62. t_today = datetime.today()
  63. #our connection
  64. conn = Connection()
  65. jobs_id = conn.getJobs("all",True).keys()
  66. if len(jobs_id) == 0 :
  67. print
  68. print "non hai stampato alcuna pagina questo mese"
  69. print
  70. exit(0)
  71. #get job attributes
  72. jobs_attr = []
  73. for i in jobs_id :
  74. jobs_attr.append( conn.getJobAttributes(i))
  75. #get printers
  76. printers = conn.getPrinters()
  77. #what we are going to print
  78. printers_records = {}
  79. #initialize the dict
  80. # it's not the py way but works
  81. for i in printers :
  82. printers_records[i] = []
  83. #parse our jobs_attr and build records
  84. for i in jobs_attr :
  85. if debug : print i
  86. #assign printer
  87. for j in printers :
  88. if j in i["job-printer-uri"].split("/") :
  89. #the job is of printer j
  90. rec = Printer_rec(i)
  91. if debug : print rec
  92. #date controll
  93. delta = t_today - rec.job_date;
  94. if delta.days > 30 :
  95. continue
  96. printers_records[j].append(rec);
  97. #ok now print "nicely"
  98. total_sheets = 0
  99. print
  100. for i in printers_records.items() :
  101. #do not print if no records
  102. if len(i[1]) == 0 : continue
  103. print Colors.blue + ("="*60) + Colors.end
  104. print
  105. print Colors.green + ( i[0].upper()).center(60) \
  106. + Colors.end
  107. print
  108. print Colors.red + "JOBS:\n" + Colors.end
  109. print Colors.pink + "DATE".ljust(10) +" "*15 \
  110. + "SHEETS" + Colors.end
  111. print
  112. tot_for_printer = 0
  113. for j in i[1]:
  114. print str(smart_str(j.job_date)).rjust(20) +\
  115. (" "*5) +\
  116. str(smart_str(j.job_sheets)).rjust(5)
  117. tot_for_printer += j.job_sheets
  118. total_sheets += j.job_sheets
  119. print Colors.red + "\nTOTAL: " + str(tot_for_printer) + Colors.end
  120. print
  121. print Colors.blue + ("="*60) + "\n" + Colors.end
  122. print Colors.red + ("TOTAL SHEETS: " + str(total_sheets)).center(60) + Colors.end
  123. print
  124. print Colors.green + "se notate un bug siete pregati di segnalarlo a: " \
  125. + "\tadmin(at)lcm.mi.infn.it" + Colors.end
  126. print