Beispiel #1
0
 def __init__(self, parent):
     self.parent = parent
     self.control = Control()        
Beispiel #2
0
class ViewExplore(object):

    _cp_config = {
        'auth.require': None,
    }
    
    def __init__(self, parent):
        self.parent = parent
        self.control = Control()        
                        

    def getargs(self, report=None, subfolder=None, filter=False, fromdate=None, todate=None):
        if str(fromdate).lower() in ('today', 't') :
            fromdate = datetime.datetime.now().date()
        elif fromdate is None:
            fromdate =datetime.datetime.now().date()
        elif isinstance(fromdate, str):
            fromdate = datetime.datetime(*time.strptime(fromdate, "%d/%m/%Y")[:6]).date()

        if str(todate).lower() in ('today', 't') or todate is None:
            todate = datetime.datetime.now().date()
        elif isinstance(todate, str):
            todate = datetime.datetime(*time.strptime(todate, "%d/%m/%Y")[:6]).date()
            
        columns = ['Report', 'Formats',  'As of Date', 'When Published', 'First As of', 'Most recent As of']
                        
        reportdata = {
            'd' : [],
            'w' : [],
            'm' : [],
        }
        
        cache = self.control.getLatest()
        for period, data in cache.iteritems():
            for key, item in data.iteritems():
                row = {
                    "name" : item["name"],
                    "maxasof" : item["maxasof"],
                    "minasof" : item["minasof"],
                    "asof" : item["maxasof"],
                    "published" : "", 
                    "files" : [],
                }
                
                if item["grouptype"] != "report":
                    row["url"] = '/explore?report=%s' % key
                    row["files"] = [(row["url"], row["name"], 'dir')]
                    
                else:
                    basepath = reportconfig.reportindex[item["reportid"]]["basepath"]
                    virtualpath = reportconfig.folderindex[basepath]                
                    files = []
                    for info in item["files"][item["reportid"]].get(item["maxasof"], []):
                        path = os.path.join(virtualpath, info["childpath"], info["name"])
                        files.append((path, info["name"], info["filetype"]))
                        row["published"] = info["modified"]
                    row["files"] = files
                    row["url"]  = path
                    
                reportdata[period].append(row)
                
        #reportdata['d'].sort(lambda a, b : cmp((a[1],a[3]), (b[1],b[3])))
        #reportdata['w'].sort(lambda a, b : cmp((a[1],a[3]), (b[1],b[3])))
        #reportdata['m'].sort(lambda a, b : cmp((a[1],a[3]), (b[1],b[3])))            
        reportdata['d'].sort(lambda a, b : cmp(a["name"], b["name"]))
        reportdata['w'].sort(lambda a, b : cmp(a["name"], b["name"]))
        reportdata['m'].sort(lambda a, b : cmp(a["name"], b["name"]))            
            
        tabledata = Table(title='Reports',
                          columns=columns,
                          data=reportdata,
                          )
        
        args =  {
            "folder" : None,
            "filter" : filter,
            "fromdate" : fromdate,
            "todate" : todate,
            "report" : report,
            "reportid" : None,
            "subfolder" : subfolder,
            "tabledata"  : tabledata,
            "reportmenu" : reportconfig.reportmenu,
            "generallinks" : reportconfig.generallinks,
        }
        
        return args


    def getargsDir(self, report=None, subfolder=None, filter=False, fromdate=None, todate=None):
        if str(fromdate).lower() in ('today', 't') :
            fromdate = datetime.datetime.now().date()
        elif fromdate is None:
            fromdate =datetime.datetime.now().date()
        elif isinstance(fromdate, str):
            fromdate = datetime.datetime(*time.strptime(fromdate, "%d/%m/%Y")[:6]).date()

        if str(todate).lower() in ('today', 't') or todate is None:
            todate = datetime.datetime.now().date()
        elif isinstance(todate, str):
            todate = datetime.datetime(*time.strptime(todate, "%d/%m/%Y")[:6]).date()
            
        columns = ['Report', 'Formats',  'As of Date', 'When Published', 'First As of', 'Most recent As of']
                        
        reportdata = {
            'd' : [],
            'w' : [],
            'm' : [],
        }
                        
        defaultItem = {
            "name" : None,
            "maxasof" : datetime.date(datetime.MINYEAR, 1, 1),
            "minasof" : datetime.date(datetime.MAXYEAR, 12, 31),
            "asof" : datetime.date(datetime.MINYEAR, 1, 1),
            "files" : {},
        }
        
        groupindex = {}        
        for info in self.control._filescan_cache:
            if info["groupname"] != report:
                continue
            
            groupby = info["groupby"]
            reportid = info["reportid"]
            fileasof = info["fileasof"]
            reportname = info["reportname"]
            
            reportItem = groupindex.get(reportname, copy.deepcopy(defaultItem))
            reportItem["name"] = info["reportname"]
            reportItem["reportid"] = reportid

            if reportItem["minasof"] is None or reportItem["minasof"] > fileasof:
                reportItem["minasof"] = fileasof
                
            if reportItem["maxasof"] is None or reportItem["maxasof"] < fileasof:
                reportItem["maxasof"] = fileasof                    
        
                
            #only interested in the most recent files
            if reportItem["maxasof"] == fileasof:
                files_asof = reportItem["files"].get(fileasof, [])
                files_asof.append(info)
                
                #remove older(other) asof's
                for key in reportItem["files"].keys():
                    if key != fileasof:
                        del reportItem["files"][key]
                        
                reportItem["files"][fileasof] = files_asof                
        
            groupindex[reportname] = reportItem
            
        for reportname, reportItem in groupindex.iteritems():

            reportid = reportItem["reportid"]
            row = {
                "name" : reportItem["name"],
                "maxasof" : reportItem["maxasof"],
                "minasof" : reportItem["minasof"],
                "asof" : reportItem["maxasof"],
                "published" : "", 
                "files" : [],
            }            
            basepath = reportconfig.reportindex[reportid]["basepath"]
            virtualpath = reportconfig.folderindex[basepath]                
            files = []
            period = None
            for info in reportItem["files"].get(reportItem["maxasof"], []):
                path = os.path.join(virtualpath, info["childpath"], info["name"])
                files.append((path, info["name"], info["filetype"]))
                row["published"] = info["modified"]
                period = info["period"]
            row["files"] = files
            row["url"]  = path
                
            reportdata[period].append(row)
            
                
        reportdata['d'].sort(lambda a, b : cmp((a["name"],a["asof"]), (b["name"],b["asof"])))
        reportdata['w'].sort(lambda a, b : cmp((a["name"],a["asof"]), (b["name"],b["asof"])))
        reportdata['m'].sort(lambda a, b : cmp((a["name"],a["asof"]), (b["name"],b["asof"])))            
        #reportdata['d'].sort(lambda a, b : cmp(a["name"], b["name"]))
        #reportdata['w'].sort(lambda a, b : cmp(a["name"], b["name"]))
        #reportdata['m'].sort(lambda a, b : cmp(a["name"], b["name"]))            
            
        tabledata = Table(title='Reports',
                          columns=columns,
                          data=reportdata,
                          )
        
        args =  {
            "folder" : report,
            "filter" : filter,
            "fromdate" : fromdate,
            "todate" : todate,
            "report" : report,
            "reportid" : None,
            "subfolder" : subfolder,
            "tabledata"  : tabledata,
            "reportmenu" : reportconfig.reportmenu,
            "generallinks" : reportconfig.generallinks,
        }
        
        return args


    def getargsSearch(self, reportparam=None, fromdate=None, todate=None):
        if str(fromdate).lower() in ('today', 't') :
            fromdate = datetime.datetime.now().date()
        elif fromdate is None:
            fromdate =datetime.datetime.now().date()
        elif isinstance(fromdate, str):
            fromdate = datetime.datetime(*time.strptime(fromdate, "%d/%m/%Y")[:6]).date()

        if str(todate).lower() in ('today', 't') or todate is None:
            todate = datetime.datetime.now().date()
        elif isinstance(todate, str):
            todate = datetime.datetime(*time.strptime(todate, "%d/%m/%Y")[:6]).date()
            
        columns = ['Report', 'Formats',  'As of Date', 'When Published', 'First As of', 'Most recent As of']
                        
        reportdata = {
            'd' : [],
            'w' : [],
            'm' : [],
        }
                        
        defaultItem = {
            "name" : None,
            "maxasof" : datetime.date(datetime.MINYEAR, 1, 1),
            "minasof" : datetime.date(datetime.MAXYEAR, 12, 31),
            "asof" : datetime.date(datetime.MINYEAR, 1, 1),
            "files" : {},
        }
        
        groupindex = {}        
        for info in self.control._filescan_cache:
            
            groupby = info["groupby"]
            reportid = info["reportid"]
            fileasof = info["fileasof"]
            reportname = info["reportname"]
            period = info["period"]

            if info["reportid"] != reportparam and info["groupname"] != reportparam:
                continue
            
            if not inRange(fileasof, period, fromdate, todate):
                continue
            
            reportItem = groupindex.get(reportname, copy.deepcopy(defaultItem))
            reportItem["name"] = info["reportname"]
            reportItem["reportid"] = reportid

            if reportItem["minasof"] is None or reportItem["minasof"] > fileasof:
                reportItem["minasof"] = fileasof
                
            if reportItem["maxasof"] is None or reportItem["maxasof"] < fileasof:
                reportItem["maxasof"] = fileasof                    
                        
            files_asof = reportItem["files"].get(fileasof, [])
            files_asof.append(info)
                                        
            reportItem["files"][fileasof] = files_asof                
        
            groupindex[reportname] = reportItem
            
        for reportname, reportItem in groupindex.iteritems():

            for fileasof, reportfiles in reportItem["files"].iteritems():
                
                reportid = reportItem["reportid"]
                row = {
                    "name" : reportItem["name"],
                    "maxasof" : reportItem["maxasof"],
                    "minasof" : reportItem["minasof"],
                    "asof" : fileasof,
                    "published" : "", 
                    "files" : [],
                }            
                basepath = reportconfig.reportindex[reportid]["basepath"]
                virtualpath = reportconfig.folderindex[basepath]                
                files = []
                period = None
                for info in reportfiles:
                    path = os.path.join(virtualpath, info["childpath"], info["name"])
                    files.append((path, info["name"], info["filetype"]))
                    row["published"] = info["modified"]
                    period = info["period"]
                row["files"] = files
                row["url"]  = path
                    
                reportdata[period].append(row)            
                
        reportdata['d'].sort(lambda a, b : cmp((a["name"],a["asof"]), (b["name"],b["asof"])))
        reportdata['w'].sort(lambda a, b : cmp((a["name"],a["asof"]), (b["name"],b["asof"])))
        reportdata['m'].sort(lambda a, b : cmp((a["name"],a["asof"]), (b["name"],b["asof"])))            
        #reportdata['d'].sort(lambda a, b : cmp(a["name"], b["name"]))
        #reportdata['w'].sort(lambda a, b : cmp(a["name"], b["name"]))
        #reportdata['m'].sort(lambda a, b : cmp(a["name"], b["name"]))            
            
        tabledata = Table(title='Reports',
                          columns=columns,
                          data=reportdata,
                          )
        
        args =  {
            "folder" : None,
            "filter" : filter,
            "fromdate" : fromdate,
            "todate" : todate,
            "report" : None,
            "reportid" : reportparam,
            "subfolder" : None,
            "tabledata"  : tabledata,
            "reportmenu" : reportconfig.reportmenu,
            "generallinks" : reportconfig.generallinks,
        }
        
        return args


    @cherrypy.expose
    @template.output('index.html')
    def index(self, report=None, subfolder=None, filter=None, reportid=None, fromdate=None, todate=None):
        
        filter = bool(filter)
        if str(fromdate).lower() in ('today', 't') :
            fromdate = datetime.datetime.now().date()
        elif fromdate is None:
            fromdate =datetime.datetime.now().date()
        else:
            fromdate = datetime.datetime(*time.strptime(fromdate, "%d/%m/%Y")[:6]).date()

        if str(todate).lower() in ('today', 't') or todate is None:
            todate = datetime.datetime.now().date()
        else:
            todate = datetime.datetime(*time.strptime(todate, "%d/%m/%Y")[:6]).date()
            
        args = self.parent.getargs()
        
        if filter:
            args["pagetitle"] = "Historical reports"

        if 0 and not any_of(member_of_ad('Whiteclif - P&L'), member_of('admin'))(): 
            log.debug("Auth Failed")
            tabledata = Table(title='Reports',
                              columns=['&nbsp;'],
                              data=[['You do not have sufficient rights to view reports']],
                              )
            
            reportargs =  {
                "folder" : None,
                "filter" : filter,
                "fromdate" : fromdate,
                "todate" : todate,
                "authorised" : False,
                "report"     : report, 
                "subfolder"  : subfolder,
                "reportmenu" : reportconfig.reportmenu,
                "tabledata"  : tabledata,
            }
        else:
            if reportid and filter:
                reportargs = self.getargsSearch(reportparam=reportid, fromdate=fromdate, todate=todate) 
            elif report:
                groupinfo = reportconfig.groupindex.get(report, None)
                if groupinfo and groupinfo.get("groupby", None) == 'groupdir':
                    reportargs = self.getargsGroupDir(report, subfolder, filter=False, fromdate=fromdate, todate=todate)
                else:
                    reportargs = self.getargsDir(report, subfolder, filter=filter, fromdate=fromdate, todate=todate)
            else:
                reportargs = self.getargs(report, subfolder, filter=filter, fromdate=fromdate, todate=todate)
            
        args.update(reportargs)
        
        args["include"] = 'reports.html'
        args["refresh"] = False
        

        log.debug("Rendering Template")
        html = template.render(**args)
        log.debug("Rendering Template Complete")
        return html