Sending django signals from django-admin command?

1.6k views Asked by At

I have an unsual problem. In my Django application I use signals to send emails. All of signals work except for the one fired from django-admin command - django.core.management.base.NoArgsCommand (which is run through manage.py).

I checked my signal in different places, it works except for this place.

Here's the code where I send the signal:

from django.core.management.base import NoArgsCommand

class Command(NoArgsCommand):
    help = "Send email advertisement expiration reminder to users"

    def handle_noargs(self, **options):
        from app.models import Advertisement, User
        from app.signals import ad_expires
        from datetime import datetime
        start=datetime(datetime.now().year, datetime.now().month, datetime.now().day+4,0,0)
        end=datetime(datetime.now().year,datetime.now().month,datetime.now().day+4,23,59)
        ads=Advertisement.objects.filter(visible_till__gte=start).filter(visible_till__lte=end)
        for ad in ads:
            ad_expires.send(self,ad=ad, user=ad.user)
        print "Expiration reminders sent to %s users" % len(ads)

Am I doing something wrong?

Also, is there any easier way to check date within one day?

2

There are 2 answers

0
zs2020 On

The shortcut is :

start = datetime.now() + timedelta(days=4)
end = start + timedelta(days=1)
ads=Advertisement.objects.filter(visible_till__gte=start).filter(visible_till__lt=end)

Can you post your project structure here? Your code looks good to me.

1
Josh Smeaton On

The only thing I can think of, is that the signal handler hasn't been registered at the time the django-admin function executes. You can check this by preceding the listener with a print statement and running your management command.

Try putting the signal listener into the app/__init__.py file. Since you're accessing the app package, everything in __init__.py should execute, registering the listener.