326 lines
15 KiB
Python
Executable file
326 lines
15 KiB
Python
Executable file
from datetime import date, timedelta
|
|
import sys
|
|
|
|
from django.core.management.base import BaseCommand, CommandError
|
|
from django.template.loader import get_template
|
|
from django.core.mail import send_mail, BadHeaderError, EmailMessage
|
|
from django.core.mail import EmailMultiAlternatives
|
|
from django.conf import settings
|
|
|
|
from input.models import Project, Library, HonoraryCertificate, Travel, Email,\
|
|
BusinessCard, List, IFG, Literature
|
|
from input.settings import IF_EMAIL, SURVEYPREFIX, SURVEY_EMAIL
|
|
|
|
class Command(BaseCommand):
|
|
''' mails will be send here:
|
|
|
|
- two weeks after confirmation of support for volunteer (/extern) send link
|
|
with surveylink
|
|
|
|
- same for HonoraryCertificate (/intern)
|
|
|
|
- travel: mail 3 weeks after end of project.
|
|
|
|
- assumed end of project (/project) reached: mail to IF, link to project-editpage
|
|
|
|
- 4 weeks after end of project reached: mail with surveylink
|
|
'''
|
|
|
|
help = '''This command sends mail with some links to the database or to the survey
|
|
after some amount of time.'''
|
|
|
|
def survey_link(self, email, type, pid, name, realname):
|
|
context = {'realname': realname,
|
|
'type': type,
|
|
'name': name,
|
|
'pid': pid,
|
|
'SURVEYPREFIX': SURVEYPREFIX, }
|
|
txt_mail_template = get_template('input/survey_mail.txt')
|
|
html_mail_template = get_template('input/survey_mail.html')
|
|
try:
|
|
subject, from_email, to = 'Dein Feedback zur Förderung durch Wikimedia Deutschland', IF_EMAIL, email
|
|
text_content = txt_mail_template.render(context)
|
|
html_content = html_mail_template.render(context)
|
|
msg = EmailMultiAlternatives(subject, text_content, from_email, [to], bcc=[SURVEY_EMAIL])
|
|
msg.attach_alternative(html_content, "text/html")
|
|
msg.send()
|
|
#print('survey mail would have been send')
|
|
|
|
#survey_mail = EmailMessage('Dein Feedback zur Förderung durch Wikimedia Deutschland',
|
|
# mail_template.render(context),
|
|
# IF_EMAIL,
|
|
# [email],
|
|
# bcc=[SURVEY_EMAIL])
|
|
#survey_mail.send(fail_silently=False)
|
|
except BadHeaderError:
|
|
return HttpResponse('Invalid header found.')
|
|
|
|
print(f'send surveylinkemail to {email}...')
|
|
|
|
''' the db entry mail_state was added. Useful when migrating databases. first delete the entry, then makemigrations
|
|
then migrate.. after that, recreate the entry with default END, after that makemigrations and migrate.
|
|
now all entries have the value END. after that rewrite the default to NONE in models.py, then makemigrations
|
|
and migrate again, to have NONE as default for all new queries. '''
|
|
|
|
|
|
def end_of_projects_reached(self):
|
|
''' end of project reached '''
|
|
# get all projects which ended
|
|
|
|
old = Project.objects.filter(end__lt = date.today())\
|
|
.exclude(end_mail_send = True)\
|
|
.filter(mail_state = 'NONE')
|
|
|
|
txt_mail_template = get_template('input/if_end_of_project.txt')
|
|
html_mail_template = get_template('input/if_end_of_project.html')
|
|
|
|
|
|
for project in old:
|
|
context = {'project': project}
|
|
context['URLPREFIX'] = settings.URLPREFIX
|
|
|
|
try:
|
|
subject, from_email, to = 'Projektende erreicht', IF_EMAIL, IF_EMAIL
|
|
text_content = txt_mail_template.render(context)
|
|
html_content = html_mail_template.render(context)
|
|
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
|
|
msg.attach_alternative(html_content, "text/html")
|
|
msg.send()
|
|
#print('end of project mail would have been sent')
|
|
|
|
#send_mail('Projektende erreicht',
|
|
# mail_template.render(context),
|
|
# IF_EMAIL,
|
|
# [IF_EMAIL],
|
|
# fail_silently=False)
|
|
project.end_mail_send = True
|
|
project.mail_state = 'INF'
|
|
try:
|
|
project.save()
|
|
except:
|
|
print( 'For project', project, 'there is possibly no project.start (', project.start, ') class')
|
|
except BadHeaderError:
|
|
self.stdout.write(self.style.ERROR('Invalid header found.'))
|
|
|
|
self.stdout.write(self.style.SUCCESS('end_of_projects_reached() executed.'))
|
|
|
|
def end_of_projects_approved(self):
|
|
''' end of project approved '''
|
|
# get all projects where end was reached already, and send mails for the ones already set to status "ended" by the admins
|
|
|
|
approved_end = Project.objects.filter(status = 'END')\
|
|
.exclude(end_mail_send = True)\
|
|
.filter(mail_state = 'INF')
|
|
txt_mail_template = get_template('input/if_end_of_project_approved.txt')
|
|
html_mail_template = get_template('input/if_end_of_project_approved.html')
|
|
|
|
txt_informMail_template = get_template('input/if_end_of_project_orginformed.txt')
|
|
html_informMail_template = get_template('input/if_end_of_project_orginformed.html')
|
|
# send the mail to project.email, which would be the mail of the volunteer filling out the form
|
|
|
|
for project in approved_end:
|
|
context = {'project': project}
|
|
context['URLPREFIX'] = settings.URLPREFIX
|
|
|
|
|
|
try:
|
|
subject, from_email, to = 'Projektende erreicht', IF_EMAIL, project.email
|
|
text_content = txt_mail_template.render(context)
|
|
html_content = html_mail_template.render(context)
|
|
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
|
|
msg.attach_alternative(html_content, "text/html")
|
|
msg.send()
|
|
#print('if and of project approved mail would have been sent')
|
|
|
|
inform_subject, inform_from_email, inform_to = 'Projektorganisator*in wurde informiert', IF_EMAIL, IF_EMAIL
|
|
inform_text_content = txt_informMail_template.render(context)
|
|
inform_html_content = html_informMail_template.render(context)
|
|
inform_msg = EmailMultiAlternatives(inform_subject, inform_text_content, inform_from_email, [inform_to])
|
|
inform_msg.attach_alternative(html_content, "text/html")
|
|
inform_msg.send()
|
|
#print('if end of project orginformed mail would have been sent')
|
|
|
|
#send_mail('Projektende erreicht',
|
|
# mail_template.render(context),
|
|
# IF_EMAIL,
|
|
# [project.email],
|
|
# fail_silently=False)
|
|
#send_mail('Projektorganisator*in wurde informiert',
|
|
# informMail_template.render(context),
|
|
# IF_EMAIL,
|
|
# [IF_EMAIL],
|
|
# fail_silently=False)
|
|
project.end_mail_send = True
|
|
project.mail_state = 'CLOSE'
|
|
try:
|
|
project.save()
|
|
except:
|
|
print( 'For project', project, 'there is possibly no project.start (', project.start, ') class')
|
|
except BadHeaderError:
|
|
self.stdout.write(self.style.ERROR('Invalid header found.'))
|
|
|
|
self.stdout.write(self.style.SUCCESS('end_of_projects_approved() executed.'))
|
|
|
|
def notHappened_of_projects_approved(self):
|
|
''' notHappened of project approved '''
|
|
# get all projects where end was reached already, and send mails for the ones where status was put to NOT by admins
|
|
|
|
approved_notHappened = Project.objects.filter(status = 'NOT')\
|
|
.exclude(end_mail_send = True)\
|
|
.filter(mail_state = 'INF')
|
|
|
|
html_mail_template = get_template('input/if_not_of_project_approved.html')
|
|
txt_mail_template = get_template('input/if_not_of_project_approved.txt')
|
|
|
|
txt_informMail_template = get_template('input/if_end_of_project_orginformed.txt')
|
|
html_informMail_template = get_template('input/if_end_of_project_orginformed.html')
|
|
# send the mail to project.email, which would be the mail of the volunteer that filled out the form
|
|
|
|
for project in approved_notHappened:
|
|
context = {'project': project}
|
|
context['URLPREFIX'] = settings.URLPREFIX
|
|
try:
|
|
subject, from_email, to = 'Projektende erreicht', IF_EMAIL, project.email
|
|
text_content = txt_mail_template.render(context)
|
|
html_content = html_mail_template.render(context)
|
|
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
|
|
msg.attach_alternative(html_content, "text/html")
|
|
msg.send()
|
|
#print('if not of project approved end mail would have been sent')
|
|
|
|
|
|
#send_mail('Projektende erreicht',
|
|
# mail_template.render(context),
|
|
# IF_EMAIL,
|
|
# [project.email],
|
|
# fail_silently=False)
|
|
|
|
inform_subject, inform_from_email, inform_to = 'Projektorganisator*in wurde informiert', IF_EMAIL, IF_EMAIL
|
|
inform_text_content = txt_informMail_template.render(context)
|
|
inform_html_content = html_informMail_template.render(context)
|
|
inform_msg = EmailMultiAlternatives(inform_subject, inform_text_content, inform_from_email, [inform_to])
|
|
inform_msg.attach_alternative(html_content, "text/html")
|
|
inform_msg.send()
|
|
#print('if not of project approved end mail orginformed would have been sent')
|
|
|
|
#send_mail('Projektorganisator*in wurde informiert',
|
|
# informMail_template.render(context),
|
|
# IF_EMAIL,
|
|
# [IF_EMAIL],
|
|
# fail_silently=False)
|
|
project.end_mail_send = True
|
|
project.mail_state = 'CLOSE'
|
|
project.save()
|
|
except BadHeaderError:
|
|
self.stdout.write(self.style.ERROR('Invalid header found.'))
|
|
|
|
self.stdout.write(self.style.SUCCESS('notHappened_of_projects_approved() executed.'))
|
|
|
|
|
|
def surveymails_to_object(self, supported, name='', type='LIB'):
|
|
mytype=type
|
|
myname = name
|
|
for item in supported:
|
|
if type == 'LIB':
|
|
mytype = item.type
|
|
elif type not in ('MAIL','VIS','LIST'):
|
|
myname = getattr(item, name, 'ERROR: NONAME')
|
|
print(f'name gefunden: {myname}')
|
|
self.survey_link(email=item.email,
|
|
type=mytype,
|
|
pid=f'{mytype}{item.pk}',
|
|
name=myname,
|
|
realname=item.realname)
|
|
item.survey_mail_send = True
|
|
item.mail_state = 'END'
|
|
item.survey_mail_date = date.today()
|
|
item.save()
|
|
self.stdout.write(self.style.SUCCESS(f'surveymails for object type {type} sent'))
|
|
|
|
|
|
''' TODO: there could be some more removing of duplicated code in the following functions '''
|
|
|
|
def surveymails_to_lib(self):
|
|
'''get all library objects which where granted two weeks ago'''
|
|
|
|
supported = Library.objects.filter(granted=True)\
|
|
.filter(granted_date__lt = date.today() - timedelta(days=14))\
|
|
.exclude(survey_mail_send=True)\
|
|
.exclude(mail_state = 'END')
|
|
self.surveymails_to_object(supported,name='library')
|
|
|
|
def surveymails_to_hon(self):
|
|
'''get all HonoraryCertificate objects which where granted two weeks ago'''
|
|
|
|
supported = HonoraryCertificate.objects.filter(granted=True)\
|
|
.filter(granted_date__lt = date.today() - timedelta(days=14))\
|
|
.exclude(survey_mail_send=True)\
|
|
.exclude(mail_state = 'END')
|
|
self.surveymails_to_object(supported, type='HON', name='project')
|
|
|
|
def surveymails_to_ifg(self):
|
|
'''get all IFG objects which where granted two weeks ago'''
|
|
|
|
supported = IFG.objects.filter(granted=True)\
|
|
.filter(granted_date__lt = date.today() - timedelta(days=14))\
|
|
.exclude(survey_mail_send=True)\
|
|
.exclude(mail_state = 'END')
|
|
self.surveymails_to_object(supported, type='IFG', name='url')
|
|
|
|
def surveymails_to_lit(self):
|
|
'''get all Litearure objects which where granted two weeks ago'''
|
|
|
|
supported = Literature.objects.filter(granted=True)\
|
|
.filter(granted_date__lt = date.today() - timedelta(days=14))\
|
|
.exclude(survey_mail_send=True)\
|
|
.exclude(mail_state = 'END')
|
|
self.surveymails_to_object(supported, type='LIT', name='info')
|
|
|
|
def surveymails_to_project(self):
|
|
'''send survey link 4 weeks after end of project reached'''
|
|
supported = Project.objects.filter(granted=True)\
|
|
.filter(end__lt = date.today() - timedelta(days=28))\
|
|
.exclude(survey_mail_send=True)\
|
|
.exclude(mail_state = 'END')
|
|
self.surveymails_to_object(supported, type='PRO', name='name')
|
|
|
|
def surveymails_to_travel(self):
|
|
'''send survey link 3 weeks after end of project reached'''
|
|
|
|
supported = Travel.objects.filter(project__granted=True)\
|
|
.filter(project__end__lt = date.today() - timedelta(days=21))\
|
|
.exclude(survey_mail_send=True)\
|
|
.exclude(mail_state = 'END')
|
|
self.surveymails_to_object(supported, type='TRAV', name='project')
|
|
|
|
def surveymails_to_mail_vis_lis(self):
|
|
'''send survey link 2 weeks after mailadresss, mailinglist or businesscards are granted'''
|
|
lastdate = date.today() - timedelta(days=14)
|
|
|
|
typefield = ('MAIL','VIS','LIST')
|
|
count = 0
|
|
for c in ('Email', 'BusinessCard', 'List'):
|
|
# get class via string
|
|
supported = getattr(sys.modules[__name__], c).objects.filter(granted=True)\
|
|
.filter(granted_date__lt = lastdate)\
|
|
.exclude(survey_mail_send=True)\
|
|
.exclude(mail_state = 'END')
|
|
self.surveymails_to_object(supported, type=typefield[count])
|
|
count += 1
|
|
|
|
|
|
def handle(self, *args, **options):
|
|
'''the main function which is called by the custom command'''
|
|
|
|
self.end_of_projects_reached()
|
|
self.end_of_projects_approved()
|
|
self.notHappened_of_projects_approved()
|
|
self.surveymails_to_lib()
|
|
self.surveymails_to_hon()
|
|
self.surveymails_to_ifg()
|
|
self.surveymails_to_lit()
|
|
self.surveymails_to_project()
|
|
self.surveymails_to_travel()
|
|
self.surveymails_to_mail_vis_lis()
|
|
|
|
self.stdout.write(self.style.SUCCESS('sendmails custom command executed'))
|