def handle(self, *args, **options):
     source_name = args[0]
     table_name = args[1]
     column_name = args[2]
     
     time_format = '%Y-%m-%d %H:%M:%S'
     
     start_time = datetime.datetime.strptime(args[3], time_format)
     end_time = datetime.datetime.strptime(args[4], time_format)
     
     for ds in DataSource.objects.filter(name=source_name):
         data_points = ds.fetch_data(table_name, column_name, start=start_time, end=end_time)
         
         time_delta = end_time - start_time
         
         output = {}
         
         output['bin_size'] = 0
         output['bins'] = []
         
         for x in data_points:
             bin_obj = {}
             bin_obj['count'] = x[1]
             bin_obj['start'] = x[0].strftime(time_format)
             bin_obj['end'] = x[0].strftime(time_format)
             
             output['bins'].append(bin_obj);
         
         report = DataReport(name='Values ' + table_name)
         report.source = ds
         report.table = table_name
         report.report_type = 'values'
         
         report.start_time = start_time.strftime(time_format)
         report.end_time = end_time.strftime(time_format)
         
         report.report_json = json.dumps(output, indent=2)
         
         report.save()
         
         print(str(len(data_points)) + ' found');
    def handle(self, *args, **options):
        source_name = args[0]
        table_name = args[1]
        column_name = args[2]
        
        time_format = '%Y-%m-%d %H:%M:%S'
        
        start_time = datetime.datetime.strptime(args[3], time_format)
        end_time = datetime.datetime.strptime(args[4], time_format)
        
        for ds in DataSource.objects.filter(name=source_name):
            data_points = ds.fetch_data(table_name, column_name, start=start_time, end=end_time)
            
            time_delta = end_time - start_time
            
            bin_size = 1 # Second bins by default
            
            if time_delta.days < 1 and time_delta.seconds < 3600:
                bin_size = 1
            elif time_delta.days < 1:
                bin_size = 60
            elif time_delta.days < 7:
                bin_size = 900
            else:
                bin_size = 3600
            
            bin_delta = datetime.timedelta(seconds=bin_size)
            
            output = {}
            
            output['bin_size'] = bin_size
            output['bins'] = []
            
            bin_start = start_time
            
            total = 0
            
            while bin_start < end_time:
                bin_end = bin_start + bin_delta
                
                bin_contents = filter(lambda x: x[0] >= bin_start and x[0] <= bin_end, data_points)
                
                sum = 0
                
                for item in bin_contents:
                    sum += item[1]
                    
                bin_obj = {}

                if len(bin_contents) > 0:
                    bin_obj['count'] = sum / len(bin_contents)
                else:
                    bin_obj['count'] = -25
                    
                bin_obj['start'] = bin_start.strftime(time_format)
                bin_obj['end'] = bin_end.strftime(time_format)
                
                output['bins'].append(bin_obj);
                
                bin_start = bin_end
            
            report = DataReport(name='Average' + table_name)
            report.source = ds
            report.table = table_name
            report.report_type = 'average'
            
            report.start_time = start_time
            report.end_time = end_time
            
            report.report_json = json.dumps(output, indent=2)
            
            report.save()
            
            print(str(total) + ' found');