WMDE
/
eva
forked from tohe/eva
7
1
Fork 0

Added Austritt to be functional (not fully released yet)

This commit is contained in:
root 2026-01-23 14:23:07 +00:00
parent 0b3ca2db03
commit ad322f8ac1
24 changed files with 430 additions and 118 deletions

View File

@ -29,39 +29,23 @@ class PersonalForm(EvaForm):
class Meta: class Meta:
model = Employee model = Employee
fields = ['firstname', 'lastname', 'department', 'team', 'add_to_wikimediade',] fields = ['firstname', 'lastname', 'lastdate_employment', 'lastdate_office', 'lastdate_working']
widgets = {'lastdate_employment': DateInput(attrs={'type': 'date'}),
class WorkingForm(EvaForm): 'lastdate_office': DateInput(attrs={'type': 'date'}),
'lastdate_working': DateInput(attrs={'type': 'date'}),}
def clean(self):
data = self.cleaned_data
if data['works_in_gs'] and data['desk'] is None:
raise ValidationError('Wer nicht remote arbeitet braucht einen Schreibtisch!')
return data
class HRForm(EvaForm):
class Meta: class Meta:
model = Employee model = Employee
fields = ['firstdate_employment', 'firstdate_presence', 'jobdescription_german', fields = ['overtime', 'holiday']
'jobdescription_english', 'works_in_gs', 'desk',]
widgets = {'firstdate_employment': DateInput(attrs={'type': 'date'}),
'firstdate_presence': DateInput(attrs={'type': 'date'}),}
class ITForm(EvaForm): class ITForm(EvaForm):
class Meta: class Meta:
model = Employee model = Employee
fields = [ fields = ['laptop_id', 'forward', 'forwardemail', 'documents', 'documentowner', 'mobile', 'sim', 'credit_card', 'transponder_id', 'special_logins']
'framework', 'os', 'keyboard', 'mobile', 'landline',
'comment', 'language', 'accounts', 'lists', 'rebu2go' ]
class OfficeForm(EvaForm): class DummyForm(ModelForm):
class Meta: class Meta:
model = Employee model = Employee
fields = ['transponder', 'special', 'post_office_box',] fields = []
class ChangeForm(EvaForm):
class Meta:
model = Employee
fields = ['firstdate_employment', 'jobdescription_german', 'jobdescription_english',
'desk', 'comment', 'accounts', 'lists', 'transponder']
widgets = {'firstdate_employment': DateInput(attrs={'type': 'date'}),}

View File

@ -0,0 +1,137 @@
# Generated by Django 5.2.8 on 2026-01-21 15:05
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('austritt', '0007_remove_employee_screen_and_more'),
]
operations = [
migrations.RemoveField(
model_name='employee',
name='accounts',
),
migrations.RemoveField(
model_name='employee',
name='add_to_wikimediade',
),
migrations.RemoveField(
model_name='employee',
name='comment',
),
migrations.RemoveField(
model_name='employee',
name='department',
),
migrations.RemoveField(
model_name='employee',
name='desk',
),
migrations.RemoveField(
model_name='employee',
name='firstdate_employment',
),
migrations.RemoveField(
model_name='employee',
name='firstdate_presence',
),
migrations.RemoveField(
model_name='employee',
name='framework',
),
migrations.RemoveField(
model_name='employee',
name='jobdescription_english',
),
migrations.RemoveField(
model_name='employee',
name='jobdescription_german',
),
migrations.RemoveField(
model_name='employee',
name='keyboard',
),
migrations.RemoveField(
model_name='employee',
name='landline',
),
migrations.RemoveField(
model_name='employee',
name='language',
),
migrations.RemoveField(
model_name='employee',
name='lists',
),
migrations.RemoveField(
model_name='employee',
name='os',
),
migrations.RemoveField(
model_name='employee',
name='post_office_box',
),
migrations.RemoveField(
model_name='employee',
name='rebu2go',
),
migrations.RemoveField(
model_name='employee',
name='special',
),
migrations.RemoveField(
model_name='employee',
name='team',
),
migrations.RemoveField(
model_name='employee',
name='transponder',
),
migrations.RemoveField(
model_name='employee',
name='works_in_gs',
),
migrations.AddField(
model_name='employee',
name='credit_card',
field=models.BooleanField(default=False, verbose_name='Kreditkarte'),
),
migrations.AddField(
model_name='employee',
name='laptop_id',
field=models.CharField(default='000000', max_length=6, verbose_name='Laptop ID'),
),
migrations.AddField(
model_name='employee',
name='lastdate_employment',
field=models.DateField(null=True, verbose_name='Vertragsende'),
),
migrations.AddField(
model_name='employee',
name='lastdate_office',
field=models.DateField(null=True, verbose_name='Letzter Tag der Anwesenheit in der Geschäftsstelle'),
),
migrations.AddField(
model_name='employee',
name='lastdate_working',
field=models.DateField(null=True, verbose_name='Letzter Arbeitstag'),
),
migrations.AddField(
model_name='employee',
name='sim',
field=models.BooleanField(default=False, verbose_name='Mobilfunkvertrag'),
),
migrations.AddField(
model_name='employee',
name='special_logins',
field=models.TextField(blank=True, max_length=500, null=True, verbose_name='Zusätzliche Accounts'),
),
migrations.AddField(
model_name='employee',
name='transponder_id',
field=models.CharField(default='000000', max_length=6, verbose_name='Transponder ID'),
),
]

