170 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Python
		
	
	
	
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.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, }
 | 
						|
        mail_template = get_template('input/survey_mail.txt')
 | 
						|
        try:
 | 
						|
            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)
 | 
						|
 | 
						|
        mail_template = get_template('input/if_end_of_project.txt')
 | 
						|
        for project in old:
 | 
						|
            context = {'project': project}
 | 
						|
            context['URLPREFIX'] = settings.URLPREFIX
 | 
						|
            try:
 | 
						|
                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 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.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'))
 |