• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

d120 / pyfeedback / 11998572299

24 Nov 2024 06:28PM UTC coverage: 89.276% (+0.04%) from 89.239%
11998572299

Pull #317

github

joachimschmidt557
add missing js imports to veranstalter/dashboard.html

This fixes the language dropdown not working in the dashboard
Pull Request #317: Internationalization for pyfeedback

107 of 127 new or added lines in 8 files covered. (84.25%)

1 existing line in 1 file now uncovered.

2564 of 2872 relevant lines covered (89.28%)

0.89 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

88.41
/src/feedback/admin.py
1
# coding=utf-8
2

3
from django.contrib import admin
1✔
4
from django import forms
1✔
5
from django.http.response import HttpResponseRedirect
1✔
6
from django.shortcuts import render
1✔
7
from django.utils.translation import gettext_lazy as _
1✔
8

9
from feedback.models import Person, Veranstaltung, Semester, \
1✔
10
    Mailvorlage, Kommentar, Tutor, BarcodeScanner, BarcodeScannEvent, BarcodeAllowedState, \
11
    EmailEndung, Fragebogen2020, FragebogenUE2020, Ergebnis2020, Fragebogen2016, FragebogenUE2016, Ergebnis2016
12
from feedback.models.base import Log, Fachgebiet, FachgebietEmail
1✔
13

14

15
class PersonAdmin(admin.ModelAdmin):
1✔
16
    """Admin View für Personen"""
17
    list_display = ('__str__', 'email', 'fachgebiet')
1✔
18
    search_fields = ['vorname', 'nachname', 'email', ]
1✔
19
    list_filter = ('fachgebiet',)
1✔
20

21
    class FachgebietZuweisenForm(forms.Form):
1✔
22
        """Form für die Zuweisung von einem Fachgebiet für eine Person."""
23
        _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
1✔
24

25
    def assign_fachgebiet_action(self, request, queryset):
1✔
26
        """Definiert eine Admin-Action für die Fachgebietzuweisung."""
27
        form = None
1✔
28
        suggestion_list = []
1✔
29

30
        for p in queryset:
1✔
31
            proposed_fachgebiet = Fachgebiet.get_fachgebiet_from_email(p.email)
1✔
32
            suggestion_list.append((p, proposed_fachgebiet))
1✔
33

34
        if any(s in request.POST for s in ('apply', 'save')):
1✔
35
            form = self.FachgebietZuweisenForm(request.POST)
1✔
36

37
            if form.is_valid():
1✔
38
                selected_persons = request.POST.getlist("selectedPerson")
1✔
39
                for person in queryset:
1✔
40
                    person_id_str = str(person.id)
1✔
41
                    if person_id_str in selected_persons:
1✔
42
                        proposed_fachgebiet_id = request.POST.get("fachgebiet_" + person_id_str, 0)
1✔
43
                        if int(proposed_fachgebiet_id) > 0:
1✔
44
                            proposed_fachgebiet = Fachgebiet.objects.get(id=proposed_fachgebiet_id)
1✔
45
                            person.fachgebiet = proposed_fachgebiet
1✔
46
                            person.save()
1✔
47
                            suggestion_list = [(x, y) for x, y in suggestion_list if x is not person]
1✔
48

49
                self.message_user(request, _("Fachgebiete erfolgreich zugewiesen."))
1✔
50

51
                if ('save' in request.POST) or not suggestion_list:
1✔
52
                    return HttpResponseRedirect(request.get_full_path())
1✔
53

54
        if not form:
1✔
55
            form = self.FachgebietZuweisenForm(initial={
1✔
56
                '_selected_action': queryset.values_list('id', flat=True)
57
            })
58

59
        return render(request, 'admin/fachgebiet.html', {'data': suggestion_list, 'fachgebiet': form, })
1✔
60

61
    assign_fachgebiet_action.short_description = _("Einem Fachgebiet zuweisen")
1✔
62
    actions = [assign_fachgebiet_action]
1✔
63

64

65
class LogInline(admin.TabularInline):
1✔
66
    """Admin View für Log"""
67
    model = Log
1✔
68
    readonly_fields = ('veranstaltung', 'user', 'scanner', 'timestamp', 'status', 'interface')
1✔
69
    can_delete = False
1✔
70

71
    def has_add_permission(self, request, obj=None):
1✔
72
        return False
×
73

74

75
class VeranstaltungAdmin(admin.ModelAdmin):
1✔
76
    """Admin View für Veranstaltung"""
77
    fieldsets = [
1✔
78
        (_('Stammdaten'), {'fields':
79
                        ['typ', 'name', 'semester', 'status', 'lv_nr', 'grundstudium', 'evaluieren',
80
                         'veranstalter', 'link_veranstalter',
81
                         ]}),
82
        (_('Bestellung'), {'fields': ['sprache', 'anzahl', 'digitale_eval', 'digitale_eval_type', 'verantwortlich', 'ergebnis_empfaenger', 'primaerdozent',
83
                                   'auswertungstermin', 'freiefrage1', 'freiefrage2', 'kleingruppen', ]}),
84
    ]
