howiworkdaily / django-faq

a simple faq application for django apps

This URL has Read+Write access

django-faq / faq / views.py
100644 98 lines (80 sloc) 3.498 kb
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
import datetime
from django.views.generic.list_detail import object_detail, object_list
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django.template import RequestContext
from django.http import Http404
from models import Question
from forms import SubmitFAQForm
 
def question_detail(request, slug, template_name='faq/question_detail.html', extra_context={}):
    """
Displays an individual question.
"""
 
    return object_detail(
        request,
        template_name = template_name,
        extra_context = extra_context,
        slug = slug,
        slug_field = 'slug',
        queryset = Question.objects.active(user=request.user),
    )
        
def question_list( request, template_name='faq/question_list.html',
extra_context={}, group=False):
    '''
Displays a list of all the questions.
'''
    
    # NOTE:
    # The code shown here is NOT REALLY NEEDED, but it is a good example
    # of extending an app using extra_content and such.
    # Specifically note how we set the dict value and then allow the user
    # to pass along their own additional extra_context using 'update'.
 
    query_set = Question.objects.active(group=group,user=request.user)
    
    if len(query_set) == 0:
raise Http404()
 
    last_update = query_set.values('updated_on').order_by('-updated_on',)[0]
    extra = { 'updated_on': last_update['updated_on'] }
 
    extra.update( extra_context )
    
    return object_list(
        request,
        template_name = template_name,
        extra_context = extra,
        queryset = query_set
    )
 
def faq_list( request, template_name='faq/faq_list.html', extra_context={} ):
    '''
Display a typical FAQ view without group headers.
Shows how to "extend" or "override" the default view supplied above.
We also make sure this view is also overridable.
'''
    
    extra = { 'page_title': 'FAQs' }
    extra.update( extra_context )
 
    return question_list( request, template_name=template_name, extra_context=extra )
 
def faq_list_by_group( request,
                       template_name='faq/faq_list_by_group.html',
                       extra_context={} ):
 
    extra = { 'page_title': 'Grouped FAQs' }
    extra.update( extra_context )
    
    return question_list( request, group=True,
                          template_name=template_name, extra_context=extra)
 
def submit_faq( request, form_class=SubmitFAQForm,
             template_name="faq/submit_question.html",
             success_url="/", extra_context={} ):
    if request.method == 'POST':
        form = form_class(data=request.POST)
        if form.is_valid():
            question = form.save()
            if request.user.is_authenticated():
                slug = question.slug
                question.slug = slug.replace("anon",request.user.username)
                question.created_by = request.user
                # Now set up a confirmation message for the user
                request.user.message_set.create(
                    message="Your question was submitted and will be reviewed by the site administrator for possible inclusion in the FAQ." )
            question.save()
            return HttpResponseRedirect(success_url)
    else:
        form = form_class()
    context = { 'form': form }
    context.update( extra_context )
    return render_to_response( template_name, context,
                              context_instance = RequestContext( request ))