source: asadb/forms/views.py @ f462be6

fysm-4-1space-accessstablestagetest-hooks
Last change on this file since f462be6 was f462be6, checked in by Alex Dehnert <adehnert@…>, 16 years ago

Use intermediate page for join links

  • Property mode set to 100644
File size: 7.0 KB
Line 
1import forms.models
2import groups.models
3import settings
4
5from django.contrib.auth.decorators import user_passes_test
6from django.views.generic import list_detail
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 send_mail, mail_admins
14from django.forms import Form
15from django.forms import ModelForm
16from django.forms import ModelChoiceField
17from django.db.models import Q
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
56def fysm_by_years(request, year, category, ):
57    if year is None: year = datetime.date.today().year
58    queryset = forms.models.FYSM.objects.filter(year=year).order_by('group__name')
59    category_obj = None
60    if category != None:
61        category_obj = get_object_or_404(forms.models.FYSMCategory, slug=category)
62        queryset = queryset.filter(categories=category_obj)
63    categories = forms.models.FYSMCategory.objects.all()
64    return list_detail.object_list(
65        request,
66        queryset=queryset,
67        template_name="fysm/fysm_listing.html",
68        template_object_name="fysm",
69        extra_context={
70            "year": year,
71            "pagename": "fysm",
72            "category": category_obj,
73            "categories": categories,
74        }
75    )
76
77def fysm_view(request, year, submission, ):
78    submit_obj = get_object_or_404(forms.models.FYSM, pk=submission,)
79    all = forms.models.FYSM.objects.only("id", "display_name", )
80    try:
81        prev = all.filter(display_name__lt=submit_obj.display_name).order_by("-display_name")[0]
82    except IndexError:
83        prev = None
84    try:
85        next = all.filter(display_name__gt=submit_obj.display_name).order_by("display_name")[0]
86    except IndexError:
87        next = None
88    return list_detail.object_detail(
89        request,
90        forms.models.FYSM.objects,
91        object_id=submission,
92        template_name="fysm/fysm_detail.html",
93        template_object_name="fysm",
94        extra_context={
95            "year": year,
96            "pagename": "fysm",
97            "prev": prev,
98            "next": next,
99        },
100    )
101
102def fysm_link(request, year, link_type, submission, ):
103    submit_obj = get_object_or_404(forms.models.FYSM, pk=submission,)
104    if submit_obj.year != int(year):
105        raise Http404("Year mismatch: fysm.year='%s', request's year='%s'" % (submit_obj.year, year, ))
106    if link_type == 'join':
107        url = submit_obj.join_url
108    elif link_type == 'website':
109        url = submit_obj.website
110    else:
111        raise Http404("Unknown link type")
112    return HttpResponseRedirect(url)
113
114def select_group_fysm(request, ):
115    qobj = Q(activity_category__name='Dorm') | Q(activity_category__name='FSILG')
116    queryset = groups.models.Group.objects.filter(~qobj)
117    return select_group(
118        request,
119        url_name_after='fysm-manage',
120        pagename='fysm',
121        queryset=queryset,
122    )
123
124class FYSMRequestForm(ModelForm):
125    class Meta:
126        model = forms.models.FYSM
127        fields = (
128            'display_name',
129            'website',
130            'join_url',
131            'contact_email',
132            'description',
133            'logo',
134            'tags',
135            'categories',
136        )
137
138@user_passes_test(lambda u: u.is_authenticated())
139def fysm_manage(request, group, ):
140    year = datetime.date.today().year
141    group_obj = get_object_or_404(groups.models.Group, pk=group)
142
143    initial = {}
144    try:
145        fysm_obj = forms.models.FYSM.objects.get(group=group_obj, year=year, )
146        print "Successfully found", fysm_obj.__dict__
147    except forms.models.FYSM.DoesNotExist:
148        fysm_obj = forms.models.FYSM()
149        fysm_obj.group = group_obj
150        fysm_obj.year = year
151        initial['display_name'] = group_obj.name
152        initial['year'] = year
153        initial['website'] = group_obj.website_url
154        initial['join_url'] = group_obj.website_url
155        initial['contact_email'] = group_obj.officer_email
156
157    if request.method == 'POST': # If the form has been submitted...
158        form = FYSMRequestForm(request.POST, request.FILES, instance=fysm_obj, ) # A form bound to the POST data
159
160        if form.is_valid(): # All validation rules pass
161            request_obj = form.save()
162
163            # Send email
164            tmpl = get_template('fysm/update_email.txt')
165            ctx = Context({
166                'group': group_obj,
167                'fysm': fysm_obj,
168                'submitter': request.user,
169                'request': request,
170                'sender': "ASA FYSM team",
171            })
172            body = tmpl.render(ctx)
173            recipients = ['asa-fysm@mit.edu', group_obj.officer_email, ]
174            send_mail(
175                'FYSM entry for "%s" updated by "%s"' % (
176                    group_obj.name,
177                    request.user,
178                ),
179                body,
180                'asa-fysm@mit.edu',
181                recipients,
182            )
183            return HttpResponseRedirect(reverse('fysm-thanks', args=[fysm_obj.pk],)) # Redirect after POST
184
185    else:
186        form = FYSMRequestForm(instance=fysm_obj, initial=initial, ) # An unbound form
187
188    context = {
189        'group':group_obj,
190        'fysm':fysm_obj,
191        'form':form,
192        'pagename':'fysm',
193    }
194    return render_to_response('fysm/submit.html', context, context_instance=RequestContext(request), )
195
196
197def fysm_thanks(request, fysm, ):
198    year = datetime.date.today().year
199    fysm_obj = get_object_or_404(forms.models.FYSM, pk=fysm)
200
201    context = {
202        'group':fysm_obj.group,
203        'fysm':fysm_obj,
204        'pagename':'fysm',
205    }
206    return render_to_response('fysm/thanks.html', context, context_instance=RequestContext(request), )
Note: See TracBrowser for help on using the repository browser.