コード例 #1
0
def edit(
    request,
    slug,
    rev_id=None,
    template_name='wakawaka/edit.html',
    extra_context=None,
    wiki_page_form=WikiPageForm,
    wiki_delete_form=DeleteWikiPageForm,
):
    """
    Displays the form for editing and deleting a page.
    """
    # Get the page for slug and get a specific revision, if given
    try:
        queryset = WikiPage.objects.all()
        page = queryset.get(slug=slug)
        rev = page.current
        initial = {'content': page.current.content}

        # Do not allow editing wiki pages if the user has no permission
        if not request.user.has_perms(
            ('wakawaka.change_wikipage', 'wakawaka.change_revision')
        ):
            return HttpResponseForbidden(
                gettext('You don\'t have permission to edit pages.')
            )

        if rev_id:
            # There is a specific revision, fetch this
            rev_specific = Revision.objects.get(pk=rev_id)
            if rev.pk != rev_specific.pk:
                rev = rev_specific
                rev.is_not_current = True
                initial = {
                    'content': rev.content,
                    'message': _('Reverted to "%s"' % rev.message),
                }

    # This page does not exist, create a dummy page
    # Note that it's not saved here
    except WikiPage.DoesNotExist:

        # Do not allow adding wiki pages if the user has no permission
        if not request.user.has_perms(
            ('wakawaka.add_wikipage', 'wakawaka.add_revision')
        ):
            return HttpResponseForbidden(
                gettext('You don\'t have permission to add wiki pages.')
            )

        page = WikiPage(slug=slug)
        page.is_initial = True
        rev = None
        initial = {
            'content': _('Describe your new page %s here...' % slug),
            'message': _('Initial revision'),
        }

    # Don't display the delete form if the user has nor permission
    delete_form = None
    # The user has permission, then do
    if request.user.has_perm('wakawaka.delete_wikipage') or request.user.has_perm(
        'wakawaka.delete_revision'
    ):
        delete_form = wiki_delete_form(request)
        if request.method == 'POST' and request.POST.get('delete'):
            delete_form = wiki_delete_form(request, request.POST)
            if delete_form.is_valid():
                return delete_form.delete_wiki(request, page, rev)

    # Page add/edit form
    form = wiki_page_form(initial=initial)
    if request.method == 'POST':
        form = wiki_page_form(data=request.POST)
        if form.is_valid():
            # Check if the content is changed, except there is a rev_id and the
            # user possibly only reverted the HEAD to it
            if not rev_id and initial['content'] == form.cleaned_data['content']:
                form.errors['content'] = (_('You have made no changes!'),)

            # Save the form and redirect to the page view
            else:
                try:
                    # Check that the page already exist
                    queryset = WikiPage.objects.all()
                    page = queryset.get(slug=slug)
                except WikiPage.DoesNotExist:
                    # Must be a new one, create that page
                    page = WikiPage(slug=slug)
                    page.save()

                form.save(request, page)

                kwargs = {'slug': page.slug}

                redirect_to = reverse('wakawaka_page', kwargs=kwargs)
                messages.success(
                    request, gettext('Your changes to %s were saved' % page.slug),
                )
                return HttpResponseRedirect(redirect_to)

    template_context = {
        'form': form,
        'delete_form': delete_form,
        'page': page,
        'rev': rev,
    }
    template_context.update(extra_context or {})
    return render(request, template_name, template_context)
