From a7d21e530f640a6e0f8493cfa9fded2c71b7c42d Mon Sep 17 00:00:00 2001 From: Sam Moore Date: Mon, 5 May 2014 23:44:43 +0800 Subject: [PATCH] Created Rate My Lit Review A system to Rate My Lit Review Look, you may be thinking "Why didn't he just work on his Lit Review?" ... That is pretty much exactly what I am thinking right now. --- .gitignore | 3 + hack-my-litreview.html | 12 +++ rate-my-litreview.html | 100 ++++++++++++++++++++++++ rate-my-litreview.py | 171 +++++++++++++++++++++++++++++++++++++++++ read-my-litreview.py | 39 ++++++++++ sledgehammer.png | Bin 0 -> 18093 bytes 6 files changed, 325 insertions(+) create mode 100644 hack-my-litreview.html create mode 100644 rate-my-litreview.html create mode 100755 rate-my-litreview.py create mode 100755 read-my-litreview.py create mode 100644 sledgehammer.png diff --git a/.gitignore b/.gitignore index d6f44f6..5197191 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,6 @@ *.bbl *.blg *.toc +page*.pdf +page*.svg +ratings.db diff --git a/hack-my-litreview.html b/hack-my-litreview.html new file mode 100644 index 0000000..55bc7fb --- /dev/null +++ b/hack-my-litreview.html @@ -0,0 +1,12 @@ + + + + Hack My LitReview (Patent Pending) + + +

Someone once told me I needed to rest more, or maybe they meant something different, but basically you need to POST your answers.

+

Hopefully you can overcome this diabolical security measure I have so cunningly wrought upon my form.

+

Happy HACKING

+ + + diff --git a/rate-my-litreview.html b/rate-my-litreview.html new file mode 100644 index 0000000..be96b88 --- /dev/null +++ b/rate-my-litreview.html @@ -0,0 +1,100 @@ + +
+ +

Rate This Page

+

Please answer the folowing questions first.

+

Or don't to give minimum rating.

+ + +

Formalness Of Language

+ + + + + + +
Space Baboon
Pirate Ship
Royal Dementia
School Ball
Officer Of The Day
+ +

Citeyness

+ + + + + + +
Nary A Reference In Cite
[Citation Needed]
[?] Does Not Count
Citation Ham Sandwich
More Citations Than Words
+ +

Reviewyness

+ + + + + + + + +
A Plague of Iarism
Wikipedia
The Articles Linked From Wikipedia
Blog Posts
Papers that link to Blog Posts
What, you expected me to check your citations?
+ +

Overallness

+ + + + + + +
Tear Inducingly Bad
Just Bad Enough To Read
Interestingly Insignificant
Blog Post Worthy
Would Read Another Page
+
+ +
+ +

Accurateness

+ + + + + + + + +
Dan Brown
A Body Of Lies
As Right As Stalin
Ministry Of Truth
Right Until Proven Left
No Shit Sherlock
+ +

Boringness

+ + + + + + + + + +
A Joy To Read
Somebody call the Fun Police
Too Punishing
Needs Salt
Deliciously Dry
Desert With One S
RFC2324
+ +

Pointyness

+ + + + + + +
Blunt As A Pixel
Infinitely Flat
Arbitrarily Smooth
Precisely Vague
Lead Pencil
+ + +

Words of Wisdom

+ + +

Turing Test

+

Are You A Robot?

+ + + +
+ + + diff --git a/rate-my-litreview.py b/rate-my-litreview.py new file mode 100755 index 0000000..251ad6a --- /dev/null +++ b/rate-my-litreview.py @@ -0,0 +1,171 @@ +#!/usr/bin/python + +import sys +import os +import sqlite3 +import cgi +import smtplib +from email.mime.text import MIMEText +import datetime +import subprocess +import random + +# Setup a sqlite3 database before deploying: +# sqlite3 ratings.db +# sqlite> CREATE TABLE ratings(formalness, citeyness, reviewyness, accurateness, boringness, pointyness, overallness, version, time, message, page); +# Get rid of database by DROP TABLE or deleting the file + +target_email = "matches@ucc.asn.au" +secret_answers = ["No", "no"] +dbfile = "ratings.db" + +def print_form(name): + """ Print the form """ + f = open(name,"r") + for line in f.readlines(): + print(line) + f.close() + +def git_stamp(): + # Python is nice but sometimes you just need to bash it over the head + p = subprocess.Popen("git show | head --lines=1 | awk '{print $NF}'", stdout=subprocess.PIPE, shell=True) + return p.stdout.readline().strip(" \r\n") + +def main(argv): + """ Do the shit """ + con = sqlite3.connect(dbfile) + c = con.cursor() + + # Values we expect + values = { + "formalness" : "", + "citeyness" : "", + "reviewyness" : "", + "accurateness" : "", + "boringness" : "", + "pointyness" : "", + "overallness" : "", + "page" : 0, + "secret" : "No" + } + + sanity = True + + # Max pages + p = subprocess.Popen("pdfinfo thesis.pdf | grep Pages | sed 's/[^0-9]*//'", stdout=subprocess.PIPE, shell=True) + max_pages = int(p.stdout.read().strip(" \r\bn")) + + + + form = cgi.FieldStorage() + + # Check we have all the values + for k in values.keys(): + if k in form: + values[k] = form[k].value + + + # No values? Print the form + if len(form.keys()) <= 0 or "page" not in form: + values["page"] = random.randint(1, max_pages) + + print("Content-type: text/html\n") + print("") + print("") + print("Rate My LitReview(TM) (Patent Pending)") + print("") + print("") + print("") + + # Check page number + try: + values["page"] = int(values["page"]) + except: + print("

