def invert_data()

in gnm_deliverables/views/deliverables_dash_views.py [0:0]


    def invert_data(raw_response:dict, start_date:datetime, end_date: datetime) -> dict:
        """
        the data from the database contains a list of dates for each platform.
        the graph requires a list of platforms for each date.
        :param raw_response: raw aggregation response from the database
        :param start_date: starting date of the requested range
        :param end_date: ending date of the requested range
        :return: a dictionary of data
        """
        current_date = start_date
        day_count = (end_date - start_date).days + 1
        logger.debug("day_count is {0}".format(day_count))
        platform_count = len(raw_response.keys())
        i=0

        content = {
            "dates": numpy.empty(day_count, dtype=datetime),
            "platforms": numpy.empty(platform_count, dtype=object)
        }

        #set up date index
        while True:
            content["dates"][i] = current_date.isoformat("T")
            i += 1
            current_date = current_date + timedelta(days=1)
            if current_date > end_date:
                break

        i = 0
        for platform, entries in raw_response.items():
            content["platforms"][i] = {
                "name": platform,
                "data": numpy.zeros(day_count, dtype=numpy.int)
            }
            entry_count = len(entries)
            dest_ctr = 0
            src_ctr  = 0
            current_date = start_date
            while src_ctr<entry_count and dest_ctr<day_count:
                if entries[src_ctr]["day"] == current_date:
                    content["platforms"][i]["data"][dest_ctr] = entries[src_ctr]["count"]
                    src_ctr += 1
                else:
                    content["platforms"][i]["data"][dest_ctr] = 0
                dest_ctr += 1
                current_date = current_date + timedelta(days=1)
            i += 1
        return content