summaryrefslogtreecommitdiff
path: root/postgresqleu/confsponsor/admin.py
blob: e6372c39fd26b1ab45453004b14bc0659ff9f9ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
from django.contrib import admin
from django.http import HttpResponseRedirect
from django.forms.models import BaseInlineFormSet
from django.urls import reverse
from django.utils.safestring import mark_safe

from postgresqleu.util.forms import ConcurrentProtectedModelForm

from .models import SponsorshipContract, SponsorshipLevel, Sponsor
from .models import SponsorshipBenefit, SponsorClaimedBenefit

from .benefits import get_benefit_class


class SponsorshipBenefitInlineFormset(BaseInlineFormSet):
    def clean(self):
        for f in self.forms:
            if f.cleaned_data.get('benefit_class') >= 0:
                params = f.cleaned_data.get('class_parameters')
                benefit = get_benefit_class(f.cleaned_data.get('benefit_class'))(self.instance, params)
                if not params:
                    f.cleaned_data['class_parameters'] = {}
                    f.instance.class_parameters = {}
                    params = {}


class SponsorshipBenefitInline(admin.TabularInline):
    model = SponsorshipBenefit
    extra = 1
    formset = SponsorshipBenefitInlineFormset


class SponsorshipLevelForm(ConcurrentProtectedModelForm):
    class Meta:
        model = SponsorshipLevel
        exclude = []

    def __init__(self, *args, **kwargs):
        super(SponsorshipLevelForm, self).__init__(*args, **kwargs)
        self.fields['paymentmethods'].label_from_instance = lambda x: x.internaldescription


class SponsorshipLevelAdmin(admin.ModelAdmin):
    list_filter = ['conference', ]
    list_display = ['levelname', 'conference', ]
    inlines = [SponsorshipBenefitInline, ]
    actions = ['copy_sponsorshiplevel', ]
    form = SponsorshipLevelForm

    def copy_sponsorshiplevel(self, request, queryset):
        source_level = queryset.all()
        if len(source_level) != 1:
            raise Exception("Must copy exactly one level at a time!")

        return HttpResponseRedirect("/admin/django/confsponsor/sponsorshiplevel/{0}/copy".format(source_level[0].id))
    copy_sponsorshiplevel.short_description = "Copy sponsorship level"


class SponsorAdminForm(ConcurrentProtectedModelForm):
    def __init__(self, *args, **kwargs):
        super(SponsorAdminForm, self).__init__(*args, **kwargs)
        if 'instance' in kwargs:
            self.fields['level'].queryset = SponsorshipLevel.objects.filter(conference=self.instance.conference)
        else:
            self.fields['level'].queryset = SponsorshipLevel.objects.all().order_by('-conference__startdate', 'levelcost')
            self.fields['level'].label_from_instance = lambda x: "%s: %s" % (x.conference, x)


class SponsorClaimedBenefitInline(admin.TabularInline):
    model = SponsorClaimedBenefit
    extra = 0
    can_delete = False
    max_num = 0


class LevelListFilter(admin.SimpleListFilter):
    title = 'Level'
    parameter_name = 'level'

    def lookups(self, request, model_admin):
        cid = request.GET.get('conference__id__exact', -1)
        if int(cid) >= 0:
            return ((level.id, level.levelname) for level in SponsorshipLevel.objects.filter(conference__id=cid))

    def queryset(self, request, queryset):
        if self.value():
            return queryset.filter(level__id=self.value())


class SponsorAdmin(admin.ModelAdmin):
    exclude = ('invoice', )
    readonly_fields = ('invoice_link', )
    form = SponsorAdminForm
    inlines = [SponsorClaimedBenefitInline, ]
    list_filter = ['conference', LevelListFilter, ]
    list_display = ['name', 'level', 'conference', ]
    autocomplete_fields = ('managers', )

    def invoice_link(self, inst):
        if inst.invoice:
            url = reverse('admin:invoices_invoice_change', args=(inst.invoice.id,))
            return mark_safe('<a href="%s">%s</a>' % (url, inst.invoice))
        else:
            return ""
    invoice_link.short_description = 'Invoice'


class SponsorshipContractAdminForm(ConcurrentProtectedModelForm):
    exclude_fields_from_validation = ['contractpdf', ]

    class Meta:
        model = SponsorshipContract
        exclude = []


class SponsorshipContractAdmin(admin.ModelAdmin):
    form = SponsorshipContractAdminForm


admin.site.register(SponsorshipContract, SponsorshipContractAdmin)
admin.site.register(SponsorshipLevel, SponsorshipLevelAdmin)
admin.site.register(Sponsor, SponsorAdmin)