Invalid Page %s!

" % values["page"]) + values["page"] = random.randint(1, max_pages) + sanity = False + + print("
") + + + print("

Rate My Lit Review

") + print("

Read a page, then rate it with the hammer of judgement!

") + print("

Page: of %d" % (values["page"], max_pages)) + if values["page"] > 1: + print("Prev" % (values["page"]-1)) + if values["page"] < max_pages: + print("Next" % (values["page"]+1)) + print("

") + + + + + + # Check secret question + if values["secret"] not in secret_answers: + print("

You failed the turing test! Hint: The answer is \"No\"

") + sanity = False + del values["secret"] + + + print("
") + print("" % values["page"]) + print("
") + + + print("
") + print_form("rate-my-litreview.html") + print("
") + + + if not sanity: + return 1 + + if len(form.keys()) <= 1: + print("") + return 0 + + # Sanity checks complete; set other values + values.update({"time" : int(datetime.datetime.now().strftime("%s"))}) + values.update({"version" : git_stamp()}) + + # Produce emails + + # Send emails + emails = ["matches@ucc.asn.au"] + userMsg = "Someone Rated Your LitReview!\n" + userMsg += "Your ratings\n-----------------\n" + for k in values: + userMsg += str(k) + ":\t" + str(values[k]) + + userMsg += "Happy LitReviewing!\n" + userMsg += "\n\nNOTE: This Message Automatically Sent By Rate My LitReview(TM) (Patent Pending)\n" + userMsg = MIMEText(userMsg) + for i,msg in enumerate([userMsg]): + msg["Subject"] = "Rate My LitReview" + msg["From"] = "matches@ucc.asn.au" + msg["To"] = emails[i] + s = smtplib.SMTP("localhost") + s.sendmail(msg["From"], [msg["To"]], msg.as_string()) + s.quit() + + # Tell them what happened. + # Do the thing + c.execute("INSERT INTO ratings("+",".join(values.keys())+") VALUES("+",".join(["?" for _ in xrange(len(values.keys()))])+")", [values[k] for k in values.keys()]) + con.commit() + con.close() + + print("" % (values["page"], values["page"])) + print("") + return 0 + + +if __name__ == "__main__": + #try: + sys.exit(main(sys.argv)) + #except: + # print "Content-type: text/plain\r\n\r\n" + # print "Something went wrong! You were unable to Rate Sam's LitReview(TM)!\nPlease send him an abusive email instead \n" + diff --git a/read-my-litreview.py b/read-my-litreview.py new file mode 100755 index 0000000..d675233 --- /dev/null +++ b/read-my-litreview.py @@ -0,0 +1,39 @@ +#!/usr/bin/python + +import sys +import os +import cgi +import time + +def main(argv): + form = cgi.FieldStorage() + page = int(form["page"].value) + + + try: + f = open("page%d.svg" % page) + except IOError: + os.system("pdftk A=thesis.pdf cat A%d output page%d.pdf" % (page, page)) + os.system("inkscape -l page%d.svg page%d.pdf" % (page, page)) + os.unlink("page%d.pdf" % page) + f = open("page%d.svg" % page) + + output = f.read() + print("Content-Length: %d" % len(output)) + print("Content-Type: image/svg+xml\n") + sys.stdout.write(output) + f.close() + + # TODO: Auto remove these on git pull, for now will just have to remember to do it + #os.unlink("page%d.svg" % page) + + + + +if __name__ == "__main__": + #try: + main(sys.argv) + #except: + # print("Content-type: text/plain\n") + # print("Something went wrong!\n") + sys.exit(0) diff --git a/sledgehammer.png b/sledgehammer.png new file mode 100644 index 0000000000000000000000000000000000000000..949786f0bb4e4672af9174e5ac327c93370b36c6 GIT binary patch literal 18093 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