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() #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}...') 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) 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() #send_mail('Projektende erreicht', # mail_template.render(context), # IF_EMAIL, # [IF_EMAIL], # fail_silently=False) project.end_mail_send = True project.save() 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 = False) print(approved_end) 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() 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() #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.save() 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 = False) 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() #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() #send_mail('Projektorganisator*in wurde informiert', # informMail_template.render(context), # IF_EMAIL, # [IF_EMAIL], # fail_silently=False) project.end_mail_send = True 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.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) 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) 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) 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) 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) 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) 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) 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'))