#36633: TaskBackend run_after validation assumes datetime when USE_TZ=True
-------------------------+-----------------------------------------
     Reporter:  Chris M  |                     Type:  Uncategorized
       Status:  new      |                Component:  Tasks
      Version:  6.0      |                 Severity:  Normal
     Keywords:           |             Triage Stage:  Unreviewed
    Has patch:  0        |      Needs documentation:  0
  Needs tests:  0        |  Patch needs improvement:  0
Easy pickings:  0        |                    UI/UX:  0
-------------------------+-----------------------------------------
 I’ve been working on an implementation of a TaskBackend using Google Cloud
 Tasks. I ran across a bit of confusion regarding the {{{run_after}}}
 parameter validation.

 The DEP originally referenced that the value could be a datetime or a
 timedelta. The released implementation looks like it only documents it as
 a datetime, so I’m not sure if it was meant to support timedelta. However,
 I tried using a timedelta with the {{{USE_TZ=True}}} and the validation in
 BaseTaskBackend assumes that the run_after value is a {{{datetime}}} and I
 got an error

 Calling code:
 {{{my_task.using(run_after=timedelta(seconds=10)).enqueue()}}}

 Error: {{{AttributeError: 'datetime.timedelta' object has no attribute
 'utcoffset'}}}

 If I run the code using a {{{timedelta}}} and with {{{USE_TZ=False}}} then
 the error isn't thrown and my backend can process it.

 The code throwing the error in the {{{BaseTaskBackend}}} is

 {{{#!python
         if (
             settings.USE_TZ
             and task.run_after is not None
             and not timezone.is_aware(task.run_after)
         ):
             raise InvalidTask("run_after must be an aware datetime.")
 }}}

 I think it would be best for this condition to verify that the provided
 {{{run_after}}} is a {{{datetime}}} before calling
 {{{timezone.is_aware}}}. I'm hoping for some confirmation if this is the
 right way to proceed.

 I think it would be great to support {{{timedelta}}} directly as well by
 updating the type annotations on {{{Task}}}, but I couldn't determine
 through the PR history if this was removed during implementation.
-- 
Ticket URL: <https://code.djangoproject.com/ticket/36633>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/django-updates/010701999dbffc44-751717bc-93f3-4410-a4f3-e20253847975-000000%40eu-central-1.amazonses.com.

Reply via email to