def ask(request):#view used to ask a new question """a view to ask a new question gives space for q title, body, tags and checkbox for to post as wiki user can start posting a question anonymously but then must login/register in order for the question go be shown """ if request.method == "POST" and "text" in request.POST: form = AskForm(request.POST) if form.is_valid(): added_at = datetime.datetime.now() title = strip_tags(form.cleaned_data['title'].strip()) wiki = form.cleaned_data['wiki'] tagnames = form.cleaned_data['tags'].strip() text = form.cleaned_data['text'] html = sanitize_html(markdowner.convert(text)) summary = strip_tags(html)[:120] if request.user.is_authenticated(): author = request.user question = Question.objects.create_new( title = title, author = author, added_at = added_at, wiki = wiki, tagnames = tagnames, summary = summary, text = sanitize_html(markdowner.convert(text)) ) return HttpResponseRedirect(question.get_absolute_url()) else: request.session.flush() session_key = request.session.session_key question = AnonymousQuestion( session_key = session_key, title = title, tagnames = tagnames, wiki = wiki, text = text, summary = summary, added_at = added_at, ip_addr = request.META['REMOTE_ADDR'], ) question.save() return HttpResponseRedirect(reverse('auth_action_signin', kwargs={'action': 'newquestion'})) elif request.method == "POST" and "go" in request.POST: form = AskForm({'title': request.POST['q']}) else: form = AskForm() tags = _get_tags_cache_json() return render_to_response('ask.html', { 'form' : form, 'tags' : tags, 'email_validation_faq_url':reverse('faq') + '#validate', }, context_instance=RequestContext(request))
def ask_book(request, short_name): if request.method == "POST": form = AskForm(request.POST) if form.is_valid(): added_at = datetime.datetime.now() html = sanitize_html(markdowner.convert(form.cleaned_data['text'])) question = Question( title = strip_tags(form.cleaned_data['title']), author = request.user, added_at = added_at, last_activity_at = added_at, last_activity_by = request.user, wiki = form.cleaned_data['wiki'], tagnames = form.cleaned_data['tags'].strip(), html = html, summary = strip_tags(html)[:120] ) if question.wiki: question.last_edited_by = question.author question.last_edited_at = added_at question.wikified_at = added_at question.save() # create the first revision QuestionRevision.objects.create( question = question, revision = 1, title = question.title, author = request.user, revised_at = added_at, tagnames = question.tagnames, summary = CONST['default_version'], text = form.cleaned_data['text'] ) books = Book.objects.extra(where=['short_name = %s'], params=[short_name]) match_count = len(books) if match_count == 1: # the book info book = books[0] book.questions.add(question) return HttpResponseRedirect(question.get_absolute_url()) else: form = AskForm() tags = _get_tags_cache_json() return render_to_response('ask.html', { 'form' : form, 'tags' : tags, 'email_validation_faq_url': reverse('faq') + '#validate', }, context_instance=RequestContext(request))
def ask(request): if request.method == "POST" and "text" in request.POST: form = AskForm(request.POST) if form.is_valid(): if request.user.is_authenticated(): return _create_post(request, Question, form) else: return HttpResponseRedirect(reverse('auth_action_signin', kwargs={'action': 'newquestion'})) elif request.method == "POST" and "go" in request.POST: form = AskForm({'title': request.POST['q']}) else: form = AskForm() tags = _get_tags_cache_json() return render_to_response('ask.html', { 'form' : form, 'tags' : tags, 'email_validation_faq_url':reverse('faq') + '#validate', }, context_instance=RequestContext(request))
def _edit_question(request, question):#non-url subview of edit_question - just edit the body/title latest_revision = question.get_latest_revision() revision_form = None if request.method == 'POST': if 'select_revision' in request.POST:#revert-type edit # user has changed revistion number revision_form = RevisionForm(question, latest_revision, request.POST) if revision_form.is_valid(): # Replace with those from the selected revision form = EditQuestionForm(question, QuestionRevision.objects.get(question=question, revision=revision_form.cleaned_data['revision'])) else: form = EditQuestionForm(question, latest_revision, request.POST) else:#new content edit # Always check modifications against the latest revision form = EditQuestionForm(question, latest_revision, request.POST) if form.is_valid(): if form.has_changed(): edited_at = datetime.datetime.now() edited_by = request.user question.apply_edit( edited_at = edited_at, edited_by = edited_by, title = form.cleaned_data['title'], text = form.cleaned_data['text'], #todo: summary name clash in question and question revision comment = form.cleaned_data['summary'], tags = form.cleaned_data['tags'], wiki = form.cleaned_data.get('wiki',False), ) return HttpResponseRedirect(question.get_absolute_url()) else: revision_form = RevisionForm(question, latest_revision) form = EditQuestionForm(question, latest_revision) return render_to_response('question_edit.html', { 'question': question, 'revision_form': revision_form, 'form' : form, 'tags' : _get_tags_cache_json() }, context_instance=RequestContext(request))
def _retag_question(request, question):#non-url subview of edit question - just retag """retag question sub-view used by view "edit_question" """ if request.method == 'POST': form = RetagQuestionForm(question, request.POST) if form.is_valid(): if form.has_changed(): latest_revision = question.get_latest_revision() retagged_at = datetime.datetime.now() # Update the Question itself Question.objects.filter(id=question.id).update( tagnames = form.cleaned_data['tags'], last_edited_at = retagged_at, last_edited_by = request.user, last_activity_at = retagged_at, last_activity_by = request.user ) # Update the Question's tag associations Question.objects.update_tags(question, form.cleaned_data['tags'], request.user) # Create a new revision QuestionRevision.objects.create( question = question, title = latest_revision.title, author = request.user, revised_at = retagged_at, tagnames = form.cleaned_data['tags'], summary = CONST['retagged'], text = latest_revision.text ) # send tags updated singal tags_updated.send(sender=question.__class__, question=question) return HttpResponseRedirect(question.get_absolute_url()) else: form = RetagQuestionForm(question) return render_to_response('question_retag.html', { 'question': question, 'form' : form, 'tags' : _get_tags_cache_json(), }, context_instance=RequestContext(request))
def _retag_question(request, question):#non-url subview of edit question - just retag """retag question sub-view used by view "edit_question" """ if request.method == 'POST': form = RetagQuestionForm(question, request.POST) if form.is_valid(): if form.has_changed(): question.retag( retagged_by = request.user, retagged_at = datetime.datetime.now(), tagnames = form.cleaned_data['tags'], ) return HttpResponseRedirect(question.get_absolute_url()) else: form = RetagQuestionForm(question) return render_to_response('question_retag.html', { 'question': question, 'form' : form, 'tags' : _get_tags_cache_json(), }, context_instance=RequestContext(request))
def _edit_question(request, question): if request.method == 'POST': revision_form = RevisionForm(question, data=request.POST) revision_form.is_valid() revision = question.revisions.get(revision=revision_form.cleaned_data['revision']) if 'select_revision' in request.POST: form = EditQuestionForm(question, revision) else: form = EditQuestionForm(question, revision, data=request.POST) if not 'select_revision' in request.POST and form.is_valid(): if form.has_changed(): question.create_revision( request.user, summary = form.cleaned_data['summary'], title = strip_tags(form.cleaned_data['title'].strip()), tagnames = form.cleaned_data['tags'].strip(), body = form.cleaned_data['text'], ) if form.cleaned_data.get('wiki', False): question.wikify() else: if not revision == question.active_revision: question.activate_revision(request.user, revision) return HttpResponseRedirect(question.get_absolute_url()) else: revision_form = RevisionForm(question) form = EditQuestionForm(question) return render_to_response('question_edit.html', { 'question': question, 'revision_form': revision_form, 'form' : form, 'tags' : _get_tags_cache_json() }, context_instance=RequestContext(request))
def _retag_question(request, question): if request.method == 'POST': form = RetagQuestionForm(question, request.POST) if form.is_valid(): if form.has_changed(): active = question.active_revision question.create_revision( request.user, summary = _('Retag'), title = active.title, tagnames = form.cleaned_data['tags'], body = active.body, ) return HttpResponseRedirect(question.get_absolute_url()) else: form = RetagQuestionForm(question) return render_to_response('question_retag.html', { 'question': question, 'form' : form, 'tags' : _get_tags_cache_json(), }, context_instance=RequestContext(request))
def ask(request):#view used to ask a new question """a view to ask a new question gives space for q title, body, tags and checkbox for to post as wiki user can start posting a question anonymously but then must login/register in order for the question go be shown """ if request.method == "POST": form = AskForm(request.POST) if form.is_valid(): added_at = datetime.datetime.now() #todo: move this to clean_title title = strip_tags(form.cleaned_data['title'].strip()) wiki = form.cleaned_data['wiki'] #todo: move this to clean_tagnames tagnames = form.cleaned_data['tags'].strip() text = form.cleaned_data['text'] #todo: move this to AskForm.clean_text #todo: make custom MarkDownField text = form.cleaned_data['text'] if request.user.is_authenticated(): author = request.user question = Question.objects.create_new( title = title, author = author, added_at = added_at, wiki = wiki, tagnames = tagnames, text = text, ) return HttpResponseRedirect(question.get_absolute_url()) else: request.session.flush() session_key = request.session.session_key summary = strip_tags(text)[:120] question = AnonymousQuestion( session_key = session_key, title = title, tagnames = tagnames, wiki = wiki, text = text, summary = summary, added_at = added_at, ip_addr = request.META['REMOTE_ADDR'], ) question.save() return HttpResponseRedirect(reverse('user_signin_new_question')) else: form = AskForm() tags = _get_tags_cache_json() return render_to_response('ask.html', { 'form' : form, 'tags' : tags, 'email_validation_faq_url':reverse('faq') + '#validate', }, context_instance=RequestContext(request))
def _edit_question(request, question):#non-url subview of edit_question - just edit the body/title latest_revision = question.get_latest_revision() revision_form = None if request.method == 'POST': if 'select_revision' in request.POST: # user has changed revistion number revision_form = RevisionForm(question, latest_revision, request.POST) if revision_form.is_valid(): # Replace with those from the selected revision form = EditQuestionForm(question, QuestionRevision.objects.get(question=question, revision=revision_form.cleaned_data['revision'])) else: form = EditQuestionForm(question, latest_revision, request.POST) else: # Always check modifications against the latest revision form = EditQuestionForm(question, latest_revision, request.POST) if form.is_valid(): html = sanitize_html(markdowner.convert(form.cleaned_data['text'])) if form.has_changed(): edited_at = datetime.datetime.now() tags_changed = (latest_revision.tagnames != form.cleaned_data['tags']) # Update the Question itself updated_fields = { 'title': form.cleaned_data['title'], 'last_edited_at': edited_at, 'last_edited_by': request.user, 'last_activity_at': edited_at, 'last_activity_by': request.user, 'tagnames': form.cleaned_data['tags'], 'summary': strip_tags(html)[:120], 'html': html, } # only save when it's checked # because wiki doesn't allow to be edited if last version has been enabled already # and we make sure this in forms. if ('wiki' in form.cleaned_data and form.cleaned_data['wiki']): updated_fields['wiki'] = True updated_fields['wikified_at'] = edited_at Question.objects.filter( id=question.id).update(**updated_fields) # Update the Question's tag associations if tags_changed: Question.objects.update_tags(question, form.cleaned_data['tags'], request.user) #tags_updated.send(sender=question.__class__, question=question) # Create a new revision revision = QuestionRevision( question = question, title = form.cleaned_data['title'], author = request.user, revised_at = edited_at, tagnames = form.cleaned_data['tags'], text = form.cleaned_data['text'], ) if form.cleaned_data['summary']: revision.summary = form.cleaned_data['summary'] else: revision.summary = 'No.%s Revision' % latest_revision.revision revision.save() return HttpResponseRedirect(question.get_absolute_url()) else: revision_form = RevisionForm(question, latest_revision) form = EditQuestionForm(question, latest_revision) return render_to_response('question_edit.html', { 'question': question, 'revision_form': revision_form, 'form' : form, 'tags' : _get_tags_cache_json() }, context_instance=RequestContext(request))