コード例 #2
0
ファイル: views.py プロジェクト: mikl/django-wakawaka
def edit(request, slug, rev_id=None, template_name='wakawaka/edit.html', extra_context={},
         wiki_page_form=WikiPageForm, wiki_delete_form=DeleteWikiPageForm):
    '''
    Displays the form for editing and deleting a page.
    '''

    # Get the page for slug and get a specific revision, if given
    try:
        page = WikiPage.objects.get(slug=slug)
        rev = page.current
        initial = {'content': page.current.content}

        # Do not allow editing wiki pages if the user has no permission
        if not request.user.has_perms(('wakawaka.change_wikipage', 'wakawaka.change_revision' )):
            return HttpResponseForbidden(ugettext('You don\'t have permission to edit pages.'))

        if rev_id:
            # There is a specific revision, fetch this
            rev_specific = Revision.objects.get(pk=rev_id)
            if rev.pk != rev_specific.pk:
                rev = rev_specific
                rev.is_not_current = True
                initial = {'content': rev.content, 'message': _('Reverted to "%s"' % rev.message)}


    # This page does not exist, create a dummy page
    # Note that it's not saved here
    except WikiPage.DoesNotExist:

        # Do not allow adding wiki pages if the user has no permission
        if not request.user.has_perms(('wakawaka.add_wikipage', 'wakawaka.add_revision',)):
            return HttpResponseForbidden(ugettext('You don\'t have permission to add wiki pages.'))

        page = WikiPage(slug=slug)
        page.is_initial = True
        rev = None
        initial = {'content': _('Describe your new page %s here...' % slug),
                   'message': _('Initial revision')}

    # Don't display the delete form if the user has nor permission
    delete_form = None
    # The user has permission, then do
    if request.user.has_perm('wakawaka.delete_wikipage') or \
       request.user.has_perm('wakawaka.delete_revision'):
        delete_form = wiki_delete_form(request)
        if request.method == 'POST' and request.POST.get('delete'):
            delete_form = wiki_delete_form(request, request.POST)
            if delete_form.is_valid():
                return delete_form.delete_wiki(request, page, rev)

    # Page add/edit form
    form = wiki_page_form(initial=initial)
    if request.method == 'POST':
        form = wiki_page_form(data=request.POST)
        if form.is_valid():
            # Check if the content is changed, except there is a rev_id and the
            # user possibly only reverted the HEAD to it
            if not rev_id and initial['content'] == form.cleaned_data['content']:
                form.errors['content'] = (_('You have made no changes!'),)

            # Save the form and redirect to the page view
            else:
                try:
                    # Check that the page already exist
                    page = WikiPage.objects.get(slug=slug)
                except WikiPage.DoesNotExist:
                    # Must be a new one, create that page
                    page = WikiPage.objects.create(slug=slug)

                form.save(request, page)

                request.user.message_set.create(message=ugettext('Your changes to %s were saved' % page.slug))
                return HttpResponseRedirect(reverse('wakawaka_page', kwargs={'slug': page.slug}))

    template_context = {
        'form': form,
        'delete_form': delete_form,
        'page': page,
        'rev': rev,
    }
    template_context.update(extra_context)
    return render_to_response(template_name, template_context,
                              RequestContext(request))
