def edit_question(request, question_id): """ Entry point for editing a question. Fields which can be edited depend on the logged-in user's roles or reputation, so this view delegates to the apporopriate view based on those criteria. """ question = get_object_or_404(Question, id=question_id) if auth.can_edit_post(request.user, question): return _edit_question(request, question) elif auth.can_retag_questions(request.user): return _retag_question(request, question) else: raise Http404
def edit_answer(request, answer_id): """Edits an Answer.""" answer = get_object_or_404(Answer, id=answer_id) if not auth.can_edit_post(request.user, answer): raise Http404 latest_revision = answer.get_latest_revision() preview = None revision_form = None if request.method == 'POST': if 'select_revision' in request.POST: # The user submitted to change the revision to start editing from revision_form = RevisionForm(answer, latest_revision, request.POST) if revision_form.is_valid(): # Replace Question details with those from the selected revision form = EditAnswerForm( answer, AnswerRevision.objects.get( answer=answer, revision=revision_form.cleaned_data['revision'])) else: # Make sure we keep a hold of the user's other input, even # though they appear to be messing about. form = EditAnswerForm(answer, latest_revision, request.POST) else: # Always check modifications against the latest revision form = EditAnswerForm(answer, latest_revision, request.POST) if form.is_valid(): html = sanitize_html( markdowner.convert(form.cleaned_data['text'])) if 'preview' in request.POST: # The user submitted to preview the formatted question preview = mark_safe(html) elif 'submit' in request.POST: if form.has_changed(): edited_at = datetime.datetime.now() # Update the Answer itself updated_fields = { 'last_edited_at': edited_at, 'last_edited_by': request.user, 'html': html, } if ('wiki' in form.cleaned_data and form.cleaned_data['wiki']): updated_fields['wiki'] = True updated_fields['wikified_at'] = edited_at Answer.objects.filter(id=answer.id).update( **updated_fields) # Create a new revision revision = AnswerRevision( answer=answer, author=request.user, revised_at=edited_at, text=form.cleaned_data['text']) if form.cleaned_data['summary']: revision.summary = form.cleaned_data['summary'] else: revision.summary = \ diff.generate_answer_revision_summary( latest_revision, revision, ('wiki' in updated_fields)) revision.save() # TODO 5 body edits by the asker = automatic wiki mode # TODO 4 individual editors = automatic wiki mode # TODO Badges related to editing Answers return HttpResponseRedirect(answer.get_absolute_url()) else: revision_form = RevisionForm(answer, latest_revision) form = EditAnswerForm(answer, latest_revision) if revision_form is None: # We're about to redisplay after a POST where we didn't care which # revision was selected - make sure the revision the user started from # is still selected on redisplay. revision_form = RevisionForm(answer, latest_revision, request.POST) return render_to_response('edit_answer.html', { 'title': u'Edit Answer', 'question': answer.question, 'answer': answer, 'revision_form': revision_form, 'form': form, 'preview': preview, }, context_instance=RequestContext(request))
def edit_answer(request, answer_id): """Edits an Answer.""" answer = get_object_or_404(Answer, id=answer_id) if not auth.can_edit_post(request.user, answer): raise Http404 latest_revision = answer.get_latest_revision() preview = None revision_form = None if request.method == 'POST': if 'select_revision' in request.POST: # The user submitted to change the revision to start editing from revision_form = RevisionForm(answer, latest_revision, request.POST) if revision_form.is_valid(): # Replace Question details with those from the selected revision form = EditAnswerForm(answer, AnswerRevision.objects.get(answer=answer, revision=revision_form.cleaned_data['revision'])) else: # Make sure we keep a hold of the user's other input, even # though they appear to be messing about. form = EditAnswerForm(answer, latest_revision, request.POST) else: # Always check modifications against the latest revision form = EditAnswerForm(answer, latest_revision, request.POST) if form.is_valid(): html = sanitize_html( markdowner.convert(form.cleaned_data['text'])) if 'preview' in request.POST: # The user submitted to preview the formatted question preview = mark_safe(html) elif 'submit' in request.POST: if form.has_changed(): edited_at = datetime.datetime.now() # Update the Answer itself updated_fields = { 'last_edited_at': edited_at, 'last_edited_by': request.user, 'html': html, } if ('wiki' in form.cleaned_data and form.cleaned_data['wiki']): updated_fields['wiki'] = True updated_fields['wikified_at'] = edited_at Answer.objects.filter( id=answer.id).update(**updated_fields) # Create a new revision revision = AnswerRevision( answer = answer, author = request.user, revised_at = edited_at, text = form.cleaned_data['text'] ) if form.cleaned_data['summary']: revision.summary = form.cleaned_data['summary'] else: revision.summary = \ diff.generate_answer_revision_summary( latest_revision, revision, ('wiki' in updated_fields)) revision.save() # TODO 5 body edits by the asker = automatic wiki mode # TODO 4 individual editors = automatic wiki mode # TODO Badges related to editing Answers return HttpResponseRedirect(answer.get_absolute_url()) else: revision_form = RevisionForm(answer, latest_revision) form = EditAnswerForm(answer, latest_revision) if revision_form is None: # We're about to redisplay after a POST where we didn't care which # revision was selected - make sure the revision the user started from # is still selected on redisplay. revision_form = RevisionForm(answer, latest_revision, request.POST) return render_to_response('edit_answer.html', { 'title': u'Edit Answer', 'question': answer.question, 'answer': answer, 'revision_form': revision_form, 'form': form, 'preview': preview, }, context_instance=RequestContext(request))
def can_edit_post(user, post): return auth.can_edit_post(user, post)