85
    list_display = ('typ', 'name', 'semester', 'grundstudium', 'evaluieren', 'anzahl',
1✔
86
                    'sprache', 'status', 'veranstalter_list', 'digitale_eval', 'auswertungstermin')
87
    list_display_links = ['name']
1✔
88
    list_filter = ('typ', 'semester', 'status', 'grundstudium', 'evaluieren', 'sprache', 'digitale_eval', 'digitale_eval_type')
1✔
89
    search_fields = ['name']
1✔
90
    filter_horizontal = ('veranstalter', 'ergebnis_empfaenger')  # @see http://stackoverflow.com/a/5386871
1✔
91
    readonly_fields = ('link_veranstalter',)
1✔
92
    inlines = [LogInline, ]
1✔
93

94
    def save_model(self, request, obj, form, change):
1✔
95
        """Definiert eine Post-Save Operation."""
96
        super(VeranstaltungAdmin, self).save_model(request, obj, form, change)
×
97
        for changed_att in form.changed_data:
×
98
            # Wenn sich der Status ändert, wird es geloggt.
99
            if changed_att == "status":
×
100
                obj.log(request.user)
×
101

102
    class StatusAendernForm(forms.Form):
1✔
103
        """Definiert eine Form für Änderung einen Status'."""
104
        _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
1✔
105
        status = forms.ChoiceField(choices=Veranstaltung.STATUS_CHOICES)
1✔
106

107
    def status_aendern_action(self, request, queryset):
1✔
108
        """Beschreibt eine Admin-Action für die Statusänderung."""
109
        form = None
1✔
110

111
        if 'apply' in request.POST:
1✔
112
            form = self.StatusAendernForm(request.POST)
1✔
113

114
            if form.is_valid():
1✔
115
                status = form.cleaned_data['status']
1✔
116

117
                queryset.update(status=status)
1✔
118
                for veranstaltung in queryset:
1✔
119
                    veranstaltung.log(request.user)
1✔
120

121
                self.message_user(request, _("Status erfolgreich geändert."))
1✔
122
                return HttpResponseRedirect(request.get_full_path())
1✔
123

124
        if not form:
1✔
125
            form = self.StatusAendernForm(initial={'_selected_action': queryset.values_list('id', flat=True)})
1✔
126

127
        return render(request, 'admin/status_aendern.html', {'veranstaltungen': queryset, 'status': form, })
1✔
128

129
    status_aendern_action.short_description = _("Ändere den Status einer Veranstaltung")
1✔
130

131
    class KeineEvaluationForm(forms.Form):
1✔
132
        _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
1✔
133

134
    def keine_evaluation_action(self, request, queryset):
1✔
135
        """Beschreibt eine Admin-Action für die Option keine Evaluation."""
136
        form = None
×
137

138
        # Dieser Teil reicht bereits zum ändern aus. In diesem Fall können auch Zeile 146-149 gelöscht werden (Kein Bestätigungsfenster erscheint.
139
        if 'apply' in request.POST:
×
140
            queryset.update(status=Veranstaltung.STATUS_KEINE_EVALUATION_FINAL)
×
141
            queryset.update(evaluieren=False)
×
142
            for veranstaltung in queryset:
×
143
                veranstaltung.log(request.user)
×
144

NEW
145
            self.message_user(request, _("Veranstaltungen wurden erfolgreich auf Keine Evaluation gesetzt."))
×
146
            return HttpResponseRedirect(request.get_full_path())
×
147
            # nach dem return landet Python in status_aendern_action
148
        if not form:
×
149
            form = self.KeineEvaluationForm(initial={'_selected_action': queryset.values_list('id', flat=True)})
×
150
        return render(request, 'admin/keine_evaluation.html', {'veranstaltungen': queryset, 'status': form, })
×
151

152
    keine_evaluation_action.short_description = _("Keine Evaluation für diese Veranstaltung(en)")
1✔
153

154
    actions = [status_aendern_action, keine_evaluation_action]
1✔
155

156

157
class SemesterAdmin(admin.ModelAdmin):
1✔
158
    """Admin View für Semester"""
159
    list_display = ('__str__', 'sichtbarkeit', 'fragebogen')
1✔
160
    list_filter = ('sichtbarkeit', 'fragebogen')
1✔
161
    ordering = ('-semester',)
1✔
162

163

164
class MailvorlageAdmin(admin.ModelAdmin):
1✔
165
    """Admin View für Mailvorlage"""
166
    list_display = ('subject',)
1✔
167

168

169
class KommentarAdmin(admin.ModelAdmin):
1✔
170
    """Admin View für Kommentar"""
171
    list_display = ('typ', 'name', 'semester', 'autor')
1✔
172
    list_display_links = ('name',)
1✔
173

174

175
class TutorAdmin(admin.ModelAdmin):
1✔
176
    """Admin View für Tutor"""
