diff --git a/src/archive.py b/src/archive.py index 4d73ab6..5f18e17 100755 --- a/src/archive.py +++ b/src/archive.py @@ -5,14 +5,14 @@ from json import loads, dumps import requests as req -searchUrl = "https://archive.org/advancedsearch.php?q={0}&fl%5B%5D=avg_rating&fl%5B%5D=description&fl%5B%5D=identifier&fl%5B%5D=type&sort%5B%5D=&sort%5B%5D=&sort%5B%5D=&rows=50&page=1&output=json&callback=callback&save=yes#raw" +searchUrl = "https://archive.org/advancedsearch.php?q={0}&fl%5B%5D=avg_rating&fl%5B%5D=description&fl%5B%5D=identifier&fl%5B%5D=mediatype&fl%5B%5D=type&fl%5B%5D=type&sort%5B%5D=&sort%5B%5D=&sort%5B%5D=&rows=50&page=1&output=json&callback=callback&save=yes#raw" def searchIA(title, author): """ Do a search on The Internet Archive for a book """ print("running a search") - requrl = searchUrl.format(quote(title + " " + author)) + requrl = searchUrl.format(quote(title) + " AND " + quote(author)) try: results = loads(req.get(requrl).text[9:][0:-1]) except ValueError: @@ -24,7 +24,8 @@ def searchIA(title, author): return [] docs = results["response"]["docs"] urls = [] - for result in results["response"]["docs"][0:3]: + for result in [r for r in results["response"]["docs"][0:10] if r["mediatype"] == "texts"]: + print(result) urls.append("https://archive.org/details/%s" % result["identifier"]) return urls diff --git a/src/mcmaster/classes.py b/src/mcmaster/classes.py index d7c3b47..699a65a 100755 --- a/src/mcmaster/classes.py +++ b/src/mcmaster/classes.py @@ -207,7 +207,7 @@ def parseColumns(subject, html): classInfo = (list(getSectionInfo(table)) for table in islice((table for table in parsed.xpath(".//table") if table.xpath("@id") and - search(r"ICField[0-9]+\$scroll", table.xpath("@id")[0])), 1, sys.maxint)) + search(r"ICField[0-9]+\$scroll", table.xpath("@id")[0])), 1, sys.maxsize)) classNames = ((subject, span.text_content().strip()) for span in parsed.xpath(".//span") if span.xpath("@id") and @@ -238,7 +238,7 @@ class MosReq(object): self.codes_ = [] def getlist(self, subject): - sys.stderr.write("Getting " + subject + "\n") + sys.stderr.write("Getting %s\n" % subject.decode("UTF-8")) first_req = requests.get(searchurl, cookies=self.cookies).content # for some reason Mosaic wants us to request it twice, ?????????????????? self.statenum = getStateNum(first_req) @@ -252,7 +252,7 @@ class MosReq(object): self.statenum = getStateNum(first_req) except IndexError: pass - if "Your search will return over" in first_req: + if b"Your search will return over" in first_req: return requests.post(searchurl, data=payload2.format(self.statenum, self.semester), @@ -295,7 +295,8 @@ def request(codes, lists, semester): code = codes.get() try: lists.put(requester.classes(code)) - except: + except exception: + print(exception) codes.task_done() return codes.task_done() @@ -335,6 +336,7 @@ class CourseInfo(object): for cl in chain.from_iterable(sections): new_sections = [] for sec in cl[1]: + print(sec) if len(sec.day) > 1: for day in sec.day: new_sections.append(copy.deepcopy(sec)) diff --git a/src/scripts/book.tag b/src/scripts/book.tag index 0491b0f..7632e2d 100644 --- a/src/scripts/book.tag +++ b/src/scripts/book.tag @@ -2,21 +2,21 @@

-

- @@ -27,6 +27,7 @@

+ + diff --git a/src/scripts/results.tag b/src/scripts/results.tag index dcdaf4e..a01ff3a 100644 --- a/src/scripts/results.tag +++ b/src/scripts/results.tag @@ -1,6 +1,9 @@
- + 0} class="course-row columns" each={ rows } data="{ this }" classrow={ row }> +
+ No Results, Sorry! +
+ diff --git a/src/scripts/search.tag b/src/scripts/search.tag index f18eb43..61f0e60 100644 --- a/src/scripts/search.tag +++ b/src/scripts/search.tag @@ -1,51 +1,62 @@ -
+ +
-
+
+
+
+ + Type keywords of your course's name or the course code (e.g. PSYCH 2B03) +
+
-
- + -
-
- -
-
- + name="title"> +
+ +
+
+ +
+
+ +
+
-
- - Type keywords of your course's name or the course code (e.g. PSYCH 2B03) -
-
- + + + diff --git a/src/search.py b/src/search.py index ee04eb3..a9c67d0 100755 --- a/src/search.py +++ b/src/search.py @@ -20,8 +20,8 @@ es = elasticsearch.Elasticsearch() def summarize(text): splitted = text.split(" ") - if len(splitted) > 4: - return " ".join(splitted[0:4]) + ".." + if len(splitted) > 6: + return " ".join(splitted[0:6]) + ".." return text def sectionToJSON(section): @@ -204,7 +204,7 @@ def searchTerms(terms): if obj.books: secs["books"] = [ { - "booktitle" : summarize(book[0]), + "booktitle" : book[0], "bookauthor" : book[1], "bookprice" : book[2] } diff --git a/src/styles/bootstrap.min.css b/src/styles/bootstrap.min.css new file mode 100644 index 0000000..85a05da --- /dev/null +++ b/src/styles/bootstrap.min.css @@ -0,0 +1,14 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! + * Generated using the Bootstrap Customizer (https://getbootstrap.com/customize/?id=d32a97d05a9759eaf2e6b0452078ee0d) + * Config saved to config.json and https://gist.github.com/d32a97d05a9759eaf2e6b0452078ee0d + *//*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}} \ No newline at end of file diff --git a/src/styles/search.scss b/src/styles/search.scss index cc27e0d..57f027e 100644 --- a/src/styles/search.scss +++ b/src/styles/search.scss @@ -4,6 +4,10 @@ header { color: $blue; } +.form-group { + margin: auto; +} + .wraptext { white-space: pre-wrap !important; } @@ -77,17 +81,52 @@ a { margin-right: 0px !important; } -.form-item { - padding-left: 5px; - padding-right: 5px; - margin-right: -15px; +.search { + max-width: 60%; + margin-bottom: 10px; + margin-left: auto; + margin-right: auto; + @media (max-width: 735px) { + max-width: 80%; + } + @media (max-width: 480px) { + max-width: 100%; + margin-bottom: 10px; + } +} + +.semester { + margin-bottom: 10px; + margin-right: 5px; + @media (max-width: 480px) { + max-width: 100%; + margin-bottom: 10px; + } +} + +.search-btn { + margin-bottom: 10px; + margin-left: 5px; + @media (max-width: 480px) { + max-width: 100%; + margin-bottom: 10px; + } +} + +.search-controls { + margin-top: 5px; + margin-left: 20%; } .title { font-weight: bolder; - @media (min-width: 480px) { - margin-left: 80px; - } + float: right; + margin-right: 10%; +} + +.header-text { + margin: auto; + max-width: 80%; } .ui-autocomplete { @@ -135,13 +174,18 @@ a { } .logo { - margin-top: 20px; - margin-left: -175px; + float: left; + margin-left: -20%; + margin-top: 15px; + @media (max-width: 480px) { + margin-left: 45% !important; + } } .page-top { font-size: 15px; - width: 50% !important; + margin: auto; + width: 80% !important; } .help-toast { diff --git a/src/templates/search.html b/src/templates/search.html index 9debd7c..cf96a4d 100644 --- a/src/templates/search.html +++ b/src/templates/search.html @@ -1,50 +1,44 @@ -{% extends "bootstrap/base.html" %} -{% block head %} - {{super()}} - + -{% endblock %} -
- -
- - {% block content %} - + -{% endblock %} -
-{% block styles %} - -{{super()}} -{% endblock %} -{% block scripts %} - {{super()}} - - - - -{% endblock %} - + + + + + + + diff --git a/src/visualize.py b/src/visualize.py index 3ec1098..215296f 100755 --- a/src/visualize.py +++ b/src/visualize.py @@ -9,24 +9,8 @@ from operator import attrgetter import pygal import csv -class Textbook(object): - def __init__(self, dept, code, title, author, price): - self.dept = dept - self.code = code - self.title = title - self.author = author - self.price = float(price) - - def __repr__(self): - return "Dept = %s, Code = %s, %s by %s, costs $%s" % (self.dept, - self.code, - self.title, - self.author, - self.price) - - def courses(): - with open("./books.csv", "r") as books: + with open("./mcmaster/courses.csv", "r") as books: booksreader = csv.reader(books) for row in booksreader: yield row diff --git a/src/website.py b/src/website.py index bdbd64c..a543202 100755 --- a/src/website.py +++ b/src/website.py @@ -142,7 +142,6 @@ def ClassSearch(configfile=None): app = Flask(__name__) app.register_blueprint(blueprint, url_prefix="/search") - Bootstrap(app) #app.config["scripts"] = "./scripts" #app.config["styles"] = "./styles" return app