View File

@ -0,0 +1,43 @@
# Generated by Django 5.2.8 on 2026-01-22 11:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('austritt', '0008_remove_employee_accounts_and_more'),
]
operations = [
migrations.AlterField(
model_name='employee',
name='credit_card',
field=models.BooleanField(default=False, verbose_name='Kreditkarte vorhanden?'),
),
migrations.AlterField(
model_name='employee',
name='laptop_id',
field=models.CharField(default='000000', max_length=6, verbose_name='Laptop ID (wenn bekannt)'),
),
migrations.AlterField(
model_name='employee',
name='mobile',
field=models.BooleanField(default=False, max_length=6, verbose_name='Diensttelefon (Handy) vorhanden?'),
),
migrations.AlterField(
model_name='employee',
name='sim',
field=models.BooleanField(default=False, verbose_name='Mobilfunkvertrag vorhanden?'),
),
migrations.AlterField(
model_name='employee',
name='special_logins',
field=models.TextField(blank=True, max_length=500, null=True, verbose_name='Zusätzlich zu deaktivierende Accounts'),
),
migrations.AlterField(
model_name='employee',
name='transponder_id',
field=models.CharField(default='000000', max_length=6, verbose_name='Transponder ID (wenn bekannt)'),
),
]

View File

@ -0,0 +1,53 @@
# Generated by Django 5.2.8 on 2026-01-22 12:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('austritt', '0009_alter_employee_credit_card_alter_employee_laptop_id_and_more'),
]
operations = [
migrations.AddField(
model_name='employee',
name='documentowner',
field=models.CharField(blank=True, max_length=300, null=True, verbose_name='An wen sollen die Dokumente übertragen werden?'),
),
migrations.AddField(
model_name='employee',
name='documents',
field=models.BooleanField(default=False, max_length=6, verbose_name='Sollen Google Drive Dokumente übertragen werden? (Sonst werden sie gelöscht)'),
),
migrations.AddField(
model_name='employee',
name='forward',
field=models.BooleanField(default=False, max_length=6, verbose_name='Soll die Email umgeleitet werden anstatt sie zu deaktivieren?'),
),
migrations.AddField(
model_name='employee',
name='forwardemail',
field=models.CharField(blank=True, max_length=300, null=True, verbose_name='An welche Email soll umgeleitet werden?'),
),
migrations.AddField(
model_name='employee',
name='holiday',
field=models.CharField(blank=True, max_length=6, verbose_name='restliche Urlaubstage (wenn bekannt)'),
),
migrations.AddField(
model_name='employee',
name='overtime',
field=models.CharField(blank=True, max_length=6, verbose_name='vorhandene Überstunden (wenn bekannt)'),
),
migrations.AlterField(
model_name='employee',
name='laptop_id',
field=models.CharField(blank=True, default='000000', max_length=6, verbose_name='Laptop ID (wenn bekannt)'),
),
migrations.AlterField(
model_name='employee',
name='transponder_id',
field=models.CharField(blank=True, default='000000', max_length=6, verbose_name='Transponder ID (wenn bekannt)'),
),
]

View File

