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)
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))
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))