コード例 #3
0
ファイル: views.py プロジェクト: snswa/django-wakawaka
def edit(request, slug, rev_id=None, template_name='wakawaka/edit.html',
         extra_context=None, wiki_page_form=WikiPageForm,
         wiki_delete_form=DeleteWikiPageForm):
    '''
    Displays the form for editing and deleting a page.
    '''
    if extra_context is None:
        extra_context = {}

    # be group aware
    group = getattr(request, "group", None)
    if group:
        bridge = request.bridge
        group_base = bridge.group_base_template()
    else:
        bridge = None
        group_base = None

    lock_owner = lock = None

    if request.user.is_authenticated():
        lock_id = request.user.id
    else:
        lock_id = request.session.session_key

    if group:
        lock_cache_key = "%s-lock-%s-%s" % (LOCK_CACHE_PREFIX, group.slug, slug)
    else:
        lock_cache_key = "%s-lock-%s" % (LOCK_CACHE_PREFIX, slug)

    cached = cache.get(lock_cache_key)
    if cached is not None:
        lock, lock_authorized, lock_timestamp = cached
    else:
        lock_authorized = request.user.is_authenticated()
        lock_timestamp = datetime.now()

    is_locked = lock is not None
    have_lock = lock == lock_id

    if lock_authorized and lock:
        lock_owner = User.objects.get(pk=lock)
    else:
        lock_owner = None

    # Get the page for slug and get a specific revision, if given
    try:
        if group:
            queryset = group.content_objects(WikiPage)
        else:
            queryset = WikiPage.objects.filter(content_type=None, object_id=None)
        page = queryset.get(slug=slug)
        rev = page.current
        initial = {'content': page.current.content}

        # Do not allow editing wiki pages if the user has no permission
        if not request.user.has_perms(('wakawaka.change_wikipage', 'wakawaka.change_revision'), page):
            if have_lock:
                # Removing lock in case permissions were revoked or lock not removed before.
                cache.delete(lock_cache_key)
            return HttpResponseForbidden(ugettext('You don\'t have permission to edit pages.'))

        if rev_id:
            # There is a specific revision, fetch this
            rev_specific = Revision.objects.get(pk=rev_id)
            if rev.pk != rev_specific.pk:
                rev = rev_specific
                rev.is_not_current = True
                initial = {'content': rev.content, 'message': _('Reverted to "%s"' % rev.message)}


    # This page does not exist, create a dummy page
    # Note that it's not saved here
    except WikiPage.DoesNotExist:

        # Do not allow adding wiki pages if the user has no permission
        if not request.user.has_perms(('wakawaka.add_wikipage', 'wakawaka.add_revision'), group):
            return HttpResponseForbidden(ugettext('You don\'t have permission to add wiki pages.'))

        page = WikiPage(slug=slug)
        page.is_initial = True
        rev = None
        initial = {'content': _('Describe your new page %s here...' % slug),
                   'message': _('Initial revision')}

    # Creating/canceling/resetting the lock
    cancel_lock = have_lock and request.GET.get('cancel_lock')
    if is_locked and cancel_lock:
        cache.delete(lock_cache_key)
        return HttpResponseRedirect(page.get_absolute_url())

    allowed_to_reset = request.user.has_perm('wakawaka.reset_lock', group)
    reset_lock = allowed_to_reset and request.GET.get('reset_lock')
    if not is_locked or reset_lock:
        cache.set(lock_cache_key, (lock_id, lock_authorized, datetime.now()), LOCK_TIMEOUT)
        if reset_lock:
            return HttpResponseRedirect(".")
        is_locked = have_lock = True

    # Don't display the delete form if the user has nor permission
    delete_form = None
    # The user has permission, then do
    if request.user.has_perm('wakawaka.delete_wikipage', page) or \
       request.user.has_perm('wakawaka.delete_revision', page):
        delete_form = wiki_delete_form(request, page)
        if request.method == 'POST' and request.POST.get('delete'):
            delete_form = wiki_delete_form(request, request.POST)
            if delete_form.is_valid():
                return delete_form.delete_wiki(request, page, rev)

    # Page add/edit form
    form = wiki_page_form(initial=initial)
    if request.method == 'POST':
        form = wiki_page_form(data=request.POST)
        if form.is_valid():
            # Check if the content is changed, except there is a rev_id and the
            # user possibly only reverted the HEAD to it
            if not rev_id and initial['content'] == form.cleaned_data['content']:
                form.errors['content'] = (_('You have made no changes!'),)

            # Save the form and redirect to the page view
            else:
                try:
                    # Check that the page already exist
                    if group:
                        queryset = group.content_objects(WikiPage)
                    else:
                        queryset = WikiPage.objects.filter(content_type=None, object_id=None)
                    page = queryset.get(slug=slug)
                except WikiPage.DoesNotExist:
                    # Must be a new one, create that page
                    page = WikiPage(slug=slug)
                    if group:
                        page = group.associate(page, commit=False)
                    page.save()

                form.save(request, page)

                if have_lock:
                    # Removing lock in case permissions were revoked or lock not removed before.
                    cache.delete(lock_cache_key)

                kwargs = {
                    'slug': page.slug,
                }

                if group:
                    redirect_to = bridge.reverse('wakawaka_page', group, kwargs=kwargs)
                else:
                    redirect_to = reverse('wakawaka_page', kwargs=kwargs)

                request.user.message_set.create(message=ugettext('Your changes to %s were saved' % page.slug))
                return HttpResponseRedirect(redirect_to)

    template_context = {
        'form': form,
        'delete_form': delete_form,
        'page': page,
        'rev': rev,
        'group': group,
        'group_base': group_base,
        'is_locked': is_locked,
        'have_lock': have_lock,
        'lock_owner': lock_owner,
        'lock_authorized': lock_authorized,
        'lock_timestamp': lock_timestamp,
        'lock_ttl': lock_timestamp + timedelta(seconds=LOCK_TIMEOUT),
        'allowed_to_reset': allowed_to_reset,
    }
    template_context.update(extra_context)
    return render_to_response(template_name, template_context,
                              RequestContext(request))