@ -0,0 +1,43 @@
# Generated by Django 5.2.8 on 2026-01-22 12:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('austritt', '0010_employee_documentowner_employee_documents_and_more'),
]
operations = [
migrations.AlterField(
model_name='employee',
name='credit_card',
field=models.CharField(choices=[('NEIN', 'Nein'), ('JA', 'Ja')], max_length=5, verbose_name='Kreditkarte vorhanden?'),
),
migrations.AlterField(
model_name='employee',
name='documents',
field=models.CharField(choices=[('NEIN', 'Nein'), ('JA', 'Ja')], max_length=5, verbose_name='Sollen Google Drive Dokumente übertragen werden? (Sonst werden sie gelöscht)'),
),
migrations.AlterField(
model_name='employee',
name='forward',
field=models.CharField(choices=[('NEIN', 'Nein'), ('JA', 'Ja')], max_length=5, verbose_name='Soll die Email umgeleitet werden anstatt sie zu deaktivieren?'),
),
migrations.AlterField(
model_name='employee',
name='laptop_id',
field=models.CharField(blank=True, max_length=6, verbose_name='Laptop ID (wenn bekannt)'),
),
migrations.AlterField(
model_name='employee',
name='mobile',
field=models.CharField(choices=[('NEIN', 'Nein'), ('JA', 'Ja')], max_length=5, verbose_name='Diensttelefon (Handy) vorhanden?'),
),
migrations.AlterField(
model_name='employee',
name='transponder_id',
field=models.CharField(blank=True, max_length=6, verbose_name='Transponder ID (wenn bekannt)'),
),
]

View File

@ -53,35 +53,28 @@ class Employee(models.Model):
# personal data # personal data
firstname = models.CharField(max_length=50, verbose_name=_("Vorname")) firstname = models.CharField(max_length=50, verbose_name=_("Vorname"))
lastname = models.CharField(max_length=50, verbose_name=_("Nachname")) lastname = models.CharField(max_length=50, verbose_name=_("Nachname"))
# intern = models.BooleanField(verbose_name='Interne_r Mitarbeiter_in?', default=True)
department = models.CharField(max_length=5, choices=DEPARTMENT_CHOICES.items(), verbose_name=_('Bereich'))
team = models.CharField(max_length=50, null=True, blank=True) # TODO? better with choices?
add_to_wikimediade = models.CharField(max_length=5, choices=JANEIN_CHOICES.items(), verbose_name=_("Soll die Person bei Ansprechpartner*innen auf der WMDE-Webseite mit aufgenommen werden?"))
# general work related stuff # general work related stuff
firstdate_employment = models.DateField(null=True, verbose_name=_("Erster Arbeitstag")) lastdate_employment = models.DateField(null=True, verbose_name=_("Vertragsende"))
firstdate_presence = models.DateField(null=True, verbose_name=_("Erster Tag der Anwesenheit in der Geschäftsstelle")) lastdate_office = 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)") lastdate_working = models.DateField(null=True, verbose_name=_("Letzter Arbeitstag"))
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) # HR related stuff
desk = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("Wo soll der Arbeitsplatz sein?")) overtime = models.CharField(max_length=6, blank=True, verbose_name=_("vorhandene Überstunden (wenn bekannt)"))
holiday = models.CharField(max_length=6, blank=True, verbose_name=_("restliche Urlaubstage (wenn bekannt)"))
# IT related stuff # IT related stuff
#vendor = models.CharField(max_length=8, choices=VENDOR_CHOICES.items(), default='STANDARD', verbose_name=_('Hersteller')) laptop_id = models.CharField(max_length=6, blank=True, verbose_name=_("Laptop ID (wenn bekannt)"))
framework = models.CharField(max_length=300, null=True, blank=True, verbose_name=_("Möchten Sie vom Standard des Frameworks (Laptop) abweichen, und wenn ja, warum?")) special_logins = models.TextField(max_length=500, null=True, blank=True, verbose_name=_("Zusätzlich zu deaktivierende Accounts"))
os = models.CharField(max_length=3, choices=OS_CHOICES.items(), default='FED', verbose_name=_('Betriebssystem')) forward = models.CharField(max_length=5, choices=JANEIN_CHOICES.items(), verbose_name=_('Soll die Email umgeleitet werden anstatt sie zu deaktivieren?'))
#screen = models.BooleanField(default=False, verbose_name=_('Zusätzlicher Monitor? Einer ist standard.')) forwardemail = models.CharField(max_length=300, null=True, blank=True, verbose_name=_("An welche Email soll umgeleitet werden?"))
mobile = models.BooleanField(max_length=6, default=False, verbose_name=_('Diensttelefon (Handy)')) documents = models.CharField(max_length=5, choices=JANEIN_CHOICES.items(), verbose_name=_('Sollen Google Drive Dokumente übertragen werden? (Sonst werden sie gelöscht)'))
landline = models.BooleanField(default = False, verbose_name=_('Festnetznummer (Sipgate)')) documentowner = models.CharField(max_length=300, null=True, blank=True, verbose_name=_("An wen sollen die Dokumente übertragen werden?"))
# sim = models.BooleanField(default=False, verbose_name="Mobilfunkvertrag") mobile = models.CharField(max_length=5, choices=JANEIN_CHOICES.items(), verbose_name=_('Diensttelefon (Handy) vorhanden?'))
keyboard = models.CharField(max_length=2, choices=KEYBOARD_CHOICES.items(), default='DE', verbose_name=_("Tastaturlayout")) sim = models.BooleanField(default=False, verbose_name="Mobilfunkvertrag vorhanden?")
comment = models.TextField(max_length=500, null=True, blank=True, verbose_name=_("zusätzliche IT-Anforderungen"))
language = models.CharField(max_length=3, choices=LANG_CHOICES.items(), default="GER", verbose_name=_("Sprache für Onboarding"))
accounts = MultiSelectField(choices=ACCOUNT_CHOICES.items(), max_length=40, null=True, blank=True, verbose_name=_("Zusätzliche Accounts"))
lists = models.CharField(max_length=100, null=True, blank=True, verbose_name=_("Zusätzliche Mailinglisten"))
rebu2go = models.BooleanField(verbose_name=_("Rebu2Go-Zugang benötigt?"), default=False)
# office related stuff # office related stuff
transponder = models.CharField(max_length=7, choices=TRANSPONDER_CHOICES.items(), default='NORM') transponder_id = models.CharField(max_length=6, blank=True, verbose_name=_("Transponder ID (wenn bekannt)"))
special = models.TextField(max_length=500, null=True, blank=True, verbose_name=_("Besondere Schließungen hier eintragen"))
post_office_box = models.BooleanField(default=True, verbose_name=_('Postfach am Empfang benötigt?')) # finance related stuff
credit_card = models.CharField(max_length=5, choices=JANEIN_CHOICES.items(), verbose_name="Kreditkarte vorhanden?")

