def my_requests_view(request): ''' Show user his/her requests, sorted by request_type. ''' page_name = "My Requests" userProfile = UserProfile.objects.get(user=request.user) request_form = RequestForm( request.POST if 'submit_request' in request.POST else None, profile=userProfile, ) response_form = ManagerResponseForm( request.POST if 'add_response' in request.POST else None, profile=userProfile, ) if request_form.is_valid(): request_form.save() return HttpResponseRedirect(reverse('my_requests')) if response_form.is_valid(): response_form.save() return HttpResponseRedirect(reverse('my_requests')) my_requests = Request.objects.filter(owner=userProfile) request_dict = list() # A pseudo dictionary, actually a list with items of form (request_type.name.title(), request_form, type_manager, [(request, [list_of_request_responses], response_form, upvote, vote_form),...], relevant_managers) for request_type in RequestType.objects.all(): relevant_managers = request_type.managers.filter(active=True) type_manager = any(i.incumbent == userProfile for i in relevant_managers) requests_list = list() # Items are of form (request, [list_of_request_responses], response_form),...]) type_requests = my_requests.filter(request_type=request_type) for req in type_requests: responses_list = Response.objects.filter(request=req) if type_manager: form = ManagerResponseForm(initial={ 'request_pk': req.pk, 'mark_filled': req.filled, 'mark_closed': req.closed, }, profile=userProfile, ) else: form = ResponseForm( initial={'request_pk': req.pk}, profile=userProfile, ) upvote = userProfile in req.upvotes.all() vote_form = VoteForm( initial={'request_pk': req.pk}, profile=userProfile, ) requests_list.append((req, responses_list, form, upvote, vote_form)) request_form = RequestForm( initial={'type_pk': request_type.pk}, profile=userProfile, ) request_dict.append((request_type, request_form, type_manager, requests_list, relevant_managers)) return render_to_response('my_requests.html', { 'page_name': page_name, 'request_dict': request_dict, }, context_instance=RequestContext(request))
def request_view(request, request_pk): ''' The view of a single request. ''' relevant_request = get_object_or_404(Request, pk=request_pk) if relevant_request.private: if relevant_request.owner.user != request.user or \ relevant_request.request_type.managers.filter(incumbent__user=request.user): return HttpResponseRedirect( reverse("managers:requests", kwargs={"requestType": relevant_request.request_type.url_name})) userProfile = UserProfile.objects.get(user=request.user) request_responses = Response.objects.filter(request=relevant_request) relevant_managers = relevant_request.request_type.managers.filter(active=True) manager = any(i.incumbent == userProfile for i in relevant_managers) if manager: response_form = ManagerResponseForm( request.POST if "add_response" in request.POST else None, initial={'action': Response.NONE}, profile=userProfile, request=relevant_request, ) else: response_form = ResponseForm( request.POST if "add_response" in request.POST else None, profile=userProfile, request=relevant_request, prefix="response", ) upvote = userProfile in relevant_request.upvotes.all() vote_form = VoteForm( request.POST if "vote" in request.POST else None, profile=UserProfile, request=relevant_request, ) if response_form.is_valid(): response_form.save() return HttpResponseRedirect(reverse('managers:view_request', kwargs={ 'request_pk': relevant_request.pk, })) if vote_form.is_valid(): vote_form.save(pk=request_pk) return HttpResponseRedirect(reverse('managers:view_request', kwargs={ 'request_pk': relevant_request.pk, })) upvote = userProfile in relevant_request.upvotes.all() return render_to_response('view_request.html', { 'page_name': "View Request", 'relevant_request': relevant_request, 'request_responses': request_responses, 'upvote': upvote, 'vote_form': vote_form, 'response_form': response_form, 'relevant_managers': relevant_managers, }, context_instance=RequestContext(request))
def request_view(request, request_pk): ''' The view of a single request. ''' relevant_request = get_object_or_404(Request, pk=request_pk) userProfile = UserProfile.objects.get(user=request.user) request_responses = Response.objects.filter(request=relevant_request) relevant_managers = relevant_request.request_type.managers.filter(active=True) manager = any(i.incumbent == userProfile for i in relevant_managers) if manager: response_form = ManagerResponseForm( request.POST if 'add_response' in request.POST else None, initial={ 'request_pk': relevant_request.pk, 'mark_filled': relevant_request.filled, 'mark_closed': relevant_request.closed, }, profile=userProfile, ) else: response_form = ResponseForm( request.POST if 'add_response' in request.POST else None, initial={ 'request_pk': relevant_request.pk, }, profile=userProfile, ) upvote = userProfile in relevant_request.upvotes.all() vote_form = VoteForm( request.POST if 'upvote' in request.POST else None, profile=UserProfile, ) if response_form.is_valid(): response_form.save() return HttpResponseRedirect(reverse('view_request', kwargs={'request_pk': relevant_request.pk})) if vote_form.is_valid(): vote_form.save(pk=request_pk) return HttpResponseRedirect(reverse('view_request', kwargs={'request_pk': relevant_request.pk})) upvote = userProfile in relevant_request.upvotes.all() return render_to_response('view_request.html', { 'page_name': "View Request", 'relevant_request': relevant_request, 'request_responses': request_responses, 'upvote': upvote, 'vote_form': vote_form, 'response_form': response_form, 'relevant_managers': relevant_managers, }, context_instance=RequestContext(request))
def homepage_view(request, message=None): ''' The view of the homepage. ''' userProfile = UserProfile.objects.get(user=request.user) request_types = RequestType.objects.filter(enabled=True) # List of request types for which the user is a relevant manager manager_request_types = list() for request_type in request_types: for position in request_type.managers.filter(active=True): if userProfile == position.incumbent: manager_request_types.append(request_type) break # Pseudo-dictionary, list with items of form (request_type, (request, # [list_of_request_responses], response_form)) requests_dict = list() # Generate a dict of open requests for each request_type for which the user # is a relevant manager: if manager_request_types: for request_type in manager_request_types: # Items of form (request, [list_of_request_responses], # response_form, upvote, vote_form) requests_list = list() # Select only open requests of type request_type: requests = Request.objects.filter( request_type=request_type, status=Request.OPEN, ) for req in requests: response_form = ManagerResponseForm( request.POST if "add_response-{0}".format(req.pk) in request.POST else None, initial={'action': Response.NONE}, profile=userProfile, request=req, ) vote_form = VoteForm( request.POST if "vote-{0}".format(req.pk) in request.POST else None, profile=userProfile, request=req, ) if response_form.is_valid(): response = response_form.save() if response.request.closed: messages.add_message(request, messages.SUCCESS, MESSAGES['REQ_CLOSED']) if response.request.filled: messages.add_message(request, messages.SUCCESS, MESSAGES['REQ_FILLED']) return HttpResponseRedirect(reverse('homepage')) if vote_form.is_valid(): vote_form.save() return HttpResponseRedirect(reverse('homepage')) response_list = Response.objects.filter(request=req) upvote = userProfile in req.upvotes.all() requests_list.append( (req, response_list, response_form, upvote, vote_form) ) requests_dict.append((request_type, requests_list)) ### Announcements # Pseudo-dictionary, list with items of form (announcement, # announcement_unpin_form) announcements_dict = list() # Oldest genesis of an unpinned announcement to be displayed. now = datetime.utcnow().replace(tzinfo=utc) within_life = now - timedelta(days=settings.ANNOUNCEMENT_LIFE) announcements = \ list(Announcement.objects.filter(pinned=True)) + \ list(Announcement.objects.filter(pinned=False, post_date__gte=within_life)) for a in announcements: pin_form = None if request.user.is_superuser or a.manager.incumbent == userProfile: pin_form = PinForm( request.POST if "pin-{0}".format(a.pk) in request.POST else None, instance=a, ) if pin_form.is_valid(): pin_form.save() return HttpResponseRedirect(reverse('homepage')) announcements_dict.append((a, pin_form)) announcement_form = AnnouncementForm( request.POST if "post_announcement" in request.POST else None, profile=userProfile, ) if announcement_form.is_valid(): announcement_form.save() return HttpResponseRedirect(reverse('homepage')) ### Events week_from_now = now + timedelta(days=7) # Get only next 7 days of events: events_list = Event.objects.exclude( start_time__gte=week_from_now, end_time__lte=now, ) # Pseudo-dictionary, list with items of form (event, ongoing, rsvpd, rsvp_form) events_dict = list() for event in events_list: ongoing = ((event.start_time <= now) and (event.end_time >= now)) rsvpd = (userProfile in event.rsvps.all()) rsvp_form = RsvpForm( request.POST if "rsvp-{0}".format(event.pk) in request.POST else None, profile=userProfile, instance=event, ) if rsvp_form.is_valid(): rsvpd = rsvp_form.save() if rsvpd: message = MESSAGES['RSVP_REMOVE'].format(event=event.title) messages.add_message(request, messages.SUCCESS, message) else: message = MESSAGES['RSVP_ADD'].format(event=event.title) messages.add_message(request, messages.SUCCESS, message) return HttpResponseRedirect(reverse('homepage')) events_dict.append((event, ongoing, rsvpd, rsvp_form)) ### Threads thread_form = ThreadForm( request.POST if "submit_thread_form" in request.POST else None, profile=userProfile, ) if thread_form.is_valid(): thread_form.save() return HttpResponseRedirect(reverse('homepage')) # List of with items of form (thread, most_recent_message_in_thread) thread_set = [] for thread in Thread.objects.all()[:settings.HOME_MAX_THREADS]: try: latest_message = Message.objects.filter(thread=thread).latest('post_date') except Message.DoesNotExist: latest_message = None thread_set.append((thread, latest_message)) return render_to_response('homepage.html', { 'page_name': "Home", 'requests_dict': requests_dict, 'announcements_dict': announcements_dict, 'announcement_form': announcement_form, 'events_dict': events_dict, 'thread_set': thread_set, 'thread_form': thread_form, }, context_instance=RequestContext(request))
def request_view(request, request_pk): ''' The view of a single request. ''' if request.is_ajax(): if not request.user.is_authenticated(): return HttpResponse(json.dumps(dict()), content_type="application/json") try: relevant_request = Request.objects.get(pk=request_pk) except Request.DoesNotExist: return HttpResponse(json.dumps(dict()), content_type="application/json") try: user_profile = UserProfile.objects.get(user=request.user) except UserProfile.DoesNotExist: return HttpResponse(json.dumps(dict()), content_type="application/json") upvote = user_profile in relevant_request.upvotes.all() vote_form = VoteForm( request.POST if "upvote" in request.POST else None, profile=user_profile, request=relevant_request, ) if vote_form.is_valid(): vote_form.save() response = dict() response['vote_count_{pk}'.format(pk=request_pk)] = \ relevant_request.upvotes.all().count() list_string = 'vote_list_{pk}'.format(pk=request_pk) vote_string = 'in_votes_{pk}'.format(pk=request_pk) count_string = 'vote_count_{pk}'.format(pk=request_pk) response[list_string], response[vote_string], \ response[count_string] = build_ajax_votes( relevant_request, user_profile ) return HttpResponse(json.dumps(response), content_type="application/json") return HttpResponse(json.dumps(dict()), content_type="application/json") relevant_request = get_object_or_404(Request, pk=request_pk) if relevant_request.private: if relevant_request.owner.user != request.user or \ relevant_request.request_type.managers.filter(incumbent__user=request.user): return HttpResponseRedirect( reverse("managers:requests", kwargs={"requestType": relevant_request.request_type.url_name})) userProfile = UserProfile.objects.get(user=request.user) request_responses = Response.objects.filter(request=relevant_request) relevant_managers = relevant_request.request_type.managers.filter(active=True) manager = any(i.incumbent == userProfile for i in relevant_managers) if manager: response_form = ManagerResponseForm( request.POST if "add_response" in request.POST else None, initial={'action': Response.NONE}, profile=userProfile, request=relevant_request, ) else: response_form = ResponseForm( request.POST if "add_response" in request.POST else None, profile=userProfile, request=relevant_request, prefix="response", ) upvote = userProfile in relevant_request.upvotes.all() vote_form = VoteForm( request.POST if "upvote" in request.POST else None, profile=userProfile, request=relevant_request, ) if response_form.is_valid(): response_form.save() return HttpResponseRedirect(reverse('managers:view_request', kwargs={ 'request_pk': relevant_request.pk, })) if vote_form.is_valid(): vote_form.save() return HttpResponseRedirect(reverse('managers:view_request', kwargs={ 'request_pk': relevant_request.pk, })) upvote = userProfile in relevant_request.upvotes.all() return render_to_response('view_request.html', { 'page_name': "View Request", 'relevant_request': relevant_request, 'request_responses': request_responses, 'upvote': upvote, 'vote_form': vote_form, 'response_form': response_form, 'relevant_managers': relevant_managers, }, context_instance=RequestContext(request))
def my_requests_view(request): ''' Show user his/her requests, sorted by request_type. ''' page_name = "Your Requests" userProfile = UserProfile.objects.get(user=request.user) my_requests = Request.objects.filter(owner=userProfile) # A pseudo dictionary, actually a list with items of form # (request_type.name.title(), request_form, type_manager, [(request, # [list_of_request_responses], response_form, upvote, vote_form),...], # relevant_managers) request_dict = list() for request_type in RequestType.objects.all(): relevant_managers = request_type.managers.filter(active=True) type_manager = any(i.incumbent == userProfile for i in relevant_managers) # Items are of form (request, [list_of_request_responses], # response_form),...]) requests_list = list() type_requests = my_requests.filter(request_type=request_type) for req in type_requests: responses_list = Response.objects.filter(request=req) if type_manager: response_form = ManagerResponseForm( request.POST if "add_response-{0}".format(req.pk) in request.POST else None, initial={'action': Response.NONE}, profile=userProfile, request=req, prefix="response-{0}".format(req.pk), ) else: response_form = ResponseForm( request.POST if "add_response-{0}".format(req.pk) in request.POST else None, profile=userProfile, request=req, prefix="response-{0}".format(req.pk), ) upvote = userProfile in req.upvotes.all() vote_form = VoteForm( request.POST if "vote-{0}".format(req.pk) in request.POST else None, request.POST or None, profile=userProfile, request=req, prefix="vote-{0}", ) if response_form.is_valid(): response_form.save() return HttpResponseRedirect(reverse('managers:my_requests')) if vote_form.is_valid(): vote_form.save() return HttpResponseRedirect(reverse('managers:my_requests')) requests_list.append((req, responses_list, response_form, upvote, vote_form)) request_form = RequestForm( request.POST if "submit_request" in request.POST else None, profile=userProfile, request_type=request_type, prefix="request-{0}".format(request_type.pk), ) if request_form.is_valid(): request_form.save() return HttpResponseRedirect(reverse('managers:my_requests')) request_dict.append((request_type, request_form, type_manager, requests_list, relevant_managers)) return render_to_response('my_requests.html', { 'page_name': page_name, 'request_dict': request_dict, }, context_instance=RequestContext(request))
def requests_view(request, requestType): ''' Generic request view. Parameters: request is the HTTP request requestType is URL name of a RequestType. e.g. "food", "maintenance", "network", "site" ''' userProfile = UserProfile.objects.get(user=request.user) request_type = get_object_or_404(RequestType, url_name=requestType) page_name = "{0} Requests".format(request_type.name.title()) if not request_type.enabled: message = "{0} requests have been disabled.".format(request_type.name.title()) return red_home(request, message) relevant_managers = request_type.managers.filter(active=True) manager = any(i.incumbent == userProfile for i in relevant_managers) request_form = RequestForm( request.POST if "submit_request" in request.POST else None, profile=userProfile, request_type=request_type, ) if request_form.is_valid(): request_form.save() return HttpResponseRedirect(reverse('managers:requests', kwargs={'requestType': requestType})) # number of requests loaded x = 0 # A pseudo-dictionary, actually a list with items of form (request, # [request_responses_list], response_form, upvote, vote_form) requests_dict = list() requests = Request.objects.filter(request_type=request_type) if not request_type.managers.filter(incumbent__user=request.user): requests = requests.exclude( ~Q(owner__user=request.user), private=True, ) for req in requests: request_responses = Response.objects.filter(request=req) if manager: response_form = ManagerResponseForm( request.POST if "add_response-{0}".format(req.pk) in request.POST else None, initial={'action': Response.NONE}, prefix="{0}".format(req.pk), profile=userProfile, request=req, ) else: response_form = ResponseForm( request.POST if "add_response-{0}".format(req.pk) in request.POST else None, prefix="{0}".format(req.pk), profile=userProfile, request=req, ) upvote = userProfile in req.upvotes.all() vote_form = VoteForm( request.POST if "vote-{0}".format(req.pk) in request.POST else None, profile=userProfile, request=req, ) if response_form.is_valid(): response_form.save() return HttpResponseRedirect(reverse('managers:requests', kwargs={'requestType': requestType})) if vote_form.is_valid(): vote_form.save() return HttpResponseRedirect(reverse('managers:requests', kwargs={'requestType': requestType})) requests_dict.append((req, request_responses, response_form, upvote, vote_form)) x += 1 if x >= settings.MAX_REQUESTS: break return render_to_response('requests.html', { 'manager': manager, 'request_type': request_type, 'page_name': page_name, 'request_form': request_form, 'requests_dict': requests_dict, 'relevant_managers': relevant_managers, }, context_instance=RequestContext(request))
def request_view(request, request_pk): ''' The view of a single request. ''' print "NOT AJAX REQUEST" if request.is_ajax(): print "AJAX REQUEST" if not request.user.is_authenticated(): return HttpResponse(json.dumps(dict()), content_type="application/json") try: relevant_request = Request.objects.get(pk=request_pk) except Request.DoesNotExist: return HttpResponse(json.dumps(dict()), content_type="application/json") try: user_profile = UserProfile.objects.get(user=request.user) except UserProfile.DoesNotExist: return HttpResponse(json.dumps(dict()), content_type="application/json") upvote = user_profile in relevant_request.upvotes.all() vote_form = VoteForm( request.POST if "upvote" in request.POST else None, profile=user_profile, request=relevant_request, ) if vote_form.is_valid(): vote_form.save() response = dict() response['vote_count_{pk}'.format(pk=request_pk)] = \ relevant_request.upvotes.all().count() list_string = 'vote_list_{pk}'.format(pk=request_pk) vote_string = 'in_votes_{pk}'.format(pk=request_pk) count_string = 'vote_count_{pk}'.format(pk=request_pk) response[list_string], response[vote_string], \ response[count_string] = build_ajax_votes( relevant_request, user_profile ) return HttpResponse(json.dumps(response), content_type="application/json") return HttpResponse(json.dumps(dict()), content_type="application/json") relevant_request = get_object_or_404(Request, pk=request_pk) if relevant_request.private: if relevant_request.owner.user != request.user or \ relevant_request.request_type.managers.filter(incumbent__user=request.user): return HttpResponseRedirect( reverse("managers:requests", kwargs={"requestType": relevant_request.request_type.url_name})) userProfile = UserProfile.objects.get(user=request.user) request_responses = Response.objects.filter(request=relevant_request) relevant_managers = relevant_request.request_type.managers.filter(active=True) manager = any(i.incumbent == userProfile for i in relevant_managers) if manager: response_form = ManagerResponseForm( request.POST if "add_response" in request.POST else None, initial={'action': Response.NONE}, profile=userProfile, request=relevant_request, ) else: response_form = ResponseForm( request.POST if "add_response" in request.POST else None, profile=userProfile, request=relevant_request, prefix="response", ) upvote = userProfile in relevant_request.upvotes.all() vote_form = VoteForm( request.POST if "upvote" in request.POST else None, profile=userProfile, request=relevant_request, ) if response_form.is_valid(): response_form.save() return HttpResponseRedirect(reverse('managers:view_request', kwargs={ 'request_pk': relevant_request.pk, })) if vote_form.is_valid(): vote_form.save() return HttpResponseRedirect(reverse('managers:view_request', kwargs={ 'request_pk': relevant_request.pk, })) upvote = userProfile in relevant_request.upvotes.all() return render_to_response('view_request.html', { 'page_name': "View Request", 'relevant_request': relevant_request, 'request_responses': request_responses, 'upvote': upvote, 'vote_form': vote_form, 'response_form': response_form, 'relevant_managers': relevant_managers, }, context_instance=RequestContext(request))
def homepage_view(request, message=None): ''' The view of the homepage. ''' userProfile = UserProfile.objects.get(user=request.user) request_types = RequestType.objects.filter(enabled=True) # List of request types for which the user is a relevant manager manager_request_types = list() for request_type in request_types: for position in request_type.managers.filter(active=True): if userProfile == position.incumbent: manager_request_types.append(request_type) break # Pseudo-dictionary, list with items of form (request_type, (request, # [list_of_request_responses], response_form)) requests_dict = list() # Generate a dict of open requests for each request_type for which the user # is a relevant manager: if manager_request_types: for request_type in manager_request_types: # Items of form (request, [list_of_request_responses], # response_form, upvote, vote_form) requests_list = list() # Select only open requests of type request_type: requests = Request.objects.filter( request_type=request_type, status=Request.OPEN, ) for req in requests: response_form = ManagerResponseForm( request.POST if "add_response-{0}".format(req.pk) in request.POST else None, initial={'action': Response.NONE}, profile=userProfile, request=req, prefix="{}-response".format(req.pk), ) vote_form = VoteForm( request.POST if "vote-{0}".format(req.pk) in request.POST else None, profile=userProfile, request=req, prefix="vote", ) if response_form.is_valid(): response = response_form.save() if response.request.closed: messages.add_message(request, messages.SUCCESS, MESSAGES['REQ_CLOSED']) if response.request.filled: messages.add_message(request, messages.SUCCESS, MESSAGES['REQ_FILLED']) return HttpResponseRedirect(reverse('homepage')) if vote_form.is_valid(): vote_form.save() return HttpResponseRedirect(reverse('homepage')) response_list = Response.objects.filter(request=req) upvote = userProfile in req.upvotes.all() requests_list.append( (req, response_list, response_form, upvote, vote_form)) requests_dict.append((request_type, requests_list)) ### Announcements # Pseudo-dictionary, list with items of form (announcement, # announcement_unpin_form) announcements_dict = list() # Oldest genesis of an unpinned announcement to be displayed. within_life = now() - timedelta(hours=settings.ANNOUNCEMENT_LIFE) announcements = \ list(Announcement.objects.filter(pinned=True)) + \ list(Announcement.objects.filter(pinned=False, post_date__gte=within_life)) for a in announcements: pin_form = None if request.user.is_superuser or a.manager.incumbent == userProfile: pin_form = PinForm( request.POST if "pin-{0}".format(a.pk) in request.POST else None, instance=a, prefix="pin", ) if pin_form.is_valid(): pin_form.save() return HttpResponseRedirect(reverse('homepage')) announcements_dict.append((a, pin_form)) if Manager.objects.filter(incumbent=userProfile, active=True).count(): announcement_form = AnnouncementForm( request.POST if "post_announcement" in request.POST else None, profile=userProfile, prefix="announce", ) else: announcement_form = None if announcement_form and announcement_form.is_valid(): announcement_form.save(request) return HttpResponseRedirect(reverse('homepage')) ### Events week_from_now = now() + timedelta(days=7) # Get only next 7 days of events: events_list = Event.objects.exclude(start_time__gte=week_from_now).exclude( end_time__lte=now(), ) # Pseudo-dictionary, list with items of form (event, ongoing, rsvpd, rsvp_form) events_dict = list() for event in events_list: ongoing = ((event.start_time <= now()) and (event.end_time >= now())) rsvpd = (userProfile in event.rsvps.all()) rsvp_form = RsvpForm( request.POST if "rsvp-{0}".format(event.pk) in request.POST else None, profile=userProfile, instance=event, prefix="rsvp", ) if rsvp_form.is_valid(): rsvpd = rsvp_form.save() if not rsvpd: message = MESSAGES['RSVP_REMOVE'].format(event=event.title) messages.add_message(request, messages.SUCCESS, message) else: message = MESSAGES['RSVP_ADD'].format(event=event.title) messages.add_message(request, messages.SUCCESS, message) return HttpResponseRedirect(reverse('homepage')) events_dict.append((event, ongoing, rsvpd, rsvp_form)) ### Threads thread_form = ThreadForm( request.POST if "submit_thread_form" in request.POST else None, profile=userProfile, prefix="thread", ) if thread_form.is_valid(): thread_form.save() return HttpResponseRedirect(reverse('homepage')) # List of with items of form (thread, most_recent_message_in_thread) thread_set = [] for thread in Thread.objects.all()[:settings.HOME_MAX_THREADS]: try: latest_message = Message.objects.filter( thread=thread).latest('post_date') except Message.DoesNotExist: latest_message = None thread_set.append((thread, latest_message)) return render_to_response('homepage.html', { 'page_name': "Home", 'requests_dict': requests_dict, 'announcements_dict': announcements_dict, 'announcement_form': announcement_form, 'events_dict': events_dict, 'thread_set': thread_set, 'thread_form': thread_form, }, context_instance=RequestContext(request))