You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
3.2 KiB
90 lines
3.2 KiB
from cashonly.core.models import * |
|
from django.conf import settings |
|
from django.core.mail import send_mass_mail |
|
from django.core.management.base import BaseCommand |
|
from django.template.loader import get_template |
|
from django.utils import translation |
|
from django.utils.dateformat import DateFormat |
|
from django.utils.formats import get_format |
|
from django.utils.translation import gettext as _ |
|
import datetime |
|
|
|
|
|
class Command(BaseCommand): |
|
help = "Sends out a digest of transactions to recently active users" |
|
|
|
def handle(self, **options): |
|
translation.activate("de") |
|
|
|
tpl = get_template("cashonly/core/daily_digest.txt") |
|
|
|
messages = [] |
|
for a in Account.objects.filter(daily_digest=True): |
|
name = "%s %s" % (a.user.first_name, a.user.last_name) |
|
context = { |
|
"name": name, |
|
"credit": a.credit, |
|
"range": settings.CASHONLY_DAILY_DIGEST_RANGE_HOURS, |
|
"url": settings.CASHONLY_USERSETTINGS_URL, |
|
} |
|
|
|
min_ts = datetime.datetime.now() - datetime.timedelta( |
|
hours=settings.CASHONLY_DAILY_DIGEST_RANGE_HOURS |
|
) |
|
transactions = Transaction.objects.filter(account=a).filter( |
|
timestamp__gte=min_ts |
|
) |
|
|
|
if transactions.count() > 0: |
|
lengths = { |
|
"timestamp": len(_("date")), |
|
"description": len(_("subject")), |
|
"amount": len(_("amount")), |
|
} |
|
|
|
sum = 0 |
|
for t in transactions: |
|
lengths["timestamp"] = max( |
|
lengths["timestamp"], |
|
len( |
|
DateFormat(t.timestamp).format( |
|
get_format("SHORT_DATETIME_FORMAT") |
|
) |
|
), |
|
) |
|
lengths["description"] = max( |
|
lengths["description"], len(t.description) |
|
) |
|
lengths["amount"] = max(lengths["amount"], len(str(t.amount))) |
|
t.description = t.description.split("\n") |
|
|
|
sum += t.amount |
|
|
|
lengths["sum"] = ( |
|
lengths["timestamp"] + lengths["description"] + lengths["amount"] |
|
) |
|
context["lengths"] = lengths |
|
context["tl"] = transactions |
|
context["sum"] = sum |
|
|
|
if a.user.email is not None and len(a.user.email) > 0: |
|
rcpts = ["%s <%s>" % (name, a.user.email)] |
|
else: |
|
self.stdout.write( |
|
self.style.WARNING( |
|
'User "%s" has no Email address.' % (a.user.username) |
|
) |
|
) |
|
continue |
|
|
|
messages.append( |
|
( |
|
"%s%s" |
|
% (settings.EMAIL_SUBJECT_PREFIX, _("Account Statement")), |
|
tpl.render(context), |
|
settings.DEFAULT_FROM_EMAIL, |
|
rcpts, |
|
) |
|
) |
|
|
|
send_mass_mail(tuple(messages))
|
|
|