View File

@ -5,57 +5,81 @@ ONLY_ONBOARDING = True
EVA_MAIL = 'it-support@wikimedia.de' EVA_MAIL = 'it-support@wikimedia.de'
# these Fields should be included in every mail # these Fields should be included in every mail
BASIC_DATA = ['firstname', 'lastname', 'firstdate_employment', 'firstdate_presence', BASIC_DATA = [
'jobdescription_german', 'jobdescription_english',] 'firstname',
'lastname',
'lastdate_employment',
'lastdate_office',
'lastdate_working'
]
# for every department: 'MAIL' => mail adress, 'DATA': additional fields to include # for every department: 'MAIL' => mail adress, 'DATA': additional fields to include
# also one copy with all fields to the person filling the form. # also one copy with all fields to the person filling the form.
MAILS = { MAILS = {
'IT': { 'IT': {
'MAIL': 'wmde-it@wikimedia.de', 'MAIL': 'wmde-it@wikimedia.de',
'DATA': [ 'DATA': [
'laptop', 'os', 'comment', 'email', 'landline', 'lists', 'mobile', 'laptop_id',
'department', 'accounts', 'language', 'screen', 'works_in_gs', 'desk', 'email',
'keyboard', 'forward',
], 'forwardemail',
'documents',
'documentowner',
'mobile',
'special_logins'
],
}, },
'OFFICE': { 'OFFICE': {
'MAIL': 'office@wikimedia.de', # 'MAIL': 'office@wikimedia.de',
'MAIL': 'julian.hahn@wikimedia.de',
'DATA': [ 'DATA': [
'transponder', 'special', 'post_office_box', 'mobile', 'transponder_id'
'works_in_gs', 'desk',
], ],
}, },
'KOMM': { # 'KOMM': {
'MAIL': 'presse@wikimedia.de', # 'MAIL': 'presse@wikimedia.de',
'DATA': [ # 'DATA': [
'department', 'team', 'add_to_wikimediade' # 'email'
], # ],
}, # },
'CENTRAL': { # 'CENTRAL': {
'MAIL': 'anna.noelte@wikimedia.de', # 'MAIL': 'anna.noelte@wikimedia.de',
'DATA': [ # 'DATA': [
'department', 'team', 'language', 'mobile', 'rebu2go' # 'sim'
], # ],
}, # },
'HR': { # 'HR': {
'MAIL': 'personal@wikimedia.de', # 'MAIL': 'personal@wikimedia.de',
'DATA': [ # 'DATA': [
'department', 'team', 'language', # 'overtime',
] # 'holiday',
}, # 'laptop_id',
'FINANCE': { # 'mobile',
'MAIL': 'claudia.langrock@wikimedia.de', # 'sim',
'DATA': [ # 'credit_card'
'rebu2go' # ]
] # },
}, # 'FINANCE': {
# 'MAIL': 'claudia.langrock@wikimedia.de',
# 'DATA': [
# 'credit_card'
# ]
# },
'SUBMITTER': { 'SUBMITTER': {
'MAIL': 'submitter@wikimedia.de', 'MAIL': 'submitter@wikimedia.de',
'DATA': [ 'DATA': [
'department', 'team', 'add_to_wikimediade', 'remote', 'desk', 'vendor', 'overtime',
'os', 'screen', 'mobile', 'landline', 'keyboard', 'comment', 'language', 'holiday',
'accounts', 'lists', 'rebu2go', 'transponder', 'special', 'post_office_box' 'laptop_id',
'email',
'forward',
'forwardemail',
'documents',
'documentowner',
'mobile',
'sim',
'credit_card'
'transponder_id',
'special_logins',
] ]
} }
} }

