2020-10-26 12:34:09 +01:00
from datetime import date
2020-11-16 15:53:43 +01:00
from smtplib import SMTPException
2020-10-26 12:34:09 +01:00
2020-09-21 14:27:16 +02:00
from django . shortcuts import render
2020-09-29 09:53:29 +02:00
from django . forms import modelformset_factory
2020-09-29 11:08:16 +02:00
from django . http import HttpResponse
2020-10-05 13:35:28 +02:00
from formtools . wizard . views import CookieWizardView
2023-02-27 18:09:29 +01:00
from django . core . mail import send_mail , BadHeaderError , EmailMultiAlternatives
2020-10-07 14:00:08 +02:00
from django . conf import settings
2020-10-07 15:07:02 +02:00
from django . template . loader import get_template
from django . template import Context
2020-10-28 15:49:18 +01:00
from django . contrib . auth . decorators import login_required
from django . contrib . auth . mixins import LoginRequiredMixin
2020-11-18 15:38:38 +01:00
from django . utils . html import format_html
2023-02-27 18:09:29 +01:00
from django . utils . translation import gettext as _
2020-09-22 12:21:05 +02:00
2020-10-27 13:47:46 +01:00
from . forms import ProjectForm , ExternForm , LibraryForm , IFGForm , LiteratureForm , \
HonoraryCertificateForm , InternForm , TravelForm , EmailForm , \
2020-10-28 15:04:53 +01:00
ListForm , BusinessCardForm , INTERN_CHOICES
2023-02-27 18:09:29 +01:00
from . models import Project , TYPE_CHOICES , Library , Literature , Travel , IFG , BusinessCard , Email , List
2020-11-09 10:33:31 +01:00
from . settings import IF_EMAIL
2020-10-20 09:35:04 +02:00
2020-10-27 13:47:46 +01:00
def auth_deny ( choice , pk , auth ) :
if choice in ( ' BIB ' , ' ELIT ' , ' SOFT ' ) :
Library . set_granted ( pk , auth )
2021-01-04 10:44:03 +01:00
elif choice == ' LIT ' :
2020-10-27 13:47:46 +01:00
Literature . set_granted ( pk , auth )
2021-01-04 10:44:03 +01:00
elif choice == ' IFG ' :
2020-10-27 13:47:46 +01:00
IFG . set_granted ( pk , auth )
2023-02-27 18:09:29 +01:00
elif choice == ' TRAV ' :
Travel . set_granted ( pk , auth )
2023-02-27 18:09:29 +01:00
elif choice == ' VIS ' :
BusinessCard . set_granted ( pk , auth )
elif choice == ' MAIL ' :
Email . set_granted ( pk , auth )
elif choice == ' LIST ' :
List . set_granted ( pk , auth )
2020-10-27 13:47:46 +01:00
else :
2021-01-04 11:24:20 +01:00
return HttpResponse ( f ' ERROR! UNKNOWN CHOICE TYPE! { choice } ' )
2020-10-27 13:47:46 +01:00
return False
2020-11-19 15:55:10 +01:00
@login_required
def export ( request ) :
''' export the project database to a csv '''
return HttpResponse ( ' WE WANT CSV! ' )
2021-01-04 10:44:03 +01:00
2020-10-28 15:49:18 +01:00
@login_required
2020-10-20 08:39:00 +02:00
def authorize ( request , choice , pk ) :
2020-10-21 09:54:12 +02: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 13:47:46 +01:00
ret = auth_deny ( choice , pk , True )
if ret :
return ret
2020-10-20 09:35:04 +02:00
else :
2020-10-27 13:47:46 +01:00
return HttpResponse ( f " AUTHORIZED! choice: { choice } , pk: { pk } " )
2020-10-20 09:35:04 +02:00
2020-10-28 15:49:18 +01:00
@login_required
2020-10-20 08:39:00 +02:00
def deny ( request , choice , pk ) :
2020-10-21 09:54:12 +02: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 09:22:53 +02:00
2020-10-27 13:47:46 +01:00
ret = auth_deny ( choice , pk , False )
if ret :
return ret
2020-10-20 09:35:04 +02:00
else :
2020-10-27 13:47:46 +01:00
return HttpResponse ( f " DENIED! choice: { choice } , pk: { pk } " )
2020-10-20 09:35:04 +02:00
2020-10-20 08:06:36 +02:00
2020-09-29 11:08:16 +02:00
def done ( request ) :
2023-02-27 18:09:29 +01: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 Communitys und Engagement unter community@wikimedia.de. " )
2020-09-30 14:26:08 +02:00
2020-10-28 15:49:18 +01:00
class InternView ( LoginRequiredMixin , CookieWizardView ) :
2020-10-21 11:15:55 +02:00
''' This View is for WMDE-employees only '''
2020-10-21 09:54:12 +02:00
template_name = ' input/extern.html '
2020-10-21 10:24:18 +02:00
form_list = [ InternForm , ProjectForm ]
def get_form ( self , step = None , data = None , files = None ) :
2020-10-21 13:53:39 +02:00
''' this function determines which part of the multipart form is
displayed next '''
2020-10-21 10:24:18 +02: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 15:04:53 +01:00
print ( f ' choice detection: { INTERN_CHOICES [ choice ] } ' )
2020-10-21 10:24:18 +02:00
if choice == ' HON ' :
form = HonoraryCertificateForm ( data )
2020-10-21 11:15:55 +02:00
elif choice == ' PRO ' :
form = ProjectForm ( data )
2020-10-26 11:38:56 +01:00
elif choice == ' TRAV ' :
form = TravelForm ( data )
2020-10-21 10:24:18 +02:00
else :
2020-10-27 11:00:58 +01:00
raise RuntimeError ( f ' ERROR! UNKNOWN FORMTYPE { choice } in InternView ' )
2020-11-19 11:26:39 +01:00
self . choice = choice
2020-10-21 10:24:18 +02:00
else :
form = super ( ) . get_form ( step , data , files )
2020-11-19 11:26:39 +01: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 10:24:18 +02:00
return form
2020-11-19 11:26:39 +01: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 10:24:18 +02:00
def done ( self , form_list , * * kwargs ) :
2020-10-26 12:06:26 +01:00
print ( ' InternView.done() reached ' )
2020-10-21 10:24:18 +02:00
# gather data from all forms
data = { }
for form in form_list :
data = { * * data , * * form . cleaned_data }
2023-02-27 18:09:29 +01:00
if data [ ' choice ' ] == ' LIT ' :
if data [ ' selfbuy ' ] == ' TRUE ' :
data [ ' selfbuy_give_data ' ] = ' False '
2020-10-21 10:24:18 +02:00
# 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 12:06:26 +01:00
# form.username = data['username']
2020-10-21 10:24:18 +02:00
form . email = data [ ' email ' ]
2020-10-26 12:34:09 +01:00
form . granted = True
form . granted_date = date . today ( )
2023-02-27 18:09:29 +01:00
if data [ ' choice ' ] == ' LIT ' :
form . selfbuy_give_data = data [ ' selfbuy_give_data ' ]
2020-10-21 10:24:18 +02:00
form . save ( )
return done ( self . request )
2020-11-18 15:38:38 +01: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 ' ) ,
2023-02-27 18:09:29 +01:00
' TRAV ' : format_html ( ' Reisekosten ' ) ,
2020-11-18 15:38:38 +01:00
' SOFT ' : format_html ( ' Software ' ) ,
' VIS ' : format_html ( ' Visitenkarten ' ) ,
}
2020-10-21 09:54:12 +02:00
2020-11-18 16:03:27 +01: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 13:35:28 +02:00
class ExternView ( CookieWizardView ) :
2020-10-21 09:54:12 +02:00
''' This View is for Volunteers '''
2020-10-01 14:08:11 +02:00
template_name = " input/extern.html "
2020-10-26 12:06:26 +01:00
form_list = [ ExternForm , LibraryForm ]
2020-10-05 13:35:28 +02:00
2020-10-05 15:53:00 +02:00
def get_form ( self , step = None , data = None , files = None ) :
2020-10-21 13:53:39 +02:00
''' this function determines which part of the multipart form is
displayed next '''
2020-10-06 09:50:18 +02:00
if step is None :
step = self . steps . current
print ( " get_form() step " + step )
2020-10-05 15:53:00 +02:00
if step == ' 1 ' :
2020-10-06 09:50:18 +02:00
prev_data = self . get_cleaned_data_for_step ( ' 0 ' )
2020-10-19 13:29:36 +02:00
choice = prev_data . get ( ' choice ' )
2020-10-27 11:00:58 +01:00
print ( f ' choice detection in ExternView: { TYPE_CHOICES [ choice ] } ' )
2020-10-19 13:29:36 +02:00
if choice == ' IFG ' :
2020-10-06 09:50:18 +02:00
form = IFGForm ( data )
2020-11-18 18:02:23 +01: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 13:29:36 +02:00
elif choice in ( ' BIB ' , ' SOFT ' , ' ELIT ' ) :
2020-10-06 09:50:18 +02:00
form = LibraryForm ( data )
2020-11-18 15:38:38 +01:00
form . fields [ ' library ' ] . label = LABEL_CHOICES [ choice ]
2020-11-18 16:16:05 +01:00
form . fields [ ' library ' ] . help_text = f " Für welche { LABEL_CHOICES [ choice ] } gilt das Stipendium? "
2020-11-18 16:03:27 +01:00
form . fields [ ' duration ' ] . help_text = HELP_CHOICES [ choice ]
2020-10-27 11:00:58 +01:00
elif choice == ' MAIL ' :
form = EmailForm ( data )
2020-11-18 17:46:05 +01: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 13:47:46 +01:00
elif choice == ' LIT ' :
form = LiteratureForm ( data )
2020-11-18 18:02:23 +01:00
form . fields [ ' notes ' ] . help_text = " Bitte gib an, wofür du die Literatur verwenden möchtest. "
2020-10-27 13:47:46 +01:00
elif choice == ' VIS ' :
form = BusinessCardForm ( data )
elif choice == ' LIST ' :
form = ListForm ( data )
2020-11-18 17:46:05 +01: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 18:09:29 +01:00
elif choice == ' TRAV ' :
form = TravelForm ( data )
2020-10-19 13:29:36 +02:00
else :
2020-10-27 11:00:58 +01:00
raise RuntimeError ( f ' ERROR! UNKNOWN FORMTYPE { choice } in ExternView ' )
2020-11-18 12:05:18 +01:00
self . choice = choice
2020-10-06 09:50:18 +02:00
else :
form = super ( ) . get_form ( step , data , files )
2020-10-05 15:53:00 +02:00
return form
2020-10-05 15:10:23 +02:00
2020-11-18 12:05:18 +01:00
def get_context_data ( self , * * kwargs ) :
context = super ( ) . get_context_data ( * * kwargs )
if hasattr ( self , ' choice ' ) :
2020-11-18 15:19:42 +01:00
context [ " choice " ] = TYPE_CHOICES [ self . choice ]
2020-11-18 12:05:18 +01:00
return context
2020-10-01 12:08:02 +02:00
def done ( self , form_list , * * kwargs ) :
2020-10-05 13:35:28 +02:00
print ( ' ExternView.done() reached ' )
# gather data from all forms
data = { }
for form in form_list :
data = { * * data , * * form . cleaned_data }
2023-10-25 17:50:40 +02:00
data [ ' username ' ] = self . request . session [ ' user ' ] [ ' username ' ]
2023-02-27 18:09:29 +01:00
2023-02-27 18:09:29 +01:00
if data [ ' choice ' ] == ' LIT ' :
if data [ ' selfbuy ' ] == ' TRUE ' :
data [ ' selfbuy_give_data ' ] = ' False '
2023-02-27 18:09:29 +01:00
2020-10-05 13:35:28 +02:00
# write data to database
2020-11-16 15:53:43 +01:00
modell = form . save ( commit = False )
2020-10-19 09:31:38 +02:00
# we have to copy the data from the first form here
2020-11-16 15:53:43 +01:00
# this is a bit ugly code. can we copy this without explicit writing?
2023-02-27 18:09:29 +01:00
if data [ ' choice ' ] == ' LIT ' :
modell . selfbuy_give_data = data [ ' selfbuy_give_data ' ]
2020-11-16 15:53:43 +01:00
modell . realname = data [ ' realname ' ]
2021-01-04 16:19:26 +01:00
modell . username = data [ ' username ' ]
2020-11-16 15:53:43 +01:00
modell . email = data [ ' email ' ]
2020-10-19 13:54:57 +02:00
# write type of form in some cases
2020-10-19 13:29:36 +02:00
if data [ ' choice ' ] in ( ' BIB ' , ' ELIT ' , ' SOFT ' ) :
2020-11-16 15:53:43 +01:00
modell . type = data [ ' choice ' ]
2023-02-27 18:09:29 +01:00
2020-10-05 13:35:28 +02:00
form . save ( )
2020-10-20 10:36:15 +02:00
# add some data to context for mail templates
2020-11-16 15:53:43 +01:00
data [ ' pk ' ] = modell . pk
2020-11-09 12:42:29 +01:00
data [ ' urlprefix ' ] = settings . URLPREFIX
2020-10-27 15:50:46 +01:00
data [ ' grant ' ] = ( ' LIT ' , ' SOFT ' , ' ELIT ' , ' BIB ' , ' IFG ' )
data [ ' DOMAIN ' ] = ( ' MAIL ' , ' LIST ' )
2020-10-28 10:28:56 +01:00
data [ ' typestring ' ] = TYPE_CHOICES [ data [ ' choice ' ] ]
2020-10-20 08:06:36 +02:00
2020-10-07 13:15:00 +02:00
# we need to send the following mails here:
2020-10-08 10:21:11 +02:00
context = { ' data ' : data }
2020-10-08 12:38:49 +02:00
try :
# - mail with entered data to the Volunteer
2023-02-27 18:09:29 +01:00
2023-02-27 18:09:29 +01:00
txt_mail_template1 = get_template ( ' input/ifg_volunteer_mail.txt ' )
html_mail_template1 = get_template ( ' input/ifg_volunteer_mail.html ' )
2023-02-27 18:09:29 +01:00
2023-02-27 18:09:29 +01:00
subject1 , from_email1 , to1 = ' Formular ausgefüllt ' , IF_EMAIL , data [ ' email ' ]
text_content1 = txt_mail_template1 . render ( context )
html_content1 = html_mail_template1 . render ( context )
msg1 = EmailMultiAlternatives ( subject1 , text_content1 , from_email1 , [ to1 ] )
msg1 . attach_alternative ( html_content1 , " text/html " )
msg1 . send ( )
#print('ifg volunteer mail would have been sent')
2023-02-27 18:09:29 +01:00
#send_mail(
# 'Formular ausgefüllt',
2023-02-27 18:09:29 +01:00
# txt_mail_template1.render(context),
2023-02-27 18:09:29 +01:00
# 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 )
2023-02-27 18:09:29 +01:00
msg2 = EmailMultiAlternatives ( subject , text_content , from_email , [ to ] )
msg2 . attach_alternative ( html_content , " text/html " )
msg2 . send ( )
#print('if mail would have been sent')
2023-02-27 18:09:29 +01:00
#send_mail(
# 'Formular ausgefüllt',
2023-02-27 18:09:29 +01:00
# txt_mail_template.render(context),
2023-02-27 18:09:29 +01:00
# IF_EMAIL,
# [IF_EMAIL],
# fail_silently=False)
## raise SMTPException("testing pupose only")
2023-02-27 18:09:29 +01:00
2020-10-08 12:38:49 +02:00
except BadHeaderError :
2020-11-16 16:10:31 +01:00
modell . delete ( )
2020-11-16 15:53:43 +01:00
return HttpResponse ( ' Invalid header found. Data not saved! ' )
except SMTPException :
2020-11-16 16:10:31 +01:00
modell . delete ( )
2023-02-27 18:09:29 +01:00
return HttpResponse ( ' Error in sending mails (probably wrong adress?). Data not saved! ' )
2020-11-16 15:53:43 +01:00
2020-10-07 13:15:00 +02:00
2020-10-01 14:45:04 +02:00
return done ( self . request )