views.py 5.67 KB
Newer Older
1
from django.utils.translation import gettext_lazy as _
2
3
from django import forms
from django.views.generic import TemplateView, FormView
4
from backend.mixins import VisitorMixin
5
from backend import const
6
7
import backend.models as bmodels
import process.models as pmodels
8
from collections import OrderedDict
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26


class PersonForm(forms.Form):
    person = forms.CharField(label=_("Person"), required=False)


class Advocate(VisitorMixin, FormView):
    template_name = "wizard/advocate.html"
    form_class = PersonForm

    def get_context_data(self, **kw):
        from django.db.models import Q
        ctx = super(Advocate, self).get_context_data(**kw)
        people = None
        processes = None
        if hasattr(ctx["form"], "cleaned_data"):
            person = ctx["form"].cleaned_data["person"]
            if person:
27
                query = (Q(fullname__icontains=person) |
Enrico Zini's avatar
Enrico Zini committed
28
29
30
                         Q(ldap_fields__cn__icontains=person) | Q(ldap_fields__mn__icontains=person) |
                         Q(ldap_fields__sn__icontains=person) | Q(email__icontains=person) |
                         Q(ldap_fields__uid__icontains=person) |
31
32
33
                         Q(fprs__fpr__icontains=person))

                people = OrderedDict()
Enrico Zini's avatar
Enrico Zini committed
34
                for p in bmodels.Person.objects.filter(query).order_by("ldap_fields__uid", "ldap_fields__cn"):
35
36
37
38
                    people[p] = p

            if people:
                processes = OrderedDict()
Enrico Zini's avatar
Enrico Zini committed
39
40
                for process in pmodels.Process.objects.filter(closed_time__isnull=True).order_by(
                        "person__ldap_fields__uid", "person__ldap_fields__cn", "applying_for"):
41
                    person = people.pop(process.person, None)
42
43
                    if person is None:
                        continue
44
45
                    try:
                        processes[process] = process.requirements.get(type="advocate").get_absolute_url()
Enrico Zini's avatar
Enrico Zini committed
46
                    except pmodels.Requirement.DoesNotExist:
47
48
                        processes[process] = None

Enrico Zini's avatar
Enrico Zini committed
49
        ctx["people"] = list(people.keys()) if people else None
50
51
52
53
54
55
        ctx["processes"] = processes
        ctx["wikihelp"] = "https://wiki.debian.org/nm.debian.org/Wizard/Advocate"
        return ctx

    def form_valid(self, form):
        return self.render_to_response(self.get_context_data(form=form))
56
57
58
59
60
61
62
63
64
65
66
67


class NewProcess(VisitorMixin, TemplateView):
    template_name = "wizard/newprocess.html"

    def get_context_data(self, **kw):
        ctx = super(NewProcess, self).get_context_data(**kw)
        target = self.kwargs["applying_for"]
        comments = []
        allowed = False

        if target == "dm":
68
            target_desc = _("Become Debian Maintainer")
69
        elif target == "ga":
70
            target_desc = _("Request guest account")
71
        elif target == "return":
72
            target_desc = _("Return from Emeritus")
73
        elif target in const.ALL_STATUS_DESCS:
74
            target_desc = _("Become {status}").format(status=const.ALL_STATUS_DESCS_WITH_PRONOUN[target])
75
        else:
76
            target_desc = _("Invalid")
77

78
79
        if self.request.user.is_authenticated:
            whitelist = self.request.user.possible_new_statuses
80
            if target == "dm":
81
                if self.request.user.status in (const.STATUS_DM, const.STATUS_DM_GA):
82
                    comments.append(_("You are already a Debian Maintainer: problem solved!"))
83
                elif self.request.user.status not in (const.STATUS_DC, const.STATUS_DC_GA):
84
85
                    comments.append(_("You are already {status}.").format(
                        status=const.ALL_STATUS_DESCS_WITH_PRONOUN[self.request.user.status]))
86
87
88
                else:
                    allowed = const.STATUS_DM in whitelist or const.STATUS_DM_GA in whitelist
                    if not allowed:
Enrico Zini's avatar
Enrico Zini committed
89
90
                        comments.append(
                                _("You cannot start a new process for Debian Maintainer. Did you already start one?"))
91
            elif target == "ga":
92
                if self.request.user.status not in (const.STATUS_DC, const.STATUS_DM):
93
94
                    comments.append(_("As {status}, you should already have access to porter machines.").format(
                        status=const.ALL_STATUS_DESCS_WITH_PRONOUN[self.request.user.status]))
95
                else:
Enrico Zini's avatar
Enrico Zini committed
96
                    allowed = const.STATUS_DC_GA in whitelist or const.STATUS_DM_GA in whitelist
97
                    if not allowed:
98
                        comments.append(_("You cannot request a guest account. Did you already request it?"))
99
            elif target == "return":
100
                if self.request.user.status != const.STATUS_EMERITUS_DD:
101
102
                    comments.append(_("You seem to be {status}, not an Emeritus DD.").format(
                        status=const.ALL_STATUS_DESCS_WITH_PRONOUN[self.request.user.status]))
103
104
                else:
                    allowed = True
105
            elif target not in const.ALL_STATUS_DESCS:
106
                comments.append(_("{status} is not a valid status.").format(status=target))
107
            else:
108
                if target == self.request.user.status:
109
110
                    comments.append(_("You are already {status}: problem solved!").format(
                        status=const.ALL_STATUS_DESCS_WITH_PRONOUN[target]))
111
112
113
                else:
                    allowed = target in whitelist
                    if not allowed:
114
                        comments.append(_("You are currently {0} and you cannot become {1}.").format(
115
                            const.ALL_STATUS_DESCS_WITH_PRONOUN[self.request.user.status],
Chris Lamb's avatar
Chris Lamb committed
116
                            const.ALL_STATUS_DESCS_WITH_PRONOUN[target]))
117
118
119
120
121

        ctx["comments"] = comments
        ctx["allowed"] = allowed
        ctx["target_desc"] = target_desc
        return ctx