View File

@ -4,11 +4,11 @@
Hallo! Hallo!
Es gibt einen Neuzugang bei Wikimedia! Hier ( https://wiki.wikimedia.de/wiki/Onboarding ) kannst Du nachsehen, Es gibt einen Austritt bei Wikimedia! Hier ( https://wiki.wikimedia.de/wiki/Offboarding ) kannst Du nachsehen,
welche Schritte jetzt für Deine Abteilung nötig werden. Im Folgenden alle Daten, welche Schritte jetzt für Deine Abteilung nötig werden. Im Folgenden alle Daten,
die Du dafür brauchst: die Du dafür brauchst:
{% include 'evapp/dataloop.txt' %} {% include 'austritt/dataloop.txt' %}
Wenn Du Fragen hast, melde Dich bei {{contact}}. Wenn Du Fragen hast, melde Dich bei {{contact}}.
@ -18,12 +18,12 @@ Grüße, Deine E.V.A.
{% language 'en' %} {% language 'en' %}
Hi! Hi!
There is a new employee at Wikimedia! Here ( https://wiki.wikimedia.de/wiki/Onboarding ) you can see, which Someone is leaving Wikimedia! Here ( https://wiki.wikimedia.de/wiki/Offboarding/en ) you can see, which
steps are now necessary for your department. steps are now necessary for your department.
All Data you need for this: All Data you need for this:
{% include 'evapp/dataloop.txt' %} {% include 'austritt/dataloop.txt' %}
If you have any questions please write to {{contact}}. If you have any questions please write to {{contact}}.

View File

@ -36,7 +36,7 @@
<h1 style="background-color:red;color:white">{% translate "WARNUNG! Test-MODUS aktiviert. Es werden keine Mails verschickt!" %}</h1> <h1 style="background-color:red;color:white">{% translate "WARNUNG! Test-MODUS aktiviert. Es werden keine Mails verschickt!" %}</h1>
{% endif %} {% endif %}
<h1> <h1>
E (V A) - Austritt, (Veränderung, Austritt)<p> (E V) A - (Eintritt, Veränderung), Austritt<p>
</h1>{% translate "Du bist eingeloggt als" %} {{ user.email }} </h1>{% translate "Du bist eingeloggt als" %} {{ user.email }}
<h2> <h2>
@ -45,11 +45,10 @@
{% translate "Angaben zur Person" %} {% endif %} {% translate "Angaben zur Person" %} {% endif %}
{% if choice == 'IN' %} {% if choice == 'IN' %}
{% if wizard.steps.step1 == 2 %} {% if wizard.steps.step1 == 2 %}
{% translate "Angaben zum neuen Arbeitsverhältnis" %} {% translate "Personal-relevante Angaben" %}
{% elif wizard.steps.step1 == 3 %} {% elif wizard.steps.step1 == 3 %}
{% translate "IT-relevante Angaben" %} {% translate "IT-relevante Angaben" %}
{% elif wizard.steps.step1 == 4 %}
{% translate "Office-relevante Angaben" %}
{% endif %} {% endif %}
{% else %} {% else %}
{% if wizard.steps.step1 == 2 %} {% if wizard.steps.step1 == 2 %}

View File

@ -14,8 +14,7 @@ from django.utils.translation import gettext_lazy as _
from .models import Employee, DEPARTMENT_CHOICES, OS_CHOICES, \ from .models import Employee, DEPARTMENT_CHOICES, OS_CHOICES, \
LANG_CHOICES, ACCOUNT_CHOICES, TRANSPONDER_CHOICES, KEYBOARD_CHOICES, JANEIN_CHOICES LANG_CHOICES, ACCOUNT_CHOICES, TRANSPONDER_CHOICES, KEYBOARD_CHOICES, JANEIN_CHOICES
from .forms import PersonalForm, WorkingForm, ITForm, OfficeForm, DummyForm,\ from .forms import PersonalForm, HRForm, ITForm, DummyForm, TYPE_CHOICES
ChangeForm, TYPE_CHOICES
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):
@ -47,7 +46,7 @@ def change_process(wizard):
class EvaFormView(LoginRequiredMixin, CookieWizardView): class EvaFormView(LoginRequiredMixin, CookieWizardView):
template_name = 'austritt/employee_form.html' template_name = 'austritt/employee_form.html'
form_list = [PersonalForm, WorkingForm, ITForm, OfficeForm, ChangeForm, DummyForm] form_list = [PersonalForm, HRForm, ITForm, DummyForm]
instance = None instance = None
choice = 'IN' choice = 'IN'
@ -90,7 +89,7 @@ class EvaFormView(LoginRequiredMixin, CookieWizardView):
'TESTMODE': testmode}) 'TESTMODE': testmode})
# deliver context for forms if we are in the last step # deliver context for forms if we are in the last step
if (self.steps.step1 == 5 or (self.choice != 'IN' and self.steps.step1 == 3)): if (self.steps.step1 == 4 or (self.choice != 'IN' and self.steps.step1 == 4)):
context.update({'data': self.beautify_data(self.get_all_cleaned_data()), context.update({'data': self.beautify_data(self.get_all_cleaned_data()),
'datatable': True,}) 'datatable': True,})
return context return context
@ -141,26 +140,26 @@ class EvaFormView(LoginRequiredMixin, CookieWizardView):
context = {'data': self.beautify_data(newdata), 'contact': contact} context = {'data': self.beautify_data(newdata), 'contact': contact}
firstname = data['firstname'] firstname = data['firstname']
lastname = data['lastname'] lastname = data['lastname']
firstday = data['firstdate_employment'] lastday = data['lastdate_employment']
try: try:
mail_template = get_template(f'evapp/department_mail.txt') mail_template = get_template(f'austritt/department_mail.txt')
if settings.MAILTEST: if settings.MAILTEST:
send_mail( send_mail(
f'EVA: Neuzugang {firstname} {lastname} {firstday} (MAILTEST)', f'EVA: Austritt {firstname} {lastname} {lastday} (MAILTEST)',
mail_template.render(context), mail_template.render(context),
EVA_MAIL, EVA_MAIL,
[EVA_MAIL], [EVA_MAIL],
fail_silently=False) fail_silently=False)
elif department != "SUBMITTER": elif department != "SUBMITTER":
send_mail( send_mail(
f'EVA: Neuzugang {firstname} {lastname} {firstday}', f'EVA: Austritt {firstname} {lastname} {lastday}',
mail_template.render(context), mail_template.render(context),
EVA_MAIL, EVA_MAIL,
[MAILS[department]['MAIL']], [MAILS[department]['MAIL']],
fail_silently=False) fail_silently=False)
else: else:
send_mail( send_mail(
f'EVA: Neuzugang {firstname} {lastname} {firstday}', f'EVA: Austritt {firstname} {lastname} {lastday}',
mail_template.render(context), mail_template.render(context),
EVA_MAIL, EVA_MAIL,
[contact], [contact],

View File

@ -0,0 +1,18 @@
# Generated by Django 5.2.8 on 2026-01-22 12:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('eintritt', '0007_remove_employee_screen_and_more'),
]
operations = [
migrations.AlterField(
model_name='employee',
name='os',
field=models.CharField(choices=[('FED', 'Fedora (Standard)'), ('WIN', 'Windows (bitte Begründung angeben)'), ('MOS', 'Mac OS (nur wenn Mac gewählt)'), ('UBU', 'Ubuntu (bitte Begründung angeben)')], default='FED', max_length=3, verbose_name='Betriebssystem'),
),
]

View File

@ -20,7 +20,7 @@ DEPARTMENT_CHOICES = {'COENG': _('Communitys & Engagement'),
OS_CHOICES = {'FED': 'Fedora (Standard)', OS_CHOICES = {'FED': 'Fedora (Standard)',
'WIN': _('Windows (bitte Begründung angeben)'), 'WIN': _('Windows (bitte Begründung angeben)'),
'MOS': _('Mac OS (nur wenn Mac gewählt)'), 'MOS': _('Mac OS (nur wenn Mac gewählt)'),
'UBU': _('Ubuntu')} 'UBU': _('Ubuntu (bitte Begründung angeben)')}
LANG_CHOICES = {'GER': 'Deutsch', LANG_CHOICES = {'GER': 'Deutsch',
'ENG': 'English',} 'ENG': 'English',}

View File

@ -59,3 +59,7 @@ MAILS = {
] ]
} }
} }

View File

@ -8,7 +8,7 @@ Es gibt einen Neuzugang bei Wikimedia! Hier ( https://wiki.wikimedia.de/wiki/Onb
welche Schritte jetzt für Deine Abteilung nötig werden. Im Folgenden alle Daten, welche Schritte jetzt für Deine Abteilung nötig werden. Im Folgenden alle Daten,
die Du dafür brauchst: die Du dafür brauchst:
{% include 'evapp/dataloop.txt' %} {% include 'eintritt/dataloop.txt' %}
Wenn Du Fragen hast, melde Dich bei {{contact}}. Wenn Du Fragen hast, melde Dich bei {{contact}}.
@ -23,7 +23,7 @@ steps are now necessary for your department.
All Data you need for this: All Data you need for this:
{% include 'evapp/dataloop.txt' %} {% include 'eintritt/dataloop.txt' %}
If you have any questions please write to {{contact}}. If you have any questions please write to {{contact}}.

View File

@ -143,7 +143,7 @@ class EvaFormView(LoginRequiredMixin, CookieWizardView):
lastname = data['lastname'] lastname = data['lastname']
firstday = data['firstdate_employment'] firstday = data['firstdate_employment']
try: try:
mail_template = get_template(f'evapp/department_mail.txt') mail_template = get_template(f'eintritt/department_mail.txt')
if settings.MAILTEST: if settings.MAILTEST:
send_mail( send_mail(
f'EVA: Neuzugang {firstname} {lastname} {firstday} (MAILTEST)', f'EVA: Neuzugang {firstname} {lastname} {firstday} (MAILTEST)',
@ -174,6 +174,10 @@ class EvaFormView(LoginRequiredMixin, CookieWizardView):
self.instance.delete() self.instance.delete()
return HttpResponse(f'{error}<p>Error in sending mails (propably wrong adress?). Data not saved!') return HttpResponse(f'{error}<p>Error in sending mails (propably wrong adress?). Data not saved!')
except Exception as error: except Exception as error:
print("str:", str(error))
print("repr:", repr(error))
print("type:", type(error))
print(error) print(error)
# self.instance.delete() # self.instance.delete()
return HttpResponse(f'{error}<p>Error in sending mails. Data not saved! Please contact ' + EVA_MAIL) return HttpResponse(f'{error}<p>Error in sending mails. Data not saved! Please contact ' + EVA_MAIL)

View File

@ -166,9 +166,20 @@ STATIC_URL = '/static/'
# settings needed for allauth # settings needed for allauth
SOCIALACCOUNT_PROVIDERS = { SOCIALACCOUNT_PROVIDERS = {
'nextcloud': { 'nextcloud': {
'SERVER': 'https://wolke.wikimedia.de/', # 'SERVER': 'https://wolke.wikimedia.de',
} 'APP': {
'name': 'Wolke',
'client_id': 'uKfMSd1oBqkrNog02ZhsXamXvvXblHYOCfLoNHLcppCQPvlFYoiKKmvdKZf77ZQ2',
'secret': 'CyEBOwjOxgR12POEAEi7FIyusZrMX9d2S7YB0diFMhbw65M06oWKtYyGq0zZJpZE',
'settings': {
'server': 'https://wolke.wikimedia.de/',
# 'server_url': 'https://wolke.wikimedia.de',
},
}
},
} }
SOCIALACCOUNT_ONLY = True
DISABLE_ALLAUTH_LOGIN_URL = True
AUTHENTICATION_BACKENDS = ( AUTHENTICATION_BACKENDS = (
"django.contrib.auth.backends.ModelBackend", "django.contrib.auth.backends.ModelBackend",

View File

@ -17,11 +17,11 @@ from django.contrib import admin
from django.urls import path, include from django.urls import path, include
urlpatterns = [ urlpatterns = [
path('eintritt/', include('eintritt.urls')), path('accounts/', include('allauth.urls')),
path('eintritt/', include('eintritt.urls')),
path('', include("home.urls")), path('', include("home.urls")),
path('austritt/', include("austritt.urls")), path('austritt/', include("austritt.urls")),
path('veraenderung/', include("veraenderung.urls")), path('veraenderung/', include("veraenderung.urls")),
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('accounts/', include('allauth.urls')),
] ]

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
home/static/evapp/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -54,7 +54,7 @@ class Employee(models.Model):
firstname = models.CharField(max_length=50, verbose_name=_("Vorname")) firstname = models.CharField(max_length=50, verbose_name=_("Vorname"))
lastname = models.CharField(max_length=50, verbose_name=_("Nachname")) lastname = models.CharField(max_length=50, verbose_name=_("Nachname"))
# intern = models.BooleanField(verbose_name='Interne_r Mitarbeiter_in?', default=True) # intern = models.BooleanField(verbose_name='Interne_r Mitarbeiter_in?', default=True)
department = models.CharField(max_length=5, choices=DEPARTMENT_CHOICES.items(), verbose_name=_('Bereich')) department = models.CharField(max_length=5, choices=DEPARTMENT_CHOICES.items(), verbose_name=_('neuer Bereich'))
team = models.CharField(max_length=50, null=True, blank=True) # TODO? better with choices? team = models.CharField(max_length=50, null=True, blank=True) # TODO? better with choices?
add_to_wikimediade = models.CharField(max_length=5, choices=JANEIN_CHOICES.items(), verbose_name=_("Soll die Person bei Ansprechpartner*innen auf der WMDE-Webseite mit aufgenommen werden?")) add_to_wikimediade = models.CharField(max_length=5, choices=JANEIN_CHOICES.items(), verbose_name=_("Soll die Person bei Ansprechpartner*innen auf der WMDE-Webseite mit aufgenommen werden?"))

View File

@ -8,7 +8,7 @@ Es gibt einen Neuzugang bei Wikimedia! Hier ( https://wiki.wikimedia.de/wiki/Onb
welche Schritte jetzt für Deine Abteilung nötig werden. Im Folgenden alle Daten, welche Schritte jetzt für Deine Abteilung nötig werden. Im Folgenden alle Daten,
die Du dafür brauchst: die Du dafür brauchst:
{% include 'evapp/dataloop.txt' %} {% include 'veraenderung/dataloop.txt' %}
Wenn Du Fragen hast, melde Dich bei {{contact}}. Wenn Du Fragen hast, melde Dich bei {{contact}}.
@ -23,7 +23,7 @@ steps are now necessary for your department.
All Data you need for this: All Data you need for this:
{% include 'evapp/dataloop.txt' %} {% include 'veraenderung/dataloop.txt' %}
If you have any questions please write to {{contact}}. If you have any questions please write to {{contact}}.

View File

@ -143,7 +143,7 @@ class EvaFormView(LoginRequiredMixin, CookieWizardView):
lastname = data['lastname'] lastname = data['lastname']
firstday = data['firstdate_employment'] firstday = data['firstdate_employment']
try: try:
mail_template = get_template(f'evapp/department_mail.txt') mail_template = get_template(f'veraenderung/department_mail.txt')
if settings.MAILTEST: if settings.MAILTEST:
send_mail( send_mail(
f'EVA: Neuzugang {firstname} {lastname} {firstday} (MAILTEST)', f'EVA: Neuzugang {firstname} {lastname} {firstday} (MAILTEST)',