def get_all_previous_periods(base_date):
    """ Returns an array of all the previous periods that are supported

    :param base_date:
    :return:
    """
    periods = []
    for flag in datecalc.PeriodTypes.Allowed_Period_Types:
        if flag == datecalc.PeriodTypes.Day:
            prev_period = base_date + timedelta(days=-1)
        elif flag == datecalc.PeriodTypes.Week:
            prev_period = base_date + timedelta(weeks=-1)
        elif flag == datecalc.PeriodTypes.Month:
            prev_period = datecalc.add_months(base_date, -1)
        elif flag == datecalc.PeriodTypes.Quarter:
            prev_period = datecalc.add_months(base_date, -3)
        elif flag == datecalc.PeriodTypes.Year:
            prev_period = datecalc.add_months(base_date, -12)

        periods.append(
            {
                "period": datecalc.get_period(prev_period, flag),
                "period_start_date": datecalc.period_start_date(prev_period, flag).isoformat(),
                "period_end_date": datecalc.period_end_date(prev_period, flag).isoformat()
            }
        )
    return periods
def collect_ga_data(base_date):
    data = []
    metrics_list = get_ga_metrics_list()
    period_defs = [
        {
            "period": datecalc.get_period(base_date, datecalc.PeriodTypes.Week),
            "period_start_date": datecalc.period_start_date(base_date, datecalc.PeriodTypes.Week).isoformat(),
            "period_end_date": datecalc.period_end_date(base_date, datecalc.PeriodTypes.Week).isoformat(),
            "period_type": "w"
        }
    ]
    service = get_ga_service(
        client_email=get_application_email_address(),
        private_key=get_application_private_key()
    )
    for period_def in period_defs:
        period_data = collect_period_ga_data(
            service=service,
            metric_def_list=metrics_list,
            period_def=period_def
        )
        for item in period_data:
            data.append(item)
    return data