2020-10-26 11:34:09 +00:00
from datetime import date
2020-11-16 14:53:43 +00:00
from smtplib import SMTPException
2020-10-26 11:34:09 +00:00
2020-09-21 12:27:16 +00:00
from django . shortcuts import render
2020-09-29 07:53:29 +00:00
from django . forms import modelformset_factory
2020-09-29 09:08:16 +00:00
from django . http import HttpResponse
2020-10-05 11:35:28 +00:00
from formtools . wizard . views import CookieWizardView
2023-02-27 17:09:29 +00:00
from django . core . mail import send_mail , BadHeaderError , EmailMultiAlternatives
2020-10-07 12:00:08 +00:00
from django . conf import settings
2020-10-07 13:07:02 +00:00
from django . template . loader import get_template
from django . template import Context
2020-10-28 14:49:18 +00:00
from django . contrib . auth . decorators import login_required
from django . contrib . auth . mixins import LoginRequiredMixin
2020-11-18 14:38:38 +00:00
from django . utils . html import format_html
2020-09-22 10:21:05 +00:00
2020-10-27 12:47:46 +00:00
from . forms import ProjectForm , ExternForm , LibraryForm , IFGForm , LiteratureForm , \
HonoraryCertificateForm , InternForm , TravelForm , EmailForm , \
2020-10-28 14:04:53 +00:00
ListForm , BusinessCardForm , INTERN_CHOICES
2023-02-27 17:09:29 +00:00
from . models import Project , TYPE_CHOICES , Library , Literature , Travel
2020-11-09 09:33:31 +00:00
from . settings import IF_EMAIL
2020-10-20 07:35:04 +00:00
2020-10-27 12:47:46 +00:00
def auth_deny ( choice , pk , auth ) :
if choice in ( ' BIB ' , ' ELIT ' , ' SOFT ' ) :
Library . set_granted ( pk , auth )
2021-01-04 09:44:03 +00:00
elif choice == ' LIT ' :
2020-10-27 12:47:46 +00:00
Literature . set_granted ( pk , auth )
2021-01-04 09:44:03 +00:00
elif choice == ' IFG ' :
2020-10-27 12:47:46 +00:00
IFG . set_granted ( pk , auth )
2023-02-27 17:09:29 +00:00
elif choice == ' TRAV ' :
Travel . set_granted ( pk , auth )
2020-10-27 12:47:46 +00:00
else :
2021-01-04 10:24:20 +00:00
return HttpResponse ( f ' ERROR! UNKNOWN CHOICE TYPE! { choice } ' )
2020-10-27 12:47:46 +00:00
return False
2020-11-19 14:55:10 +00:00
@login_required
def export ( request ) :
''' export the project database to a csv '''
return HttpResponse ( ' WE WANT CSV! ' )
2021-01-04 09:44:03 +00:00
2020-10-28 14:49:18 +00:00
@login_required
2020-10-20 06:39:00 +00:00
def authorize ( request , choice , pk ) :
2020-10-21 07:54:12 +00:00
''' If IF grant a support they click a link in a mail which leads here.
We write the granted field in the database here and set a timestamp . '''
2020-10-27 12:47:46 +00:00
ret = auth_deny ( choice , pk , True )
if ret :
return ret
2020-10-20 07:35:04 +00:00
else :
2020-10-27 12:47:46 +00:00
return HttpResponse ( f " AUTHORIZED! choice: { choice } , pk: { pk } " )
2020-10-20 07:35:04 +00:00
2020-10-28 14:49:18 +00:00
@login_required
2020-10-20 06:39:00 +00:00
def deny ( request , choice , pk ) :
2020-10-21 07:54:12 +00:00
''' If IF denies a support they click a link in a mail which leads here
We write the granted field in the database here . '''
2020-10-21 07:22:53 +00:00
2020-10-27 12:47:46 +00:00
ret = auth_deny ( choice , pk , False )
if ret :
return ret
2020-10-20 07:35:04 +00:00
else :
2020-10-27 12:47:46 +00:00
return HttpResponse ( f " DENIED! choice: { choice } , pk: { pk } " )
2020-10-20 07:35:04 +00:00
2020-10-20 06:06:36 +00:00
2020-09-29 09:08:16 +00:00
def done ( request ) :
2020-11-18 17:07:57 +00:00
return HttpResponse ( " Deine Anfrage wurde gesendet. Du erhältst in Kürze eine E-Mail-Benachrichtigung mit deinen Angaben. Für alle Fragen kontaktiere bitte das Team Ideenförderung unter community@wikimedia.de. " )
2020-09-30 12:26:08 +00:00
2020-10-28 14:49:18 +00:00
class InternView ( LoginRequiredMixin , CookieWizardView ) :
2020-10-21 09:15:55 +00:00
''' This View is for WMDE-employees only '''
2020-10-21 07:54:12 +00:00
template_name = ' input/extern.html '
2020-10-21 08:24:18 +00:00
form_list = [ InternForm , ProjectForm ]
def get_form ( self , step = None , data = None , files = None ) :
2020-10-21 11:53:39 +00:00
''' this function determines which part of the multipart form is
displayed next '''
2020-10-21 08:24:18 +00:00
if step is None :
step = self . steps . current
print ( " get_form() step " + step )
if step == ' 1 ' :
prev_data = self . get_cleaned_data_for_step ( ' 0 ' )
choice = prev_data . get ( ' choice ' )
2020-10-28 14:04:53 +00:00
print ( f ' choice detection: { INTERN_CHOICES [ choice ] } ' )
2020-10-21 08:24:18 +00:00
if choice == ' HON ' :
form = HonoraryCertificateForm ( data )
2020-10-21 09:15:55 +00:00
elif choice == ' PRO ' :
form = ProjectForm ( data )
2020-10-26 10:38:56 +00:00
elif choice == ' TRAV ' :
form = TravelForm ( data )
2020-10-21 08:24:18 +00:00
else :
2020-10-27 10:00:58 +00:00
raise RuntimeError ( f ' ERROR! UNKNOWN FORMTYPE { choice } in InternView ' )
2020-11-19 10:26:39 +00:00
self . choice = choice
2020-10-21 08:24:18 +00:00
else :
form = super ( ) . get_form ( step , data , files )
2020-11-19 10:26:39 +00:00
form . fields [ ' realname ' ] . help_text = format_html ( " Vor- und Zuname (Realname), Wer hat das Projekt beantragt?<br> \
Wer ist Hauptansprechperson ? Bei WMDE - MAs immer „ ( WMDE ) “ , < br > \
bei externen Partnern „ ( PART ) “ hinzufügen . " )
2020-10-21 08:24:18 +00:00
return form
2020-11-19 10:26:39 +00:00
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
if hasattr ( self , ' choice ' ) :
context [ " choice " ] = INTERN_CHOICES [ self . choice ]
return context
2020-10-21 08:24:18 +00:00
def done ( self , form_list , * * kwargs ) :
2020-10-26 11:06:26 +00:00
print ( ' InternView.done() reached ' )
2020-10-21 08:24:18 +00:00
# gather data from all forms
data = { }
for form in form_list :
data = { * * data , * * form . cleaned_data }
2023-02-27 17:09:29 +00:00
if data [ ' selfbuy ' ] == ' TRUE ' :
data [ ' selfbuy_give_data ' ] = ' False '
2020-10-21 08:24:18 +00:00
print ( data )
# write data to database
form = form . save ( commit = False )
# we have to copy the data from the first form here
# this is ugly code. how can we copy this without explicit writing?
# i found no way to access the ModelForm.Meta.exclude-tupel
form . realname = data [ ' realname ' ]
2020-10-26 11:06:26 +00:00
# form.username = data['username']
2020-10-21 08:24:18 +00:00
form . email = data [ ' email ' ]
2020-10-26 11:34:09 +00:00
form . granted = True
form . granted_date = date . today ( )
2023-02-27 17:09:29 +00:00
if data [ ' choice ' ] == ' LIT ' :
form . selfbuy_give_data = data [ ' selfbuy_give_data ' ]
2020-10-21 08:24:18 +00:00
form . save ( )
return done ( self . request )
2020-11-18 14:38:38 +00:00
# these where used as labels in the second form TYPE_CHOICES is used for the first form and the
# text above the second form. only used for BIB, SOFT, ELIT in the moment
LABEL_CHOICES = { ' BIB ' : format_html ( ' Bibliothek ' ) ,
' ELIT ' : format_html ( ' Datenbank/Online-Ressource ' ) ,
' MAIL ' : format_html ( ' E-Mail-Adresse ' ) ,
' IFG ' : format_html ( ' Kostenübernahme IFG-Anfrage ' ) ,
' LIT ' : format_html ( ' Literaturstipendium ' ) ,
' LIST ' : format_html ( ' Mailingliste ' ) ,
' SOFT ' : format_html ( ' Software ' ) ,
' VIS ' : format_html ( ' Visitenkarten ' ) ,
2023-02-27 17:09:29 +00:00
' TRAV ' : format_html ( ' Reisekosten ' ) ,
2020-11-18 14:38:38 +00:00
}
2020-10-21 07:54:12 +00:00
2020-11-18 15:03:27 +00:00
HELP_CHOICES = { ' BIB ' : format_html ( " In welchem Zeitraum möchtest du recherchieren oder<br>wie lange ist der Bibliotheksausweis gültig? " ) ,
' ELIT ' : " Wie lange gilt der Zugang? " ,
' SOFT ' : " Wie lange gilt die Lizenz? " ,
}
2020-10-05 11:35:28 +00:00
class ExternView ( CookieWizardView ) :
2020-10-21 07:54:12 +00:00
''' This View is for Volunteers '''
2020-10-01 12:08:11 +00:00
template_name = " input/extern.html "
2020-10-26 11:06:26 +00:00
form_list = [ ExternForm , LibraryForm ]
2020-10-05 11:35:28 +00:00
2020-10-05 13:53:00 +00:00
def get_form ( self , step = None , data = None , files = None ) :
2020-10-21 11:53:39 +00:00
''' this function determines which part of the multipart form is
displayed next '''
2020-10-06 07:50:18 +00:00
if step is None :
step = self . steps . current
print ( " get_form() step " + step )
2020-10-05 13:53:00 +00:00
if step == ' 1 ' :
2020-10-06 07:50:18 +00:00
prev_data = self . get_cleaned_data_for_step ( ' 0 ' )
2020-10-19 11:29:36 +00:00
choice = prev_data . get ( ' choice ' )
2020-10-27 10:00:58 +00:00
print ( f ' choice detection in ExternView: { TYPE_CHOICES [ choice ] } ' )
2020-10-19 11:29:36 +00:00
if choice == ' IFG ' :
2020-10-06 07:50:18 +00:00
form = IFGForm ( data )
2020-11-18 17:02:23 +00:00
form . fields [ ' notes ' ] . help_text = format_html ( " Bitte gib an, wie die gewonnenen Informationen den<br>Wikimedia-Projekten zugute kommen sollen. " )
2020-10-19 11:29:36 +00:00
elif choice in ( ' BIB ' , ' SOFT ' , ' ELIT ' ) :
2020-10-06 07:50:18 +00:00
form = LibraryForm ( data )
2020-11-18 14:38:38 +00:00
form . fields [ ' library ' ] . label = LABEL_CHOICES [ choice ]
2020-11-18 15:16:05 +00:00
form . fields [ ' library ' ] . help_text = f " Für welche { LABEL_CHOICES [ choice ] } gilt das Stipendium? "
2020-11-18 15:03:27 +00:00
form . fields [ ' duration ' ] . help_text = HELP_CHOICES [ choice ]
2020-10-27 10:00:58 +00:00
elif choice == ' MAIL ' :
form = EmailForm ( data )
2020-11-18 16:46:05 +00:00
form . fields [ ' domain ' ] . help_text = format_html ( " Mit welcher Domain, bzw. für welches Wikimedia-Projekt,<br>möchtest du eine Mailadresse beantragen? " )
2020-10-27 12:47:46 +00:00
elif choice == ' LIT ' :
form = LiteratureForm ( data )
2020-11-18 17:02:23 +00:00
form . fields [ ' notes ' ] . help_text = " Bitte gib an, wofür du die Literatur verwenden möchtest. "
2020-10-27 12:47:46 +00:00
elif choice == ' VIS ' :
form = BusinessCardForm ( data )
elif choice == ' LIST ' :
form = ListForm ( data )
2020-11-18 16:46:05 +00:00
form . fields [ ' domain ' ] . help_text = format_html ( " Mit welcher Domain, bzw. für welches Wikimedia-Projekt,<br>möchtest du eine Mailingliste beantragen? " )
2023-02-27 17:09:29 +00:00
elif choice == ' TRAV ' :
form = TravelForm ( data )
2020-10-19 11:29:36 +00:00
else :
2020-10-27 10:00:58 +00:00
raise RuntimeError ( f ' ERROR! UNKNOWN FORMTYPE { choice } in ExternView ' )
2020-11-18 11:05:18 +00:00
self . choice = choice
2020-10-06 07:50:18 +00:00
else :
form = super ( ) . get_form ( step , data , files )
2020-10-05 13:53:00 +00:00
return form
2020-10-05 13:10:23 +00:00
2020-11-18 11:05:18 +00:00
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
if hasattr ( self , ' choice ' ) :
2020-11-18 14:19:42 +00:00
context [ " choice " ] = TYPE_CHOICES [ self . choice ]
2020-11-18 11:05:18 +00:00
return context
2020-10-01 10:08:02 +00:00
def done ( self , form_list , * * kwargs ) :
2020-10-05 11:35:28 +00:00
print ( ' ExternView.done() reached ' )
# gather data from all forms
data = { }
for form in form_list :
data = { * * data , * * form . cleaned_data }
2023-02-27 17:09:29 +00:00
if data [ ' selfbuy ' ] == ' TRUE ' :
data [ ' selfbuy_give_data ' ] = ' False '
2020-10-05 11:35:28 +00:00
print ( data )
2023-02-27 17:09:29 +00:00
2020-10-05 11:35:28 +00:00
# write data to database
2020-11-16 14:53:43 +00:00
modell = form . save ( commit = False )
2020-10-19 07:31:38 +00:00
# we have to copy the data from the first form here
2020-11-16 14:53:43 +00:00
# this is a bit ugly code. can we copy this without explicit writing?
2023-02-27 17:09:29 +00:00
if data [ ' choice ' ] == ' LIT ' :
modell . selfbuy_give_data = data [ ' selfbuy_give_data ' ]
2020-11-16 14:53:43 +00:00
modell . realname = data [ ' realname ' ]
2021-01-04 15:19:26 +00:00
modell . username = data [ ' username ' ]
2020-11-16 14:53:43 +00:00
modell . email = data [ ' email ' ]
2020-10-19 11:54:57 +00:00
# write type of form in some cases
2020-10-19 11:29:36 +00:00
if data [ ' choice ' ] in ( ' BIB ' , ' ELIT ' , ' SOFT ' ) :
2020-11-16 14:53:43 +00:00
modell . type = data [ ' choice ' ]
2023-02-27 17:09:29 +00:00
2020-10-05 11:35:28 +00:00
form . save ( )
2020-10-20 08:36:15 +00:00
# add some data to context for mail templates
2020-11-16 14:53:43 +00:00
data [ ' pk ' ] = modell . pk
2020-11-09 11:42:29 +00:00
data [ ' urlprefix ' ] = settings . URLPREFIX
2020-10-27 14:50:46 +00:00
data [ ' grant ' ] = ( ' LIT ' , ' SOFT ' , ' ELIT ' , ' BIB ' , ' IFG ' )
data [ ' DOMAIN ' ] = ( ' MAIL ' , ' LIST ' )
2020-10-28 09:28:56 +00:00
data [ ' typestring ' ] = TYPE_CHOICES [ data [ ' choice ' ] ]
2020-10-20 06:06:36 +00:00
2020-10-07 11:15:00 +00:00
# we need to send the following mails here:
2020-10-08 08:21:11 +00:00
context = { ' data ' : data }
2020-10-08 10:38:49 +00:00
try :
# - mail with entered data to the Volunteer
2023-02-27 17:09:29 +00:00
txt_mail_template = get_template ( ' input/ifg_volunteer_mail.txt ' )
html_mail_template = get_template ( ' input/ifg_volunteer_mail.html ' )
subject , from_email , to = ' Formular ausgefüllt ' , IF_EMAIL , data [ ' 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 " )
2023-02-27 17:09:29 +00:00
#msg.send()
print ( ' ifg volunteer mail would have been sent ' )
2023-02-27 17:09:29 +00:00
#send_mail(
# 'Formular ausgefüllt',
# mail_template.render(context),
# IF_EMAIL,
# [data['email']],
# fail_silently=False)
## - mail to IF with link to accept/decline
txt_mail_template = get_template ( ' input/if_mail.txt ' )
html_mail_template = get_template ( ' input/if_mail.html ' )
subject , from_email , to = ' Formular ausgefüllt ' , 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 " )
2023-02-27 17:09:29 +00:00
#msg.send()
print ( ' if mail would have been sent ' )
2023-02-27 17:09:29 +00:00
#send_mail(
# 'Formular ausgefüllt',
# mail_template.render(context),
# IF_EMAIL,
# [IF_EMAIL],
# fail_silently=False)
## raise SMTPException("testing pupose only")
2020-10-08 10:38:49 +00:00
except BadHeaderError :
2020-11-16 15:10:31 +00:00
modell . delete ( )
2020-11-16 14:53:43 +00:00
return HttpResponse ( ' Invalid header found. Data not saved! ' )
except SMTPException :
2020-11-16 15:10:31 +00:00
modell . delete ( )
2020-11-16 14:53:43 +00:00
return HttpResponse ( ' Error in sending mails (propably wrong adress?). Data not saved! ' )
2020-10-07 11:15:00 +00:00
2020-10-01 12:45:04 +00:00
return done ( self . request )