Commit b3797a41 by Bridger Maxwell

Got most of admin deleting and user deleting implemented. Need to work on…

Got most of admin deleting and user deleting implemented. Need to work on interface for encountering deleted articles.

--HG--
branch : bridgerwiki
parent 608fa179
...@@ -220,12 +220,24 @@ class Revision(models.Model): ...@@ -220,12 +220,24 @@ class Revision(models.Model):
counter = models.IntegerField(verbose_name=_('Revision#'), default=1, editable=False) counter = models.IntegerField(verbose_name=_('Revision#'), default=1, editable=False)
previous_revision = models.ForeignKey('self', blank=True, null=True, editable=False) previous_revision = models.ForeignKey('self', blank=True, null=True, editable=False)
# Deleted has three values. 0 is normal, non-deleted. 1 is if it was deleted by a normal user. It should
# be a NEW revision, so that it appears in the history. 2 is a special flag that can be applied or removed
# from a normal revision. It means it has been admin-deleted, and can only been seen by an admin. It doesn't
# show up in the history.
deleted = models.IntegerField(verbose_name=_('Deleted group'), default=0) deleted = models.IntegerField(verbose_name=_('Deleted group'), default=0)
def get_user(self): def get_user(self):
return self.revision_user if self.revision_user else _('Anonymous') return self.revision_user if self.revision_user else _('Anonymous')
def adminSetDeleted(self, deleted):
self.deleted = deleted
super(Revision, self).save()
def save(self, **kwargs): def save(self, **kwargs):
#Really, the only time this should not happen is when the revision is being marked as deleted
print "kwargs" , kwargs, not ('is_deletion_modification' in kwargs and kwars['is_deletion_modification'])
print "save was just called"
# Check if contents have changed... if not, silently ignore save # Check if contents have changed... if not, silently ignore save
if self.article and self.article.current_revision: if self.article and self.article.current_revision:
if self.article.current_revision.contents == self.contents: if self.article.current_revision.contents == self.contents:
......
...@@ -38,6 +38,7 @@ def view(request, wiki_url): ...@@ -38,6 +38,7 @@ def view(request, wiki_url):
d = {'wiki_article': article, d = {'wiki_article': article,
'wiki_write': article.can_write_l(request.user), 'wiki_write': article.can_write_l(request.user),
'wiki_attachments_write': article.can_attach(request.user), 'wiki_attachments_write': article.can_attach(request.user),
'wiki_current_revision_deleted' : not (article.current_revision.deleted == 0),
} }
d.update(csrf(request)) d.update(csrf(request))
return render_to_response('simplewiki_view.html', d) return render_to_response('simplewiki_view.html', d)
...@@ -149,9 +150,15 @@ def edit(request, wiki_url): ...@@ -149,9 +150,15 @@ def edit(request, wiki_url):
if f.is_valid(): if f.is_valid():
new_revision = f.save(commit=False) new_revision = f.save(commit=False)
new_revision.article = article new_revision.article = article
# Check that something has actually been changed...
if not new_revision.get_diff(): if request.POST.__contains__('delete'):
return (None, HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),)))) if (article.current_revision.deleted == 1): #This article has already been deleted. Redirect
return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),)))
new_revision.contents = "Article Deletion Revision\n==="
new_revision.deleted = 1
elif not new_revision.get_diff():
return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),)))
if not request.user.is_anonymous(): if not request.user.is_anonymous():
new_revision.revision_user = request.user new_revision.revision_user = request.user
new_revision.save() new_revision.save()
...@@ -160,7 +167,9 @@ def edit(request, wiki_url): ...@@ -160,7 +167,9 @@ def edit(request, wiki_url):
new_revision.article.save() new_revision.article.save()
return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),))) return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),)))
else: else:
f = EditForm({'contents': article.current_revision.contents, 'title': article.title}) startContents = article.current_revision.contents if (article.current_revision.deleted == 0) else 'Headline\n===\n\n'
f = EditForm({'contents': startContents, 'title': article.title})
d = {'wiki_form': f, d = {'wiki_form': f,
'wiki_write': True, 'wiki_write': True,
'wiki_article': article, 'wiki_article': article,
...@@ -192,18 +201,40 @@ def history(request, wiki_url, page=1): ...@@ -192,18 +201,40 @@ def history(request, wiki_url, page=1):
history = Revision.objects.filter(article__exact = article).order_by('-counter') history = Revision.objects.filter(article__exact = article).order_by('-counter')
if request.method == 'POST': if request.method == 'POST':
if request.POST.__contains__('revision'): if request.POST.__contains__('revision'): #They selected a version, but they can be either deleting or changing the version
perm_err = check_permissions(request, article, check_write=True, check_locked=True) perm_err = check_permissions(request, article, check_write=True, check_locked=True)
if perm_err: if perm_err:
return perm_err return perm_err
try: try:
r = int(request.POST['revision']) r = int(request.POST['revision'])
article.current_revision = Revision.objects.get(id=r) revision = Revision.objects.get(id=r)
article.save() if request.POST.__contains__('change'):
article.current_revision = revision
article.save()
elif request.POST.__contains__('delete') and request.user.is_superuser:
if (revision.deleted == 0):
revision.adminSetDeleted(2)
elif request.POST.__contains__('restore') and request.user.is_superuser:
print "revision.deleted: " , revision.deleted
if (revision.deleted == 2):
print "save was just called"
revision.adminSetDeleted(0)
print "revison.deleted is now " , revision.deleted
elif request.POST.__contains__('delete_all') and request.user.is_superuser:
Revision.objects.filter(article__exact = article, deleted = 0).update(deleted = 2)
except: except:
pass pass
finally: finally:
return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),))) return HttpResponseRedirect(reverse('wiki_view', args=(article.get_url(),)))
#
#
# <input type="submit" name="delete" value="Delete revision"/>
# <input type="submit" name="restore" value="Restore revision"/>
# <input type="submit" name="delete_all" value="Delete all revisions">
# %else:
# <input type="submit" name="delete_article" value="Delete all revisions">
#
page_count = (history.count()+(page_size-1)) / page_size page_count = (history.count()+(page_size-1)) / page_size
if p > page_count: if p > page_count:
...@@ -219,7 +250,8 @@ def history(request, wiki_url, page=1): ...@@ -219,7 +250,8 @@ def history(request, wiki_url, page=1):
'wiki_write': article.can_write_l(request.user), 'wiki_write': article.can_write_l(request.user),
'wiki_attachments_write': article.can_attach(request.user), 'wiki_attachments_write': article.can_attach(request.user),
'wiki_article': article, 'wiki_article': article,
'wiki_history': history[beginItem:beginItem+page_size],} 'wiki_history': history[beginItem:beginItem+page_size],
'show_delete_revision' : request.user.is_superuser,}
d.update(csrf(request)) d.update(csrf(request))
return render_to_response('simplewiki_history.html', d) return render_to_response('simplewiki_history.html', d)
...@@ -394,16 +426,21 @@ def fetch_from_url(request, url): ...@@ -394,16 +426,21 @@ def fetch_from_url(request, url):
return (article, path, err) return (article, path, err)
def check_permissions(request, article, check_read=False, check_write=False, check_locked=False): def check_permissions(request, article, check_read=False, check_write=False, check_locked=False, check_deleted=True):
read_err = check_read and not article.can_read(request.user) read_err = check_read and not article.can_read(request.user)
write_err = check_write and not article.can_write(request.user) write_err = check_write and not article.can_write(request.user)
locked_err = check_locked and article.locked locked_err = check_locked and article.locked
if read_err or write_err or locked_err: deleted_err = check_deleted and not (article.current_revision.deleted == 0)
if request.user.is_superuser:
deleted_err = False
if read_err or write_err or locked_err or deleted_err:
d = {'wiki_article': article, d = {'wiki_article': article,
'wiki_err_noread': read_err, 'wiki_err_noread': read_err,
'wiki_err_nowrite': write_err, 'wiki_err_nowrite': write_err,
'wiki_err_locked': locked_err,} 'wiki_err_locked': locked_err,
'wiki_err_deleted': deleted_err,}
d.update(csrf(request)) d.update(csrf(request))
# TODO: Make this a little less jarring by just displaying an error # TODO: Make this a little less jarring by just displaying an error
# on the current page? (no such redirect happens for an anon upload yet) # on the current page? (no such redirect happens for an anon upload yet)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment