added admin page for review of recent link submissions
This commit is contained in:
parent
c0d3ec4341
commit
25de2207f7
1 changed files with 32 additions and 10 deletions
|
@ -61,6 +61,9 @@ EXPORT_ENCODING = "utf-8"
|
||||||
EXPORT_CHARSET = "utf8"
|
EXPORT_CHARSET = "utf8"
|
||||||
EXPORT_FILENAME_TEMPLATE = "%%(prefix)s_%%(title)s_%s.csv" % datetime.datetime.now().strftime("%Y-%m-%d")
|
EXPORT_FILENAME_TEMPLATE = "%%(prefix)s_%%(title)s_%s.csv" % datetime.datetime.now().strftime("%Y-%m-%d")
|
||||||
DEFAULT_DATE = datetime.datetime.now() + datetime.timedelta(days=DEFAULT_DAYS_AHEAD)
|
DEFAULT_DATE = datetime.datetime.now() + datetime.timedelta(days=DEFAULT_DAYS_AHEAD)
|
||||||
|
URL_DOMAIN_REGEX = r"(\A|\s|\()([a-zA-Z_\-\.]+\.[a-zA-Z]{2,4})(/|\)|\s|\Z)"
|
||||||
|
URL_PROTOCOL_REGEX = r"(\A|\s|\()(https?://[\w/\?\.\#=;,_\-\~&]*)(\)|\s|\Z)"
|
||||||
|
|
||||||
|
|
||||||
POLL_SETTINGS = {
|
POLL_SETTINGS = {
|
||||||
"show_all_submissions": (bool, True),
|
"show_all_submissions": (bool, True),
|
||||||
|
@ -88,7 +91,7 @@ class ContentSubmission(sqlobject.SQLObject):
|
||||||
submitter = sqlobject.UnicodeCol()
|
submitter = sqlobject.UnicodeCol()
|
||||||
content = sqlobject.UnicodeCol()
|
content = sqlobject.UnicodeCol()
|
||||||
poll_id = sqlobject.ForeignKey("Poll", cascade=True)
|
poll_id = sqlobject.ForeignKey("Poll", cascade=True)
|
||||||
timestamp_creation = sqlobject.DateTimeCol()
|
timestamp_creation = sqlobject.DateTimeCol(default=datetime.datetime.now)
|
||||||
|
|
||||||
def get_creation_time_string(self):
|
def get_creation_time_string(self):
|
||||||
return str(self.timestamp_creation)
|
return str(self.timestamp_creation)
|
||||||
|
@ -157,7 +160,7 @@ class Poll(sqlobject.SQLObject):
|
||||||
admin_hash_key = sqlobject.StringCol()
|
admin_hash_key = sqlobject.StringCol()
|
||||||
title = sqlobject.UnicodeCol()
|
title = sqlobject.UnicodeCol()
|
||||||
description = sqlobject.UnicodeCol()
|
description = sqlobject.UnicodeCol()
|
||||||
timestamp_creation = sqlobject.DateTimeCol()
|
timestamp_creation = sqlobject.DateTimeCol(default=datetime.datetime.now)
|
||||||
|
|
||||||
def get_related_polls(self):
|
def get_related_polls(self):
|
||||||
""" get all directly and indirectly connected polls up to a certain
|
""" get all directly and indirectly connected polls up to a certain
|
||||||
|
@ -335,18 +338,25 @@ def get_markup_with_links(text):
|
||||||
return prefix + url + suffix
|
return prefix + url + suffix
|
||||||
# surround all urls with html markup
|
# surround all urls with html markup
|
||||||
text = genshi.escape(text)
|
text = genshi.escape(text)
|
||||||
text = re.sub(r"(\A|\s|\()([a-zA-Z_\-\.]+\.[a-zA-Z]{2,4})(/|\)|\s|\Z)",
|
text = re.sub(URL_DOMAIN_REGEX, expand_protocol, text)
|
||||||
expand_protocol, text)
|
text = re.sub(URL_PROTOCOL_REGEX, get_link_markup, text)
|
||||||
text = re.sub(r"(\A|\s|\()(https?://[\w/\?\.\#=;,_\-\~&]*)(\)|\s|\Z)",
|
|
||||||
get_link_markup, text)
|
|
||||||
return get_markup_with_formatted_linebreaks(text, "<br />")
|
return get_markup_with_formatted_linebreaks(text, "<br />")
|
||||||
|
|
||||||
|
|
||||||
|
def has_links(text):
|
||||||
|
if re.search(URL_DOMAIN_REGEX, text) or re.search(URL_PROTOCOL_REGEX, text):
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def get_markup_with_formatted_linebreaks(text, break_char):
|
def get_markup_with_formatted_linebreaks(text, break_char):
|
||||||
text = text.replace("\r\n", "\n")
|
text = text.replace("\r\n", "\n")
|
||||||
text = text.replace("\r", "\n")
|
text = text.replace("\r", "\n")
|
||||||
text = text.replace("\n", break_char)
|
text = text.replace("\n", break_char)
|
||||||
return text
|
return text
|
||||||
|
|
||||||
|
|
||||||
def get_poll_setting_string(key, value):
|
def get_poll_setting_string(key, value):
|
||||||
if not key in POLL_SETTINGS.keys():
|
if not key in POLL_SETTINGS.keys():
|
||||||
return ""
|
return ""
|
||||||
|
@ -770,10 +780,9 @@ def new_poll(bobo_request, submit=None, cancel=None, author=None, title=None,
|
||||||
# create the new poll
|
# create the new poll
|
||||||
hash_key = get_new_hash_key()
|
hash_key = get_new_hash_key()
|
||||||
admin_hash_key = get_new_hash_key()
|
admin_hash_key = get_new_hash_key()
|
||||||
now = datetime.datetime.now()
|
|
||||||
new_poll = Poll(hash_key=hash_key, admin_hash_key=admin_hash_key,
|
new_poll = Poll(hash_key=hash_key, admin_hash_key=admin_hash_key,
|
||||||
timestamp_creation=now, author=data["author"],
|
author=data["author"], title=data["title"],
|
||||||
title=data["title"], description=data["description"])
|
description=data["description"])
|
||||||
# apply the template settings
|
# apply the template settings
|
||||||
for key, value in template_settings.items():
|
for key, value in template_settings.items():
|
||||||
new_poll.change_setting(key, value)
|
new_poll.change_setting(key, value)
|
||||||
|
@ -896,7 +905,6 @@ def submit_content(bobo_request, hash_key=None, submitter=None, content=None):
|
||||||
return render("poll_details.html", input_data=data, **value_dict)
|
return render("poll_details.html", input_data=data, **value_dict)
|
||||||
else:
|
else:
|
||||||
# create the new submission content
|
# create the new submission content
|
||||||
data["timestamp_creation"] = datetime.datetime.now()
|
|
||||||
data["poll_id"] = poll.id
|
data["poll_id"] = poll.id
|
||||||
ContentSubmission(**data)
|
ContentSubmission(**data)
|
||||||
# remove "content" for the next input
|
# remove "content" for the next input
|
||||||
|
@ -1230,6 +1238,20 @@ def admin_maintenance(age_days=60, keyword="viagra", keyword_submission="viagra"
|
||||||
|
|
||||||
return bobo.redirect("../admin")
|
return bobo.redirect("../admin")
|
||||||
|
|
||||||
|
|
||||||
|
@bobo.query('/admin/spam_test')
|
||||||
|
def show_spam_test_page(bobo_request, last_days=14):
|
||||||
|
try:
|
||||||
|
last_days = int(last_days)
|
||||||
|
except ValueError:
|
||||||
|
last_days = 7
|
||||||
|
now = datetime.datetime.now()
|
||||||
|
oldest = now - datetime.timedelta(days=last_days)
|
||||||
|
cs = ContentSubmission
|
||||||
|
submissions = [item for item in cs.select(cs.q.timestamp_creation >= oldest).orderBy("-timestamp_creation") if has_links(item.content)]
|
||||||
|
return render("admin_spam_test.html", submissions=submissions,
|
||||||
|
last_days=last_days, **get_default_values(bobo_request))
|
||||||
|
|
||||||
@bobo.query('/admin')
|
@bobo.query('/admin')
|
||||||
@bobo.query('/admin/')
|
@bobo.query('/admin/')
|
||||||
@bobo.query('/admin/page/:page')
|
@bobo.query('/admin/page/:page')
|
||||||
|
|
Loading…
Reference in a new issue