177
    fieldsets = [
1✔
178
        (_('Stammdaten'), {'fields':
179
                        ['vorname', 'nachname', 'email',
180
                         ]}),
181
        (_('Lehrveranstaltung'), {'fields':
182
                               ['veranstaltung', 'nummer', 'anmerkung'
183
                                ]}),
184
    ]
185
    list_display = ('vorname', 'nachname', 'nummer', 'veranstaltung')
1✔
186
    search_fields = ('vorname', 'nachname')
1✔
187
    ordering = ('veranstaltung', 'nummer')
1✔
188

189
    def render_change_form(self, request, context, *args, **kwargs):
1✔
190
        # Limit Auswahl zum aktuellen Semester
191
        context['adminform'].form.fields['veranstaltung'].queryset = Veranstaltung.objects.filter(
×
192
            semester=Semester.current())
193
        return super(TutorAdmin, self).render_change_form(request, context, args, kwargs)
×
194

195

196
class BarcodeScannEventAdmin(admin.ModelAdmin):
1✔
197
    """Admin View für BarcodeScannEvent"""
198
    list_display = ('veranstaltung', 'timestamp',)
1✔
199
    readonly_fields = ('veranstaltung', 'timestamp',)
1✔
200

201

202
class BarcodeAllowedStateInline(admin.TabularInline):
1✔
203
    """Admin View für BarcodeAllowedState"""
204
    model = BarcodeAllowedState
1✔
205

206

207
class BarcodeScannerAdmin(admin.ModelAdmin):
1✔
208
    """Admin View für BarcodeScanner"""
209
    inlines = [
1✔
210
        BarcodeAllowedStateInline,
211
    ]
212
    list_display = ('token', 'description')
1✔
213

214

215
class FachgebietEmailAdminInline(admin.TabularInline):
1✔
216
    """Admin View für FachgebietEmail"""
217
    model = FachgebietEmail
1✔
218
    extra = 1
1✔
219

220

221
class FachgebietDomainAdminInline(admin.TabularInline):
1✔
222
    model = EmailEndung
1✔
223
    extra = 1
1✔
224

225

226
class FachgebietAdmin(admin.ModelAdmin):
1✔
227
    """Admin View für Fachgebiet"""
228
    list_display = ('name', 'kuerzel')
1✔
229
    list_display_links = ('name',)
1✔
230
    inlines = (FachgebietEmailAdminInline, FachgebietDomainAdminInline,)
1✔
231

232
    def save_related(self, request, form, formsets, change):
1✔
233
        super().save_related(request, form, formsets, change)
1✔
234
        if change:
1✔
235
            count_added = 0
1✔
236
            if EmailEndung.objects.filter(fachgebiet=form.instance).count() != 0:
1✔
237
                persons = Person.objects.filter(fachgebiet=None)
1✔
238
                for person in persons:
1✔
239
                    if not person.email:
1✔
240
                        continue
×
241
                    proposed_fachgebiet = Fachgebiet.get_fachgebiet_from_email(person.email)
1✔
242
                    if proposed_fachgebiet \
1✔
243
                            and proposed_fachgebiet.id == form.instance.id:
244
                        person.fachgebiet = proposed_fachgebiet
1✔
245
                        person.save()
1✔
246
                        count_added += 1
1✔
247
            if count_added > 0:
1✔
248
                self.message_user(request, _("Dieses Fachgebiet wurde {count_added} Personen zugeordnet").format(count_added=count_added))
1✔
249

250

251
class FragebogenAdmin(admin.ModelAdmin):
1✔
252
    """Admin View für Ergebnis2020"""
253
    list_display = ('veranstaltung',)
1✔
254
    list_per_page = 500
1✔
255

256

257
admin.site.register(Person, PersonAdmin)
1✔
258
admin.site.register(Veranstaltung, VeranstaltungAdmin)
1✔
259
admin.site.register(Semester, SemesterAdmin)
1✔
260
admin.site.register(Fragebogen2020, FragebogenAdmin)
1✔
261
admin.site.register(FragebogenUE2020, FragebogenAdmin)
1✔
262
admin.site.register(Ergebnis2020, FragebogenAdmin)
1✔
263
admin.site.register(Fragebogen2016, FragebogenAdmin)
1✔
264
admin.site.register(FragebogenUE2016, FragebogenAdmin)
1✔
265
admin.site.register(Ergebnis2016, FragebogenAdmin)
1✔
266
admin.site.register(Mailvorlage, MailvorlageAdmin)
1✔
267
admin.site.register(Kommentar, KommentarAdmin)
1✔
268
admin.site.register(Tutor, TutorAdmin)
1✔
269
admin.site.register(BarcodeScannEvent, BarcodeScannEventAdmin)
1✔
270
admin.site.register(BarcodeScanner, BarcodeScannerAdmin)
1✔
271
admin.site.register(Fachgebiet, FachgebietAdmin)
1✔
272
admin.site.register(EmailEndung)
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc