Exports: Add predefined timeframes (#3027)

Co-authored-by: Richard Schreiber <schreiber@rami.io>
This commit is contained in:
Raphael Michel
2023-01-13 13:14:08 +01:00
committed by GitHub
parent 95979143d7
commit bf4569b080
13 changed files with 715 additions and 269 deletions

View File

@@ -72,19 +72,11 @@ SAMPLE_EXPORTER_CONFIG = {
"required": False
},
{
"name": "date_from",
"name": "date_range",
"required": False
},
{
"name": "date_to",
"required": False
},
{
"name": "event_date_from",
"required": False
},
{
"name": "event_date_to",
"name": "event_date_range",
"required": False
},
]

View File

@@ -0,0 +1,110 @@
#
# This file is part of pretix (Community Edition).
#
# Copyright (C) 2014-2020 Raphael Michel and contributors
# Copyright (C) 2020-2021 rami.io GmbH and contributors
#
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
# Public License as published by the Free Software Foundation in version 3 of the License.
#
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
# this file, see <https://pretix.eu/about/en/license>.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
# details.
#
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
# <https://www.gnu.org/licenses/>.
#
from datetime import date, datetime
import pytest
import pytz
from pretix.base.timeframes import (
REPORTING_DATE_TIMEFRAMES, resolve_timeframe_to_dates_inclusive,
resolve_timeframe_to_datetime_start_inclusive_end_exclusive,
)
tz = pytz.timezone("Europe/Berlin")
def dt(*args):
return tz.localize(datetime(*args))
ref_date = date(2023, 3, 28)
@pytest.mark.parametrize("ref_dt,identifier,expected_start,expected_end,description", [
(ref_date, 'days_today', date(2023, 3, 28), date(2023, 3, 28), None),
(ref_date, 'days_yesterday', date(2023, 3, 27), date(2023, 3, 27), None),
(ref_date, 'days_last7', date(2023, 3, 22), date(2023, 3, 28), None),
(ref_date, 'days_last14', date(2023, 3, 15), date(2023, 3, 28), None),
(ref_date, 'days_tomorrow', date(2023, 3, 29), date(2023, 3, 29), None),
(ref_date, 'days_next7', date(2023, 3, 29), date(2023, 4, 4), None),
(ref_date, 'days_next14', date(2023, 3, 29), date(2023, 4, 11), None),
(ref_date, 'week_this', date(2023, 3, 27), date(2023, 4, 2), 'W 13, 2023 - March 27th April 2nd, 2023'),
(ref_date, 'week_to_date', date(2023, 3, 27), date(2023, 3, 28), 'W 13, 2023 - March 27th 28th, 2023'),
(ref_date, 'week_previous', date(2023, 3, 20), date(2023, 3, 26), 'W 12, 2023 - March 20th 26th, 2023'),
(ref_date, 'week_next', date(2023, 4, 3), date(2023, 4, 9), 'W 14, 2023 - April 3rd 9th, 2023'),
(ref_date, 'month_this', date(2023, 3, 1), date(2023, 3, 31), 'March 2023'),
(ref_date, 'month_to_date', date(2023, 3, 1), date(2023, 3, 28), 'March 2023'),
(ref_date, 'month_previous', date(2023, 2, 1), date(2023, 2, 28), 'February 2023'),
(ref_date, 'month_next', date(2023, 4, 1), date(2023, 4, 30), 'April 2023'),
(ref_date, 'quarter_this', date(2023, 1, 1), date(2023, 3, 31), 'Q1/2023'),
(ref_date, 'quarter_to_date', date(2023, 1, 1), date(2023, 3, 28), 'Q1/2023'),
(ref_date, 'quarter_previous', date(2022, 10, 1), date(2022, 12, 31), 'Q4/2022'),
(ref_date, 'quarter_next', date(2023, 4, 1), date(2023, 6, 30), 'Q2/2023'),
(ref_date, 'year_this', date(2023, 1, 1), date(2023, 12, 31), '2023'),
(ref_date, 'year_to_date', date(2023, 1, 1), date(2023, 3, 28), '2023'),
(ref_date, 'year_previous', date(2022, 1, 1), date(2022, 12, 31), '2022'),
(ref_date, 'year_next', date(2024, 1, 1), date(2024, 12, 31), '2024'),
(ref_date, 'future', date(2023, 3, 29), None, '2023-03-29 '),
(ref_date, 'past', None, date(2023, 3, 28), ' 2023-03-28'),
])
def test_timeframe(ref_dt, identifier, expected_start, expected_end, description):
for idf, label, start, end, includes_future, group, describe in REPORTING_DATE_TIMEFRAMES:
if identifier == idf:
assert start(ref_dt) == expected_start
assert end(ref_dt, expected_start) == expected_end
if expected_end and expected_start:
assert includes_future == (expected_end > ref_dt)
if description:
assert describe(expected_start, expected_end) == description
break
else:
assert False, "identifier not found"
def test_resolve():
assert resolve_timeframe_to_dates_inclusive(ref_date, "week_previous", tz) == (
date(2023, 3, 20),
date(2023, 3, 26),
)
assert resolve_timeframe_to_datetime_start_inclusive_end_exclusive(ref_date, "week_previous", tz) == (
dt(2023, 3, 20, 0, 0, 0, 0),
dt(2023, 3, 27, 0, 0, 0, 0),
)
assert resolve_timeframe_to_dates_inclusive(ref_date, "2023-03-20/2023-03-21", tz) == (
date(2023, 3, 20),
date(2023, 3, 21),
)
assert resolve_timeframe_to_datetime_start_inclusive_end_exclusive(ref_date, "2023-03-20/2023-03-21", tz) == (
dt(2023, 3, 20, 0, 0, 0, 0),
dt(2023, 3, 22, 0, 0, 0, 0),
)
assert resolve_timeframe_to_dates_inclusive(ref_date, "2023-03-20/", tz) == (
date(2023, 3, 20),
None
)
assert resolve_timeframe_to_datetime_start_inclusive_end_exclusive(ref_date, "2023-03-20/", tz) == (
dt(2023, 3, 20, 0, 0, 0, 0),
None
)