Exemple #1
0
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))
Exemple #2
0
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))
Exemple #3
0
def _edit_question(request, question):
    """
    Allows the user to edit a Question's title, text and tags.

    If the Question is not already in wiki mode, the user can put it in
    wiki mode, or it will automatically be put in wiki mode if the
    question has been edited five times by the person who asked it, or
    has been edited by four different users.
    """
    latest_revision = question.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(question, latest_revision,
                                         request.POST)
            if revision_form.is_valid():
                # Replace Question details with those from the selected revision
                form = EditQuestionForm(
                    question,
                    QuestionRevision.objects.get(
                        question=question,
                        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 = 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 '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()
                        tags_changed = (latest_revision.tagnames !=
                                        form.cleaned_data['tags'])
                        tags_updated = False
                        # 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)[:180],
                            'html': html,
                        }
                        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:
                            tags_updated = Question.objects.update_tags(
                                question, question.tagnames, request.user)
                        # 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 = \
                                diff.generate_question_revision_summary(
                                    latest_revision, revision,
                                    ('wiki' in updated_fields))
                        revision.save()
                        # TODO 5 body edits by the author = automatic wiki mode
                        # TODO 4 individual editors = automatic wiki mode
                        # TODO Badges related to Tag usage
                        # TODO Badges related to editing Questions
                    return HttpResponseRedirect(question.get_absolute_url())
    else:
        if 'revision' in request.GET:
            revision_form = RevisionForm(question, latest_revision,
                                         request.GET)
            if revision_form.is_valid():
                # Replace Question details with those from the selected revision
                form = EditQuestionForm(
                    question,
                    QuestionRevision.objects.get(
                        question=question,
                        revision=revision_form.cleaned_data['revision']))
        else:
            revision_form = RevisionForm(question, latest_revision)
            form = EditQuestionForm(question, 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(question, latest_revision, request.POST)
    return render_to_response('edit_question.html', {
        'title': u'Edit Question',
        'question': question,
        'revision_form': revision_form,
        'form': form,
        'preview': preview,
    },
                              context_instance=RequestContext(request))
Exemple #4
0
def _edit_question(request, question):
    """
    Allows the user to edit a Question's title, text and tags.

    If the Question is not already in wiki mode, the user can put it in
    wiki mode, or it will automatically be put in wiki mode if the
    question has been edited five times by the person who asked it, or
    has been edited by four different users.
    """
    latest_revision = question.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(question, latest_revision, request.POST)
            if revision_form.is_valid():
                # Replace Question details with those from the selected revision
                form = EditQuestionForm(question,
                    QuestionRevision.objects.get(question=question,
                        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 = 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 '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()
                        tags_changed = (latest_revision.tagnames !=
                                        form.cleaned_data['tags'])
                        tags_updated = False
                        # 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)[:180],
                            'html': html,
                        }
                        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:
                            tags_updated = Question.objects.update_tags(
                                question, question.tagnames, request.user)
                        # 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 = \
                                diff.generate_question_revision_summary(
                                    latest_revision, revision,
                                    ('wiki' in updated_fields))
                        revision.save()
                        # TODO 5 body edits by the author = automatic wiki mode
                        # TODO 4 individual editors = automatic wiki mode
                        # TODO Badges related to Tag usage
                        # TODO Badges related to editing Questions
                    return HttpResponseRedirect(question.get_absolute_url())
    else:
        if 'revision' in request.GET:
            revision_form = RevisionForm(question, latest_revision, request.GET)
            if revision_form.is_valid():
                # Replace Question details with those from the selected revision
                form = EditQuestionForm(question,
                    QuestionRevision.objects.get(question=question,
                        revision=revision_form.cleaned_data['revision']))
        else:
            revision_form = RevisionForm(question, latest_revision)
            form = EditQuestionForm(question, 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(question, latest_revision, request.POST)
    return render_to_response('edit_question.html', {
        'title': u'Edit Question',
        'question': question,
        'revision_form': revision_form,
        'form': form,
        'preview': preview,
    }, context_instance=RequestContext(request))