Changeset 3319

Show
Ignore:
Timestamp:
02/02/08 15:35:16 (16 years ago)
Author:
jerome
Message:

Greatly simplified the code.
Will serve as the model for the other command line tools.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • pykota/trunk/bin/pkbanner

    r3305 r3319  
    2828import time 
    2929import cStringIO 
    30 import popen2 
     30import subprocess 
    3131 
    3232try : 
    3333    from reportlab.pdfgen import canvas 
    34     from reportlab.lib import pagesizes 
     34    import reportlab.lib 
    3535    from reportlab.lib.units import cm 
    3636except ImportError :     
     
    4848import pykota.appinit 
    4949from pykota.utils import * 
    50 from pykota.commandline import parser 
    51  
    52 from pykota.errors import PyKotaToolError, PyKotaCommandLineError 
     50from pykota import commandline 
     51 
     52from pykota.errors import PyKotaToolError 
    5353from pykota.tool import Tool 
    5454from pykota import version 
    5555 
     56def getPageSize(pgsize) : 
     57    """Returns the correct page size or None if not found.""" 
     58    try : 
     59        try : 
     60            return getattr(reportlab.lib.pagesizes, pgsize.upper()) 
     61        except AttributeError :     
     62            try : 
     63                return getattr(reportlab.lib.pagesizes, pgsize.lower()) 
     64            except AttributeError : 
     65                pass 
     66    except UnicodeError :             
     67        pass 
     68    return None         
     69     
    5670class PyKotaBanner(Tool) :         
    5771    """A class for pkbanner.""" 
    58     def getPageSize(self, pgsize) : 
    59         """Returns the correct page size or None if not found.""" 
    60         try : 
    61             return getattr(pagesizes, pgsize.upper()) 
    62         except AttributeError :     
    63             try : 
    64                 return getattr(pagesizes, pgsize.lower()) 
    65             except AttributeError : 
    66                 pass 
    67                  
    6872    def getVar(self, varname) :             
    6973        """Extracts a variable from the environment and returns its value or 'Unknown' in the current locale.""" 
     
    136140         
    137141        # Current date (TODO : at the time the banner was printed ! Change this to job's submission date) 
    138         datetime = time.strftime("%c", time.localtime()) 
     142        datetime = time.strftime("%c", time.localtime()).decode(self.charset, "replace") 
    139143        ypos -= self.printVar(c, xcenter, ypos, _("Date"), datetime, 14, savetoner)  
    140144         
     
    209213            raise PyKotaToolError, "The Python Imaging Library is missing. Download it from http://www.pythonware.com/downloads" 
    210214             
    211         try : 
    212             if (options.savetoner < 0) or (options.savetoner > 99) : 
    213                 raise ValueError, _("Allowed range is (0..99)") 
    214         except ValueError, msg : 
    215             self.printInfo(_("Invalid 'savetoner' option %s : %s") % (options.savetoner, msg), "warn") 
    216             savetoner = 0.0 
    217         else :     
    218             savetoner = options.savetoner / 100.0     
    219              
    220         pagesize = self.getPageSize(options.pagesize) 
    221         if pagesize is None : 
    222             pagesize = self.getPageSize("a4") 
    223             self.printInfo(_("Invalid 'pagesize' option %s, defaulting to A4.") % options.pagesize, "warn") 
    224              
    225215        self.logdebug("Generating the banner in PDF format...")     
    226         doc = self.genPDF(pagesize,  
     216        doc = self.genPDF(getPageSize(options.pagesize), 
    227217                          options.logo.strip().encode(sys.getfilesystemencoding(), "replace"),  
    228218                          options.url.strip(),  
    229219                          " ".join(arguments).strip(),  
    230                           savetoner) 
     220                          options.savetoner) 
    231221         
    232222        self.logdebug("Converting the banner to PostScript...")     
    233         os.environ["PATH"] = "%s:/bin:/usr/bin:/usr/local/bin:/opt/bin:/sbin:/usr/sbin" % os.environ.get("PATH", "") 
    234         child = popen2.Popen3("gs -q -dNOPAUSE -dBATCH -dPARANOIDSAFER -sDEVICE=pswrite -sOutputFile=- -") 
    235         try : 
    236             child.tochild.write(doc) 
    237             child.tochild.close() 
    238             sys.stdout.write(child.fromchild.read()) 
    239             sys.stdout.flush() 
    240             child.fromchild.close() 
    241         except IOError, msg :     
    242             self.printInfo("I/O Error %s" % msg, "error") 
    243         status = child.wait() 
     223        command = "gs -q -dNOPAUSE -dBATCH -dPARANOIDSAFER -sDEVICE=pswrite -sOutputFile=- -" 
     224        subpr = subprocess.Popen(command, 
     225                                 shell=True, 
     226                                 stdin=subprocess.PIPE, 
     227                                 stdout=subprocess.PIPE, 
     228                                 stderr=subprocess.PIPE) 
     229        try :                          
     230            (out, err) = subpr.communicate(doc) 
     231        except OSError, msg :     
     232            raise PyKotaToolError, _("Impossible to execute '%(command)s'") % locals() 
     233        status = subpr.wait() 
    244234        if os.WIFEXITED(status) : 
    245235            status = os.WEXITSTATUS(status) 
    246236        self.logdebug("PDF to PostScript converter exit code is %s" % str(status)) 
     237        sys.stdout.write(out) 
     238        sys.stdout.flush() 
    247239        self.logdebug("Banner completed.") 
    248240        return status 
    249241 
    250242if __name__ == "__main__" : 
     243    def checkandset_pagesize(option, opt, value, parser) : 
     244        """Checks and sets the page size.""" 
     245        if getPageSize(value) is None : 
     246            loginvalidparam(opt, value, option.default) 
     247            setattr(parser.values, option.dest, option.default) 
     248        else :     
     249            setattr(parser.values, option.dest, value) 
     250         
     251    def checkandset_savetoner(option, opt, value, parser) :     
     252        """Checks and sets the save toner value.""" 
     253        if (value < 0.0) or (value > 99.0) : 
     254            loginvalidparam(opt, value, option.default, \ 
     255                            _("Allowed range is (0..99)")) 
     256            setattr(parser.values, option.dest, option.default) 
     257        else :     
     258            setattr(parser.values, option.dest, value / 100.0) 
     259         
    251260    # TODO : --papertray : to print banners on a different paper (colored for example) 
    252     parser = parser.PyKotaOptionParser(description=_("Banner generator for PyKota")) 
     261    parser = commandline.PyKotaOptionParser(description=_("Banner generator for PyKota")) 
    253262    parser.add_option("-l", "--logo", 
    254263                            dest="logo", 
     
    256265                            help=_("The image to use as the banner's logo. The logo will be drawn at the center top of the page. The default logo is %default")) 
    257266    parser.add_option("-p", "--pagesize", 
     267                            type="string", 
     268                            action="callback", 
     269                            callback=checkandset_pagesize, 
    258270                            dest="pagesize", 
    259271                            default=u"A4", 
    260272                            help=_("Sets the size of the page. Most well known page sizes are recognized, like 'A4' or 'Letter' to name a few. The default page size is %default")) 
    261273    parser.add_option("-s", "--savetoner", 
     274                            type="float", 
     275                            action="callback", 
     276                            callback=checkandset_savetoner, 
    262277                            dest="savetoner", 
    263                             type="int", 
    264                             default=0, 
     278                            default=0.0, 
    265279                            help=_("Sets the text luminosity to this percent. This can be used to save toner. The default value is %default, which means that no toner saving will be done.")) 
    266280    parser.add_option("-u", "--url", 
     
    269283                            help=_("Sets the url to write at the bottom of the banner page. The default url is %default")) 
    270284    parser.add_example('--logo="" --savetoner=75', 
    271                        _("This would generate an A4 banner with no logo, and text luminosity would be increased by 75%%.")) 
    272     (options, arguments) = parser.parse_args()                    
    273     if options.version : 
    274         from pykota import version 
    275         sys.stdout.write("%s\n" % version.__version__) 
    276         sys.exit(0) 
    277      
    278     retcode = 0 
    279     try : 
    280         # Initializes the command line tool 
    281         banner = PyKotaBanner() 
    282         banner.deferredInit() 
    283         retcode = banner.main(arguments, options) 
    284     except KeyboardInterrupt :         
    285         logerr("\nInterrupted with Ctrl+C !\n") 
    286         retcode = -3 
    287     except PyKotaCommandLineError, msg :     
    288         logerr("%s : %s\n" % (sys.argv[0], msg)) 
    289         retcode = -2 
    290     except SystemExit :         
    291         pass 
    292     except : 
    293         try : 
    294             banner.crashed("pkbanner failed") 
    295         except :     
    296             crashed("pkbanner failed") 
    297         retcode = -1 
    298          
    299     sys.exit(retcode)     
     285                       _("This would generate a banner in the default page size, with no logo, and text luminosity would be increased by 75%.")) 
     286                        
     287    run(parser, PyKotaBanner)