]> git.openstreetmap.org Git - osqa.git/blob - forum_modules/books/views.py
Initial commit
[osqa.git] / forum_modules / books / views.py
1 from django.shortcuts import render_to_response, get_object_or_404\r
2 from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden, Http404\r
3 from django.template import RequestContext\r
4 from django.contrib.auth.decorators import login_required\r
5 from django.core.urlresolvers import reverse\r
6 from django.utils.html import *\r
7 \r
8 from models import *\r
9 \r
10 from forum.forms import AskForm\r
11 from forum.views.readers import _get_tags_cache_json\r
12 from forum.models import *\r
13 from forum.utils.html import sanitize_html\r
14 \r
15 def books(request):\r
16     return HttpResponseRedirect(reverse('books') + '/mysql-zhaoyang')\r
17 \r
18 def book(request, short_name, unanswered=False):\r
19     """\r
20     1. questions list\r
21     2. book info\r
22     3. author info and blog rss items\r
23     """\r
24     """\r
25     List of Questions, Tagged questions, and Unanswered questions.\r
26     """\r
27     books = Book.objects.extra(where=['short_name = %s'], params=[short_name])\r
28     match_count = len(books)\r
29     if match_count == 0:\r
30         raise Http404\r
31     else:\r
32         # the book info\r
33         book = books[0]\r
34         # get author info\r
35         author_info = BookAuthorInfo.objects.get(book=book)\r
36         # get author rss info\r
37         author_rss = BookAuthorRss.objects.filter(book=book)\r
38 \r
39         # get pagesize from session, if failed then get default value\r
40         user_page_size = request.session.get("pagesize", QUESTIONS_PAGE_SIZE)\r
41         # set pagesize equal to logon user specified value in database\r
42         if request.user.is_authenticated() and request.user.questions_per_page > 0:\r
43             user_page_size = request.user.questions_per_page\r
44 \r
45         try:\r
46             page = int(request.GET.get('page', '1'))\r
47         except ValueError:\r
48             page = 1\r
49 \r
50         view_id = request.GET.get('sort', None)\r
51         view_dic = {"latest":"-added_at", "active":"-last_activity_at", "hottest":"-answer_count", "mostvoted":"-score" }\r
52         try:\r
53             orderby = view_dic[view_id]\r
54         except KeyError:\r
55             view_id = "latest"\r
56             orderby = "-added_at"\r
57 \r
58         # check if request is from tagged questions\r
59         if unanswered:\r
60             # check if request is from unanswered questions\r
61             # Article.objects.filter(publications__id__exact=1)\r
62             objects = Question.objects.filter(book__id__exact=book.id, deleted=False, answer_count=0).order_by(orderby)\r
63         else:\r
64             objects = Question.objects.filter(book__id__exact=book.id, deleted=False).order_by(orderby)\r
65 \r
66         # RISK - inner join queries\r
67         objects = objects.select_related();\r
68         objects_list = Paginator(objects, user_page_size)\r
69         questions = objects_list.page(page)\r
70 \r
71         return render_to_response('book.html', {\r
72             "book" : book,\r
73             "author_info" : author_info,\r
74             "author_rss" : author_rss,\r
75             "questions" : questions,\r
76             "context" : {\r
77                 'is_paginated' : True,\r
78                 'pages': objects_list.num_pages,\r
79                 'page': page,\r
80                 'has_previous': questions.has_previous(),\r
81                 'has_next': questions.has_next(),\r
82                 'previous': questions.previous_page_number(),\r
83                 'next': questions.next_page_number(),\r
84                 'base_url' : request.path + '?sort=%s&' % view_id,\r
85                 'pagesize' : user_page_size\r
86             }\r
87         }, context_instance=RequestContext(request))\r
88 \r
89 @login_required\r
90 def ask_book(request, short_name):\r
91     if request.method == "POST":\r
92         form = AskForm(request.POST)\r
93         if form.is_valid():\r
94             added_at = datetime.datetime.now()\r
95             html = sanitize_html(markdowner.convert(form.cleaned_data['text']))\r
96             question = Question(\r
97                 title            = strip_tags(form.cleaned_data['title']),\r
98                 author           = request.user,\r
99                 added_at         = added_at,\r
100                 last_activity_at = added_at,\r
101                 last_activity_by = request.user,\r
102                 wiki             = form.cleaned_data['wiki'],\r
103                 tagnames         = form.cleaned_data['tags'].strip(),\r
104                 html             = html,\r
105                 summary          = strip_tags(html)[:120]\r
106             )\r
107             if question.wiki:\r
108                 question.last_edited_by = question.author\r
109                 question.last_edited_at = added_at\r
110                 question.wikified_at = added_at\r
111 \r
112             question.save()\r
113 \r
114             # create the first revision\r
115             QuestionRevision.objects.create(\r
116                 question   = question,\r
117                 revision   = 1,\r
118                 title      = question.title,\r
119                 author     = request.user,\r
120                 revised_at = added_at,\r
121                 tagnames   = question.tagnames,\r
122                 summary    = CONST['default_version'],\r
123                 text       = form.cleaned_data['text']\r
124             )\r
125 \r
126             books = Book.objects.extra(where=['short_name = %s'], params=[short_name])\r
127             match_count = len(books)\r
128             if match_count == 1:\r
129                 # the book info\r
130                 book = books[0]\r
131                 book.questions.add(question)\r
132 \r
133             return HttpResponseRedirect(question.get_absolute_url())\r
134     else:\r
135         form = AskForm()\r
136 \r
137     tags = _get_tags_cache_json()\r
138     return render_to_response('ask.html', {\r
139         'form' : form,\r
140         'tags' : tags,\r
141         'email_validation_faq_url': reverse('faq') + '#validate',\r
142         }, context_instance=RequestContext(request))