source: asadb/forms/views.py @ ea42397

space-accessstablestagetest-hooks
Last change on this file since ea42397 was ea42397, checked in by Alex Dehnert <adehnert@…>, 14 years ago

Add view to show who has already submitted

  • Property mode set to 100644
File size: 13.2 KB
Line 
1import forms.models
2import groups.models
3import settings
4
5from django.contrib.auth.decorators import user_passes_test, login_required
6from django.views.generic import list_detail, ListView, DetailView
7from django.shortcuts import render_to_response, get_object_or_404
8from django.template import RequestContext
9from django.template import Context, Template
10from django.template.loader import get_template
11from django.http import Http404, HttpResponseRedirect
12from django.core.urlresolvers import reverse
13from django.core.mail import EmailMessage, mail_admins
14from django.forms import Form
15from django.forms import ModelForm
16from django.forms import ModelChoiceField, ModelMultipleChoiceField
17from django.db.models import Q, Count
18
19import datetime
20
21#################
22# GENERIC VIEWS #
23#################
24
25class SelectGroupForm(Form):
26    group = ModelChoiceField(queryset=groups.models.Group.objects.all())
27    def __init__(self, *args, **kwargs):
28        queryset = None
29        if 'queryset' in kwargs:
30            queryset = kwargs['queryset']
31            del kwargs['queryset']
32        super(SelectGroupForm, self).__init__(*args, **kwargs)
33        if queryset is not None:
34            self.fields["group"].queryset = queryset
35
36def select_group(request, url_name_after, pagename='homepage', queryset=None, ):
37    if request.method == 'POST': # If the form has been submitted...
38        # A form bound to the POST data
39        form = SelectGroupForm(request.POST, queryset=queryset, )
40        if form.is_valid(): # All validation rules pass
41            group = form.cleaned_data['group'].id
42            return HttpResponseRedirect(reverse(url_name_after, args=[group],)) # Redirect after POST
43    else:
44        form = SelectGroupForm(queryset=queryset, ) # An unbound form
45
46    context = {
47        'form':form,
48        'pagename':pagename,
49    }
50    return render_to_response('forms/select.html', context, context_instance=RequestContext(request), )
51
52#############################
53# FIRST-YEAR SUMMER MAILING #
54#############################
55
56@login_required
57def fysm_by_years(request, year, category, ):
58    if year is None: year = datetime.date.today().year
59    queryset = forms.models.FYSM.objects.filter(year=year).order_by('group__name')
60    category_obj = None
61    category_name = 'main'
62    if category != None:
63        category_obj = get_object_or_404(forms.models.FYSMCategory, slug=category)
64        category_name = category_obj.name
65        queryset = queryset.filter(categories=category_obj)
66    forms.models.FYSMView.record_metric(request=request, fysm=None, year=year, page=category_name, )
67    categories = forms.models.FYSMCategory.objects.all()
68    return list_detail.object_list(
69        request,
70        queryset=queryset,
71        template_name="fysm/fysm_listing.html",
72        template_object_name="fysm",
73        extra_context={
74            "year": year,
75            "pagename": "fysm",
76            "category": category_obj,
77            "categories": categories,
78        }
79    )
80
81@login_required
82def fysm_view(request, year, submission, ):
83    submit_obj = get_object_or_404(forms.models.FYSM, pk=submission,)
84    all = forms.models.FYSM.objects.only("id", "display_name", )
85    try:
86        prev = all.filter(display_name__lt=submit_obj.display_name).order_by("-display_name")[0]
87    except IndexError:
88        prev = None
89    try:
90        next = all.filter(display_name__gt=submit_obj.display_name).order_by("display_name")[0]
91    except IndexError:
92        next = None
93    forms.models.FYSMView.record_metric(request=request, fysm=submit_obj, year=year, page="detail", )
94    return list_detail.object_detail(
95        request,
96        forms.models.FYSM.objects,
97        object_id=submission,
98        template_name="fysm/fysm_detail.html",
99        template_object_name="fysm",
100        extra_context={
101            "year": year,
102            "pagename": "fysm",
103            "prev": prev,
104            "next": next,
105        },
106    )
107
108def fysm_link(request, year, link_type, submission, ):
109    submit_obj = get_object_or_404(forms.models.FYSM, pk=submission,)
110    if submit_obj.year != int(year):
111        raise Http404("Year mismatch: fysm.year='%s', request's year='%s'" % (submit_obj.year, year, ))
112    if link_type == 'join':
113        url = submit_obj.join_url
114    elif link_type == 'website':
115        url = submit_obj.website
116    else:
117        raise Http404("Unknown link type")
118    forms.models.FYSMView.record_metric(request=request, fysm=submit_obj, year=year, page=link_type, )
119    return HttpResponseRedirect(url)
120
121def select_group_fysm(request, ):
122    qobj = Q(activity_category__isnull = True) | ~(Q(activity_category__name='Dorm') | Q(activity_category__name='FSILG'))
123    queryset = groups.models.Group.active_groups.filter(qobj)
124    return select_group(
125        request,
126        url_name_after='fysm-manage',
127        pagename='fysm',
128        queryset=queryset,
129    )
130
131class FYSMRequestForm(ModelForm):
132    class Meta:
133        model = forms.models.FYSM
134        fields = (
135            'display_name',
136            'website',
137            'join_url',
138            'contact_email',
139            'description',
140            'logo',
141            'slide',
142            'tags',
143            'categories',
144        )
145
146@login_required
147def fysm_manage(request, group, ):
148    year = datetime.date.today().year
149    group_obj = get_object_or_404(groups.models.Group, pk=group)
150
151    initial = {}
152    try:
153        fysm_obj = forms.models.FYSM.objects.get(group=group_obj, year=year, )
154        print "Successfully found", fysm_obj.__dict__
155    except forms.models.FYSM.DoesNotExist:
156        fysm_obj = forms.models.FYSM()
157        fysm_obj.group = group_obj
158        fysm_obj.year = year
159        initial['display_name'] = group_obj.name
160        initial['year'] = year
161        initial['website'] = group_obj.website_url
162        initial['join_url'] = group_obj.website_url
163        initial['contact_email'] = group_obj.officer_email
164
165    if request.method == 'POST': # If the form has been submitted...
166        form = FYSMRequestForm(request.POST, request.FILES, instance=fysm_obj, ) # A form bound to the POST data
167
168        if form.is_valid(): # All validation rules pass
169            request_obj = form.save()
170
171            view_path = reverse('fysm-view', args=[year, request_obj.pk, ])
172            view_uri = '%s://%s%s' % (request.is_secure() and 'https' or 'http',
173                 request.get_host(), view_path)
174
175            # Send email
176            tmpl = get_template('fysm/update_email.txt')
177            ctx = Context({
178                'group': group_obj,
179                'fysm': fysm_obj,
180                'view_uri': view_uri,
181                'submitter': request.user,
182                'request': request,
183                'sender': "ASA FYSM team",
184            })
185            body = tmpl.render(ctx)
186            email = EmailMessage(
187                subject='FYSM entry for "%s" updated by "%s"' % (
188                    group_obj.name,
189                    request.user,
190                ),
191                body=body,
192                from_email='asa-fysm@mit.edu',
193                to=[group_obj.officer_email, request.user.email, ],
194                bcc=['asa-fysm-submissions@mit.edu', ]
195            )
196            email.send()
197            return HttpResponseRedirect(reverse('fysm-thanks', args=[fysm_obj.pk],)) # Redirect after POST
198
199    else:
200        form = FYSMRequestForm(instance=fysm_obj, initial=initial, ) # An unbound form
201
202    context = {
203        'group':group_obj,
204        'fysm':fysm_obj,
205        'form':form,
206        'categories':forms.models.FYSMCategory.objects.all(),
207        'pagename':'fysm',
208    }
209    return render_to_response('fysm/submit.html', context, context_instance=RequestContext(request), )
210
211
212def fysm_thanks(request, fysm, ):
213    year = datetime.date.today().year
214    fysm_obj = get_object_or_404(forms.models.FYSM, pk=fysm)
215
216    context = {
217        'group':fysm_obj.group,
218        'fysm':fysm_obj,
219        'pagename':'fysm',
220    }
221    return render_to_response('fysm/thanks.html', context, context_instance=RequestContext(request), )
222
223#####################
224# Membership update #
225#####################
226
227class Form_GroupMembershipUpdate(ModelForm):
228    group = ModelChoiceField(queryset=groups.models.Group.active_groups.all())
229
230    def __init__(self, *args, **kwargs):
231        super(Form_GroupMembershipUpdate, self).__init__(*args, **kwargs)
232        self.fields['no_hazing'].required = True
233
234    class Meta:
235        model = forms.models.GroupMembershipUpdate
236        fields = [
237            'group',
238            'updater_title',
239            'group_email',
240            'officer_email',
241            'email_preface',
242            'no_hazing',
243            'no_discrimination',
244            'membership_definition',
245            'num_undergrads',
246            'num_grads',
247            'num_alum',
248            'num_other_affiliate',
249            'num_other',
250            'membership_list',
251        ]
252
253@login_required
254def group_membership_update(request, ):
255    year = datetime.date.today().year
256
257    initial = {
258    }
259    update_obj = forms.models.GroupMembershipUpdate()
260    update_obj.update_time  = datetime.datetime.now()
261    update_obj.updater_name = request.user.username
262
263    confirm_path = reverse('membership-confirm', )
264    confirm_uri = '%s://%s%s' % (request.is_secure() and 'https' or 'http',
265         request.get_host(), confirm_path)
266
267    if request.method == 'POST': # If the form has been submitted...
268        form = Form_GroupMembershipUpdate(request.POST, request.FILES, instance=update_obj) # A form bound to the POST data
269
270        if form.is_valid(): # All validation rules pass
271            request_obj = form.save()
272            group_obj = request_obj.group
273
274
275            # Send email
276            tmpl = get_template('membership/anti-hazing.txt')
277            ctx = Context({
278                'update': request_obj,
279                'group': group_obj,
280                'submitter': request.user,
281            })
282            body = tmpl.render(ctx)
283            email = EmailMessage(
284                subject='Anti-Hazing and Non-Discrimination Acknowledgement for %s' % (
285                    group_obj.name,
286                ),
287                body=body,
288                from_email=request.user.email,
289                to=[request_obj.group_email, ],
290                cc=[request_obj.officer_email, ],
291                bcc=['asa-db-outgoing@mit.edu', ],
292            )
293            email.send()
294
295            # Send email
296            tmpl = get_template('membership/submit-confirm-email.txt')
297            ctx = Context({
298                'update': request_obj,
299                'group': group_obj,
300                'submitter': request.user,
301                'confirm_uri': confirm_uri,
302            })
303            body = tmpl.render(ctx)
304            email = EmailMessage(
305                subject='ASA Membership Information for %s' % (
306                    group_obj.name,
307                ),
308                body=body,
309                from_email=request.user.email,
310                to=[request_obj.officer_email, ],
311                bcc=['asa-db-outgoing@mit.edu', ],
312            )
313            email.send()
314
315            return HttpResponseRedirect(reverse('membership-thanks', )) # Redirect after POST
316
317    else:
318        form = Form_GroupMembershipUpdate(initial=initial, ) # An unbound form
319
320    context = {
321        'form':form,
322        'confirm_uri': confirm_uri,
323        'pagename':'groups',
324    }
325    return render_to_response('membership/update.html', context, context_instance=RequestContext(request), )
326
327class Form_PersonMembershipUpdate(ModelForm):
328    groups = ModelMultipleChoiceField(queryset=groups.models.Group.active_groups.all())
329    class Meta:
330        model = forms.models.PersonMembershipUpdate
331        fields = [
332            'groups',
333        ]
334
335@login_required
336def person_membership_update(request, ):
337    year = datetime.date.today().year
338
339    initial = {
340    }
341    update_obj = forms.models.PersonMembershipUpdate()
342    update_obj.update_time  = datetime.datetime.now()
343    update_obj.username = request.user.username
344
345    if request.method == 'POST': # If the form has been submitted...
346        form = Form_PersonMembershipUpdate(request.POST, request.FILES, instance=update_obj) # A form bound to the POST data
347
348        if form.is_valid(): # All validation rules pass
349            request_obj = form.save()
350            return HttpResponseRedirect(reverse('membership-thanks', )) # Redirect after POST
351
352    else:
353        form = Form_PersonMembershipUpdate(initial=initial, ) # An unbound form
354
355    context = {
356        'form':form,
357        'pagename':'groups',
358    }
359    return render_to_response('membership/confirm.html', context, context_instance=RequestContext(request), )
360
361
362class View_GroupMembershipList(ListView):
363    context_object_name = "group_list"
364    template_name = "membership/submitted.html"
365
366    def get_queryset(self):
367        group_updates = forms.models.GroupMembershipUpdate.objects.all()
368        group_updates = group_updates.annotate(num_confirms=Count('group__personmembershipupdate'))
369        return group_updates
370
371    #def get_context_data(self, **kwargs):
372    #    context = super(GroupHistoryView, self).get_context_data(**kwargs)
373    #    if 'pk' in self.kwargs:
374    #        group = get_object_or_404(groups.models.Group, pk=self.kwargs['pk'])
375    #        context['title'] = "History for %s" % (group.name, )
376    #    else:
377    #        context['title'] = "Recent Changes"
378    #    return context
Note: See TracBrowser for help on using the repository browser.