1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/events/check_edit_speed.py Thu May 05 20:11:07 2016 +0200
1.3 @@ -0,0 +1,93 @@
1.4 +# -*- coding: iso-8859-1 -*-
1.5 +"""
1.6 + MoinMoin - Check the speed of page editing
1.7 +
1.8 + Check to see how quickly the user wanted to edit a page after previous
1.9 + actions. Prevent them from saving a page if they were too fast.
1.10 +
1.11 + @copyright: 2016 Paul Boddie <paul@boddie.org.uk>
1.12 + @license: GNU GPL, see COPYING for details.
1.13 +"""
1.14 +
1.15 +from MoinMoin.events import PagePreSaveEvent, Abort
1.16 +from MoinMoin.logfile.eventlog import EventLog
1.17 +from MoinMoin import wikiutil
1.18 +import time
1.19 +
1.20 +# The default editing delay where no configuration setting has been provided.
1.21 +# Value expressed in seconds.
1.22 +
1.23 +editing_delay_default = "10"
1.24 +
1.25 +# Event handling.
1.26 +
1.27 +def handle_presave(event):
1.28 + request = event.request
1.29 + _ = request.getText
1.30 +
1.31 + # Obtain user details. If no user is identified, nothing can be done.
1.32 +
1.33 + username = request.user.name
1.34 + if not username:
1.35 + return None
1.36 +
1.37 + # Obtain the required delay between viewing and editing. This is expressed
1.38 + # in seconds.
1.39 +
1.40 + delay = float(getattr(request.cfg, "editing_delay", editing_delay_default))
1.41 +
1.42 + # Obtain the current time.
1.43 +
1.44 + time_now = time.time()
1.45 +
1.46 + # Check in the log for the last action by the user. This requires the
1.47 + # recording of the username in the log.
1.48 +
1.49 + log = EventLog(request)
1.50 + log.set_filter(["VIEWPAGE", "SAVEPAGE", "SAVENEW"])
1.51 +
1.52 + pagename = event.page_editor.page_name
1.53 + last_viewed = None
1.54 + last_saved = None
1.55 +
1.56 + for event in log.reverse():
1.57 + event_usecs, event_type, event_attr = event[:3]
1.58 +
1.59 + # Convert to seconds and determine if the start of the delay period has
1.60 + # been reached.
1.61 +
1.62 + event_secs = wikiutil.version2timestamp(event_usecs)
1.63 + if time_now - event_secs >= delay:
1.64 + break
1.65 +
1.66 + event_page = event_attr.get("pagename")
1.67 + event_user = event_attr.get("username")
1.68 +
1.69 + # Stop when encountering the latest event entry for this page and user.
1.70 +
1.71 + if event_page == pagename and event_user == username:
1.72 + if event_type == "VIEWPAGE":
1.73 + last_viewed = event_secs
1.74 + else:
1.75 + last_saved = event_secs
1.76 + break
1.77 +
1.78 + # Any attempt to save occurring too soon after VIEWPAGE is possibly an
1.79 + # automated edit.
1.80 +
1.81 + if last_viewed:
1.82 + return Abort(_("Page not changed: the page was saved too quickly after viewing."))
1.83 +
1.84 + # Any attempt to save without any previous VIEWPAGE, but after a SAVENEW or
1.85 + # SAVEPAGE may also be an automated edit.
1.86 +
1.87 + elif last_saved:
1.88 + return Abort(_("Page not changed: the page was saved again too soon or saved without viewing the page."))
1.89 +
1.90 + return None
1.91 +
1.92 +def handle(event):
1.93 + if isinstance(event, PagePreSaveEvent):
1.94 + return handle_presave(event)
1.95 +
1.96 +# vim: tabstop=4 expandtab shiftwidth=4