Time machine mode

In test mode, pretix provides a “time machine” feature which allows event organizers to test their shop as if it were a different date and time. To enable this feature, they can click on the “time machine”-link in the test mode warning box on the event page.

Internally, this time machine mode is implemented by calling our custom time_machine_now() function instead of django.utils.timezone.now() in all places where the fake time should be taken into account. If you add code that uses the current date and time for checking whether some product can be bought, you should use time_machine_now().

pretix.base.timemachine.time_machine_now(default=False)

Return the datetime to use as current datetime for checking order restrictions in event index and checkout flow.

Parameters:

default – Value to return if time machine mode is disabled. By default the current datetime is used.

Background tasks

The time machine datetime is passed through the request flow via a thread-local variable (ContextVar). Therefore, if you call a background task in the order process, where time_machine_now should be respected, you need to pass it through manually as shown in the example below:

@app.task()
def my_task(self, override_now_dt: datetime=None) -> None:
    with time_machine_now_assigned(override_now_dt):
        # ...do something that uses time_machine_now()

my_task.apply_async(kwargs={'override_now_dt': time_machine_now(default=None)})
pretix.base.timemachine.time_machine_now_assigned(now_dt)

Use this context manager to assign current datetime for time machine mode. Useful e.g. for background tasks.

Parameters:

now_dt – The datetime value to assign. May be None to disable time machine.