Compare commits
8 Commits
master
...
offboardin
Author | SHA1 | Date |
---|---|---|
Benni Bärmann | 9c62624580 | |
Benni Bärmann | 2b6bc19296 | |
Benni Bärmann | 9901c94e16 | |
Benni Bärmann | e61c28aae3 | |
Benni Bärmann | da8c744227 | |
Benni Bärmann | 86f30c8479 | |
Benni Bärmann | 60debb6e86 | |
Benni Bärmann | 4917d24fd5 |
|
@ -20,17 +20,23 @@ class EvaForm(ModelForm):
|
||||||
'''this base class provides the required css class for all forms'''
|
'''this base class provides the required css class for all forms'''
|
||||||
required_css_class = 'required'
|
required_css_class = 'required'
|
||||||
|
|
||||||
TYPE_CHOICES = {'IN': 'Eintritt', 'CHANGE': 'Veränderung', 'OUT': 'Austritt'}
|
# TYPE_CHOICES = {'IN': 'Eintritt', 'CHANGE': 'Veränderung', 'OUT': 'Austritt'}
|
||||||
|
TYPE_CHOICES = {'IN': 'Eintritt', 'OUT': 'Austritt'}
|
||||||
|
|
||||||
class PersonalForm(EvaForm):
|
class PersonalForm(EvaForm):
|
||||||
# TODO: comment this back in to use implementation of change or exit process
|
choice = ChoiceField(choices=TYPE_CHOICES.items(), widget=RadioSelect,
|
||||||
# choice = ChoiceField(choices=TYPE_CHOICES.items(), widget=RadioSelect,
|
label='Welcher Prozess soll angestoßen werden?')
|
||||||
# label='Welcher Prozess soll angestoßen werden?')
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Employee
|
model = Employee
|
||||||
fields = ['firstname', 'lastname', 'department', 'team', ]
|
fields = ['firstname', 'lastname', 'department', 'team', ]
|
||||||
|
|
||||||
|
class OffboardingForm(EvaForm):
|
||||||
|
class Meta:
|
||||||
|
model = Employee
|
||||||
|
fields = ['lastdate_employment']
|
||||||
|
widgets = {'lastdate_employment' : DateInput(attrs={'type': 'date'})}
|
||||||
|
|
||||||
class WorkingForm(EvaForm):
|
class WorkingForm(EvaForm):
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 3.1.4 on 2021-11-10 08:32
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('evapp', '0002_auto_20210914_1055'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='employee',
|
||||||
|
name='department',
|
||||||
|
field=models.CharField(choices=[('PROG', 'Programme'), ('SOFT', 'Softwareentwicklung'), ('CENT', 'Central'), ('KOMEV', 'Kommunikation und Events'), ('VOR', 'Vorstand')], max_length=5, verbose_name='Bereich'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,23 @@
|
||||||
|
# Generated by Django 3.1.4 on 2021-11-10 12:25
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('evapp', '0003_auto_20211110_0832'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='employee',
|
||||||
|
name='lastdate_employment',
|
||||||
|
field=models.DateField(null=True, verbose_name='Letzter Arbeitstag'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='employee',
|
||||||
|
name='lastdate_presence',
|
||||||
|
field=models.DateField(null=True, verbose_name='Letzter Tag der Anwesenheit in der Geschäftsstelle'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -55,6 +55,8 @@ class Employee(models.Model):
|
||||||
# general work related stuff
|
# general work related stuff
|
||||||
firstdate_employment = models.DateField(null=True, verbose_name="Erster Arbeitstag")
|
firstdate_employment = models.DateField(null=True, verbose_name="Erster Arbeitstag")
|
||||||
firstdate_presence = models.DateField(null=True, verbose_name="Erster Tag der Anwesenheit in der Geschäftsstelle")
|
firstdate_presence = models.DateField(null=True, verbose_name="Erster Tag der Anwesenheit in der Geschäftsstelle")
|
||||||
|
lastdate_employment= models.DateField(null=True, verbose_name="Letzter Arbeitstag")
|
||||||
|
lastdate_presence = models.DateField(null=True, verbose_name="Letzter Tag der Anwesenheit in der Geschäftsstelle")
|
||||||
jobdescription_german = models.CharField(null=True, max_length=100, verbose_name="Stellenbezeichnung(deutsch)")
|
jobdescription_german = models.CharField(null=True, max_length=100, verbose_name="Stellenbezeichnung(deutsch)")
|
||||||
jobdescription_english = models.CharField(null=True, max_length=100, verbose_name="Job description(english)")
|
jobdescription_english = models.CharField(null=True, max_length=100, verbose_name="Job description(english)")
|
||||||
works_in_gs = models.BooleanField(verbose_name='Braucht Arbeitsplatz in der Geschäftsstelle?', default=True)
|
works_in_gs = models.BooleanField(verbose_name='Braucht Arbeitsplatz in der Geschäftsstelle?', default=True)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# temporary setting while change and exit is not yet fully implemented
|
# temporary setting while change and exit is not yet fully implemented
|
||||||
ONLY_ONBOARDING = True
|
ONLY_ONBOARDING = False
|
||||||
|
|
||||||
# sender mail adress also used for MAILTEST mode
|
# sender mail adress also used for MAILTEST mode
|
||||||
EVA_MAIL = 'it-support@wikimedia.de'
|
EVA_MAIL = 'it-support@wikimedia.de'
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.conf import settings
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.core import mail
|
from django.core import mail
|
||||||
|
|
||||||
from .forms import ITForm, WorkingForm, OfficeForm, DummyForm
|
from .forms import ITForm, WorkingForm, OfficeForm, DummyForm, OffboardingForm
|
||||||
|
|
||||||
class LoginTestCase(TestCase):
|
class LoginTestCase(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -45,8 +45,8 @@ class LoginTestCase(TestCase):
|
||||||
self.assertContains(self.response, 'Programme', status_code=200)
|
self.assertContains(self.response, 'Programme', status_code=200)
|
||||||
self.assertContains(self.response, 'Kommunikation und Events', status_code=200)
|
self.assertContains(self.response, 'Kommunikation und Events', status_code=200)
|
||||||
|
|
||||||
def testWizzard(self):
|
def test_wizzard_in(self):
|
||||||
''' this test goes through the whole process of the EvaFormView from start to end '''
|
''' this test goes through the whole onboarding process of the EvaFormView from start to end '''
|
||||||
|
|
||||||
self.assertEqual(200, self.response.status_code)
|
self.assertEqual(200, self.response.status_code)
|
||||||
|
|
||||||
|
@ -55,6 +55,7 @@ class LoginTestCase(TestCase):
|
||||||
'0-firstname': 'Ara',
|
'0-firstname': 'Ara',
|
||||||
'0-lastname': 'Seva',
|
'0-lastname': 'Seva',
|
||||||
'0-department': 'CENT',
|
'0-department': 'CENT',
|
||||||
|
'0-choice': 'IN'
|
||||||
}, WorkingForm)
|
}, WorkingForm)
|
||||||
|
|
||||||
response = self._postform({
|
response = self._postform({
|
||||||
|
@ -83,8 +84,35 @@ class LoginTestCase(TestCase):
|
||||||
'eva_form_view-current_step': '5',
|
'eva_form_view-current_step': '5',
|
||||||
}, DummyForm)
|
}, DummyForm)
|
||||||
|
|
||||||
|
def test_wizzard_out(self):
|
||||||
|
''' this test goes through the whole offboarding process of the EvaFormView from start to end '''
|
||||||
|
|
||||||
|
self.assertEqual(200, self.response.status_code)
|
||||||
|
|
||||||
|
response = self._postform({
|
||||||
|
'eva_form_view-current_step': '0',
|
||||||
|
'0-firstname': 'Ara',
|
||||||
|
'0-lastname': 'Seva',
|
||||||
|
'0-department': 'CENT',
|
||||||
|
'0-choice': 'OUT'
|
||||||
|
}, OffboardingForm)
|
||||||
|
|
||||||
|
response = self._postform({
|
||||||
|
'eva_form_view-current_step': '4',
|
||||||
|
'4-lastdate_employment': '2021-01-01',
|
||||||
|
'4-date_returning': '2021-01-01',
|
||||||
|
'4-lastdate_bvg': '2021-01-01',
|
||||||
|
'4-lastdate_bahncard': '2021-01-01',
|
||||||
|
|
||||||
|
}, DummyForm)
|
||||||
|
|
||||||
|
response = self._postform({
|
||||||
|
'eva_form_view-current_step': '5',
|
||||||
|
}, DummyForm)
|
||||||
|
|
||||||
|
|
||||||
def test_mail(self):
|
def test_mail(self):
|
||||||
self.testWizzard()
|
self.test_wizzard_in()
|
||||||
# print(mail.outbox)
|
# print(mail.outbox)
|
||||||
self.assertGreater(len(mail.outbox), 2)
|
self.assertGreater(len(mail.outbox), 2)
|
||||||
self.assertIn("Ara Seva", mail.outbox[0].subject)
|
self.assertIn("Ara Seva", mail.outbox[0].subject)
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
|
||||||
from .views import EvaFormView, success, long_process, change_process
|
from .views import EvaFormView, success, long_process, change_process, offboarding_process
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', EvaFormView.as_view(condition_dict = {'1': long_process,
|
path('', EvaFormView.as_view(condition_dict = {'1': long_process,
|
||||||
'2': long_process,
|
'2': long_process,
|
||||||
'3': long_process,
|
'3': long_process,
|
||||||
|
|
||||||
'4': change_process,}),
|
'4': offboarding_process,}),
|
||||||
name='evaform'),
|
name='evaform'),
|
||||||
path('success', success, name='success')
|
path('success', success, name='success')
|
||||||
]
|
]
|
||||||
|
|
|
@ -14,7 +14,7 @@ from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from .models import Employee, DEPARTMENT_CHOICES, OS_CHOICES, VENDOR_CHOICES, \
|
from .models import Employee, DEPARTMENT_CHOICES, OS_CHOICES, VENDOR_CHOICES, \
|
||||||
LANG_CHOICES, ACCOUNT_CHOICES, TRANSPONDER_CHOICES, KEYBOARD_CHOICES
|
LANG_CHOICES, ACCOUNT_CHOICES, TRANSPONDER_CHOICES, KEYBOARD_CHOICES
|
||||||
from .forms import PersonalForm, WorkingForm, ITForm, OfficeForm, DummyForm,\
|
from .forms import PersonalForm, WorkingForm, ITForm, OfficeForm, DummyForm,\
|
||||||
ChangeForm, TYPE_CHOICES
|
ChangeForm, TYPE_CHOICES, OffboardingForm
|
||||||
from .settings import MAILS, EVA_MAIL, BASIC_DATA, ONLY_ONBOARDING
|
from .settings import MAILS, EVA_MAIL, BASIC_DATA, ONLY_ONBOARDING
|
||||||
|
|
||||||
def success(request):
|
def success(request):
|
||||||
|
@ -28,15 +28,29 @@ def long_process(wizard):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
data = wizard.get_cleaned_data_for_step('0') or {}
|
data = wizard.get_cleaned_data_for_step('0') or {}
|
||||||
print(data)
|
# print(data)
|
||||||
if data.get('choice') != 'CHANGE':
|
if data.get('choice') == 'IN':
|
||||||
wizard.set_choice('IN')
|
wizard.set_choice('IN')
|
||||||
print('PROZESS IN')
|
print('PROZESS IN')
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
wizard.set_choice('CHANGE')
|
|
||||||
print('PROZESS NOT IN')
|
|
||||||
return False
|
return False
|
||||||
|
#wizard.set_choice('CHANGE')
|
||||||
|
#print('PROZESS CHANGE')
|
||||||
|
#return False
|
||||||
|
|
||||||
|
def offboarding_process(wizard):
|
||||||
|
''' this method is called via urls.py to determine if the form is part of the change process'''
|
||||||
|
print('OFFBOARDING PROZESS')
|
||||||
|
if not ONLY_ONBOARDING:
|
||||||
|
data = wizard.get_cleaned_data_for_step('0') or {}
|
||||||
|
print(data)
|
||||||
|
if data.get('choice') == 'OUT':
|
||||||
|
#print("PPPPPPPPPPPPPPP")
|
||||||
|
wizard.set_choice('OUT')
|
||||||
|
return True
|
||||||
|
# wizard.set_choice('IN')
|
||||||
|
return False
|
||||||
|
|
||||||
def change_process(wizard):
|
def change_process(wizard):
|
||||||
''' this method is called via urls.py to determine if the form is part of the change process'''
|
''' this method is called via urls.py to determine if the form is part of the change process'''
|
||||||
|
@ -46,7 +60,7 @@ def change_process(wizard):
|
||||||
|
|
||||||
class EvaFormView(LoginRequiredMixin, CookieWizardView):
|
class EvaFormView(LoginRequiredMixin, CookieWizardView):
|
||||||
template_name = 'evapp/employee_form.html'
|
template_name = 'evapp/employee_form.html'
|
||||||
form_list = [PersonalForm, WorkingForm, ITForm, OfficeForm, ChangeForm, DummyForm]
|
form_list = [PersonalForm, WorkingForm, ITForm, OfficeForm, OffboardingForm, DummyForm]
|
||||||
instance = None
|
instance = None
|
||||||
choice = 'IN'
|
choice = 'IN'
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue