diff --git a/input/admin.py b/input/admin.py
index 4057fc7..7da1e6f 100755
--- a/input/admin.py
+++ b/input/admin.py
@@ -3,8 +3,20 @@ import csv
from django.contrib import admin
from django.http import HttpResponse
-from .models import Account, Project, HonoraryCertificate, Library, IFG, Travel,\
- Email, BusinessCard, List, Literature
+from .models import (
+ Account,
+ Project,
+ HonoraryCertificate,
+ Library,
+ ELiterature,
+ Software,
+ IFG,
+ Travel,
+ Email,
+ BusinessCard,
+ List,
+ Literature,
+)
def export_as_csv(self, request, queryset):
@@ -78,7 +90,8 @@ class HonoraryCertificateAdmin(admin.ModelAdmin):
class Media:
js = ('dropdown/js/otrs_link.js',)
-@admin.register(Library)
+
+@admin.register(Library, ELiterature, Software)
class LibraryAdmin(admin.ModelAdmin):
save_as = True
search_fields = ('realname', 'service_id', 'granted', 'granted_date')
@@ -86,6 +99,21 @@ class LibraryAdmin(admin.ModelAdmin):
list_display_links = ('realname', 'service_id')
date_hierarchy = 'granted_date'
readonly_fields = ['service_id']
+ exclude = ['type']
+
+ def get_queryset(self, request):
+ return super().get_queryset(request).filter(type=self.model.TYPE)
+
+ def formfield_for_dbfield(self, db_field, request, **kwargs):
+ if db_field.name == 'library':
+ kwargs['label'] = self.model.LIBRARY_LABEL
+ kwargs['help_text'] = self.model.LIBRARY_HELP_TEXT
+
+ elif db_field.name == 'duration':
+ kwargs['help_text'] = self.model.DURATION_HELP_TEXT
+
+ return super().formfield_for_dbfield(db_field, request, **kwargs)
+
@admin.register(IFG)
class IFGAdmin(admin.ModelAdmin):
diff --git a/input/forms.py b/input/forms.py
index 3a58720..c592656 100755
--- a/input/forms.py
+++ b/input/forms.py
@@ -1,13 +1,25 @@
from django.conf import settings
-from django.forms import ModelForm, DateField, ChoiceField, RadioSelect, BooleanField
+from django.forms import ModelForm, ChoiceField, RadioSelect, BooleanField
from django.contrib.admin.widgets import AdminDateWidget
from django.utils.html import format_html
from django.utils.safestring import mark_safe
-from .models import Project, Volunteer, ConcreteVolunteer, Extern, ConcreteExtern, IFG, Library, TYPE_CHOICES,\
- HonoraryCertificate, Travel, Email, Literature, List,\
- BusinessCard
-
+from .models import (
+ TYPE_CHOICES,
+ Project,
+ ConcreteVolunteer,
+ ConcreteExtern,
+ IFG,
+ Library,
+ ELiterature,
+ Software,
+ HonoraryCertificate,
+ Travel,
+ Email,
+ Literature,
+ List,
+ BusinessCard,
+)
class FdbForm(ModelForm):
@@ -89,6 +101,7 @@ class TravelForm(FdbForm):
'all': ('css/dateFieldNoNowShortcutInTravels.css',)
}
+
class LibraryForm(FdbForm):
class Meta:
@@ -96,6 +109,26 @@ class LibraryForm(FdbForm):
fields = ['cost', 'library', 'duration', 'notes', 'survey_mail_send']
exclude = ['intern_notes', 'survey_mail_send', 'mail_state']
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+
+ self.fields['library'].label = self._meta.model.LIBRARY_LABEL
+ self.fields['library'].help_text = self._meta.model.LIBRARY_HELP_TEXT
+ self.fields['duration'].help_text = self._meta.model.DURATION_HELP_TEXT
+
+
+class ELiteratureForm(LibraryForm):
+
+ class Meta(LibraryForm.Meta):
+ model = ELiterature
+
+
+class SoftwareForm(LibraryForm):
+
+ class Meta(LibraryForm.Meta):
+ model = Software
+
+
class HonoraryCertificateForm(FdbForm):
class Meta:
diff --git a/input/migrations/0098_add_eliterature_and_software_proxies.py b/input/migrations/0098_add_eliterature_and_software_proxies.py
new file mode 100644
index 0000000..78b9cca
--- /dev/null
+++ b/input/migrations/0098_add_eliterature_and_software_proxies.py
@@ -0,0 +1,40 @@
+# Generated by Django 5.2.5 on 2025-08-20 10:01
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('input', '0097_alter_realname_and_username'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='ELiterature',
+ fields=[
+ ],
+ options={
+ 'proxy': True,
+ 'indexes': [],
+ 'constraints': [],
+ },
+ bases=('input.library',),
+ ),
+ migrations.CreateModel(
+ name='Software',
+ fields=[
+ ],
+ options={
+ 'proxy': True,
+ 'indexes': [],
+ 'constraints': [],
+ },
+ bases=('input.library',),
+ ),
+ migrations.AlterField(
+ model_name='library',
+ name='type',
+ field=models.CharField(choices=[('BIB', 'Bibliotheksstipendium'), ('ELIT', 'eLiteraturstipendium'), ('SOFT', 'Softwarestipendium')], default='BIB', max_length=4),
+ ),
+ ]
diff --git a/input/models.py b/input/models.py
index f4da70e..c0a8949 100755
--- a/input/models.py
+++ b/input/models.py
@@ -279,18 +279,44 @@ LIBRARY_TYPE_CHOICES = [(choice, TYPE_CHOICES[choice]) for choice in LIBRARY_TYP
# same model is used for Library, ELitStip and Software!
class Library(Grant):
+ TYPE = TYPE_BIB
+ LIBRARY_LABEL = 'Bibliothek'
+ LIBRARY_HELP_TEXT = 'Für welche Bibliothek gilt das Stipendium?'
+ DURATION_HELP_TEXT = mark_safe('In welchem Zeitraum möchtest du recherchieren oder
wie lange ist der Bibliotheksausweis gültig?')
- type = models.CharField(
- max_length=4,
- choices=LIBRARY_TYPE_CHOICES,
- default='BIB',
- )
+ type = models.CharField(max_length=4, choices=LIBRARY_TYPE_CHOICES, default=TYPE_BIB)
library = models.CharField(max_length=200)
duration = models.CharField(max_length=100, verbose_name="Dauer")
intern_notes = models.TextField(max_length=1000, blank=True, verbose_name="interne Anmerkungen")
+
def __str__(self):
return self.library
+ def save(self, **kwargs):
+ self.type = self.TYPE
+
+ return super().save(**kwargs)
+
+
+class ELiterature(Library):
+ TYPE = TYPE_ELIT
+ LIBRARY_LABEL = 'Datenbank/Online-Ressource'
+ LIBRARY_HELP_TEXT = 'Für welche Datenbank/Online-Ressource gilt das Stipendium?'
+ DURATION_HELP_TEXT = 'Wie lange gilt der Zugang?'
+
+ class Meta:
+ proxy = True
+
+
+class Software(Library):
+ TYPE = TYPE_SOFT
+ LIBRARY_LABEL = 'Software'
+ LIBRARY_HELP_TEXT = 'Für welche Software gilt das Stipendium?'
+ DURATION_HELP_TEXT = 'Wie lange gilt die Lizenz?'
+
+ class Meta:
+ proxy = True
+
SELFBUY_CHOICES = {'TRUE': mark_safe('Ich möchte das Werk selbst kaufen und per Kostenerstattung bei Wikimedia Deutschland abrechnen.'),
'FALSE': mark_safe('Ich möchte, dass Wikimedia Deutschland das Werk für mich kauft'),
@@ -394,3 +420,16 @@ class BusinessCard(Extern):
default='', help_text="Bitte gib den Namen und die vollständige Adresse ein, an welche die Visitenkarten geschickt werden sollen.")
send_data_to_print = models.BooleanField(default=False, verbose_name=mark_safe('Datenweitergabe erlauben'), help_text=mark_safe('Hiermit erlaube ich die Weitergabe meiner Daten (Name, Postadresse) an den von Wikimedia
Deutschland ausgewählten Dienstleister (z. B. wir-machen-druck.de) zum Zwecke des direkten
Versands der Druckerzeugnisse an mich.'))
intern_notes = models.TextField(max_length=1000, blank=True, verbose_name="interne Anmerkungen")
+
+
+MODELS = {
+ TYPE_BIB: Library,
+ TYPE_ELIT: ELiterature,
+ TYPE_MAIL: Email,
+ TYPE_IFG: IFG,
+ TYPE_LIT: Literature,
+ TYPE_LIST: List,
+ TYPE_TRAV: Travel,
+ TYPE_SOFT: Software,
+ TYPE_VIS: BusinessCard,
+}
diff --git a/input/views.py b/input/views.py
index 213ecb5..ece0b5e 100755
--- a/input/views.py
+++ b/input/views.py
@@ -11,28 +11,37 @@ from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin
-from .forms import ProjectForm, ExternForm, LibraryForm, IFGForm, LiteratureForm,\
- HonoraryCertificateForm, InternForm, TravelForm, EmailForm,\
- ListForm, BusinessCardForm, INTERN_CHOICES
-from .models import Project, TYPE_CHOICES, Library, Literature, Travel, IFG, BusinessCard, Email, List
+from .forms import (
+ INTERN_CHOICES,
+ ProjectForm,
+ ExternForm,
+ LibraryForm,
+ ELiteratureForm,
+ SoftwareForm,
+ IFGForm,
+ LiteratureForm,
+ HonoraryCertificateForm,
+ InternForm,
+ TravelForm,
+ EmailForm,
+ ListForm,
+ BusinessCardForm,
+)
+from .models import TYPE_CHOICES, MODELS, TYPE_BIB, TYPE_ELIT, TYPE_SOFT
-def auth_deny(choice,pk,auth):
- if choice in ('BIB', 'ELIT', 'SOFT'):
- Library.set_granted(pk,auth)
- elif choice == 'LIT':
- Literature.set_granted(pk,auth)
- elif choice == 'IFG':
- IFG.set_granted(pk,auth)
- elif choice == 'TRAV':
- Travel.set_granted(pk,auth)
- elif choice == 'VIS':
- BusinessCard.set_granted(pk,auth)
- elif choice == 'MAIL':
- Email.set_granted(pk,auth)
- elif choice == 'LIST':
- List.set_granted(pk,auth)
- else:
+LIBRARY_FORMS = {
+ TYPE_BIB: LibraryForm,
+ TYPE_ELIT: ELiteratureForm,
+ TYPE_SOFT: SoftwareForm,
+}
+
+
+def auth_deny(choice, pk, auth):
+ if choice not in MODELS:
return HttpResponse(f'ERROR! UNKNOWN CHOICE TYPE! {choice}')
+
+ MODELS[choice].set_granted(pk, auth)
+
return False
@login_required
@@ -138,23 +147,6 @@ class InternView(LoginRequiredMixin, CookieWizardView): # pragma: no cover
return done(self.request)
-# 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': mark_safe('Bibliothek'),
- 'ELIT': mark_safe('Datenbank/Online-Ressource'),
- 'MAIL': mark_safe('E-Mail-Adresse'),
- 'IFG': mark_safe('Kostenübernahme IFG-Anfrage'),
- 'LIT': mark_safe('Literaturstipendium'),
- 'LIST': mark_safe('Mailingliste'),
- 'TRAV': mark_safe('Reisekosten'),
- 'SOFT': mark_safe('Software'),
- 'VIS': mark_safe('Visitenkarten'),
- }
-
-HELP_CHOICES = {'BIB': mark_safe("In welchem Zeitraum möchtest du recherchieren oder
wie lange ist der Bibliotheksausweis gültig?"),
- 'ELIT': "Wie lange gilt der Zugang?",
- 'SOFT': "Wie lange gilt die Lizenz?",
- }
class ExternView(CookieWizardView):
'''This View is for Volunteers'''
@@ -177,11 +169,8 @@ class ExternView(CookieWizardView):
if choice == 'IFG':
form = IFGForm(data)
form.fields['notes'].help_text = mark_safe("Bitte gib an, wie die gewonnenen Informationen den
Wikimedia-Projekten zugute kommen sollen.")
- elif choice in ('BIB', 'SOFT', 'ELIT'):
- form = LibraryForm(data)
- form.fields['library'].label = LABEL_CHOICES[choice]
- form.fields['library'].help_text = f"Für welche {LABEL_CHOICES[choice]} gilt das Stipendium?"
- form.fields['duration'].help_text = HELP_CHOICES[choice]
+ elif choice in LIBRARY_FORMS:
+ form = LIBRARY_FORMS[choice](data)
elif choice == 'MAIL':
form = EmailForm(data)
form.fields['domain'].help_text = mark_safe("Mit welcher Domain, bzw. für welches Wikimedia-Projekt,
möchtest du eine Mailadresse beantragen?")