mirror of
https://github.com/reddit-archive/reddit.git
synced 2026-04-27 03:00:12 -04:00
wiki: Add an emergency admin delete.
This commit is contained in:
@@ -283,6 +283,7 @@ def make_map():
|
||||
|
||||
mc('/api/wiki/edit', controller='wikiapi', action='wiki_edit')
|
||||
mc('/api/wiki/hide', controller='wikiapi', action='wiki_revision_hide')
|
||||
mc('/api/wiki/delete', controller='wikiapi', action='wiki_revision_delete')
|
||||
mc('/api/wiki/revert', controller='wikiapi', action='wiki_revision_revert')
|
||||
mc('/api/wiki/alloweditor/:act', controller='wikiapi',
|
||||
requirements=dict(act="del|add"), action='wiki_allow_editor')
|
||||
|
||||
@@ -38,6 +38,7 @@ from r2.lib.template_helpers import join_urls
|
||||
from r2.lib.validator import (
|
||||
nop,
|
||||
validate,
|
||||
VAdmin,
|
||||
VBoolean,
|
||||
VExistingUname,
|
||||
VInt,
|
||||
@@ -418,6 +419,22 @@ class WikiApiController(WikiController):
|
||||
self.handle_error(400, 'INVALID_ACTION')
|
||||
return json.dumps({})
|
||||
|
||||
@validate(
|
||||
VModhash(),
|
||||
VAdmin(),
|
||||
pv=VWikiPageAndVersion(('page', 'revision')),
|
||||
deleted=VBoolean('deleted'),
|
||||
)
|
||||
def POST_wiki_revision_delete(self, pv, deleted):
|
||||
page, revision = pv
|
||||
if not revision:
|
||||
self.handle_error(400, 'INVALID_REVISION')
|
||||
if deleted and page.revision == str(revision._id):
|
||||
self.handle_error(400, 'REVISION_IS_CURRENT')
|
||||
revision.admin_deleted = deleted
|
||||
revision._commit()
|
||||
return json.dumps({'status': revision.admin_deleted})
|
||||
|
||||
@require_oauth2_scope("modwiki")
|
||||
@validate(VModhash(),
|
||||
VWikiModerator(),
|
||||
|
||||
@@ -264,6 +264,9 @@ class VWikiPage(VWikiPageName):
|
||||
return
|
||||
try:
|
||||
r = WikiRevision.get(version, pageid)
|
||||
if r.admin_deleted and not c.user_is_admin:
|
||||
self.set_error('INVALID_REVISION', code=404)
|
||||
raise AbortWikiError
|
||||
if not self.allow_hidden_revision and (r.is_hidden and not c.is_wiki_mod):
|
||||
self.set_error('HIDDEN_REVISION', code=403)
|
||||
raise AbortWikiError
|
||||
|
||||
@@ -639,7 +639,10 @@ class WikiRevisionBuilder(QueryBuilder):
|
||||
cls.add_props(user, types[cls])
|
||||
|
||||
return wrapped
|
||||
|
||||
|
||||
def must_skip(self, item):
|
||||
return item.admin_deleted and not c.user_is_admin
|
||||
|
||||
def keep_item(self, item):
|
||||
from r2.lib.validator.wiki import may_view
|
||||
return ((not item.is_hidden) and
|
||||
@@ -649,6 +652,8 @@ class WikiRecentRevisionBuilder(WikiRevisionBuilder):
|
||||
show_extended = False
|
||||
|
||||
def must_skip(self, item):
|
||||
if WikiRevisionBuilder.must_skip(self, item):
|
||||
return True
|
||||
item_age = datetime.datetime.now(g.tz) - item.date
|
||||
return item_age.days >= wiki.WIKI_RECENT_DAYS
|
||||
|
||||
|
||||
@@ -90,7 +90,8 @@ class WikiRevision(tdb_cassandra.UuidThing, Printable):
|
||||
_connection_pool = 'main'
|
||||
|
||||
_str_props = ('pageid', 'content', 'author', 'reason')
|
||||
_bool_props = ('hidden')
|
||||
_bool_props = ('hidden', 'admin_deleted')
|
||||
_defaults = {'admin_deleted': False}
|
||||
|
||||
cache_ignore = set(list(_str_props)).union(Printable.cache_ignore).union(['wikipage'])
|
||||
|
||||
|
||||
@@ -44,6 +44,10 @@
|
||||
.revision {
|
||||
.transition(opacity, 500ms);
|
||||
}
|
||||
.revision.deleted {
|
||||
opacity: .5;
|
||||
text-decoration: line-through;
|
||||
}
|
||||
.revision.hidden {
|
||||
opacity: .5;
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ r.wiki = {
|
||||
|
||||
init: function() {
|
||||
$('body').delegate('.wiki-page .revision_hide', 'click', this.toggleHide)
|
||||
$('body').delegate('.wiki-page .revision_delete', 'click', this.toggleDelete)
|
||||
$('body').delegate('.wiki-page .toggle-source', 'click', this.toggleSource)
|
||||
},
|
||||
|
||||
@@ -33,6 +34,34 @@ r.wiki = {
|
||||
$('.wiki-page .source').toggle('slow')
|
||||
},
|
||||
|
||||
toggleDelete: function(event) {
|
||||
event.preventDefault()
|
||||
var $this = $(this),
|
||||
url = r.wiki.baseApiUrl() + '/delete',
|
||||
$this_parent = $this.parents('.revision'),
|
||||
deleted = $this_parent.hasClass('deleted')
|
||||
$this_parent.toggleClass('deleted')
|
||||
r.wiki.request({
|
||||
url: url,
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
data: {
|
||||
revision: $this.data('revision'),
|
||||
deleted: !deleted
|
||||
},
|
||||
error: function() {
|
||||
$this_parent.toggleClass('deleted')
|
||||
},
|
||||
success: function(data) {
|
||||
if (!data.status) {
|
||||
$this_parent.removeClass('deleted')
|
||||
} else {
|
||||
$this_parent.addClass('deleted')
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
toggleHide: function(event) {
|
||||
event.preventDefault()
|
||||
var $this = $(this),
|
||||
|
||||
@@ -31,6 +31,9 @@
|
||||
%if thing._hidden:
|
||||
hidden
|
||||
%endif
|
||||
%if thing.admin_deleted:
|
||||
deleted
|
||||
%endif
|
||||
">
|
||||
|
||||
%if thing.show_extended:
|
||||
@@ -76,4 +79,10 @@
|
||||
}
|
||||
</td>
|
||||
%endif
|
||||
|
||||
%if c.user_is_admin:
|
||||
<td>
|
||||
<a href="#" class="revision_delete" data-revision="${thing._id}">delete</a>
|
||||
</td>
|
||||
%endif
|
||||
</tr>
|
||||
|
||||
Reference in New Issue
Block a user