├── .coveralls.yml ├── .dockerignore ├── .flake8 ├── .git-blame-ignore-revs ├── .gitattributes ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── config.yml │ └── feature_request.md └── workflows │ ├── python-app.yml │ └── stale.yml ├── .gitignore ├── .gitmodules ├── .jshintrc ├── .prettierignore ├── .prettierrc.js ├── .readthedocs.yml ├── .travis.yml ├── CONTRIBUTING.md ├── ChangeLog.rst ├── Dockerfile ├── LICENSE ├── README.rst ├── VERSION ├── __init__.py ├── books └── .gitignore ├── build └── preview │ ├── .gitignore │ ├── _sources │ └── .gitignore │ ├── _static │ ├── .gitignore │ ├── activecodethumb.png │ ├── audio │ │ ├── Example04_Tour01_Line01.mp3 │ │ ├── Example04_Tour01_Line01.wav │ │ ├── Example04_Tour01_Line02.mp3 │ │ ├── Example04_Tour01_Line02.wav │ │ ├── Example04_Tour01_Line03.mp3 │ │ └── Example04_Tour01_Line03.wav │ ├── clock.png │ ├── close.png │ ├── first.png │ ├── last.png │ ├── next.png │ ├── pause.png │ └── prev.png │ ├── _templates │ └── plugin_layouts │ │ └── sphinx_bootstrap │ │ ├── globaltoc.html │ │ ├── layout.html │ │ ├── localtoc.html │ │ ├── relations.html │ │ ├── sourcelink.html │ │ ├── static │ │ ├── bootstrap-3.0.0 │ │ │ ├── css │ │ │ │ └── bootstrap.min.css │ │ │ ├── fonts │ │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ │ └── glyphicons-halflings-regular.woff │ │ │ └── js │ │ │ │ └── bootstrap.min.js │ │ ├── bootstrap-sphinx.css_t │ │ ├── bootstrap-sphinx.js │ │ └── img │ │ │ ├── Facebook.png │ │ │ ├── Facebook_icon.png │ │ │ ├── Twitter.png │ │ │ ├── Twitter_icon.png │ │ │ └── logo_small.png │ │ ├── subchapter.html │ │ └── theme.conf │ ├── conf.py │ └── pavement.py ├── codechat_config.yaml ├── conf.py ├── controllers ├── admin.py ├── ajax.py ├── appadmin.py ├── assignments.py ├── books.py ├── dashboard.py ├── default.py ├── designer.py ├── exams.py ├── lti.py ├── oauth.py ├── peer.py ├── proxy.py └── toctree.rst ├── docker-compose.yml ├── docker ├── .env.prototype ├── README.rst ├── build │ └── .gitignore ├── docker_tools.py ├── docker_tools_misc.py ├── gunicorn_config │ ├── __init__.py │ ├── common_config.py │ ├── fastapi_config.py │ ├── toctree.rst │ └── web2py_config.py ├── nginx │ └── sites-available │ │ └── runestone.template ├── routes.py ├── runguard-install.py ├── runguard │ ├── runguard-config.h │ └── runguard.c ├── setup.py ├── toctree.rst └── wsgihandler.py ├── docs ├── RunestoneArch.svg ├── installation.rst └── lti.rst ├── index.rst ├── jobeinabox ├── Dockerfile ├── files │ ├── CodeTestHelper.java │ ├── hamcrest-all-1.3.jar │ └── junit-4.13-beta-3.jar └── include │ ├── CImg.h │ ├── CTurtle.hpp │ └── catch.hpp ├── lti.config ├── makeRelease.sh ├── models ├── 0.py ├── 1.py.prototype ├── db.py ├── db_ebook.py ├── db_ebook_chapters.py ├── grouped_assignments.py ├── lti.py ├── menu.py ├── practice.py ├── questions.py ├── toctree.rst └── user_biography.py ├── modules ├── .gitignore ├── __init__.py ├── db_dashboard.py ├── feedback.py ├── outcome_request.py ├── outcome_response.py ├── pytsugi_utils.py ├── questions_report.py ├── rs_grading.py ├── rs_practice.py └── stripe_form.py ├── poetry.lock ├── production ├── README.rst ├── docker-compose.yml ├── env.template └── load_balancer_default ├── pylintrc ├── pyproject.toml ├── requirements-rtd.txt ├── rsmanage ├── __init__.py ├── fill_practice_log_missings.py ├── grade.py ├── makeuser.py ├── migrate.py ├── noop.py ├── rsmanage.py ├── setup.py └── toctree.rst ├── runestone_poetry_project ├── __init__.py ├── poetry_fix.py ├── poetry_fix_diagram.png └── poetry_fix_diagram.vsdx ├── scripts ├── active_users.py ├── buildPageViews.py ├── cleanup_courses.py ├── crawl_sitemap.py ├── createMchoiceGrades.py ├── currentTraffic.py ├── database_pruning.py ├── dbtimes.py ├── dump_trace.py ├── find_modified_index.py ├── getLoad.sh ├── grep_logs.py ├── install_new_image.sh ├── loadTimes.py ├── loadtest.py ├── log2csv.py ├── logging.conf ├── make_new_production.sh ├── make_script_tags.py ├── make_sitemap.py ├── migrateLibrary.py ├── monitor_log.py ├── nightlytransfer.py ├── numberFigs.py ├── parseLog.py ├── parse_tickets.py ├── populateDivTable.py ├── populate_lib.py ├── pparse.py ├── request_part.html ├── routes.py ├── seedUnittestAnswers.py ├── split.py ├── start ├── sumuse ├── tickets2db.py ├── toRstTable.py ├── toctree.rst └── uwsgi_mem.py ├── static ├── .buildinfo ├── _images │ ├── 8arrayTree.png │ ├── CS-Prereqs.png │ ├── Internet.png │ ├── SIGCSE-logo-large.jpg │ ├── Texas__oneColor_orange.png │ ├── TreeDefRecursive.png │ ├── U-M-logo-preview.jpg │ ├── UT_Square_logo.png │ ├── addtohead.png │ ├── adjMat.png │ ├── adjMatEx.png │ ├── adjlist.png │ ├── adt.png │ ├── assignment1.png │ ├── assignment2.png │ ├── badrotate.png │ ├── basicdeque.png │ ├── basicqueue.png │ ├── bcast1.png │ ├── bfderive.png │ ├── bfs1.png │ ├── bfs2.png │ ├── bfs3.png │ ├── bfsDone.png │ ├── bigknight.png │ ├── binsearch.png │ ├── biology.png │ ├── blackbox.png │ ├── bookstack2.png │ ├── booktree.png │ ├── bstdel3.png │ ├── bstput.png │ ├── bubblepass.png │ ├── buildExp1.png │ ├── buildExp2.png │ ├── buildExp3.png │ ├── buildExp4.png │ ├── buildExp5.png │ ├── buildExp6.png │ ├── buildExp7.png │ ├── buildExp8.png │ ├── buildheap.png │ ├── callTree.png │ ├── callstack.png │ ├── chaining.png │ ├── changeTable.png │ ├── circuit1.png │ ├── clustering.png │ ├── compTree.png │ ├── completeTour.png │ ├── complexmove.png │ ├── connector.png │ ├── cshome.png │ ├── dectobin.png │ ├── dfstree.png │ ├── digraph.png │ ├── dijkstraa.png │ ├── dijkstrab.png │ ├── dijkstrac.png │ ├── dijkstrad.png │ ├── dijkstrae.png │ ├── dijkstraf.png │ ├── directory.png │ ├── elevenCents.png │ ├── evalpostfix1.png │ ├── evalpostfix2.png │ ├── exerTree.png │ ├── firstsplit.png │ ├── fraction1.png │ ├── fraction2.png │ ├── fraction3.png │ ├── gates.png │ ├── gendfsa.png │ ├── gendfsb.png │ ├── gendfsc.png │ ├── gendfsd.png │ ├── gendfse.png │ ├── gendfsf.png │ ├── gendfsg.png │ ├── gendfsh.png │ ├── gendfsi.png │ ├── gendfsj.png │ ├── gendfsk.png │ ├── gendfsl.png │ ├── hanoi.png │ ├── hardunbalanced.png │ ├── hashtable.png │ ├── hashtable2.png │ ├── heapOrder.png │ ├── hotpotato.png │ ├── idea.png │ ├── idea2.png │ ├── inheritance1.png │ ├── initlinkedlist.png │ ├── insertionpass.png │ ├── insertionsort.png │ ├── intopost.png │ ├── knightmoves.png │ ├── ktdfsa.png │ ├── ktdfsb.png │ ├── ktdfsc.png │ ├── ktdfsd.png │ ├── ktdfse.png │ ├── ktdfsf.png │ ├── ktdfsg.png │ ├── ktdfsh.png │ ├── linearprobing1.png │ ├── linearprobing2.png │ ├── linkedlist.png │ ├── linkedlistinsert.png │ ├── listvdict.png │ ├── logo-trademark.png │ ├── luther_college_vertical_blue.png │ ├── maze.png │ ├── meParse.png │ ├── meSimple.png │ ├── mergesortA.png │ ├── mergesortB.png │ ├── moveCount.png │ ├── moveleft.png │ ├── moveright.png │ ├── mst1.png │ ├── namequeue.png │ ├── newplot.png │ ├── newplot2.png │ ├── nlParse.png │ ├── node.png │ ├── node2.png │ ├── nsf-logo.png │ ├── orderedsearch.png │ ├── orderlinkedlist.png │ ├── palindromesetup.png │ ├── pancakes.png │ ├── pancakesDFS.png │ ├── pancakesTS.png │ ├── partitionA.png │ ├── partitionB.png │ ├── percDown.png │ ├── percUp.png │ ├── poptime.png │ ├── prevcurr.png │ ├── prima.png │ ├── primb.png │ ├── primc.png │ ├── primd.png │ ├── prime.png │ ├── primf.png │ ├── primg.png │ ├── primitive.png │ ├── ptx-logo.png │ ├── quadratic.png │ ├── recstack.png │ ├── remove.png │ ├── remove2.png │ ├── removeinit.png │ ├── rightrotate1.png │ ├── rotatelr.png │ ├── rotexer1.png │ ├── routeGraph.png │ ├── rsi_logo.jpg │ ├── runestone.mov │ ├── runestone.webm │ ├── scc1.png │ ├── scc1a.png │ ├── scc1b.png │ ├── scc2.png │ ├── sccforest.png │ ├── search.png │ ├── searchicon.png │ ├── searchicon2.jpg │ ├── selectionsort.png │ ├── seqsearch.png │ ├── seqsearch2.png │ ├── shellsortA.png │ ├── shellsortB.png │ ├── shellsortC.png │ ├── shellsortD.png │ ├── simpleBST.png │ ├── simpleparcheck.png │ ├── simplereversal2.png │ ├── simpleunbalanced.png │ ├── simulationsetup.png │ ├── smalltree.png │ ├── stringhash.png │ ├── stringhash2.png │ ├── sumlistIn.png │ ├── sumlistOut.png │ ├── swap.png │ ├── toStr.png │ ├── toStrBase2.png │ ├── transpose1.png │ ├── transpose2.png │ ├── traversal.png │ ├── treedef1.png │ ├── treerecs.png │ ├── truthtable.png │ ├── unbalanced.png │ ├── wordbuckets.png │ ├── wordgraph.png │ ├── worstAVL.png │ └── wrongorder.png ├── _static │ ├── ajax-loader.gif │ ├── basic.css │ ├── clock.png │ ├── codemirror.js │ ├── codemirror.js.old │ ├── comment-bright.png │ ├── comment-close.png │ ├── comment.png │ ├── contents.png │ ├── doctools.js │ ├── down-pressed.png │ ├── down.png │ ├── edu-python.css │ ├── file.png │ ├── jquery.textarea.js │ ├── minus.png │ ├── navigation.png │ ├── plus.png │ ├── pygments.css │ ├── python.js │ ├── python.js.old │ ├── searchtools.js │ ├── simplemodal.js │ ├── sphinxdoc.css │ ├── theme │ │ ├── default.css.old │ │ ├── elegant.css │ │ ├── elegant.css.old │ │ ├── neat.css │ │ ├── neat.css.old │ │ ├── night.css │ │ └── night.css.old │ ├── underscore.js │ ├── up-pressed.png │ ├── up.png │ ├── video.css │ └── websupport.js ├── bootstrap-3.0.0 │ ├── css │ │ └── bootstrap.min.css │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ └── glyphicons-halflings-regular.woff │ └── js │ │ └── bootstrap.min.js ├── css │ ├── accessibility.css │ ├── basic.css │ ├── calendar.css │ ├── carousel.css │ ├── custom.css │ ├── datepicker.css │ ├── dd.css │ ├── html4css1.css │ ├── index.css │ ├── pygments.css │ ├── select2.multi-checkboxes.css │ ├── skeleton.css │ ├── superfish.css │ └── web2py.css ├── dashboard-charts.js ├── dashboard.css ├── dashboard │ └── icons │ │ ├── cohorts.png │ │ ├── gradebook copy.png │ │ ├── gradebook.png │ │ └── settings.png ├── favicon.ico ├── images │ ├── Facebook_icon.png │ ├── GettingStartedWithRunestone.png │ ├── RAIcon.png │ ├── RunestoneBanner0.png │ ├── RunestoneBanner1.png │ ├── RunestoneBanner2.png │ ├── Twitter_icon.png │ ├── anon.jpg │ ├── arrows-ffffff.png │ ├── completed.png │ ├── css3buttons_backgrounds.png │ ├── css3buttons_icons.png │ ├── glyphicons-halflings-white.png │ ├── glyphicons-halflings.png │ ├── logo_small.png │ ├── poweredby.png │ ├── seperator.png │ ├── shadow-section.png │ ├── shadow.png │ ├── spinner10.gif │ └── ui-icons_222222_256x240.png ├── jquery.datetimepicker.min.css ├── js │ ├── FileSaver.min.js │ ├── WaitingFor.js │ ├── admin.js │ ├── animationbase.js │ ├── assignment_table.js │ ├── books.js │ ├── bootstrap-datepicker.js │ ├── bootstrap-table │ │ ├── bootstrap-editable │ │ │ ├── css │ │ │ │ └── bootstrap-editable.css │ │ │ ├── img │ │ │ │ ├── clear.png │ │ │ │ └── loading.gif │ │ │ └── js │ │ │ │ └── bootstrap-editable.js │ │ ├── bootstrap-table-editable.min.js │ │ ├── bootstrap-table-en-US.min.js │ │ ├── bootstrap-table-reorder-rows.css │ │ ├── bootstrap-table-reorder-rows.js │ │ ├── bootstrap-table.min.css │ │ ├── bootstrap-table.min.js │ │ └── jquery.tablednd.js │ ├── calendar.js │ ├── dd_belatedpng.js │ ├── doctools.js │ ├── documentation_options.js │ ├── holder.js │ ├── jquery-1.10.2.js │ ├── jquery-1.10.2.min.js │ ├── jquery-1.10.2.min.map │ ├── jquery-fix.js │ ├── jquery.datetimepicker.full.min.js │ ├── jquery.fireworks.js │ ├── jquery.js │ ├── jquery.tabletoCSV.js │ ├── jquery.tinyscrollbar.min.js │ ├── jstree.min.js │ ├── jstree_themes │ │ └── proton │ │ │ ├── 30px.png │ │ │ ├── 32px.png │ │ │ ├── fonts │ │ │ └── titillium │ │ │ │ ├── titilliumweb-bold-webfont.eot │ │ │ │ ├── titilliumweb-bold-webfont.svg │ │ │ │ ├── titilliumweb-bold-webfont.ttf │ │ │ │ ├── titilliumweb-bold-webfont.woff │ │ │ │ ├── titilliumweb-extralight-webfont.eot │ │ │ │ ├── titilliumweb-extralight-webfont.svg │ │ │ │ ├── titilliumweb-extralight-webfont.ttf │ │ │ │ ├── titilliumweb-extralight-webfont.woff │ │ │ │ ├── titilliumweb-regular-webfont.eot │ │ │ │ ├── titilliumweb-regular-webfont.svg │ │ │ │ ├── titilliumweb-regular-webfont.ttf │ │ │ │ └── titilliumweb-regular-webfont.woff │ │ │ ├── style.css │ │ │ ├── style.min.css │ │ │ └── throbber.gif │ ├── markcomplete.js │ ├── modernizr.custom.js │ ├── peer.js │ ├── select2.multi-checkboxes.js │ ├── selfgrade.js │ ├── share.js │ ├── sorttable.js │ ├── superfish.js │ ├── underscore.js │ └── web2py.js ├── motd.html ├── rectangle_badge.png ├── robots.txt ├── runestone-custom-sphinx-bootstrap.css ├── searchindex.js └── websupport-custom.css ├── tests ├── .coveragerc ├── README.rst ├── __init__.py ├── ci_utils.py ├── conftest.py ├── locustfile.py ├── test_admin.py ├── test_ajax2.py ├── test_autograder.py ├── test_course_1 │ ├── .gitignore │ ├── _sources │ │ ├── Iris.csv │ │ ├── activecode.rst │ │ ├── index.rst │ │ ├── lp_demo-test.py │ │ ├── lp_demo.py │ │ ├── multiquestion.rst │ │ ├── selectquestion.rst │ │ └── test_chapter_1 │ │ │ ├── dynamicquestions.rst │ │ │ ├── subchapter_a.rst │ │ │ ├── subchapter_b.rst │ │ │ └── toctree.rst │ ├── _static │ │ ├── .gitignore │ │ ├── activecodethumb.png │ │ ├── audio │ │ │ ├── Example04_Tour01_Line01.mp3 │ │ │ ├── Example04_Tour01_Line01.wav │ │ │ ├── Example04_Tour01_Line02.mp3 │ │ │ ├── Example04_Tour01_Line02.wav │ │ │ ├── Example04_Tour01_Line03.mp3 │ │ │ └── Example04_Tour01_Line03.wav │ │ ├── clock.png │ │ ├── close.png │ │ ├── first.png │ │ ├── img │ │ │ └── logo_small.png │ │ ├── last.png │ │ ├── next.png │ │ ├── pause.png │ │ └── prev.png │ ├── conf.py │ └── pavement.py ├── test_dashboard.py ├── test_designer.py ├── test_formatting.py ├── test_server.py └── utils.py └── views ├── __init__.py ├── _qeditor.html ├── _sphinx_static_files.html ├── admin ├── admin.html ├── assignments.html ├── dashboard.html ├── doc.html ├── enroll_students.html ├── grading.html ├── instructors.html ├── manage_exercises.html ├── practice.html ├── progress.html ├── sections_create.html ├── simulate_exam.html ├── startdate.html ├── studentactivity.html └── tickets.html ├── appadmin.html ├── assignments ├── chooseAssignment.html ├── doAssignment.html ├── index.html ├── practice.html ├── practiceNotStartedYet.html └── settz_then_practice.html ├── books ├── index.html └── published.html ├── dashboard ├── active.html ├── exercisemetrics.html ├── grades.html ├── index.html ├── questiongrades.html ├── studentreport.html ├── subchapdetail.html └── subchapoverview.html ├── default ├── about.html ├── accessIssue.html ├── ack.html ├── ads.html ├── bio.html ├── bios.html ├── ca_addendum.html ├── courses.html ├── ct_addendum.html ├── donate.html ├── error.html ├── payment.html ├── privacy.html ├── remove.html ├── reportabug.html ├── start.html ├── terms.html ├── user.html └── wisp.html ├── designer ├── build.html └── index.html ├── exams └── one_exam_competency.html ├── generic.csv ├── generic.html ├── generic.json ├── generic.jsonp ├── generic.load ├── generic.pdf ├── generic.rss ├── generic.xml ├── layout.html ├── lti ├── index.html └── store.html ├── oauth └── index.html ├── peer ├── dashboard.html ├── extra.html ├── home.html ├── instructor.html ├── peer_async.html ├── peer_question.html └── student.html └── web2py_ajax.html /.coveralls.yml: -------------------------------------------------------------------------------- 1 | repo_token: luElJYbYOu3bnb0nka7qFTq0xbyGxrP9a 2 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | # *********************************** 2 | # |docname| - Files ignored by docker 3 | # *********************************** 4 | # Per the `docs `__, these files are excluded from the Docker context. 5 | .git 6 | .venv 7 | _build 8 | **/Data 9 | **/Notebooks 10 | **/TestNotebooks 11 | **/Solutions 12 | **/altair*.json 13 | **/__pycache__ 14 | books 15 | docker/letsencrypt 16 | -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length=88 3 | ignore=F821, 4 | W503, 5 | E203, 6 | # space before : 7 | E501, 8 | E265, 9 | E266, 10 | # too many # 11 | E711, 12 | E712 13 | # web2py needs to compare to == True or == False for queries 14 | 15 | builtins=settings, 16 | request, 17 | response, 18 | db, 19 | auth, 20 | redirect, 21 | XML, 22 | URL, 23 | T, 24 | HTTP, 25 | cache, 26 | gluon, 27 | verifyInstructorStatus 28 | -------------------------------------------------------------------------------- /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | ed4b5bca88882e20398ae92777d470bee7571363 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Ensure files that must always have LF line endings on checkout will by ensuring Docker build and bash scripts will work regardless of OS 2 | 3 | Dockerfile text eol=lf 4 | *.sh text eol=lf 5 | scripts/** text eol=lf 6 | docker/docker_tools.py eol=lf 7 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: RunestoneInteractive # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: runestone 5 | #open_collective: # Replace with a single Open Collective username 6 | #ko_fi: # Replace with a single Ko-fi username 7 | #tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | #community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | #liberapay: # Replace with a single Liberapay username 10 | #issuehunt: # Replace with a single IssueHunt username 11 | #otechie: # Replace with a single Otechie username 12 | #custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | custom: ["https://www.paypal.me/runestoneinteractive"] -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "" 5 | labels: "" 6 | assignees: "" 7 | --- 8 | 9 | **Please check the current issues** Many bug reports are duplicates, this just creates more work for us. Searching the issues first may give you your answer or a workaround! If not adding new information to an existing report is much more helpful than a new report. 10 | 11 | **What Course are you in** 12 | Knowing the course will help us a lot 13 | 14 | **What Page were you on** 15 | 16 | **What is your username** 17 | 18 | **Describe the bug** 19 | A clear and concise description of what what you were trying to accomplish and what went wrong. Vague statements like X does not work are not helpful. Imagine if one of your students sent you an email that said, "My program doesn't work, whats wrong with it?" Could you help them with only that to go on? 20 | 21 | **Traceback** 22 | If you got here through the Bug Report page and there was a stack trace, please paste it here 23 | 24 | **Javascript Errors** 25 | Many many errors can be quickly diagnosed from the Javascript Console error log. On Chrome this is View --> Developer --> Javascript Console, on Safari ⌥⌘i or Develop --> Show Web Inspector on Firefox Tools --> Web Developer --> Toggle Tools 26 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Runestone Community Support 4 | url: https://blog.runestone.academy/pages/support.html 5 | about: Our slack channel is the best place to get immediate support for questions 6 | - name: Frequently Asked Questions 7 | url: https://blog.runestone.academy/pages/faq.html 8 | about: Please Check here before asking a question or creating an issue 9 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | name: Mark stale issues and pull requests 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: "30 1 * * *" 7 | 8 | jobs: 9 | stale: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/stale@v3 14 | with: 15 | repo-token: ${{ secrets.GITHUB_TOKEN }} 16 | days-before-stale: 90 17 | stale-issue-message: "Stale issue message" 18 | stale-pr-message: "Stale pull request message" 19 | stale-issue-label: "no-issue-activity" 20 | stale-pr-label: "no-pr-activity" 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 127.0.0.1.2012* 2 | errors/* 3 | sessions/* 4 | 127.0.0.1-* 5 | databases/* 6 | *.o 7 | *~ 8 | .DS_Store 9 | databases/storage.sqlite 10 | data/* 11 | databases/c8b669d15150d7109e5f7ab36744a5b7_auth_cas.table 12 | databases/c8b669d15150d7109e5f7ab36744a5b7_auth_event.table 13 | databases/c8b669d15150d7109e5f7ab36744a5b7_auth_group.table 14 | databases/c8b669d15150d7109e5f7ab36744a5b7_auth_membership.table 15 | databases/c8b669d15150d7109e5f7ab36744a5b7_auth_permission.table 16 | databases/c8b669d15150d7109e5f7ab36744a5b7_auth_user.table 17 | private/* 18 | *.pyc 19 | *.class 20 | /.idea/ 21 | \#*\# 22 | TAGS 23 | cache/* 24 | *.log 25 | *.orig 26 | .pythonhistory 27 | custom_courses/ 28 | /source/index.rst 29 | models/1.py 30 | /runestone.sublime-project 31 | /runestone.sublime-workspace 32 | /chromedriver.log 33 | /ghostdriver.log 34 | /paverconfig.py 35 | /build_info 36 | node_modules 37 | /test 38 | */_static/blockly*.html 39 | /static/* 40 | # except 41 | !/static/_static 42 | !/static/_sources 43 | !/static/_images 44 | !/static/css 45 | !/static/js 46 | !/static/robots.txt 47 | !/static/favicon.ico 48 | !/static/runestone-custom-sphinx-bootstrap.css 49 | !/static/websupport-custom.css 50 | !/static/images 51 | !/static/bootstrap* 52 | !/static/dashboard* 53 | !/static/motd.html 54 | .vscode/* 55 | *.egg-info/ 56 | *.egg 57 | AC_scripts 58 | Pipfile.lock 59 | rsmanage/build 60 | tests/test_book/build 61 | instructors.csv 62 | htmlcov 63 | /languages/ 64 | docker-compose.override.yml 65 | .history 66 | /_build/ 67 | sphinx-enki-info.txt 68 | _builddoctrees 69 | .venv 70 | .nova 71 | .env 72 | docker/nginx/sites-available/runestone 73 | ready.txt 74 | books/* -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/.gitmodules -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "esversion": 8 3 | } 4 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | views -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | // prettier.config.js or .prettierrc.js 2 | module.exports = { 3 | trailingComma: "es5", 4 | tabWidth: 4, 5 | printWidth: 89, 6 | }; 7 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | # ******************************************** 2 | # |docname| - Read the Docs configuration file 3 | # ******************************************** 4 | # This sets up the RTD build to use CodeChat. See https://docs.readthedocs.io/en/stable/config-file/v2.html for details on this file's format. 5 | 6 | # Required 7 | version: 2 8 | 9 | # Build documentation in the docs/ directory with Sphinx 10 | sphinx: 11 | configuration: conf.py 12 | 13 | # Optionally set the version of Python and requirements required to build your docs 14 | python: 15 | version: 3.8 16 | install: 17 | - requirements: requirements-rtd.txt -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to Runestone Server 2 | 3 | We welcome contributions large and small to the Runestone Components. We welcome contributions from newcomers as well as seasoned Runestone hackers. You don't need to be an expert to make a contribution here. When I started this project I had barely written a line of Javascript, Runestone is a project that is all about helping people learn, if you learn by helping us improve Runestone that is even better! 4 | 5 | Your next moves should be to check out the `documentation `\_ It will guide you though installation and give you an overview of how Runestone is put together. The documentation is a work in progress so don't be shy about letting us know whats missing. 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The following license applies to all files in this repository, with these exceptions: 2 | 3 | - CSS and JS files included by this library contain their own, third-party licenses. 4 | - The Handsontable component is commercial software; if you make a copy of this software, you must contact https://handsontable.com/ to verify your compliance with their license. 5 | - The text of "How to Think Like a Computer Scientist", which is published under the GNU Documentation License 6 | - The text of "Problem Solving with Algorithms and Data Structures using Python", which is (c) Franklin Beedle and Associates. 7 | 8 | 9 | The MIT License (MIT) 10 | 11 | Copyright (c) 2014 Brad Miller, David Ranum. 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in 21 | all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 29 | THE SOFTWARE. 30 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/__init__.py -------------------------------------------------------------------------------- /books/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore everything in this directory 2 | * 3 | # Except this file and ``__init__.py``. 4 | !.gitignore 5 | !__init__.py 6 | -------------------------------------------------------------------------------- /build/preview/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | build_info 3 | sphinx_settings.json 4 | -------------------------------------------------------------------------------- /build/preview/_sources/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | # except 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /build/preview/_static/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/.gitignore -------------------------------------------------------------------------------- /build/preview/_static/activecodethumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/activecodethumb.png -------------------------------------------------------------------------------- /build/preview/_static/audio/Example04_Tour01_Line01.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/audio/Example04_Tour01_Line01.mp3 -------------------------------------------------------------------------------- /build/preview/_static/audio/Example04_Tour01_Line01.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/audio/Example04_Tour01_Line01.wav -------------------------------------------------------------------------------- /build/preview/_static/audio/Example04_Tour01_Line02.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/audio/Example04_Tour01_Line02.mp3 -------------------------------------------------------------------------------- /build/preview/_static/audio/Example04_Tour01_Line02.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/audio/Example04_Tour01_Line02.wav -------------------------------------------------------------------------------- /build/preview/_static/audio/Example04_Tour01_Line03.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/audio/Example04_Tour01_Line03.mp3 -------------------------------------------------------------------------------- /build/preview/_static/audio/Example04_Tour01_Line03.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/audio/Example04_Tour01_Line03.wav -------------------------------------------------------------------------------- /build/preview/_static/clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/clock.png -------------------------------------------------------------------------------- /build/preview/_static/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/close.png -------------------------------------------------------------------------------- /build/preview/_static/first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/first.png -------------------------------------------------------------------------------- /build/preview/_static/last.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/last.png -------------------------------------------------------------------------------- /build/preview/_static/next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/next.png -------------------------------------------------------------------------------- /build/preview/_static/pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/pause.png -------------------------------------------------------------------------------- /build/preview/_static/prev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_static/prev.png -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/globaltoc.html: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/localtoc.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/relations.html: -------------------------------------------------------------------------------- 1 | {%- if prev %} 2 |
  • 3 | 4 | 5 | 6 |
  • 7 | {% if not next %} 8 |
  • 9 | {% endif %} 10 | 11 | {%- endif %} 12 | 13 | {%- if next %} 14 |
  • 15 | 16 | 17 | 18 |
  • 19 |
  • 20 | {%- endif %} 21 | 22 | 31 | -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/sourcelink.html: -------------------------------------------------------------------------------- 1 | {%- if show_source and has_source and sourcename %} 2 | {{ _('Source') }} 4 | {%- endif %} 5 | -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/bootstrap-sphinx.css_t: -------------------------------------------------------------------------------- 1 | /* 2 | * bootstrap-sphinx.css 3 | * ~~~~~~~~~~~~~~~~~~~~ 4 | * 5 | * Sphinx stylesheet -- Twitter Bootstrap theme. 6 | */ 7 | 8 | .navbar-inverse .brand { 9 | color: #FFF; 10 | } 11 | 12 | .page-top { 13 | top: 0px; 14 | } 15 | 16 | {% if theme_navbar_fixed_top == 'true' %} 17 | body { 18 | {% if theme_bootswatch_theme %} 19 | padding-top: 50px; 20 | {% else %} 21 | padding-top: 40px; 22 | {% endif %} 23 | } 24 | .page-top { 25 | {% if theme_bootswatch_theme %} 26 | top: 50px; 27 | {% else %} 28 | top: 40px; 29 | {% endif %} 30 | } 31 | 32 | .navbar-inner { 33 | padding-left: 12px !important; 34 | padding-right: 12px !important; 35 | } 36 | {% endif %} 37 | 38 | {%- block sidebarlogo %} 39 | {%- if logo %} 40 | @media (min-width: 980px) { 41 | .navbar h3 a, .navbar .brand { 42 | background: transparent url("{{ logo }}") no-repeat 22px 3px; 43 | padding-left: 62px; 44 | } 45 | } 46 | {%- endif %} 47 | {%- endblock %} 48 | 49 | table { 50 | border: 0; 51 | } 52 | 53 | .footer { 54 | width: 100%; 55 | border-top: 1px solid #ccc; 56 | padding-top: 10px; 57 | } 58 | -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/img/Facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/img/Facebook.png -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/img/Facebook_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/img/Facebook_icon.png -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/img/Twitter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/img/Twitter.png -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/img/Twitter_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/img/Twitter_icon.png -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/img/logo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/build/preview/_templates/plugin_layouts/sphinx_bootstrap/static/img/logo_small.png -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/subchapter.html: -------------------------------------------------------------------------------- 1 | {%- if prev %} 2 | 7 | 8 | {% endif %} 9 | 10 | {%- if next %} 11 | 16 | Next Section - {{ next.title }} 17 | {%- endif %} 18 | 19 | 25 | -------------------------------------------------------------------------------- /build/preview/_templates/plugin_layouts/sphinx_bootstrap/theme.conf: -------------------------------------------------------------------------------- 1 | # Twitter Bootstrap Theme 2 | [theme] 3 | inherit = basic 4 | stylesheet = basic.css 5 | pygments_style = tango 6 | 7 | # Configurable options. 8 | [options] 9 | # Navigation bar title. (Default: ``project`` value) 10 | navbar_title = 11 | 12 | # Tab name for entire site. (Default: "Site") 13 | navbar_site_name = Site 14 | 15 | # Global TOC depth for "site" navbar tab. (Default: 1) 16 | # Switching to -1 shows all levels. 17 | globaltoc_depth = 1 18 | 19 | # Include hidden TOCs in Site navbar? 20 | # 21 | # Note: If this is "false", you cannot have mixed ``:hidden:`` and 22 | # non-hidden ``toctree`` directives in the same page, or else the build 23 | # will break. 24 | # 25 | # Values: "true" (default) or "false" 26 | globaltoc_includehidden = true 27 | 28 | # HTML navbar class (Default: "navbar") to attach to
    element. 29 | # For black navbar, do "navbar navbar-inverse" 30 | navbar_class = navbar 31 | 32 | # Fix navigation bar to top of page? 33 | # Values: "true" (default) or "false" 34 | navbar_fixed_top = true 35 | 36 | # Location of link to source. 37 | # Options are "nav" (default), "footer" or anything else to exclude. 38 | source_link_position = nav 39 | 40 | # Bootswatch (http://bootswatch.com/) theme. 41 | # 42 | # Options are nothing with "" (default) or the name of a valid theme such as 43 | # "amelia" or "cosmo". 44 | # 45 | # Note that this is served off CDN, so won't be available offline. 46 | bootswatch_theme = "" 47 | -------------------------------------------------------------------------------- /build/preview/pavement.py: -------------------------------------------------------------------------------- 1 | import paver 2 | from paver.easy import * 3 | import paver.setuputils 4 | paver.setuputils.install_distutils_tasks() 5 | import os, sys 6 | from runestone.server import get_dburl 7 | from sphinxcontrib import paverutils 8 | import pkg_resources 9 | 10 | sys.path.append(os.getcwd()) 11 | 12 | home_dir = os.getcwd() 13 | master_url = 'http://127.0.0.1:8000' 14 | master_app = 'runestone' 15 | serving_dir = "./build/preview" 16 | dest = "../../static" 17 | 18 | options( 19 | sphinx = Bunch(docroot=".",), 20 | 21 | build = Bunch( 22 | builddir="./build/preview", 23 | sourcedir="_sources", 24 | outdir="./build/preview", 25 | confdir=".", 26 | project_name = "preview", 27 | template_args={'course_id': 'preview', 28 | 'login_required':'false', 29 | 'appname':master_app, 30 | 'loglevel': 0, 31 | 'course_url':master_url, 32 | 'use_services': 'false', 33 | 'python3': 'true', 34 | 'dburl': '', 35 | 'basecourse': 'preview' 36 | } 37 | ) 38 | ) 39 | 40 | version = pkg_resources.require("runestone")[0].version 41 | options.build.template_args['runestone_version'] = version 42 | 43 | # If DBUSER etc. are in the environment override dburl 44 | options.build.template_args['dburl'] = '' 45 | 46 | from runestone import build # build is called implicitly by the paver driver. 47 | -------------------------------------------------------------------------------- /controllers/oauth.py: -------------------------------------------------------------------------------- 1 | # This page provides an endpoint for getting an oauth redirect after an oauth verification process 2 | def index(): 3 | full_url = URL(args=request.args, vars=request.get_vars, host=True) 4 | return {"url": full_url} 5 | -------------------------------------------------------------------------------- /controllers/toctree.rst: -------------------------------------------------------------------------------- 1 | ****************** 2 | Web2py controllers 3 | ****************** 4 | 5 | .. toctree:: 6 | :maxdepth: 2 7 | :glob: 8 | 9 | *.py 10 | -------------------------------------------------------------------------------- /docker/build/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore everything in this directory 2 | * 3 | # Except this file 4 | !.gitignore 5 | !preview/* 6 | !preview/_sources/.gitignore 7 | preview/_sources/index.rst 8 | -------------------------------------------------------------------------------- /docker/gunicorn_config/__init__.py: -------------------------------------------------------------------------------- 1 | # ********* 2 | # |docname| 3 | # ********* 4 | # This is required so that imports of ``gunicorn_config.common_config`` work. (Naming the subdirectory ``gunicorn`` conflicts with the ``gunicorn`` module, of course.) 5 | -------------------------------------------------------------------------------- /docker/gunicorn_config/common_config.py: -------------------------------------------------------------------------------- 1 | # ************************************************** 2 | # |docname| - common gunicorn configuration settings 3 | # ************************************************** 4 | # This file contains common configuration settings for gunicorn. 5 | # 6 | # See also the `gunicorn config docs `_. 7 | # 8 | # Imports 9 | # ======= 10 | # These are listed in the order prescribed by `PEP 8`_. 11 | # 12 | # Standard library 13 | # ---------------- 14 | # None. 15 | # 16 | # Third-party imports 17 | # ------------------- 18 | # None. 19 | # 20 | # Local application imports 21 | # ------------------------- 22 | # None. 23 | # 24 | # 25 | # Configuration 26 | # ============= 27 | # `user `_: Switch worker processes to run as this user. 28 | user = "www-data" 29 | 30 | # `group `_: Switch worker process to run as this group. 31 | group = "www-data" 32 | 33 | # `max_requests `_: The maximum number of requests a worker will process before restarting. This is a good way to prevent memory "leaks" in Python to keep things from eventually crashing. 34 | max_requests = 5000 35 | 36 | # `max_requests_jitter `_: The maximum jitter to add to the max_requests setting. Ensures that everything doesn't restart in lock step. 37 | max_requests_jitter = 30 38 | 39 | # `timeout `_: Workers silent for more than this many seconds are killed and restarted. Restart processes that haven't produced any output for 60 seconds. 40 | timeout = 60 41 | -------------------------------------------------------------------------------- /docker/gunicorn_config/toctree.rst: -------------------------------------------------------------------------------- 1 | ********************** 2 | Gunicorn configuration 3 | ********************** 4 | This folder configures gunicorn for the web2py and FastAPI servers. 5 | 6 | .. toctree:: 7 | 8 | fastapi_config.py 9 | web2py_config.py 10 | common_config.py 11 | __init__.py -------------------------------------------------------------------------------- /docker/routes.py: -------------------------------------------------------------------------------- 1 | # ****************************** 2 | # |docname| - routing for web2py 3 | # ****************************** 4 | # Provide a default application, so that accessing "https://my-site-name.edu" works, instead of requiring "https://my-site-name.edu/runestone". 5 | # 6 | # See the `web2py manual `_. 7 | routers = dict( 8 | BASE=dict( 9 | default_application="runestone", 10 | ) 11 | ) 12 | -------------------------------------------------------------------------------- /docker/runguard/runguard-config.h: -------------------------------------------------------------------------------- 1 | /* Runguard config for use with CodeRunner. Includes all necessary 2 | * DOMJudge constants from config.h. 3 | * Assumes all tests will be done as the Linux user "coderunner". 4 | * It is assumed CHROOT will not be used so the CHROOT_PREFIX 5 | * is not meaningfully set. 6 | */ 7 | 8 | #ifndef _RUNGUARD_CONFIG_ 9 | #define _RUNGUARD_CONFIG_ 10 | 11 | #define DOMJUDGE_VERSION "3" 12 | #define REVISION "3.3" 13 | 14 | #define VALID_USERS "domjudge,jobe,jobe00,jobe01,jobe02,jobe03,jobe04,jobe05,jobe06,jobe07,jobe08,jobe09,jobe10,jobe11,jobe12,jobe13,jobe14,jobe15,jobe16,jobe17,jobe18,jobe19" 15 | 16 | #define CHROOT_PREFIX "/var/www/jobe/chrootjail" 17 | 18 | #endif /* _RUNGUARD_CONFIG_ */ 19 | -------------------------------------------------------------------------------- /docker/setup.py: -------------------------------------------------------------------------------- 1 | # ****************************************************************** 2 | # |docname| - Provide `docker_tools.py` as the script `docker-tools` 3 | # ****************************************************************** 4 | from setuptools import setup 5 | 6 | setup( 7 | name="runestone-docker-tools", 8 | version="0.1", 9 | install_requires=["click"], 10 | py_modules=["docker_tools", "docker_tools_misc"], 11 | entry_points={"console_scripts": ["docker-tools = docker_tools:cli"]}, 12 | ) 13 | -------------------------------------------------------------------------------- /docker/toctree.rst: -------------------------------------------------------------------------------- 1 | *********************** 2 | Docker supporting files 3 | *********************** 4 | This directory contains files supporting the Docker containerized application. 5 | 6 | .. toctree:: 7 | :maxdepth: 2 8 | 9 | README 10 | docker_tools.py 11 | docker_tools_misc.py 12 | ../Dockerfile 13 | ../docker-compose.yml 14 | ../.dockerignore 15 | nginx/sites-available/runestone.template 16 | gunicorn_config/toctree 17 | routes.py 18 | .env.prototype 19 | setup.py 20 | __init__.py 21 | -------------------------------------------------------------------------------- /docker/wsgihandler.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | This file is part of the web2py Web Framework 6 | Copyrighted by Massimo Di Pierro 7 | License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html) 8 | 9 | 10 | This is a WSGI handler 11 | """ 12 | 13 | import sys 14 | import os 15 | 16 | # change these parameters as required 17 | LOGGING = False 18 | SOFTCRON = False 19 | 20 | 21 | path = os.path.dirname(os.path.abspath(__file__)) 22 | os.chdir(path) 23 | 24 | if not os.path.isdir('applications'): 25 | raise RuntimeError('Running from the wrong folder') 26 | 27 | sys.path = [path] + [p for p in sys.path if not p == path] 28 | 29 | import gluon.main 30 | 31 | if LOGGING: 32 | application = gluon.main.appfactory(wsgiapp=gluon.main.wsgibase, 33 | logfilename='httpserver.log', 34 | profiler_dir=None) 35 | else: 36 | application = gluon.main.wsgibase 37 | 38 | if SOFTCRON: 39 | from gluon.settings import global_settings 40 | global_settings.web2py_crontype = 'soft' 41 | -------------------------------------------------------------------------------- /jobeinabox/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM trampgeek/jobeinabox:latest 2 | 3 | COPY include/* /usr/include/ 4 | RUN rm -rf /var/www/html/jobe && \ 5 | git clone https://github.com/RunestoneInteractive/jobe.git /var/www/html/jobe && \ 6 | apache2ctl start && \ 7 | cd /var/www/html/jobe && ./install 8 | 9 | RUN pip3 install install beautifulsoup4 pandas requests altair 10 | 11 | # Healthcheck, minimaltest.py should complete within 2 seconds 12 | HEALTHCHECK --interval=5m --timeout=2s \ 13 | CMD /usr/bin/python3 /var/www/html/jobe/minimaltest.py || exit 1 14 | 15 | # Start apache 16 | CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"] 17 | -------------------------------------------------------------------------------- /jobeinabox/files/hamcrest-all-1.3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/jobeinabox/files/hamcrest-all-1.3.jar -------------------------------------------------------------------------------- /jobeinabox/files/junit-4.13-beta-3.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/jobeinabox/files/junit-4.13-beta-3.jar -------------------------------------------------------------------------------- /makeRelease.sh: -------------------------------------------------------------------------------- 1 | set -e 2 | 3 | if [ $# -eq 0 ] 4 | then 5 | echo "Usage: makeRelease " 6 | exit 7 | fi 8 | 9 | while true; do 10 | read -p "Did you update/commit the version in pyproject.toml " yn 11 | case $yn in 12 | [Yy]* ) break;; 13 | [Nn]* ) exit;; 14 | * ) echo "Please answer yes or no.";; 15 | esac 16 | done 17 | 18 | while true; do 19 | read -p "Did you update motd and VERSION? " yn 20 | case $yn in 21 | [Yy]* ) break;; 22 | [Nn]* ) exit;; 23 | * ) echo "Please answer yes or no.";; 24 | esac 25 | done 26 | 27 | 28 | echo "tagging this release and pushing to github" 29 | 30 | git tag -a $1 -m 'tag new version' 31 | git push --follow-tags 32 | gh release create v$1 --generate-notes 33 | -------------------------------------------------------------------------------- /models/lti.py: -------------------------------------------------------------------------------- 1 | db.define_table( 2 | "lti_keys", 3 | Field("consumer"), 4 | Field("secret"), 5 | Field("application"), 6 | migrate=bookserver_owned("lti_keys"), 7 | ) 8 | 9 | # To generate keys, one choice is to invoke `import secrets; hex(secrets.randbits(256))[2:]`; this creates a `256-bit hexadecimal `_ `secret key `_. 10 | 11 | db.define_table( 12 | "course_lti_map", 13 | Field("lti_id", "integer"), 14 | Field("course_id", "integer"), 15 | migrate=bookserver_owned("course_lti_map"), 16 | ) 17 | -------------------------------------------------------------------------------- /models/menu.py: -------------------------------------------------------------------------------- 1 | response.title = settings.title 2 | response.subtitle = settings.subtitle 3 | response.meta.author = "%(author)s <%(author_email)s>" % settings 4 | response.meta.keywords = settings.keywords 5 | response.meta.description = settings.description 6 | response.menu = [ 7 | (T("Index"), URL("default", "index") == URL(), URL("default", "index"), []) 8 | ] 9 | -------------------------------------------------------------------------------- /models/toctree.rst: -------------------------------------------------------------------------------- 1 | ************* 2 | Web2py models 3 | ************* 4 | 5 | .. toctree:: 6 | :maxdepth: 2 7 | :glob: 8 | 9 | *.py 10 | -------------------------------------------------------------------------------- /models/user_biography.py: -------------------------------------------------------------------------------- 1 | db.define_table( 2 | "user_biography", 3 | Field("user_id", "reference auth_user"), 4 | Field("prefered_name", "text"), 5 | # Field('pronounced_name', 'string'), 6 | Field("interesting_fact", "text"), 7 | Field("programming_experience", "text"), 8 | Field( 9 | "laptop_type", 10 | requires=IS_IN_SET( 11 | ["Windows", "Mac", "Chromebook", "Unix/Linux", "Other", "None"] 12 | ), 13 | ), 14 | Field("image", "upload"), 15 | Field("confidence", "text"), 16 | migrate=table_migrate_prefix + "user_biography.table", 17 | ) 18 | -------------------------------------------------------------------------------- /modules/.gitignore: -------------------------------------------------------------------------------- 1 | # Except this file 2 | !.gitignore 3 | 4 | -------------------------------------------------------------------------------- /modules/__init__.py: -------------------------------------------------------------------------------- 1 | # ************************** 2 | # |docname| - web2py modules 3 | # ************************** 4 | # .. toctree:: 5 | # :maxdepth: 2 6 | # :glob: 7 | # 8 | # *.py 9 | -------------------------------------------------------------------------------- /modules/pytsugi_utils.py: -------------------------------------------------------------------------------- 1 | # Forked from - Wed Jun 21 09:01:59 EDT 2017 2 | # https://github.com/tophatmonocle/ims_lti_py 3 | 4 | # Interestingly, the code in Pypi fails: 5 | # https://pypi.python.org/pypi/ims_lti_py/0.5 6 | 7 | # And the code in the Harvard fork fails: 8 | # https://github.com/harvard-dce/dce_lti_py 9 | 10 | # But the trunk of this works 11 | # https://github.com/tophatmonocle/ims_lti_py 12 | 13 | from uuid import uuid1 14 | 15 | 16 | def generate_identifier(): 17 | return uuid1().__str__() 18 | 19 | 20 | class InvalidLTIConfigError(Exception): 21 | def __init__(self, value): 22 | self.value = value 23 | 24 | def __str__(self): 25 | return repr(self.value) 26 | 27 | 28 | class InvalidLTIRequestError(Exception): 29 | def __init__(self, value): 30 | self.value = value 31 | 32 | def __str__(self): 33 | return repr(self.value) 34 | -------------------------------------------------------------------------------- /production/env.template: -------------------------------------------------------------------------------- 1 | # ********************************************************************** 2 | # |docname| - Set environment variables for the containerized Docker app 3 | # ********************************************************************** 4 | # Must be set to hostname of server if you want to access the server from another machine 5 | # (Production or remote testing). It can be set to a hostname or ip address. 6 | RUNESTONE_HOST=localhost 7 | 8 | # Select a configuration for the instructor-facing server (the Runestone server) and the student-facing server (BookServer). Valid values are ``test``, ``development``, and ``production``. 9 | SERVER_CONFIG=production 10 | 11 | # For production, you should change the credentials for the DB to something more secure 12 | # This should be done prior to first running ``docker/docker_tools.py up``. 13 | POSTGRES_PASSWORD=runestone 14 | POSTGRES_USER=runestone 15 | POSTGRES_DBNAME=runestone 16 | POSTGRES_HOST=db.runestoneacademy.org 17 | REDIS_HOST=redis.runestoneacademy.org 18 | 19 | # To serve using https, set the `CERTBOT_EMAIL` environment variable and a certificate 20 | # will be automatically acquired. For a multicontainer production environment certificates 21 | # are managed by the load balancer 22 | #CERTBOT_EMAIL=you@somewhere.edu 23 | -------------------------------------------------------------------------------- /production/load_balancer_default: -------------------------------------------------------------------------------- 1 | ## 2 | # You should look at the following URL's in order to grasp a solid understanding 3 | # of Nginx configuration files in order to fully unleash the power of Nginx. 4 | # https://www.nginx.com/resources/wiki/start/ 5 | # https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ 6 | # https://wiki.debian.org/Nginx/DirectoryStructure 7 | # 8 | # In most cases, administrators will remove this file from sites-enabled/ and 9 | # leave it as reference inside of sites-available where it will continue to be 10 | # updated by the nginx packaging team. 11 | # 12 | # This file will automatically load configuration files provided by other 13 | # applications, such as Drupal or Wordpress. These applications will be made 14 | # available underneath a path with that package name, such as /drupal8. 15 | # 16 | # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. 17 | ## 18 | 19 | # many examples show the rest of this file inside an http block. 20 | 21 | upstream backend { 22 | server server1.runestoneacademy.org; 23 | server server2.runestoneacademy.org; 24 | } 25 | 26 | 27 | 28 | server { 29 | listen 443 ssl; 30 | server_name runestone.academy; 31 | 32 | ssl_certificate /etc/letsencrypt/live/runestoneacademy.org/fullchain.pem; 33 | ssl_certificate_key /etc/letsencrypt/live/runestoneacademy.org/privkey.pem; 34 | include /etc/letsencrypt/options-ssl-nginx.conf; 35 | 36 | location / { 37 | proxy_pass http://backend; 38 | } 39 | 40 | 41 | if ($scheme != "https") { 42 | return 301 https://$host$request_uri; 43 | } 44 | 45 | 46 | } 47 | 48 | -------------------------------------------------------------------------------- /pylintrc: -------------------------------------------------------------------------------- 1 | # This pylintrc file will use the default settings except for the 2 | # naming conventions, which will allow for camel case naming as found 3 | # in Java code or several libraries such as PyQt, etc. 4 | 5 | [MASTER] 6 | load-plugins=pylint_web2py2 7 | 8 | [BASIC] 9 | # Regular expression which should only match correct module names 10 | module-rgx=(([a-z][a-z0-9]*)|([A-Z][a-zA-Z0-9]+))$ 11 | 12 | # Regular expression which should only match correct class names 13 | class-rgx=[A-Z][a-zA-Z0-9]+$ 14 | 15 | # Regular expression which should only match correct function names 16 | function-rgx=[a-z_][a-zA-Z0-9]*$ 17 | 18 | # Regular expression which should only match correct method names 19 | method-rgx=[a-z_][a-zA-Z0-9]*$ 20 | 21 | # Regular expression which should only match correct argument names 22 | argument-rgx=[a-z][a-zA-Z0-9]*$ 23 | 24 | # Regular expression which should only match correct variable names 25 | variable-rgx=[a-z][a-zA-Z0-9]*$ 26 | 27 | # Regular expression matching correct constant names 28 | const-rgx=(([a-zA-Z_][a-zA-Z0-9_]*)|(__.*__))$ 29 | 30 | 31 | [MESSAGES CONTROL] 32 | 33 | disable=C0103,C0111,C0325 34 | 35 | [General] 36 | init-hook='import sys; sys.path.append("site-packages")' -------------------------------------------------------------------------------- /requirements-rtd.txt: -------------------------------------------------------------------------------- 1 | CodeChat 2 | myst_parser 3 | sphinx_rtd_theme 4 | -------------------------------------------------------------------------------- /rsmanage/__init__.py: -------------------------------------------------------------------------------- 1 | # ********* 2 | # |docname| 3 | # ********* 4 | # This is required by Poetry for `rsmanage.py` to be a script. 5 | -------------------------------------------------------------------------------- /rsmanage/fill_practice_log_missings.py: -------------------------------------------------------------------------------- 1 | from rs_grading import do_fill_user_topic_practice_log_missings 2 | 3 | 4 | do_fill_user_topic_practice_log_missings(db=db, settings=settings) 5 | -------------------------------------------------------------------------------- /rsmanage/grade.py: -------------------------------------------------------------------------------- 1 | from rs_grading import do_autograde, do_calculate_totals 2 | import json 3 | 4 | userinfo = json.loads(os.environ["RSM_USERINFO"]) 5 | # print(userinfo['course'], userinfo['pset']) 6 | # # print(db.keys()) 7 | # print(settings) 8 | 9 | assignmentid = userinfo["pset"] 10 | assignment = db(db.assignments.id == assignmentid).select().first() 11 | course = db(db.courses.course_name == userinfo["course"]).select().first() 12 | do_autograde( 13 | assignment, 14 | course.id, 15 | course.course_name, 16 | sid=None, 17 | student_rownum=None, 18 | question_name=None, 19 | enforce_deadline=userinfo["enforce_deadline"], 20 | # I don't know what this is for, but if you want to set this to Michigan timezone offset, it should be 4 21 | # not 5. 22 | timezoneoffset=240, 23 | db=db, 24 | settings=settings, 25 | ) 26 | 27 | do_calculate_totals( 28 | assignment, course.id, course.course_name, sid=None, db=db, settings=settings 29 | ) 30 | -------------------------------------------------------------------------------- /rsmanage/makeuser.py: -------------------------------------------------------------------------------- 1 | # running in the context of a web2py shell 2 | import json 3 | import sys 4 | from psycopg2 import IntegrityError 5 | import click 6 | import datetime 7 | 8 | 9 | def resetpw(username, password): 10 | pw = CRYPT(auth.settings.hmac_key)(password)[0] 11 | db(db.auth_user.username == username).update(password=pw) 12 | 13 | 14 | ### Main ### 15 | 16 | if "--userfile" in sys.argv: 17 | # find the file (.csv) iterate over each line and call createUser 18 | pass 19 | 20 | ec = 0 21 | userinfo = json.loads(os.environ["RSM_USERINFO"]) 22 | 23 | if "--resetpw" in sys.argv: 24 | try: 25 | resetpw(userinfo["username"], userinfo["password"]) 26 | except Exception as e: 27 | click.echo("Password reset failed for user {}".format(userinfo["username"])) 28 | click.echo("Details: {}".format(e)) 29 | else: 30 | try: 31 | createUser( 32 | userinfo["username"], 33 | userinfo["password"], 34 | userinfo["first_name"], 35 | userinfo["last_name"], 36 | userinfo["email"], 37 | userinfo["course"], 38 | userinfo["instructor"], 39 | ) 40 | db.commit() 41 | except ValueError as e: 42 | # click.echo("Value Error: ", e) 43 | ec = 1 44 | except IntegrityError as e: 45 | # click.echo("Caught an integrity error: ", e) 46 | ec = 2 47 | except Exception as e: 48 | # click.echo("Unexpected Error: ", e) 49 | ec = 3 50 | 51 | if ec == 0: 52 | click.echo(f"User {userinfo['username']} created successfully") 53 | else: 54 | sys.exit(ec) 55 | -------------------------------------------------------------------------------- /rsmanage/migrate.py: -------------------------------------------------------------------------------- 1 | import click 2 | import datetime 3 | from dateutil.parser import parse 4 | import os.path 5 | import re 6 | 7 | res = db.executesql( 8 | """ 9 | SELECT table_name 10 | FROM information_schema.tables 11 | WHERE table_schema='public' AND table_type='BASE TABLE'""" 12 | ) 13 | 14 | click.echo("The following migration actions were taken today") 15 | with open( 16 | os.path.join("applications", "runestone", "databases", "sql.log") 17 | ) as action_file: 18 | last_match = 0 19 | now = datetime.datetime.now() 20 | line = action_file.readline() 21 | while line: 22 | g = re.match(r"^timestamp:\s(.*)$", line) 23 | if g: 24 | mdate = parse(g.group(1)) 25 | if ( 26 | mdate.year == now.year 27 | and mdate.month == now.month 28 | and mdate.day == now.day 29 | ): 30 | done = False 31 | while line and not done: 32 | line = action_file.readline() 33 | click.echo(line, nl=False) 34 | if re.match("^success!", line): 35 | done = True 36 | line = action_file.readline() 37 | -------------------------------------------------------------------------------- /rsmanage/noop.py: -------------------------------------------------------------------------------- 1 | import click 2 | import datetime 3 | from dateutil.parser import parse 4 | import os.path 5 | import re 6 | 7 | res = db.executesql( 8 | """ 9 | SELECT table_name 10 | FROM information_schema.tables 11 | WHERE table_schema='public' AND table_type='BASE TABLE'""" 12 | ) 13 | -------------------------------------------------------------------------------- /rsmanage/setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup 2 | 3 | setup( 4 | name="rsmanage", 5 | version="1.0.0", 6 | py_modules=["rsmanage"], 7 | install_requires=["click"], 8 | entry_points=""" 9 | [console_scripts] 10 | rsmanage=rsmanage.rsmanage:cli 11 | """, 12 | ) 13 | -------------------------------------------------------------------------------- /runestone_poetry_project/__init__.py: -------------------------------------------------------------------------------- 1 | # ********* 2 | # |docname| 3 | # ********* 4 | # This is required by Poetry in order to install scripts. 5 | -------------------------------------------------------------------------------- /runestone_poetry_project/poetry_fix_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/runestone_poetry_project/poetry_fix_diagram.png -------------------------------------------------------------------------------- /runestone_poetry_project/poetry_fix_diagram.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/runestone_poetry_project/poetry_fix_diagram.vsdx -------------------------------------------------------------------------------- /scripts/active_users.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import os 3 | 4 | from sqlalchemy import ( 5 | Column, 6 | Table, 7 | ForeignKey, 8 | Index, 9 | Integer, 10 | String, 11 | Date, 12 | DateTime, 13 | Text, 14 | create_engine, 15 | types, 16 | Float, 17 | inspect, 18 | MetaData, 19 | ) 20 | from sqlalchemy.orm import declarative_base, sessionmaker 21 | 22 | from sqlalchemy.ext.declarative import declared_attr 23 | from sqlalchemy.sql.schema import UniqueConstraint 24 | from sqlalchemy.orm import declarative_base 25 | 26 | # Local application imports 27 | # ------------------------- 28 | # This creates the base class we will use to create models 29 | 30 | Base = declarative_base() 31 | 32 | # authors will have a role defined for their user_id in auth_group and auth_membership 33 | engine = create_engine(os.environ["DBURL"]) 34 | Session = sessionmaker(expire_on_commit=False) 35 | engine.connect() 36 | Session.configure(bind=engine) 37 | meta = MetaData() 38 | 39 | 40 | class UserActivity(Base): 41 | __tablename__ = "user_activity" 42 | timestamp = Column(DateTime, primary_key=True) 43 | num_users = Column(Integer) 44 | 45 | 46 | Base.metadata.create_all(bind=engine) 47 | 48 | 49 | def create_activity_entry(num_active: int) -> None: 50 | new_row = UserActivity(num_users=num_active, timestamp=datetime.datetime.utcnow()) 51 | with Session.begin() as session: 52 | session.add(new_row) 53 | 54 | 55 | last_five = engine.execute( 56 | """ 57 | select count(distinct sid) from useinfo where timestamp > now() - interval '5 minutes' 58 | """ 59 | ).first() 60 | 61 | num_active = last_five[0] 62 | 63 | create_activity_entry(num_active) 64 | -------------------------------------------------------------------------------- /scripts/cleanup_courses.py: -------------------------------------------------------------------------------- 1 | import psycopg2 2 | import shutil 3 | import os 4 | 5 | conn = psycopg2.connect(host="localhost",user="bnmnetp_courselib", 6 | password="al3xandria", database="bnmnetp_courselib"); 7 | 8 | curs = conn.cursor() 9 | curs.execute('set session statement_timeout to 0') 10 | curs.execute('''select course_id, count(*), max(timestamp) from useinfo group by course_id having max(timestamp) < now() - interval '365 days' and count(*) < 100''') 11 | 12 | cleancount = 0 13 | 14 | for row in curs: 15 | course = row[0] 16 | if course and os.path.exists("./live/static/{}".format(course)): 17 | print('removing {} count: {} last_access: {}'.format(course, row[1], row[2])) 18 | try: 19 | shutil.rmtree("./live/static/{}".format(course)) 20 | shutil.rmtree("./live/custom_courses/{}".format(course)) 21 | cleancount += 1 22 | except: 23 | print("failed to remove {} in file system".format(course)) 24 | 25 | print("Cleaned up {} old courses".format(cleancount)) 26 | -------------------------------------------------------------------------------- /scripts/crawl_sitemap.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import logging 3 | from pysitemap import crawler 4 | 5 | # this script crawls the site and makes a sitemap.xml file. 6 | # I think it is better/faster to use the other script that walks the file system 7 | # and includes everything under published/XXX 8 | 9 | if __name__ == "__main__": 10 | if "--iocp" in sys.argv: 11 | from asyncio import events, windows_events 12 | 13 | sys.argv.remove("--iocp") 14 | logging.info("using iocp") 15 | el = windows_events.ProactorEventLoop() 16 | events.set_event_loop(el) 17 | 18 | # root_url = sys.argv[1] 19 | root_url = "https://runestone.academy" 20 | crawler( 21 | root_url, 22 | out_file="sitemap.xml", 23 | exclude_urls=[".pdf", ".jpg", ".png", ".zip", "reportabug"], 24 | ) 25 | -------------------------------------------------------------------------------- /scripts/currentTraffic.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | import numpy as np 3 | from sqlalchemy import create_engine 4 | import altair as alt 5 | from altair import Chart, X, Y, Scale 6 | import os.path 7 | import datetime 8 | import re 9 | from altair_saver import save 10 | 11 | 12 | eng = create_engine(os.environ["DBURL"]) 13 | 14 | last_day = pd.read_sql_query( 15 | """ 16 | select date_trunc('hour', timestamp) date_bucket, count(distinct sid) from useinfo where timestamp > now() - interval 17 | '49 hours' group by date_bucket 18 | """, 19 | eng, 20 | parse_dates=["date_bucket"], 21 | ) 22 | 23 | last_five = pd.read_sql_query( 24 | """ 25 | select count(distinct sid) from useinfo where timestamp > now() - interval '5 minutes' 26 | """, 27 | eng, 28 | ) 29 | 30 | last_day["date_bucket"] = last_day.date_bucket - datetime.timedelta(hours=8) 31 | 32 | 33 | hc = ( 34 | Chart( 35 | last_day, 36 | title=f"Unique Students Per Hour - Current: {last_five.iloc[0]['count']}", 37 | ) 38 | .mark_area() 39 | .encode(x="date_bucket", y="count") 40 | ) 41 | hc.save("chart.png") 42 | -------------------------------------------------------------------------------- /scripts/dbtimes.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy import ( 2 | create_engine, 3 | MetaData, 4 | Table, 5 | Column, 6 | Integer, 7 | String, 8 | DateTime, 9 | Date, 10 | Float, 11 | ) 12 | from sqlalchemy.ext.declarative import declarative_base 13 | from sqlalchemy.orm import sessionmaker 14 | import datetime 15 | 16 | Base = declarative_base() 17 | 18 | engine = create_engine( 19 | # "postgresql://runestone:al3xandria@localhost/logtimes", 20 | # echo=True 21 | "postgresql://bmiller:autocubanlobbyduck@localhost/bmiller", 22 | echo=True, 23 | ) 24 | meta = MetaData() 25 | Session = sessionmaker(bind=engine) 26 | 27 | 28 | class LogEntry(Base): 29 | __tablename__ = "api_times" 30 | id = Column(Integer, primary_key=True) 31 | timestamp = Column(Date) 32 | endpoint = Column(String) 33 | calls = Column(Integer) 34 | response_average = Column(Float) 35 | max_response = Column(Integer) 36 | 37 | 38 | Base.metadata.create_all(engine) 39 | # meta.create_all(engine) 40 | db = Session() 41 | 42 | e = LogEntry( 43 | timestamp=datetime.datetime.now().date(), 44 | endpoint="foo", 45 | calls=10, 46 | response_average=1.55, 47 | max_response=10, 48 | ) 49 | 50 | db.add(e) 51 | 52 | db.commit() 53 | -------------------------------------------------------------------------------- /scripts/dump_trace.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | __author__ = 'bmiller' 3 | 4 | import cPickle 5 | import sys 6 | import pprint 7 | 8 | sys.path.insert(0,'/home/bnmnetp/webapps/uwsgi_runestone/web2py') 9 | 10 | with open(sys.argv[1]) as f: 11 | trace_data = cPickle.load(f) 12 | 13 | print(trace_data['traceback']) 14 | pprint.pprint(trace_data['snapshot']['locals']) 15 | for i in trace_data['snapshot']['frames']: 16 | print("============") 17 | pprint.pprint(i) 18 | 19 | -------------------------------------------------------------------------------- /scripts/find_modified_index.py: -------------------------------------------------------------------------------- 1 | import psycopg2 2 | import shutil 3 | import os, sys 4 | import filecmp 5 | import difflib 6 | 7 | conn = psycopg2.connect(os.environ['DBURL']) 8 | curs = conn.cursor() 9 | curs.execute('set session statement_timeout to 0') 10 | curs.execute('''select course_name, base_course from courses''') 11 | 12 | cleancount = 0 13 | 14 | for row in curs: 15 | course = "custom_courses/{}/index.rst".format(row[0]) 16 | bc = "books/{}/_sources/index.rst".format(row[1]) 17 | 18 | if os.path.exists(course) and os.path.exists(bc): 19 | print("comparing {} to {}".format(course,bc)) 20 | res = filecmp.cmp(course, bc) 21 | if not res: 22 | print("{} is DIFFERENT".format(course)) 23 | sys.stdout.writelines(difflib.context_diff(open(course).readlines(), open(bc).readlines())) 24 | -------------------------------------------------------------------------------- /scripts/getLoad.sh: -------------------------------------------------------------------------------- 1 | 2 | #!/usr/bin/env bash 3 | # 4 | # Academy CPU 5 | # v0.1.0 6 | # Brad Miller 7 | # bnmnetp 8 | # Continuously checks load on academy workers 9 | # Bash 10 | # 00,05,10,15,20,25,30,35,40,45,50,55 * * * * 11 | # 12 | # Academy Load 13 | # 14 | # Continuously checks if hosts are available for ssh connection on port 22 15 | 16 | head="Academy CPU Average" 17 | body="" 18 | errors=0 19 | for i in {1..5}; do 20 | host=server$i.runestoneacademy.org 21 | load=`ssh $host ps -axo 'pcpu'| awk '{s+=$1} END {print s " " s/4}'` 22 | body="$body\n$host\t$load" 23 | done 24 | host=db.runestoneacademy.org 25 | load=`ssh $host ps -axo 'pcpu'| awk '{s+=$1} END {print s " " s/4}'` 26 | body="$body\n$host\t\t$load" 27 | host=balance.runestoneacademy.org 28 | load=`ssh root@$host ps -axo 'pcpu'| awk '{s+=$1} END {print s " " s/2}'` 29 | body="$body\n$host\t$load" 30 | 31 | echo -n "$head" 32 | echo -e "\n---" 33 | echo -e "$body" 34 | -------------------------------------------------------------------------------- /scripts/install_new_image.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | cd /home/bmiller/Runestone/RunestoneServer/production 6 | 7 | if [[ $PWD != */production ]]; then 8 | echo 'you need to be in the production folder for this' 9 | exit 10 | fi 11 | 12 | export HOSTNAME=$HOSTNAME 13 | 14 | # pull the latest 15 | git pull 16 | docker pull registry.digitalocean.com/runestone-registry/production_server:latest 17 | 18 | docker compose stop 19 | docker compose up -d 20 | 21 | echo "Pruning old images" 22 | docker image prune -f 23 | -------------------------------------------------------------------------------- /scripts/loadtest.py: -------------------------------------------------------------------------------- 1 | from locust import HttpLocust, TaskSet, task 2 | from lxml import html 3 | import requests as rq 4 | 5 | class SimpleTests(TaskSet): 6 | 7 | @task 8 | def index(self): 9 | self.client.get("/", verify=False) 10 | 11 | @task 12 | def home(self): 13 | self.client.get("/runestone/static/thinkcspy/PythonTurtle/TheforLoop.html", verify=False) 14 | self.getAllAssets() 15 | 16 | @task 17 | def logrun(self): 18 | self.client.post("/runestone/ajax/hsblog", 19 | {'event': 'activecode', 'act': 'edit', 'div_id': 'logtest'}, 20 | verify=False) 21 | 22 | @task 23 | def dynamicpage(self): 24 | self.r = self.client.get("/runestone/course/serve/thinkcspy/PythonTurtle/TheforLoop.html", verify=False) 25 | self.getAllAssets() 26 | 27 | def getAllAssets(self): 28 | tree = html.fromstring(self.r.text) 29 | csslinks = tree.xpath('//link/@href') 30 | jslinks = tree.xpath('//script/@src') 31 | base = self.r.url[:self.r.url.rfind('/')+1] 32 | for l in csslinks: 33 | rq.get(base + l, verify=False) 34 | 35 | for l in jslinks: 36 | rq.get(base + l, verify=False) 37 | 38 | class WebsiteUser(HttpLocust): 39 | task_set = SimpleTests 40 | min_wait = 5000 41 | max_wait = 15000 42 | host = "https://rsvm" 43 | -------------------------------------------------------------------------------- /scripts/log2csv.py: -------------------------------------------------------------------------------- 1 | import re 2 | import sys 3 | 4 | # 104.255.205.41 - [22/Feb/2022:19:25:46 +0000] Request: "POST /runestone/proxy/jobeRun HTTP/1.1" Status: 200 Bytes: 242 Host: 10.136.0.8:80 ResponseTime: 4.204 Referrer: "https://runestone.academy/runestone/assignments/doAssignment?assignment_id=97720" Agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36" 5 | if len(sys.argv) > 1: 6 | logfile = open(sys.argv[1], "r") 7 | else: 8 | logfile = sys.stdin 9 | 10 | print( 11 | "IPRequest,timestamp,Request,Status,Bytes,HostAssigned,ResponseTime,ReferringPage,Agent" 12 | ) 13 | for line in logfile: 14 | if g := re.match( 15 | r"^(.*) - \[(.*?)\] Request: (.*?) Status: (\d+) Bytes: (\d+) Host: (.*?) ResponseTime: (.*?) Referrer: (.*?) Agent: (.*?)$", 16 | line, 17 | ): 18 | print( 19 | f"{g.group(1)},{g.group(2)},{g.group(3)},{g.group(4)},{g.group(5)},{g.group(6)},{g.group(7)},{g.group(8)},{g.group(9)}" 20 | ) 21 | -------------------------------------------------------------------------------- /scripts/make_new_production.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | 5 | # Make sure all services are stopped 6 | docker compose -f docker-compose.yml stop 7 | docker compose -f production/docker-compose.yml stop 8 | 9 | # Run a production build of a new image 10 | ./docker/docker_tools.py build --multi 11 | 12 | # start the newly built image 13 | docker compose -f docker-compose.yml up -d 14 | sleep 5 15 | 16 | # commit the built image (with startup changes) as we want to use what is now running across all servers 17 | prod_id=`docker ps |grep runestone/server|awk '{ print $1 }'` 18 | docker commit $prod_id runestone/server/prod 19 | 20 | # push the image to our private registry 21 | docker image tag runestone/server/prod registry.digitalocean.com/runestone-registry/production_server:latest 22 | docker push registry.digitalocean.com/runestone-registry/production_server:latest 23 | 24 | docker compose -f docker-compose.yml stop 25 | cd production 26 | docker compose up -d 27 | -------------------------------------------------------------------------------- /scripts/make_script_tags.py: -------------------------------------------------------------------------------- 1 | import json 2 | import pyclip 3 | 4 | import_file = "/Users/bmiller/Runestone/RunestoneComponents/runestone/dist/webpack_static_imports.json" 5 | 6 | imports = json.load(open(import_file, "r")) 7 | res = "" 8 | for f in imports["js"]: 9 | res += f"""\n""" 10 | 11 | for f in imports["css"]: 12 | res += f"""\n""" 13 | 14 | print(res) 15 | pyclip.copy(res) 16 | print("The New imports on on the clipboard.") 17 | -------------------------------------------------------------------------------- /scripts/make_sitemap.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | import os 3 | 4 | # /Users/bmiller/Runestone/RunestoneServer/books/csawesome/published/csawesome/MixedFreeResponse/RandomStringChooserParsonsB.html 5 | # becomes /ns/books/published/ 6 | def path_to_url(p): 7 | parts = p.split("published") 8 | return "https://runestone.academy/ns/books/published" + parts[-1] 9 | 10 | 11 | home = os.environ["HOME"] 12 | 13 | with open(Path(home, "Runestone/RunestoneServer/static", "sitemap.xml"), "w") as sm: 14 | sm.write( 15 | """ 16 | 17 | https://runestone.academy 18 | https://runestone.academy/ns/books/index 19 | """ 20 | ) 21 | p = Path(home, "Runestone/books") 22 | for i in p.rglob("*.html"): 23 | if "build" in str(i) or "knowl" in str(i): 24 | continue 25 | elif "published" in str(i): 26 | sm.write("" + path_to_url(str(i)) + "\n") 27 | sm.write("") 28 | -------------------------------------------------------------------------------- /scripts/nightlytransfer.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy import create_engine, Table, MetaData, select, func 2 | from sqlalchemy.orm import sessionmaker 3 | import os 4 | 5 | rspw = os.environ['RUNESTONEPW'] 6 | 7 | localengine = create_engine('postgresql://millbr02@localhost/runestoneanalysis') 8 | remoteengine = create_engine('postgresql://bnmnetp_courselib:{}@web608.webfaction.com/bnmnetp_courselib'.format(rspw)) 9 | 10 | meta = MetaData() 11 | 12 | 13 | def mirror_table(fromeng, toeng, tablename): 14 | print("Mirroring {}".format(tablename)) 15 | from_tbl = Table(tablename, meta, autoload=True, autoload_with=fromeng) 16 | to_tbl = Table(tablename, meta, autoload=True, autoload_with=toeng) 17 | 18 | last = toeng.execute("select max(id) from {}".format(tablename)).first()[0] 19 | 20 | s = select([from_tbl]).where((from_tbl.c.id > last)) 21 | result = fromeng.execute(s) 22 | 23 | ct = 0 24 | for row in result: 25 | newrow = {} 26 | for column in to_tbl.columns.keys(): 27 | newrow[column] = row[column] 28 | s = to_tbl.insert().values(**newrow) 29 | toeng.execute(s) 30 | ct += 1 31 | 32 | print("Inserted {} new rows into {}".format(ct,tablename)) 33 | 34 | 35 | for tbl in ['useinfo','acerror_log','courses','div_ids', 'code', 'timed_exam']: 36 | mirror_table(remoteengine, localengine, tbl) 37 | 38 | -------------------------------------------------------------------------------- /scripts/numberFigs.py: -------------------------------------------------------------------------------- 1 | #!/usr/local/bin/python3.2 2 | 3 | import sys 4 | import re 5 | 6 | chapf = open(sys.argv[1],'r') 7 | chap = chapf.read() 8 | chapf.close() 9 | 10 | lst_anchors = re.compile(r'\.\. _(lst_.*):') 11 | lst_matches = lst_anchors.findall(chap) 12 | fig_anchors = re.compile(r'\.\. _(fig_.*):') 13 | fig_matches = fig_anchors.findall(chap) 14 | tbl_anchors = re.compile(r'\.\. _(tbl_.*):') 15 | tbl_matches = tbl_anchors.findall(chap) 16 | 17 | figNum = 1 18 | for fig in fig_matches: 19 | ## TODO replace replace with re.sub after a chapter has been numbered once 20 | # chap = chap.replace('Figure x <%s>'%fig, 'Figure %d <%s>'%(figNum,fig)) 21 | chap = re.sub(r'Figure ([0-9x]+) \<%s\>'%fig, 'Figure %d <%s>'%(figNum,fig), chap ) 22 | figNum += 1 23 | 24 | lstNum = 1 25 | for lst in lst_matches: 26 | print("Numbering: Listing <%s>"%lst) 27 | ## TODO replace replace with re.sub after a chapter has been numbered once 28 | # chap = chap.replace('Listing x <%s>'%lst, 'Listing %d <%s>'%(lstNum,lst)) 29 | chap = re.sub(r'Listing ([0-9x]+) <%s>'%lst, 'Listing %d <%s>'%(lstNum,lst), chap ) 30 | lstNum += 1 31 | 32 | tblNum = 1 33 | for tbl in tbl_matches: 34 | ## TODO replace replace with re.sub after a chapter has been numbered once 35 | #chap = chap.replace('Table x <%s>'%tbl, 'Table %d <%s>'%(tblNum,tbl)) 36 | chap = re.sub(r'Table ([0-9x]+) \<%s\>'%tbl, 'Table %d <%s>'%(tblNum,tbl), chap ) 37 | tblNum += 1 38 | 39 | chapf = open(sys.argv[1],'w') 40 | chapf.write(chap) 41 | chapf.close() 42 | -------------------------------------------------------------------------------- /scripts/parseLog.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # {address space usage: 359067648 bytes/342MB} {rss usage: 107823104 bytes/102MB} [pid: 11266|app: 0|req: 99163/885977] 64.208.17.170 () {48 vars in 1249 bytes} [Thu Feb 15 16:28:43 2018] GET /runestone/ajax/getnumonline => generated 16 bytes in 2553 msecs (HTTP/1.1 200) 8 headers in 381 bytes (1 switches on core 0) 4 | 5 | import re, sys 6 | 7 | refer_pat = re.compile(r".*Referrer: (.*) Agent:.*") 8 | logfile = open(sys.argv[1], "r") 9 | referrers = {} 10 | 11 | for line in logfile: 12 | if g := refer_pat.match(line): 13 | ref = g.group(1).strip('"') 14 | if "runestone.academy" not in ref: 15 | referrers[ref] = referrers.get(ref, 0) + 1 16 | 17 | 18 | i = 0 19 | for k, v in sorted(referrers.items(), key=lambda x: x[1], reverse=True): 20 | if i < 25: 21 | print(k, v) 22 | i += 1 23 | else: 24 | break 25 | -------------------------------------------------------------------------------- /scripts/parse_tickets.py: -------------------------------------------------------------------------------- 1 | __author__ = 'bmiller' 2 | 3 | import cPickle 4 | import os 5 | import datetime 6 | import sys 7 | from collections import Counter 8 | 9 | sys.path.insert(0,'../../../') #pickle needs gluon?? 10 | all = True 11 | outset = Counter() 12 | outlist = [] 13 | 14 | tickets = os.listdir('../errors') 15 | for t in tickets: 16 | nparts = t.split('.') 17 | d = datetime.date(*[int(x) for x in nparts[4].split('-')]) 18 | if datetime.datetime.now().date() == d or all == True: 19 | f = open('../errors/'+t, 'rb') 20 | tick_data = cPickle.load(f) 21 | outlist.append(tick_data['output']) 22 | 23 | 24 | outset = Counter(outlist) 25 | 26 | for m in outset.most_common(10): 27 | print("========") 28 | print(m) 29 | -------------------------------------------------------------------------------- /scripts/pparse.py: -------------------------------------------------------------------------------- 1 | __author__ = 'bmiller' 2 | import re 3 | 4 | class PTest: 5 | 6 | def parse_multiline_parsons(self, lines): 7 | current_block = [] 8 | results = [] 9 | for line in lines: 10 | if(line == '====='): 11 | results.append(self.convert_leading_whitespace_for_block(current_block)) 12 | current_block = [] 13 | else: 14 | current_block.append(line) 15 | results.append(self.convert_leading_whitespace_for_block(current_block)) 16 | return "\n".join(results) 17 | 18 | def convert_leading_whitespace_for_block(self, block): 19 | whitespaceMatcher = re.compile("^\s*") 20 | initialWhitespace = whitespaceMatcher.match(block[0]).end() 21 | result = block[0] 22 | for line in block[1:]: 23 | result += '\\n' # not a line break...the literal characters \n 24 | result += line[initialWhitespace:] 25 | return result 26 | 27 | tt = ''' 28 | x = 0 29 | ===== 30 | for i in range(3): 31 | x = x + i 32 | y = 10 33 | ===== 34 | print x 35 | print y 36 | ''' 37 | 38 | z = PTest() 39 | zzz = z.parse_multiline_parsons(tt.split('\n')) 40 | print(type(zzz)) 41 | print(zzz.split('\n')) 42 | print(zzz) 43 | -------------------------------------------------------------------------------- /scripts/seedUnittestAnswers.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy import create_engine, Table, MetaData, select 2 | import datetime 3 | import os, re 4 | 5 | 6 | def insertAnswer(sid, divid, ts, course, correct, passed, failed): 7 | print("inserting ", sid, divid, course, ts, passed, failed) 8 | s = unit_answers.insert().values( 9 | timestamp=ts, 10 | div_id=divid, 11 | sid=sid, 12 | course_name=course, 13 | correct=correct, 14 | passed=passed, 15 | failed=failed, 16 | ) 17 | engine.execute(s) 18 | 19 | 20 | engine = create_engine(os.environ["DEV_DBURL"]) 21 | 22 | meta = MetaData() 23 | useinfo = Table("useinfo", meta, autoload=True, autoload_with=engine) 24 | unit_answers = Table("unittest_answers", meta, autoload=True, autoload_with=engine) 25 | 26 | s = select([useinfo]).where(useinfo.c.event == "unittest").order_by(useinfo.c.id) 27 | result = engine.execute(s) 28 | 29 | for row in result: 30 | # ignore sid's of the form: 1423153196780@199.185.67.12 or 208.191.24.178@anon.user 31 | if re.match(r"^\d+@[\d\.]+$", row["sid"]): 32 | continue 33 | 34 | try: 35 | statslist = row["act"].split(":") 36 | pct = float(statslist[1]) 37 | passed = int(statslist[3]) 38 | failed = int(statslist[5]) 39 | if pct >= 99.99999: 40 | correct = "T" 41 | else: 42 | correct = "F" 43 | except: 44 | print(f"bad act data {row['act']}") 45 | continue 46 | insertAnswer( 47 | row["sid"], 48 | row["div_id"], 49 | row["timestamp"], 50 | row["course_id"], 51 | correct, 52 | passed, 53 | failed, 54 | ) 55 | -------------------------------------------------------------------------------- /scripts/start: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # A simple script to start web2py and the companion scheduler app for building 4 | # books. Copy these into the main web2py folder and use them there 5 | # 6 | 7 | export DBUSER=bmiller 8 | export DBPASS='' 9 | export DBHOST=localhost 10 | export DBNAME=runestone 11 | 12 | echo "Be sure to activate your virtual environment" 13 | #source ~/Environments/web2py/bin/activate 14 | python web2py.py --ip=0.0.0.0 --port=8000 --password='' -K runestone --nogui -X & 15 | -------------------------------------------------------------------------------- /scripts/sumuse: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ps -u bnmnetp -o rss,pid,ppid,command 3 | echo "-----" 4 | ps -u bnmnetp -o rss,pid,ppid,command | awk '{sum += $1 }; END {print sum}' - 5 | -------------------------------------------------------------------------------- /scripts/toRstTable.py: -------------------------------------------------------------------------------- 1 | #!/usr/local/bin/python3.2 2 | __author__ = 'bmiller' 3 | 4 | import sys 5 | 6 | oldTable = sys.stdin.readlines() 7 | 8 | numCols = oldTable.count('&') 9 | 10 | i = 0 11 | while i < len(oldTable): 12 | oldTable[i] = oldTable[i].split('&') 13 | i += 1 14 | 15 | numCols = len(oldTable[0]) 16 | colMax = [0 for x in range(numCols)] 17 | 18 | for col in range(numCols): 19 | for row in range(len(oldTable)): 20 | if len(oldTable[row]) == numCols: 21 | if len(oldTable[row][col].strip()) > colMax[col]: 22 | colMax[col] = len(oldTable[row][col]) 23 | 24 | # print header info 25 | for c in colMax: 26 | print("="*c,end=' ') 27 | 28 | print() 29 | col = 0 30 | for h in oldTable[0]: 31 | print(("%"+str(colMax[col])+"s") % h.strip(),end=' ') 32 | col += 1 33 | print() 34 | 35 | 36 | for c in colMax: 37 | print("="*c,end=' ') 38 | print() 39 | 40 | for row in range(1,len(oldTable)): 41 | col = 0 42 | for h in oldTable[row]: 43 | print(("%"+str(colMax[col])+"s") % h.strip(),end=' ') 44 | col += 1 45 | print() 46 | 47 | for c in colMax: 48 | print("="*c,end=' ') 49 | print() 50 | 51 | -------------------------------------------------------------------------------- /scripts/toctree.rst: -------------------------------------------------------------------------------- 1 | ************ 2 | Misc scripts 3 | ************ 4 | 5 | .. toctree:: 6 | :maxdepth: 2 7 | :glob: 8 | 9 | *.py 10 | -------------------------------------------------------------------------------- /static/.buildinfo: -------------------------------------------------------------------------------- 1 | # Sphinx build info version 1 2 | # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. 3 | config: 439c6e3ff06cd30c3ce29e27047f0b78 4 | tags: fbb0d17656682115ca4d033fb2f83ba1 5 | -------------------------------------------------------------------------------- /static/_images/8arrayTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/8arrayTree.png -------------------------------------------------------------------------------- /static/_images/CS-Prereqs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/CS-Prereqs.png -------------------------------------------------------------------------------- /static/_images/Internet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/Internet.png -------------------------------------------------------------------------------- /static/_images/SIGCSE-logo-large.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/SIGCSE-logo-large.jpg -------------------------------------------------------------------------------- /static/_images/Texas__oneColor_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/Texas__oneColor_orange.png -------------------------------------------------------------------------------- /static/_images/TreeDefRecursive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/TreeDefRecursive.png -------------------------------------------------------------------------------- /static/_images/U-M-logo-preview.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/U-M-logo-preview.jpg -------------------------------------------------------------------------------- /static/_images/UT_Square_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/UT_Square_logo.png -------------------------------------------------------------------------------- /static/_images/addtohead.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/addtohead.png -------------------------------------------------------------------------------- /static/_images/adjMat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/adjMat.png -------------------------------------------------------------------------------- /static/_images/adjMatEx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/adjMatEx.png -------------------------------------------------------------------------------- /static/_images/adjlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/adjlist.png -------------------------------------------------------------------------------- /static/_images/adt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/adt.png -------------------------------------------------------------------------------- /static/_images/assignment1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/assignment1.png -------------------------------------------------------------------------------- /static/_images/assignment2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/assignment2.png -------------------------------------------------------------------------------- /static/_images/badrotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/badrotate.png -------------------------------------------------------------------------------- /static/_images/basicdeque.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/basicdeque.png -------------------------------------------------------------------------------- /static/_images/basicqueue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/basicqueue.png -------------------------------------------------------------------------------- /static/_images/bcast1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/bcast1.png -------------------------------------------------------------------------------- /static/_images/bfderive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/bfderive.png -------------------------------------------------------------------------------- /static/_images/bfs1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/bfs1.png -------------------------------------------------------------------------------- /static/_images/bfs2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/bfs2.png -------------------------------------------------------------------------------- /static/_images/bfs3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/bfs3.png -------------------------------------------------------------------------------- /static/_images/bfsDone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/bfsDone.png -------------------------------------------------------------------------------- /static/_images/bigknight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/bigknight.png -------------------------------------------------------------------------------- /static/_images/binsearch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/binsearch.png -------------------------------------------------------------------------------- /static/_images/biology.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/biology.png -------------------------------------------------------------------------------- /static/_images/blackbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/blackbox.png -------------------------------------------------------------------------------- /static/_images/bookstack2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/bookstack2.png -------------------------------------------------------------------------------- /static/_images/booktree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/booktree.png -------------------------------------------------------------------------------- /static/_images/bstdel3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/bstdel3.png -------------------------------------------------------------------------------- /static/_images/bstput.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/bstput.png -------------------------------------------------------------------------------- /static/_images/bubblepass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/bubblepass.png -------------------------------------------------------------------------------- /static/_images/buildExp1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/buildExp1.png -------------------------------------------------------------------------------- /static/_images/buildExp2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/buildExp2.png -------------------------------------------------------------------------------- /static/_images/buildExp3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/buildExp3.png -------------------------------------------------------------------------------- /static/_images/buildExp4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/buildExp4.png -------------------------------------------------------------------------------- /static/_images/buildExp5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/buildExp5.png -------------------------------------------------------------------------------- /static/_images/buildExp6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/buildExp6.png -------------------------------------------------------------------------------- /static/_images/buildExp7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/buildExp7.png -------------------------------------------------------------------------------- /static/_images/buildExp8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/buildExp8.png -------------------------------------------------------------------------------- /static/_images/buildheap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/buildheap.png -------------------------------------------------------------------------------- /static/_images/callTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/callTree.png -------------------------------------------------------------------------------- /static/_images/callstack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/callstack.png -------------------------------------------------------------------------------- /static/_images/chaining.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/chaining.png -------------------------------------------------------------------------------- /static/_images/changeTable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/changeTable.png -------------------------------------------------------------------------------- /static/_images/circuit1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/circuit1.png -------------------------------------------------------------------------------- /static/_images/clustering.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/clustering.png -------------------------------------------------------------------------------- /static/_images/compTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/compTree.png -------------------------------------------------------------------------------- /static/_images/completeTour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/completeTour.png -------------------------------------------------------------------------------- /static/_images/complexmove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/complexmove.png -------------------------------------------------------------------------------- /static/_images/connector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/connector.png -------------------------------------------------------------------------------- /static/_images/cshome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/cshome.png -------------------------------------------------------------------------------- /static/_images/dectobin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/dectobin.png -------------------------------------------------------------------------------- /static/_images/dfstree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/dfstree.png -------------------------------------------------------------------------------- /static/_images/digraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/digraph.png -------------------------------------------------------------------------------- /static/_images/dijkstraa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/dijkstraa.png -------------------------------------------------------------------------------- /static/_images/dijkstrab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/dijkstrab.png -------------------------------------------------------------------------------- /static/_images/dijkstrac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/dijkstrac.png -------------------------------------------------------------------------------- /static/_images/dijkstrad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/dijkstrad.png -------------------------------------------------------------------------------- /static/_images/dijkstrae.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/dijkstrae.png -------------------------------------------------------------------------------- /static/_images/dijkstraf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/dijkstraf.png -------------------------------------------------------------------------------- /static/_images/directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/directory.png -------------------------------------------------------------------------------- /static/_images/elevenCents.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/elevenCents.png -------------------------------------------------------------------------------- /static/_images/evalpostfix1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/evalpostfix1.png -------------------------------------------------------------------------------- /static/_images/evalpostfix2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/evalpostfix2.png -------------------------------------------------------------------------------- /static/_images/exerTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/exerTree.png -------------------------------------------------------------------------------- /static/_images/firstsplit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/firstsplit.png -------------------------------------------------------------------------------- /static/_images/fraction1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/fraction1.png -------------------------------------------------------------------------------- /static/_images/fraction2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/fraction2.png -------------------------------------------------------------------------------- /static/_images/fraction3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/fraction3.png -------------------------------------------------------------------------------- /static/_images/gates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gates.png -------------------------------------------------------------------------------- /static/_images/gendfsa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfsa.png -------------------------------------------------------------------------------- /static/_images/gendfsb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfsb.png -------------------------------------------------------------------------------- /static/_images/gendfsc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfsc.png -------------------------------------------------------------------------------- /static/_images/gendfsd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfsd.png -------------------------------------------------------------------------------- /static/_images/gendfse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfse.png -------------------------------------------------------------------------------- /static/_images/gendfsf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfsf.png -------------------------------------------------------------------------------- /static/_images/gendfsg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfsg.png -------------------------------------------------------------------------------- /static/_images/gendfsh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfsh.png -------------------------------------------------------------------------------- /static/_images/gendfsi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfsi.png -------------------------------------------------------------------------------- /static/_images/gendfsj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfsj.png -------------------------------------------------------------------------------- /static/_images/gendfsk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfsk.png -------------------------------------------------------------------------------- /static/_images/gendfsl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/gendfsl.png -------------------------------------------------------------------------------- /static/_images/hanoi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/hanoi.png -------------------------------------------------------------------------------- /static/_images/hardunbalanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/hardunbalanced.png -------------------------------------------------------------------------------- /static/_images/hashtable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/hashtable.png -------------------------------------------------------------------------------- /static/_images/hashtable2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/hashtable2.png -------------------------------------------------------------------------------- /static/_images/heapOrder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/heapOrder.png -------------------------------------------------------------------------------- /static/_images/hotpotato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/hotpotato.png -------------------------------------------------------------------------------- /static/_images/idea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/idea.png -------------------------------------------------------------------------------- /static/_images/idea2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/idea2.png -------------------------------------------------------------------------------- /static/_images/inheritance1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/inheritance1.png -------------------------------------------------------------------------------- /static/_images/initlinkedlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/initlinkedlist.png -------------------------------------------------------------------------------- /static/_images/insertionpass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/insertionpass.png -------------------------------------------------------------------------------- /static/_images/insertionsort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/insertionsort.png -------------------------------------------------------------------------------- /static/_images/intopost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/intopost.png -------------------------------------------------------------------------------- /static/_images/knightmoves.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/knightmoves.png -------------------------------------------------------------------------------- /static/_images/ktdfsa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/ktdfsa.png -------------------------------------------------------------------------------- /static/_images/ktdfsb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/ktdfsb.png -------------------------------------------------------------------------------- /static/_images/ktdfsc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/ktdfsc.png -------------------------------------------------------------------------------- /static/_images/ktdfsd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/ktdfsd.png -------------------------------------------------------------------------------- /static/_images/ktdfse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/ktdfse.png -------------------------------------------------------------------------------- /static/_images/ktdfsf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/ktdfsf.png -------------------------------------------------------------------------------- /static/_images/ktdfsg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/ktdfsg.png -------------------------------------------------------------------------------- /static/_images/ktdfsh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/ktdfsh.png -------------------------------------------------------------------------------- /static/_images/linearprobing1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/linearprobing1.png -------------------------------------------------------------------------------- /static/_images/linearprobing2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/linearprobing2.png -------------------------------------------------------------------------------- /static/_images/linkedlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/linkedlist.png -------------------------------------------------------------------------------- /static/_images/linkedlistinsert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/linkedlistinsert.png -------------------------------------------------------------------------------- /static/_images/listvdict.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/listvdict.png -------------------------------------------------------------------------------- /static/_images/logo-trademark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/logo-trademark.png -------------------------------------------------------------------------------- /static/_images/luther_college_vertical_blue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/luther_college_vertical_blue.png -------------------------------------------------------------------------------- /static/_images/maze.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/maze.png -------------------------------------------------------------------------------- /static/_images/meParse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/meParse.png -------------------------------------------------------------------------------- /static/_images/meSimple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/meSimple.png -------------------------------------------------------------------------------- /static/_images/mergesortA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/mergesortA.png -------------------------------------------------------------------------------- /static/_images/mergesortB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/mergesortB.png -------------------------------------------------------------------------------- /static/_images/moveCount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/moveCount.png -------------------------------------------------------------------------------- /static/_images/moveleft.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/moveleft.png -------------------------------------------------------------------------------- /static/_images/moveright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/moveright.png -------------------------------------------------------------------------------- /static/_images/mst1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/mst1.png -------------------------------------------------------------------------------- /static/_images/namequeue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/namequeue.png -------------------------------------------------------------------------------- /static/_images/newplot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/newplot.png -------------------------------------------------------------------------------- /static/_images/newplot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/newplot2.png -------------------------------------------------------------------------------- /static/_images/nlParse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/nlParse.png -------------------------------------------------------------------------------- /static/_images/node.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/node.png -------------------------------------------------------------------------------- /static/_images/node2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/node2.png -------------------------------------------------------------------------------- /static/_images/nsf-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/nsf-logo.png -------------------------------------------------------------------------------- /static/_images/orderedsearch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/orderedsearch.png -------------------------------------------------------------------------------- /static/_images/orderlinkedlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/orderlinkedlist.png -------------------------------------------------------------------------------- /static/_images/palindromesetup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/palindromesetup.png -------------------------------------------------------------------------------- /static/_images/pancakes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/pancakes.png -------------------------------------------------------------------------------- /static/_images/pancakesDFS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/pancakesDFS.png -------------------------------------------------------------------------------- /static/_images/pancakesTS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/pancakesTS.png -------------------------------------------------------------------------------- /static/_images/partitionA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/partitionA.png -------------------------------------------------------------------------------- /static/_images/partitionB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/partitionB.png -------------------------------------------------------------------------------- /static/_images/percDown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/percDown.png -------------------------------------------------------------------------------- /static/_images/percUp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/percUp.png -------------------------------------------------------------------------------- /static/_images/poptime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/poptime.png -------------------------------------------------------------------------------- /static/_images/prevcurr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/prevcurr.png -------------------------------------------------------------------------------- /static/_images/prima.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/prima.png -------------------------------------------------------------------------------- /static/_images/primb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/primb.png -------------------------------------------------------------------------------- /static/_images/primc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/primc.png -------------------------------------------------------------------------------- /static/_images/primd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/primd.png -------------------------------------------------------------------------------- /static/_images/prime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/prime.png -------------------------------------------------------------------------------- /static/_images/primf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/primf.png -------------------------------------------------------------------------------- /static/_images/primg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/primg.png -------------------------------------------------------------------------------- /static/_images/primitive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/primitive.png -------------------------------------------------------------------------------- /static/_images/ptx-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/ptx-logo.png -------------------------------------------------------------------------------- /static/_images/quadratic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/quadratic.png -------------------------------------------------------------------------------- /static/_images/recstack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/recstack.png -------------------------------------------------------------------------------- /static/_images/remove.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/remove.png -------------------------------------------------------------------------------- /static/_images/remove2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/remove2.png -------------------------------------------------------------------------------- /static/_images/removeinit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/removeinit.png -------------------------------------------------------------------------------- /static/_images/rightrotate1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/rightrotate1.png -------------------------------------------------------------------------------- /static/_images/rotatelr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/rotatelr.png -------------------------------------------------------------------------------- /static/_images/rotexer1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/rotexer1.png -------------------------------------------------------------------------------- /static/_images/routeGraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/routeGraph.png -------------------------------------------------------------------------------- /static/_images/rsi_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/rsi_logo.jpg -------------------------------------------------------------------------------- /static/_images/runestone.mov: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/runestone.mov -------------------------------------------------------------------------------- /static/_images/runestone.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/runestone.webm -------------------------------------------------------------------------------- /static/_images/scc1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/scc1.png -------------------------------------------------------------------------------- /static/_images/scc1a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/scc1a.png -------------------------------------------------------------------------------- /static/_images/scc1b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/scc1b.png -------------------------------------------------------------------------------- /static/_images/scc2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/scc2.png -------------------------------------------------------------------------------- /static/_images/sccforest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/sccforest.png -------------------------------------------------------------------------------- /static/_images/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/search.png -------------------------------------------------------------------------------- /static/_images/searchicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/searchicon.png -------------------------------------------------------------------------------- /static/_images/searchicon2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/searchicon2.jpg -------------------------------------------------------------------------------- /static/_images/selectionsort.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/selectionsort.png -------------------------------------------------------------------------------- /static/_images/seqsearch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/seqsearch.png -------------------------------------------------------------------------------- /static/_images/seqsearch2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/seqsearch2.png -------------------------------------------------------------------------------- /static/_images/shellsortA.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/shellsortA.png -------------------------------------------------------------------------------- /static/_images/shellsortB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/shellsortB.png -------------------------------------------------------------------------------- /static/_images/shellsortC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/shellsortC.png -------------------------------------------------------------------------------- /static/_images/shellsortD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/shellsortD.png -------------------------------------------------------------------------------- /static/_images/simpleBST.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/simpleBST.png -------------------------------------------------------------------------------- /static/_images/simpleparcheck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/simpleparcheck.png -------------------------------------------------------------------------------- /static/_images/simplereversal2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/simplereversal2.png -------------------------------------------------------------------------------- /static/_images/simpleunbalanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/simpleunbalanced.png -------------------------------------------------------------------------------- /static/_images/simulationsetup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/simulationsetup.png -------------------------------------------------------------------------------- /static/_images/smalltree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/smalltree.png -------------------------------------------------------------------------------- /static/_images/stringhash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/stringhash.png -------------------------------------------------------------------------------- /static/_images/stringhash2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/stringhash2.png -------------------------------------------------------------------------------- /static/_images/sumlistIn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/sumlistIn.png -------------------------------------------------------------------------------- /static/_images/sumlistOut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/sumlistOut.png -------------------------------------------------------------------------------- /static/_images/swap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/swap.png -------------------------------------------------------------------------------- /static/_images/toStr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/toStr.png -------------------------------------------------------------------------------- /static/_images/toStrBase2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/toStrBase2.png -------------------------------------------------------------------------------- /static/_images/transpose1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/transpose1.png -------------------------------------------------------------------------------- /static/_images/transpose2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/transpose2.png -------------------------------------------------------------------------------- /static/_images/traversal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/traversal.png -------------------------------------------------------------------------------- /static/_images/treedef1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/treedef1.png -------------------------------------------------------------------------------- /static/_images/treerecs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/treerecs.png -------------------------------------------------------------------------------- /static/_images/truthtable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/truthtable.png -------------------------------------------------------------------------------- /static/_images/unbalanced.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/unbalanced.png -------------------------------------------------------------------------------- /static/_images/wordbuckets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/wordbuckets.png -------------------------------------------------------------------------------- /static/_images/wordgraph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/wordgraph.png -------------------------------------------------------------------------------- /static/_images/worstAVL.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/worstAVL.png -------------------------------------------------------------------------------- /static/_images/wrongorder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_images/wrongorder.png -------------------------------------------------------------------------------- /static/_static/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/ajax-loader.gif -------------------------------------------------------------------------------- /static/_static/clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/clock.png -------------------------------------------------------------------------------- /static/_static/comment-bright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/comment-bright.png -------------------------------------------------------------------------------- /static/_static/comment-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/comment-close.png -------------------------------------------------------------------------------- /static/_static/comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/comment.png -------------------------------------------------------------------------------- /static/_static/contents.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/contents.png -------------------------------------------------------------------------------- /static/_static/down-pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/down-pressed.png -------------------------------------------------------------------------------- /static/_static/down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/down.png -------------------------------------------------------------------------------- /static/_static/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/file.png -------------------------------------------------------------------------------- /static/_static/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/minus.png -------------------------------------------------------------------------------- /static/_static/navigation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/navigation.png -------------------------------------------------------------------------------- /static/_static/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/plus.png -------------------------------------------------------------------------------- /static/_static/theme/default.css.old: -------------------------------------------------------------------------------- 1 | .cm-s-default span.cm-keyword {color: #708;} 2 | .cm-s-default span.cm-atom {color: #219;} 3 | .cm-s-default span.cm-number {color: #164;} 4 | .cm-s-default span.cm-def {color: #00f;} 5 | .cm-s-default span.cm-variable {color: black;} 6 | .cm-s-default span.cm-variable-2 {color: #05a;} 7 | .cm-s-default span.cm-variable-3 {color: #0a5;} 8 | .cm-s-default span.cm-property {color: black;} 9 | .cm-s-default span.cm-operator {color: black;} 10 | .cm-s-default span.cm-comment {color: #a50;} 11 | .cm-s-default span.cm-string {color: #a11;} 12 | .cm-s-default span.cm-meta {color: #555;} 13 | .cm-s-default span.cm-error {color: #f00;} 14 | .cm-s-default span.cm-qualifier {color: #555;} 15 | .cm-s-default span.cm-builtin {color: #30a;} 16 | .cm-s-default span.cm-bracket {color: #cc7;} 17 | .cm-s-default span.cm-tag {color: #170;} 18 | .cm-s-default span.cm-attribute {color: #00c;} 19 | -------------------------------------------------------------------------------- /static/_static/theme/elegant.css: -------------------------------------------------------------------------------- 1 | .cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom {color: #762;} 2 | .cm-s-elegant span.cm-comment {color: #262; font-style: italic; line-height: 1em;} 3 | .cm-s-elegant span.cm-meta {color: #555; font-style: italic; line-height: 1em;} 4 | .cm-s-elegant span.cm-variable {color: black;} 5 | .cm-s-elegant span.cm-variable-2 {color: #b11;} 6 | .cm-s-elegant span.cm-qualifier {color: #555;} 7 | .cm-s-elegant span.cm-keyword {color: #730;} 8 | .cm-s-elegant span.cm-builtin {color: #30a;} 9 | .cm-s-elegant span.cm-error {background-color: #fdd;} 10 | .cm-s-elegant span.cm-link {color: #762;} 11 | -------------------------------------------------------------------------------- /static/_static/theme/elegant.css.old: -------------------------------------------------------------------------------- 1 | .cm-s-elegant span.cm-number, .cm-s-elegant span.cm-string, .cm-s-elegant span.cm-atom {color: #762;} 2 | .cm-s-elegant span.cm-comment {color: #262;font-style: italic;} 3 | .cm-s-elegant span.cm-meta {color: #555;font-style: italic;} 4 | .cm-s-elegant span.cm-variable {color: black;} 5 | .cm-s-elegant span.cm-variable-2 {color: #b11;} 6 | .cm-s-elegant span.cm-qualifier {color: #555;} 7 | .cm-s-elegant span.cm-keyword {color: #730;} 8 | .cm-s-elegant span.cm-builtin {color: #30a;} 9 | .cm-s-elegant span.cm-error {background-color: #fdd;} 10 | -------------------------------------------------------------------------------- /static/_static/theme/neat.css: -------------------------------------------------------------------------------- 1 | .cm-s-neat span.cm-comment { color: #a86; } 2 | .cm-s-neat span.cm-keyword { line-height: 1em; font-weight: bold; color: blue; } 3 | .cm-s-neat span.cm-string { color: #a22; } 4 | .cm-s-neat span.cm-builtin { line-height: 1em; font-weight: bold; color: #077; } 5 | .cm-s-neat span.cm-special { line-height: 1em; font-weight: bold; color: #0aa; } 6 | .cm-s-neat span.cm-variable { color: black; } 7 | .cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; } 8 | .cm-s-neat span.cm-meta {color: #555;} 9 | .cm-s-neat span.cm-link { color: #3a3; } 10 | -------------------------------------------------------------------------------- /static/_static/theme/neat.css.old: -------------------------------------------------------------------------------- 1 | .cm-s-neat span.cm-comment { color: #a86; } 2 | .cm-s-neat span.cm-keyword { font-weight: bold; color: blue; } 3 | .cm-s-neat span.cm-string { color: #a22; } 4 | .cm-s-neat span.cm-builtin { font-weight: bold; color: #077; } 5 | .cm-s-neat span.cm-special { font-weight: bold; color: #0aa; } 6 | .cm-s-neat span.cm-variable { color: black; } 7 | .cm-s-neat span.cm-number, .cm-s-neat span.cm-atom { color: #3a3; } 8 | .cm-s-neat span.cm-meta {color: #555;} 9 | -------------------------------------------------------------------------------- /static/_static/theme/night.css: -------------------------------------------------------------------------------- 1 | /* Loosely based on the Midnight Textmate theme */ 2 | 3 | .cm-s-night { background: #0a001f; color: #f8f8f8; } 4 | .cm-s-night div.CodeMirror-selected { background: #447 !important; } 5 | .cm-s-night .CodeMirror-gutter { background: #0a001f; border-right: 1px solid #aaa; } 6 | .cm-s-night .CodeMirror-gutter-text { color: #f8f8f8; } 7 | .cm-s-night .CodeMirror-cursor { border-left: 1px solid white !important; } 8 | 9 | .cm-s-night span.cm-comment { color: #6900a1; } 10 | .cm-s-night span.cm-atom { color: #845dc4; } 11 | .cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; } 12 | .cm-s-night span.cm-keyword { color: #599eff; } 13 | .cm-s-night span.cm-string { color: #37f14a; } 14 | .cm-s-night span.cm-meta { color: #7678e2; } 15 | .cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; } 16 | .cm-s-night span.cm-variable-3, .cm-s-night span.cm-def { color: white; } 17 | .cm-s-night span.cm-error { color: #9d1e15; } 18 | .cm-s-night span.cm-bracket { color: #8da6ce; } 19 | .cm-s-night span.cm-comment { color: #6900a1; } 20 | .cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; } 21 | .cm-s-night span.cm-link { color: #845dc4; } 22 | -------------------------------------------------------------------------------- /static/_static/theme/night.css.old: -------------------------------------------------------------------------------- 1 | /* Loosely based on the Midnight Textmate theme */ 2 | 3 | .cm-s-night { background: #0a001f; color: #f8f8f8; } 4 | .cm-s-night span.CodeMirror-selected { background: #a8f !important; } 5 | .cm-s-night .CodeMirror-gutter { background: #0a001f; border-right: 1px solid #aaa; } 6 | .cm-s-night .CodeMirror-gutter-text { color: #f8f8f8; } 7 | .cm-s-night .CodeMirror-cursor { border-left: 1px solid white !important; } 8 | 9 | .cm-s-night span.cm-comment { color: #6900a1; } 10 | .cm-s-night span.cm-atom { color: #845dc4; } 11 | .cm-s-night span.cm-number, .cm-s-night span.cm-attribute { color: #ffd500; } 12 | .cm-s-night span.cm-keyword { color: #599eff; } 13 | .cm-s-night span.cm-string { color: #37f14a; } 14 | .cm-s-night span.cm-meta { color: #7678e2; } 15 | .cm-s-night span.cm-variable-2, .cm-s-night span.cm-tag { color: #99b2ff; } 16 | .cm-s-night span.cm-variable-3, .cm-s-night span.cm-def { white; } 17 | .cm-s-night span.cm-error { color: #9d1e15; } 18 | .cm-s-night span.cm-bracket { color: #8da6ce; } 19 | .cm-s-night span.cm-comment { color: #6900a1; } 20 | .cm-s-night span.cm-builtin, .cm-s-night span.cm-special { color: #ff9e59; } 21 | -------------------------------------------------------------------------------- /static/_static/up-pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/up-pressed.png -------------------------------------------------------------------------------- /static/_static/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/_static/up.png -------------------------------------------------------------------------------- /static/_static/video.css: -------------------------------------------------------------------------------- 1 | .exercises { 2 | background-color:#f0ffff; 3 | } 4 | 5 | 6 | .active_out { 7 | background-color:#dcdcdc; 8 | border-radius: 6px; 9 | } 10 | 11 | figcaption { 12 | margin: .75em 0; 13 | text-align: center; 14 | font: italic 13px/18px Cambria, Georgia, "Times New Roman", Times, serif; 15 | } 16 | 17 | img.bookfig { 18 | margin-left: auto; 19 | margin-right: auto; 20 | } 21 | 22 | .video_popup { 23 | display: none; 24 | } 25 | .ac_caption { 26 | text-align: center; 27 | font-weight: bold; 28 | } 29 | 30 | .ac_caption_text { 31 | font-weight: normal; 32 | } 33 | 34 | .cl_caption { 35 | font-weight: bold; 36 | } 37 | 38 | .ac_caption:before { 39 | content: "ActiveCode: " counter(activecode) " "; 40 | counter-increment: activecode; 41 | } 42 | .cl_caption:before { 43 | content: "CodeLens: " counter(codelens) " "; 44 | counter-increment: codelens; 45 | } 46 | 47 | body { 48 | counter-reset: activecode codelens; 49 | } 50 | 51 | #simplemodal-overlay {background-color:#000; cursor:wait;} 52 | 53 | /* Container */ 54 | #simplemodal-container {height:590px; width:768px; color:#bbb; background-color:#333; border:4px solid #444; padding:12px;} 55 | #simplemodal-container .simplemodal-data {padding:8px;} 56 | #simplemodal-container code {background:#141414; border-left:3px solid #65B43D; color:#bbb; display:block; font-size:12px; margin-bottom:12px; padding:4px 6px 6px;} 57 | #simplemodal-container a {color:#ddd;} 58 | #simplemodal-container a.modalCloseImg {background:url(x.png) no-repeat; width:25px; height:29px; display:inline; z-index:3200; position:absolute; top:-15px; right:-16px; cursor:pointer;} 59 | #simplemodal-container h3 {color:#84b8d9;} -------------------------------------------------------------------------------- /static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/bootstrap-3.0.0/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /static/css/html4css1.css: -------------------------------------------------------------------------------- 1 | /* 2 | **************************** 3 | |docname| - Dummy CSS for LP 4 | **************************** 5 | This file is blank for Runestone -- other CodeChat instances supply something useful here. 6 | */ -------------------------------------------------------------------------------- /static/css/select2.multi-checkboxes.css: -------------------------------------------------------------------------------- 1 | /* **************************************************************** 2 | * |docname| -- A style sheet for the select2 multi-checkbox plugin 3 | * **************************************************************** 4 | */ 5 | 6 | /* Style unchecked checkboxes in a select2 multi-checkbox using an empty checkbox from a nice font. */ 7 | .select2-results__option .wrap::before{ 8 | font-family: fontAwesome; 9 | color: #999; 10 | content: "\f096"; 11 | width: 25px; 12 | height: 25px; 13 | padding-right: 10px; 14 | } 15 | 16 | /* Style checked checkboxes. */ 17 | .select2-results__option[aria-selected=true] .wrap::before{ 18 | content: "\f14a"; 19 | } 20 | 21 | /* Make the background of selected items the same as unselected items (white). */ 22 | .select2-container--default .select2-results__option[aria-selected=true] { 23 | background-color: #FFFFFF; 24 | } 25 | 26 | /* The highlighted option needs to be blue. */ 27 | .select2-container--default .select2-results__option--highlighted[aria-selected] { 28 | background-color: #5897fb 29 | } 30 | 31 | -------------------------------------------------------------------------------- /static/dashboard/icons/cohorts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/dashboard/icons/cohorts.png -------------------------------------------------------------------------------- /static/dashboard/icons/gradebook copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/dashboard/icons/gradebook copy.png -------------------------------------------------------------------------------- /static/dashboard/icons/gradebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/dashboard/icons/gradebook.png -------------------------------------------------------------------------------- /static/dashboard/icons/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/dashboard/icons/settings.png -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/favicon.ico -------------------------------------------------------------------------------- /static/images/Facebook_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/Facebook_icon.png -------------------------------------------------------------------------------- /static/images/GettingStartedWithRunestone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/GettingStartedWithRunestone.png -------------------------------------------------------------------------------- /static/images/RAIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/RAIcon.png -------------------------------------------------------------------------------- /static/images/RunestoneBanner0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/RunestoneBanner0.png -------------------------------------------------------------------------------- /static/images/RunestoneBanner1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/RunestoneBanner1.png -------------------------------------------------------------------------------- /static/images/RunestoneBanner2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/RunestoneBanner2.png -------------------------------------------------------------------------------- /static/images/Twitter_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/Twitter_icon.png -------------------------------------------------------------------------------- /static/images/anon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/anon.jpg -------------------------------------------------------------------------------- /static/images/arrows-ffffff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/arrows-ffffff.png -------------------------------------------------------------------------------- /static/images/completed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/completed.png -------------------------------------------------------------------------------- /static/images/css3buttons_backgrounds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/css3buttons_backgrounds.png -------------------------------------------------------------------------------- /static/images/css3buttons_icons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/css3buttons_icons.png -------------------------------------------------------------------------------- /static/images/glyphicons-halflings-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/glyphicons-halflings-white.png -------------------------------------------------------------------------------- /static/images/glyphicons-halflings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/glyphicons-halflings.png -------------------------------------------------------------------------------- /static/images/logo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/logo_small.png -------------------------------------------------------------------------------- /static/images/poweredby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/poweredby.png -------------------------------------------------------------------------------- /static/images/seperator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/seperator.png -------------------------------------------------------------------------------- /static/images/shadow-section.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/shadow-section.png -------------------------------------------------------------------------------- /static/images/shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/shadow.png -------------------------------------------------------------------------------- /static/images/spinner10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/spinner10.gif -------------------------------------------------------------------------------- /static/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /static/js/books.js: -------------------------------------------------------------------------------- 1 | //This is the JavaScript function of the search bar of the library 2 | 3 | function search_book() { 4 | let input = document.getElementById('searchbar').value 5 | input = input.toLowerCase(); 6 | let x = document.getElementsByClassName('book_title'); 7 | let y = document.getElementsByClassName('book_descript'); 8 | 9 | for (i = 0; i < x.length; i++) { 10 | if ((x[i].innerHTML.toLowerCase().includes(input)) || (y[i].innerHTML.toLowerCase().includes(input))) { 11 | x[i].parentElement.style.display = "list-item"; 12 | y[i].parentElement.style.display = "list-item"; 13 | } 14 | else { 15 | x[i].parentElement.style.display = "none"; 16 | y[i].parentElement.style.display = "none"; 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /static/js/bootstrap-table/bootstrap-table-en-US.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | * bootstrap-table - v1.11.1 - 2017-02-22 3 | * https://github.com/wenzhixin/bootstrap-table 4 | * Copyright (c) 2017 zhixin wen 5 | * Licensed MIT License 6 | */ 7 | !function(a){"use strict";a.fn.bootstrapTable.locales["en-US"]={formatLoadingMessage:function(){return"Loading, please wait..."},formatRecordsPerPage:function(a){return a+" rows per page"},formatShowingRows:function(a,b,c){return"Showing "+a+" to "+b+" of "+c+" rows"},formatSearch:function(){return"Search"},formatNoMatches:function(){return"No matching records found"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatRefresh:function(){return"Refresh"},formatToggle:function(){return"Toggle"},formatColumns:function(){return"Columns"},formatAllRows:function(){return"All"},formatExport:function(){return"Export data"},formatClearFilters:function(){return"Clear filters"}},a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales["en-US"])}(jQuery); -------------------------------------------------------------------------------- /static/js/bootstrap-table/bootstrap-table-reorder-rows.css: -------------------------------------------------------------------------------- 1 | .reorder_rows_onDragClass td { 2 | background-color: #eee; 3 | -webkit-box-shadow: 11px 5px 12px 2px #333, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset; 4 | -webkit-box-shadow: 6px 3px 5px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset; 5 | -moz-box-shadow: 6px 4px 5px 1px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset; 6 | -box-shadow: 6px 4px 5px 1px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset; 7 | } 8 | 9 | .reorder_rows_onDragClass td:last-child { 10 | -webkit-box-shadow: 8px 7px 12px 0 #333, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset; 11 | -webkit-box-shadow: 1px 8px 6px -4px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset; 12 | -moz-box-shadow: 0 9px 4px -4px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset, -1px 0 0 #ccc inset; 13 | -box-shadow: 0 9px 4px -4px #555, 0 1px 0 #ccc inset, 0 -1px 0 #ccc inset, -1px 0 0 #ccc inset; 14 | } -------------------------------------------------------------------------------- /static/js/documentation_options.js: -------------------------------------------------------------------------------- 1 | var DOCUMENTATION_OPTIONS = { 2 | URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), 3 | VERSION: '0.0', 4 | LANGUAGE: 'en', 5 | COLLAPSE_INDEX: false, 6 | BUILDER: 'html', 7 | FILE_SUFFIX: '.html', 8 | LINK_SUFFIX: '.html', 9 | HAS_SOURCE: true, 10 | SOURCELINK_SUFFIX: '.txt', 11 | NAVIGATION_WITH_KEYS: false 12 | }; -------------------------------------------------------------------------------- /static/js/jquery-fix.js: -------------------------------------------------------------------------------- 1 | // The Bootstrap-based Sphinx theme uses $jqTheme 2 | // Setting $ is needed to override the (old!) version of jQuery packaged with Sphinx 3 | var $jqTheme = jQuery.noConflict(); 4 | var $ = jQuery.noConflict(); 5 | -------------------------------------------------------------------------------- /static/js/jquery.tabletoCSV.js: -------------------------------------------------------------------------------- 1 | jQuery.fn.tableToCSV = function() { 2 | 3 | var clean_text = function(text){ 4 | text = text.replace(/"/g, '""'); 5 | return '"'+text+'"'; 6 | }; 7 | 8 | $(this).each(function(){ 9 | var table = $(this); 10 | var caption = $(this).find('caption').text(); 11 | var title = []; 12 | var rows = []; 13 | 14 | $(this).find('tr').each(function(){ 15 | var data = []; 16 | $(this).find('th').each(function(){ 17 | var text = clean_text($(this).text()); 18 | title.push(text); 19 | }); 20 | $(this).find('td').each(function(){ 21 | var text = clean_text($(this).text()); 22 | data.push(text); 23 | }); 24 | data = data.join(","); 25 | rows.push(data); 26 | }); 27 | title = title.join(","); 28 | rows = rows.join("\n"); 29 | 30 | var csv = title + rows; 31 | var uri = 'data:text/csv;charset=utf-8,' + encodeURIComponent(csv); 32 | var download_link = document.createElement('a'); 33 | download_link.href = uri; 34 | var ts = new Date().getTime(); 35 | if(caption==""){ 36 | download_link.download = ts+".csv"; 37 | } else { 38 | download_link.download = caption+"-"+ts+".csv"; 39 | } 40 | document.body.appendChild(download_link); 41 | download_link.click(); 42 | document.body.removeChild(download_link); 43 | }); 44 | 45 | }; 46 | -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/30px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/30px.png -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/32px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/32px.png -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/fonts/titillium/titilliumweb-bold-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/fonts/titillium/titilliumweb-bold-webfont.eot -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/fonts/titillium/titilliumweb-bold-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/fonts/titillium/titilliumweb-bold-webfont.ttf -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/fonts/titillium/titilliumweb-bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/fonts/titillium/titilliumweb-bold-webfont.woff -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/fonts/titillium/titilliumweb-extralight-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/fonts/titillium/titilliumweb-extralight-webfont.eot -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/fonts/titillium/titilliumweb-extralight-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/fonts/titillium/titilliumweb-extralight-webfont.ttf -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/fonts/titillium/titilliumweb-extralight-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/fonts/titillium/titilliumweb-extralight-webfont.woff -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/fonts/titillium/titilliumweb-regular-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/fonts/titillium/titilliumweb-regular-webfont.eot -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/fonts/titillium/titilliumweb-regular-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/fonts/titillium/titilliumweb-regular-webfont.ttf -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/fonts/titillium/titilliumweb-regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/fonts/titillium/titilliumweb-regular-webfont.woff -------------------------------------------------------------------------------- /static/js/jstree_themes/proton/throbber.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/js/jstree_themes/proton/throbber.gif -------------------------------------------------------------------------------- /static/js/markcomplete.js: -------------------------------------------------------------------------------- 1 | function markComplete(assignment_id, student_id) { 2 | // This function is deprecated as of December 2022 3 | jQuery.ajax({ 4 | url: eBookConfig.app + '/assignments/update_submit', 5 | type: "POST", 6 | dataType: "JSON", 7 | data: { 8 | assignment_id: assignment_id, 9 | student_id: student_id 10 | }, 11 | success: function(retdata) { 12 | window.location.reload(true); 13 | } 14 | }); 15 | } 16 | 17 | 18 | 19 | async function updateAssignmentProgress (newState, assignmentId) { 20 | 21 | let data = { 22 | assignment_id: assignmentId, 23 | new_state: newState, 24 | }; 25 | let jsheaders = new Headers({ 26 | "Content-type": "application/json; charset=utf-8", 27 | Accept: "application/json", 28 | }); 29 | let request = new Request(`${eBookConfig.app}/assignments/update_submit`, { 30 | method: "POST", 31 | headers: jsheaders, 32 | body: JSON.stringify(data), 33 | }); 34 | let resp = await fetch(request); 35 | if (!resp.ok) { 36 | alert(`Status Not Updated ${resp.statusText}`); 37 | } else { 38 | if (location.href.indexOf("doAssignment") > -1) { 39 | window.location.reload(true); 40 | } 41 | } 42 | 43 | console.log(newState); 44 | } 45 | -------------------------------------------------------------------------------- /static/js/selfgrade.js: -------------------------------------------------------------------------------- 1 | function selfGrade(assignment_id) { 2 | jQuery.ajax({ 3 | url: eBookConfig.app + '/assignments/student_autograde', 4 | type: "POST", 5 | dataType: "JSON", 6 | data: { 7 | assignment_id: assignment_id, 8 | }, 9 | success: function (retdata) { 10 | window.location.reload(true); 11 | } 12 | }); 13 | } -------------------------------------------------------------------------------- /static/motd.html: -------------------------------------------------------------------------------- 1 |

    Updates May 25, 2023

    2 |
      3 |
    • Bug fixing and polishing
    • 4 |
    • UI polish for async peer instruction
    • 5 |
    6 |

    Runestone Academy approved as 501(c)(3) nonprofit

    7 |

    High School Teachers:

    8 |

    9 | If your school district wants us to sign a "contract" for providing please check to 10 | see if your district has adopted the 11 | National Data Privacy Agreement. 12 | If they have, then we can sign that and you are good to go. For many states we have 13 | already signed the NDPA and all you need to do is sign Exhibit E. 14 |

    15 | 16 |

    Please Support Runestone

    17 |

    18 | Did you know that over 70,000 students registered on Runestone Academy for the August 19 | 2022 school year. At $100 a textbook we saved students $7 million this year! Thats a 20 | lot of students and a lot of savings. It takes a lot of work to keep this site up and 21 | growing. We are adding new features and improvements all the time. Please consider a 22 | donation or ask your institution to support 23 | Runestone. If every school sent us $100 per class we would be fully sustainable and 24 | could add support staff. 25 |

    26 |

    27 | A huge Thank You! to those of you who have sent your support 28 | already. 29 |

    30 | -------------------------------------------------------------------------------- /static/rectangle_badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/static/rectangle_badge.png -------------------------------------------------------------------------------- /static/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: /welcome/default/user 3 | -------------------------------------------------------------------------------- /tests/.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | omit = 3 | applications/runestone/controllers/appadmin.py 4 | applications/runestone/controllers/everyday.py 5 | applications/runestone/controllers/feed.py 6 | 7 | [html] 8 | directory = applications/runestone/tests/htmlcov 9 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | # ******************* 2 | # |docname| - testing 3 | # ******************* 4 | # .. toctree:: 5 | # :maxdepth: 2 6 | # :glob: 7 | # 8 | # README 9 | # *.py 10 | # test_course_1/*.py 11 | -------------------------------------------------------------------------------- /tests/test_ajax2.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | 4 | # @unittest.skipIf(not is_linux, 'preview_question only runs under Linux.') FIXME 5 | def testPreviewQuestion(test_client, test_user_1): 6 | src = """ 7 | .. activecode:: preview_test1 8 | 9 | Hello World 10 | ~~~~ 11 | print("Hello World") 12 | 13 | """ 14 | test_user_1.login() 15 | 16 | kwargs = dict(code=json.dumps(src)) 17 | test_client.post("ajax/preview_question", data=kwargs) 18 | print(test_client.text) 19 | res = json.loads(test_client.text) 20 | 21 | assert "id=preview_test1" in res 22 | assert 'print("Hello World")' in res 23 | assert "textarea>" in res 24 | assert 'div data-component="activecode"' in res 25 | 26 | 27 | def test_Donations(test_client, test_user_1): 28 | test_user_1.login() 29 | res = ajaxCall(test_client, "save_donate") 30 | assert res == None 31 | 32 | res = ajaxCall(test_client, "did_donate") 33 | assert res["donate"] == True 34 | 35 | 36 | def test_NonDonor(test_client, test_user_1): 37 | test_user_1.login() 38 | res = ajaxCall(test_client, "did_donate") 39 | assert not res["donate"] 40 | 41 | 42 | def ajaxCall(client, funcName, **kwargs): 43 | """ 44 | Call the funcName using the client 45 | Returns json.loads(funcName()) 46 | """ 47 | client.post("ajax/" + funcName, data=kwargs) 48 | print(client.text) 49 | if client.text != "None": 50 | return json.loads(client.text) 51 | -------------------------------------------------------------------------------- /tests/test_course_1/.gitignore: -------------------------------------------------------------------------------- 1 | published/ 2 | build/ 3 | build_info 4 | -------------------------------------------------------------------------------- /tests/test_course_1/_sources/lp_demo-test.py: -------------------------------------------------------------------------------- 1 | # ============================================ 2 | # |docname| -- test code for :doc:`lp_demo.py` 3 | # ============================================ 4 | from lp_demo import one 5 | 6 | assert one() == 1 7 | -------------------------------------------------------------------------------- /tests/test_course_1/_sources/lp_demo.py: -------------------------------------------------------------------------------- 1 | # ===================================== 2 | # |docname| - Literate programming demo 3 | # ===================================== 4 | # Write a function named ``one`` which takes no parameters and returns the value 1. 5 | # 6 | # SOLUTION_BEGIN 7 | 8 | 9 | def one(): 10 | return 1 11 | 12 | 13 | # SOLUTION_END 14 | 15 | # .. lp_build:: test_lp_1 16 | # :builder: python 17 | -------------------------------------------------------------------------------- /tests/test_course_1/_sources/test_chapter_1/dynamicquestions.rst: -------------------------------------------------------------------------------- 1 | Testing SelectQuestion 2 | ====================== 3 | 4 | .. selectquestion:: dynamic_q_1 5 | :fromid: test_activecode_1 6 | :points: 10 7 | 8 | 9 | TODO - Add another test to test within an exam but this will require selenium 10 | -------------------------------------------------------------------------------- /tests/test_course_1/_sources/test_chapter_1/subchapter_a.rst: -------------------------------------------------------------------------------- 1 | ============ 2 | Subchapter A 3 | ============ 4 | This is empty. 5 | -------------------------------------------------------------------------------- /tests/test_course_1/_sources/test_chapter_1/toctree.rst: -------------------------------------------------------------------------------- 1 | ============== 2 | Test chapter 1 3 | ============== 4 | 5 | .. toctree:: 6 | :maxdepth: 2 7 | 8 | subchapter_a 9 | subchapter_b 10 | dynamicquestions -------------------------------------------------------------------------------- /tests/test_course_1/_static/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/.gitignore -------------------------------------------------------------------------------- /tests/test_course_1/_static/activecodethumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/activecodethumb.png -------------------------------------------------------------------------------- /tests/test_course_1/_static/audio/Example04_Tour01_Line01.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/audio/Example04_Tour01_Line01.mp3 -------------------------------------------------------------------------------- /tests/test_course_1/_static/audio/Example04_Tour01_Line01.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/audio/Example04_Tour01_Line01.wav -------------------------------------------------------------------------------- /tests/test_course_1/_static/audio/Example04_Tour01_Line02.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/audio/Example04_Tour01_Line02.mp3 -------------------------------------------------------------------------------- /tests/test_course_1/_static/audio/Example04_Tour01_Line02.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/audio/Example04_Tour01_Line02.wav -------------------------------------------------------------------------------- /tests/test_course_1/_static/audio/Example04_Tour01_Line03.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/audio/Example04_Tour01_Line03.mp3 -------------------------------------------------------------------------------- /tests/test_course_1/_static/audio/Example04_Tour01_Line03.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/audio/Example04_Tour01_Line03.wav -------------------------------------------------------------------------------- /tests/test_course_1/_static/clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/clock.png -------------------------------------------------------------------------------- /tests/test_course_1/_static/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/close.png -------------------------------------------------------------------------------- /tests/test_course_1/_static/first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/first.png -------------------------------------------------------------------------------- /tests/test_course_1/_static/img/logo_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/img/logo_small.png -------------------------------------------------------------------------------- /tests/test_course_1/_static/last.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/last.png -------------------------------------------------------------------------------- /tests/test_course_1/_static/next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/next.png -------------------------------------------------------------------------------- /tests/test_course_1/_static/pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/pause.png -------------------------------------------------------------------------------- /tests/test_course_1/_static/prev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RunestoneInteractive/RunestoneServer/afdf1b77a5f7d8a0c25ab84552a7699b1c1094c9/tests/test_course_1/_static/prev.png -------------------------------------------------------------------------------- /tests/test_designer.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | 3 | 4 | @pytest.mark.skip( 5 | reason="See https://github.com/RunestoneInteractive/RunestoneServer/issues/1904" 6 | ) 7 | def test_build(test_client, test_user_1, runestone_db_tools): 8 | test_user_1.make_instructor() 9 | test_user_1.login() 10 | test_client.validate( 11 | "designer/build", 12 | "build_course_1", 13 | data=dict( 14 | coursetype=test_user_1.course.course_name, 15 | institution="Runestone", 16 | startdate="01/01/2019", 17 | python3="T", 18 | login_required="T", 19 | instructor="T", 20 | projectname="build_course_1", 21 | projectdescription="Build a course", 22 | ), 23 | ) 24 | 25 | db = runestone_db_tools.db 26 | res = db(db.courses.course_name == "build_course_1").select().first() 27 | assert res.institution == "Runestone" 28 | assert res.base_course == test_user_1.course.course_name 29 | 30 | # Now delete it 31 | 32 | test_client.validate("admin/deletecourse", "About Runestone") 33 | res = db(db.courses.course_name == "build_course_1").select().first() 34 | assert not res 35 | 36 | # deleting the course invalidates the session 37 | test_user_1.login() 38 | test_client.validate( 39 | "designer/build", 40 | "build_course_2", 41 | data=dict( 42 | coursetype=test_user_1.course.course_name, 43 | instructor="T", 44 | startdate="", 45 | projectname="build_course_2", 46 | projectdescription="Build a course", 47 | ), 48 | ) 49 | -------------------------------------------------------------------------------- /tests/test_formatting.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | from .ci_utils import xqt, pushd 4 | import pytest 5 | 6 | 7 | def tests_black_format_check(runestone_name): 8 | with pushd("applications/{}".format(runestone_name)): 9 | xqt( 10 | "{} -m black --check controllers models modules tests --exclude 1.py".format( 11 | sys.executable 12 | ) 13 | ) 14 | 15 | 16 | @pytest.mark.skip("only failing on Travis") 17 | def test_flake8_lint(runestone_name): 18 | with pushd("applications/{}".format(runestone_name)): 19 | controllers = os.listdir("controllers") 20 | models = os.listdir("models") 21 | controllers = [x for x in controllers + models if x.endswith(".py")] 22 | for c in controllers: 23 | xqt("{} -m flake8 controllers/{}".format(sys.executable, c)) 24 | -------------------------------------------------------------------------------- /views/__init__.py: -------------------------------------------------------------------------------- 1 | # ************ 2 | # Web2py views 3 | # ************ 4 | # .. toctree:: 5 | # :maxdepth: 2 6 | # :glob: 7 | # 8 | # *.html 9 | # admin/* 10 | # assignments/* 11 | # books/* 12 | # dashboard/* 13 | # default/* 14 | # designer/* 15 | # lti/* 16 | # oauth/* 17 | -------------------------------------------------------------------------------- /views/admin/dashboard.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 | 4 | 5 | 6 |
    7 |

    {{=course_name}} Spring 2016 Instructor Dashboard

    8 |
    9 |

    Chapter 4 - Names for Strings

    10 |
    11 |
    12 | Overall Progression 13 |
    14 |
    15 |
    16 | 19 | 20 |
    21 |
    22 |
    23 |
    24 | Exercise Analytics 25 |
    26 |
    27 |
    28 |
    29 |
    30 |
    31 |
    32 |

    Recent Activity

    33 |
    34 | 38 |
    39 |
    40 |
    41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /views/admin/enroll_students.html: -------------------------------------------------------------------------------- 1 | {{ extend "admin/instructors.html"}} 2 | 3 | {{ block tabcontent }} 4 | 5 | 6 |

    Errors in CSV No students registered

    7 | 8 |

    Your CSV file has the following problems:

    9 |
      10 | {{ for mess in messages:}} 11 |
    1. {{= mess}}
    2. 12 | {{pass}} 13 |
    14 | 15 |

    Please edit your csv file in a text editor and correct the errors. 16 | You can resubmit the file after your corrections.

    17 | 18 | {{ end }} 19 | 20 | -------------------------------------------------------------------------------- /views/admin/progress.html: -------------------------------------------------------------------------------- 1 |

    HOME

    2 |

    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

    -------------------------------------------------------------------------------- /views/admin/sections_create.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | All Sections 3 |

    Create New Section

    4 | {{=form}} -------------------------------------------------------------------------------- /views/admin/simulate_exam.html: -------------------------------------------------------------------------------- 1 | {{ extend "admin/instructors.html"}} 2 | 3 | {{ block tabcontent }} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |

    Simulation Results

    12 |
    13 | 14 | 18 | 19 | {{ end }} 20 | 21 | -------------------------------------------------------------------------------- /views/admin/startdate.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 | 4 | 5 |

    Set the course start date

    6 | 7 |
    8 |

    This allows you set the start date for the current term of your course. All logs, records, and 9 | assignments from dates before the start date will not be visible to you or to your students. 10 |

    11 | 12 |
    13 | 14 |
    15 |
    16 |
    17 | 18 | 19 |
    20 |
    21 | 22 |
    23 |
    24 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /views/admin/studentactivity.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 |

    Student Activity Summary

    4 | {{=SQLTABLE(grid,headers={'useinfo.sid':'Student','COUNT(useinfo.id)':'Number','MAX(useinfo.timestamp)':'Last Activity'})}} 5 | 6 | -------------------------------------------------------------------------------- /views/admin/tickets.html: -------------------------------------------------------------------------------- 1 |

    Quick Look at Tickets

    2 | 3 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | {{ for ticket in tickets: }} 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 44 | 45 | {{ pass }} 46 |
    IDtimestampError MessagePathQuery StringHostnameTraceback
    {{=ticket["id"]}}{{=ticket["timestamp"]}}{{=ticket["err_message"]}}{{=ticket["path"]}}{{=ticket["query_string"]}}{{=ticket["hostname"]}} 41 | Show 42 |
    {{=ticket["traceback"]}}
    43 |
    47 | 48 |

    Traceback for ID:

    49 |
    
    50 | 
    51 | 
    61 | 
    
    
    --------------------------------------------------------------------------------
    /views/assignments/practiceNotStartedYet.html:
    --------------------------------------------------------------------------------
     1 | {{extend 'admin/instructors.html'}}
     2 | 
     3 | {{block moreincludes}}
     4 |     {{include '_sphinx_static_files.html'}}
     5 |     
     6 |     
     7 | {{end}}
     8 | 
     9 | {{block tabcontent}}
    10 |     
    11 |

    {{=message1}}

    12 |

    {{=message2}}

    13 |
    14 | {{end}} 15 | -------------------------------------------------------------------------------- /views/assignments/settz_then_practice.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | 13 | Automatically redirecting to {{=URL('assignments', 'practice')}} 14 | -------------------------------------------------------------------------------- /views/books/published.html: -------------------------------------------------------------------------------- 1 | {{ extend 'books/index.html' }} 2 | -------------------------------------------------------------------------------- /views/dashboard/active.html: -------------------------------------------------------------------------------- 1 | {{extend 'admin/instructors.html'}} 2 | {{ block tabcontent }} 3 | 4 | 5 | 6 | 7 | 8 |
    9 |

    {{=course.course_name}}

    10 |

    Active Students

    11 |

    This page shows students who have loaded a page in the last 15 minutes. Refresh the page to update.

    12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {{for row in activestudents: }} 22 | 23 | 24 | 25 | 26 | 27 | {{pass}} 28 | 29 |
    StudentTimeLast Page Loaded
    {{=row['sid']}}{{=row['timestamp']}}{{=row['div_id']}}
    30 | {{end}} 31 | -------------------------------------------------------------------------------- /views/dashboard/subchapdetail.html: -------------------------------------------------------------------------------- 1 | {{ extend 'admin/instructors.html' }} 2 | 3 | {{ block moreincludes }} 4 | {{super}} 5 | {{include '_sphinx_static_files.html' }} 6 | {{ end }} 7 | 8 | {{ block tabcontent }} 9 |

    {{=chapter}} / {{=subchapter}}

    10 |

    {{=sid}}

    11 |
    12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | {{ for row in rows: }} 23 | 24 | {{ if row["question_type"] in ["mchoice","fillintheblank","parsonsprob","clickablearea","dragndrop"]: }} 25 | 26 | {{ else: }} 27 | 28 | {{ pass }} 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | {{ pass }} 37 |
    QuestionQuestion TypeCorrectfirst trylast tryNumber of clicks
    {{=row["name"]}}{{=row["name"]}}{{=row["question_type"]}}{{=row["correct"]}}{{=row["first"]}}{{=row["last"]}}{{=row["clicks"]}}
    38 | 39 |
    40 | 41 | {{ end }} 42 | -------------------------------------------------------------------------------- /views/default/ack.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 | {{block statusbar}} 4 | {{end}} 5 | 6 |

    Acknowledgements

    7 | 8 |

    No project like this stands on its own. We are proud to be standing on the shoulders of giants who produced great software before us. We would like to acknowledge the following. 9 |

    10 | 11 |
      12 |
    • Jeffrey Elkner, et. al. for publishing the first version of How to Think Like a Computer Scientist
    • 13 |
    • Scott Graham, for Skulpt, which allowed us to develop activecode
    • 14 |
    • Philip Guo for the Online Python Tutor, which forms the basis for codelens
    • 15 |
    • To the folks at Pocoo.org who developed Skulpt
    • 16 |
    • To all the developers of RestructuredText
    • 17 |
    18 | 19 | 20 |

    We would especially like to acknowledge Jim Leisy of Franklin Beedle Publishers. Jim supported our first book project: Problem Sovling with Algorithms and Data Structures using Python. Jim has generously allowed us to develop the online version of this book and make it avaialable for free. Although you can access the interactive version of this book on line for free, you can still purchase a paper copy of the book from the link provided.

    -------------------------------------------------------------------------------- /views/default/bio.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 | {{block statusbar}} 4 | {{end}} 5 | 6 |

    Tell Us About Yourself

    7 | {{=form}} 8 | -------------------------------------------------------------------------------- /views/default/bios.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | {{""" 3 | 4 | You should not modify this file. 5 | It is used as default when a view is not provided for your controllers 6 | 7 | """}} 8 |

    {{=' '.join(x.capitalize() for x in request.function.split('_'))}}

    9 | {{if len(response._vars)==1:}} 10 | {{=list(response._vars.values())[0]}} 11 | {{elif len(response._vars)>1:}} 12 | {{=BEAUTIFY(response._vars)}} 13 | {{pass}} 14 | {{if request.is_local:}} 15 | {{=response.toolbar()}} 16 | {{pass}} 17 | -------------------------------------------------------------------------------- /views/default/courses.html: -------------------------------------------------------------------------------- 1 | {{user_navs = True}} 2 | {{extend 'layout.html'}} 3 | 4 | {{block statusbar}} 5 | {{end}} 6 | 7 |
    8 |
    9 | 10 |

    Course Selection

    11 |

    If you ended up here unexpectedly it is because you are logged 12 | in, but trying to access a course that you have not registered for. This is for your own good. You can click 13 | on the Enroll in a Course button and register for the course on the profile page. You do this 14 | by typing the name of the course into the Course Name box.

    15 |

    Choose your course. If you want to add a new course, click on the Enroll in a Course button, 16 | then change the course name in your profile.

    17 | {{ for course in courses: }} 18 |
    19 |
    21 |
    22 | {{pass}} 23 |
    24 | 25 |
    26 |
    27 | 28 |
    29 | 30 |
    31 |
    -------------------------------------------------------------------------------- /views/default/error.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 |

    Error: the document does not exist

    -------------------------------------------------------------------------------- /views/default/payment.html: -------------------------------------------------------------------------------- 1 | {{user_navs = True}} 2 | {{extend 'layout.html'}} 3 | 4 | {{block statusbar}} 5 | {{end}} 6 | 7 | {{if payment_success is None:}} 8 |

    Payment

    9 | 10 | This textbook requires a fee for access. 11 | 12 | {{# The payment form is contained in ``html``. Include it. 13 | =XML(html) 14 | }} 15 | {{elif payment_success:}} 16 |

    Thank you for your payment

    17 | 18 |

    Your book has been added to your library.

    19 | 20 | {{else:}} 21 |

    Payment failed

    22 | 23 |

    {{=form.response['error']['message']}} Please correct this error and retry your payment.

    24 | {{pass}} 25 | -------------------------------------------------------------------------------- /views/default/remove.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 | {{block statusbar}} 4 | {{end}} 5 | 6 | 7 |

    Remove a Course

    8 |

    Click your course to remove it

    9 |

    This action cannot be undone

    10 | 11 | 12 |
    13 |
    14 | {{for course in courses:}} 15 |
    16 | 17 |
    18 | {{pass}} 19 |
    20 | 21 |
    22 | 23 |
    24 |
    25 | -------------------------------------------------------------------------------- /views/exams/one_exam_competency.html: -------------------------------------------------------------------------------- 1 | {{ extend "admin/instructors.html"}} 2 | 3 | {{ block tabcontent }} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

    Exam Results

    13 |
    14 |
    15 |
    16 |
    17 | 18 | 19 | 26 | 27 | {{ end }} 28 | -------------------------------------------------------------------------------- /views/generic.csv: -------------------------------------------------------------------------------- 1 | {{ 2 | ### 3 | # Stream a CSV 4 | # for this to work the controller must return 5 | # 6 | # dict(filename=...,csvdata=...,field_names=...) 7 | # 8 | # filename is the suggested name to save the file as 9 | # csvdata is the list to output 10 | # field_names is a list of column headers 11 | ### 12 | try: 13 | thefile = filename 14 | except: 15 | thefile = 'export.csv' 16 | pass 17 | # the try block is commented out because it obscures errors that 18 | # may be interesting while debugging 19 | #try: 20 | import cStringIO 21 | import csv 22 | stream=cStringIO.StringIO() 23 | #field_names = ('Order Nbr','Invoice','Location','Payment ID','Date1','Date2','Amount1','Amount2') 24 | 25 | csv_writer = csv.DictWriter(stream, field_names, extrasaction='ignore') 26 | csv_writer.writeheader() 27 | #csv_writer.writerow(field_names) 28 | for row in csvdata: 29 | csv_writer.writerow(row) 30 | pass 31 | 32 | response.headers['Content-Type']='application/vnd.ms-excel' 33 | response.headers['Content-disposition']='attachment; filename=' +thefile 34 | response.write(stream.getvalue(), escape=False) 35 | #except: 36 | # raise HTTP(405,'no css') 37 | }} 38 | -------------------------------------------------------------------------------- /views/generic.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | {{""" 3 | 4 | You should not modify this file. 5 | It is used as default when a view is not provided for your controllers 6 | 7 | """}} 8 |

    {{=' '.join(x.capitalize() for x in request.function.split('_'))}}

    9 | {{if len(response._vars)==1:}} 10 | {{=response._vars.values()[0]}} 11 | {{elif len(response._vars)>1:}} 12 | {{=BEAUTIFY(response._vars)}} 13 | {{pass}} 14 | {{if request.is_local:}} 15 | {{=response.toolbar()}} 16 | {{pass}} 17 | -------------------------------------------------------------------------------- /views/generic.json: -------------------------------------------------------------------------------- 1 | {{from gluon.serializers import json}}{{=XML(json(response._vars))}} 2 | -------------------------------------------------------------------------------- /views/generic.jsonp: -------------------------------------------------------------------------------- 1 | {{ 2 | ### 3 | # response._vars contains the dictionary returned by the controller action 4 | ### 5 | try: 6 | from gluon.serializers import json 7 | result = "%s(%s)" % (request.vars['callback'], json(response._vars)) 8 | response.write(result, escape=False) 9 | response.headers['Content-Type'] = 'application/jsonp' 10 | except (TypeError, ValueError): 11 | raise HTTP(405, 'JSON serialization error') 12 | except ImportError: 13 | raise HTTP(405, 'JSON not available') 14 | except: 15 | raise HTTP(405, 'JSON error') 16 | }} -------------------------------------------------------------------------------- /views/generic.load: -------------------------------------------------------------------------------- 1 | {{''' 2 | # License: Public Domain 3 | # Author: Iceberg at 21cn dot com 4 | 5 | With this generic.load file, you can use same function to serve two purposes. 6 | 7 | = regular action 8 | - ajax callback (when called with .load) 9 | 10 | Example modified from http://www.web2py.com/AlterEgo/default/show/252: 11 | 12 | def index(): 13 | return dict( 14 | part1='hello world', 15 | part2=LOAD(url=URL(r=request,f='auxiliary.load'),ajax=True)) 16 | 17 | def auxiliary(): 18 | form=SQLFORM.factory(Field('name')) 19 | if form.accepts(request.vars): 20 | response.flash = 'ok' 21 | return dict(message="Hello %s" % form.vars.name) 22 | return dict(form=form) 23 | 24 | Notice: 25 | 26 | - no need to set response.headers['web2py-response-flash'] 27 | - no need to return a string 28 | even if the function is called via ajax. 29 | 30 | '''}}{{if len(response._vars)==1:}}{{=response._vars.values()[0]}}{{else:}}{{=BEAUTIFY(response._vars)}}{{pass}} -------------------------------------------------------------------------------- /views/generic.pdf: -------------------------------------------------------------------------------- 1 | {{ 2 | import os 3 | from gluon.contrib.generics import pdf_from_html 4 | filename = '%s/%s.html' % (request.controller,request.function) 5 | if os.path.exists(os.path.join(request.folder,'views',filename)): 6 | html=response.render(filename) 7 | else: 8 | html=BODY(BEAUTIFY(response._vars)).xml() 9 | pass 10 | =pdf_from_html(html) 11 | }} 12 | -------------------------------------------------------------------------------- /views/generic.rss: -------------------------------------------------------------------------------- 1 | {{ 2 | ### 3 | # response._vars contains the dictionary returned by the controller action 4 | # for this to work the action must return something like 5 | # 6 | # dict(title=...,link=...,description=...,created_on='...',items=...) 7 | # 8 | # items is a list of dictionaries each with title, link, description, pub_date. 9 | ### 10 | from gluon.serializers import rss}}{{=XML(rss(response._vars))}} 11 | -------------------------------------------------------------------------------- /views/generic.xml: -------------------------------------------------------------------------------- 1 | {{from gluon.serializers import xml}}{{=XML(xml(response._vars,quote=False))}} 2 | -------------------------------------------------------------------------------- /views/lti/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {{if logged_in:}} 7 |

    Logged in

    8 | 21 | {{else:}} 22 |

    Not logged in due to the following error(s)

    23 |
      24 | {{for item in lti_errors:}}
    • {{=item}}
    • {{pass}} 25 |
    26 | {{pass}} 27 | 28 | -------------------------------------------------------------------------------- /views/lti/store.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
    4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
    15 | 16 | -------------------------------------------------------------------------------- /views/oauth/index.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 | 4 | 5 | This page is a utility for accepting redirects from external services like Spotify or LinkedIn that use oauth. You should have reached this page after authorizing at one of those sites.

    6 | 7 | Normally, you will have reached this site with a python program running on your computer wait for you to paste in the url for this page, which is also printed below. Copy it and paste it into the terminal window where that program is running. 8 | 9 | 10 |

    Copy and paste the whole URL!

    11 |

    {{=url}}

    12 | 13 | -------------------------------------------------------------------------------- /views/peer/extra.html: -------------------------------------------------------------------------------- 1 | {{ extend "admin/instructors.html"}} {{ block tabcontent }} 2 | 3 |
    4 |

    Percent Correct for {{=current_question['name']}}

    5 | 6 |

    %

    7 | 8 |
    9 | 10 | 37 | 38 | 49 | 50 | {{ end }} -------------------------------------------------------------------------------- /views/peer/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Chat 6 | 7 | 8 | 9 |

    WebSocket Chat

    10 |
    11 | 12 | 13 |
    14 | 15 |
      16 |
    17 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /views/peer/instructor.html: -------------------------------------------------------------------------------- 1 | {{ extend "admin/instructors.html"}} 2 | {{ block tabcontent }} 3 | 4 |

    Peer Work

    5 |

    6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {{for assignment in assignments:}} 14 | 15 | 18 | 21 | 22 | 23 | 24 | 25 | {{pass}} 26 |
    NameExtra**DueDescription
    16 | {{=assignment['name']}} 17 | 19 | {{=assignment['name']}} - Extra Info 20 | {{=assignment['duedate']}}{{=assignment['description']}}
    27 | 28 |

    ** Note: The Extra Info link for each peer assignment can be brought up on your phone or another device or in a different window, it contains information that you might not want to share with your students.

    29 | {{ end }} 30 | -------------------------------------------------------------------------------- /views/peer/student.html: -------------------------------------------------------------------------------- 1 | {{extend 'layout.html'}} 2 | 3 | {{block moreincludes}} 4 | {{include '_sphinx_static_files.html'}} 5 | {{end}} 6 | 7 | 8 |

    Peer Instruction Links

    9 |

    10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {{i=0}} 18 | {{for assignment in assignments:}} 19 | 20 | 21 | {{if assignment.peer_async_visible:}} 22 | 23 | {{else:}} 24 | 25 | {{pass}} 26 | 27 | 28 | 29 | 30 | {{pass}} 31 |
    In Class LinkAfter Class LinkDueDescription
    {{=assignment['name']}} (in class){{=assignment['name']}} (after class)Not Available{{=assignment['duedate']}}{{=assignment['description']}}
    32 | 33 |

    Note: The "After Class" version of the assignment is only for use outside of and AFTER the class it was introduced. You will be able to vote for each question twice and review a chat transcript from a group that was recorded during class.

    34 | -------------------------------------------------------------------------------- /views/web2py_ajax.html: -------------------------------------------------------------------------------- 1 | 7 | {{ 8 | response.files.insert(0,URL('static','js/jquery.js')) 9 | response.files.insert(1,URL('static','css/calendar.css')) 10 | response.files.insert(2,URL('static','js/calendar.js')) 11 | response.files.insert(3,URL('static','js/web2py.js')) 12 | response.include_meta() 13 | response.include_files() 14 | }} 15 | --------------------------------------------------------------------------------