{ "info": { "author": "W. Trevor King", "author_email": "wking@tremily.us", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Education", "License :: OSI Approved :: GNU General Public License (GPL)", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Topic :: Communications :: Email", "Topic :: Database", "Topic :: Education" ], "description": "``pygrader`` is a directory-based grade database for grading course\nassignments. Besides tracking grades locally, you can also use it to\nautomatically mail grades to students and professors associated with\nthe course. For secure communication, PGP_ can be used to sign and/or\nencrypt any of these emails.\n\nInstallation\n============\n\nPackages\n--------\n\nGentoo\n~~~~~~\n\nI've packaged ``pygrader`` for Gentoo_. You need layman_ and\nmy `wtk overlay`_. Install with::\n\n # emerge -av app-portage/layman\n # layman --add wtk\n # emerge -av dev-python/pygrader\n\nDependencies\n------------\n\nIf you're installing by hand or packaging ``pygrader`` for another\ndistribution, you'll need the following dependencies:\n\n========= ===================== ================ =========================\nPackage Purpose Debian_ Gentoo_\n========= ===================== ================ =========================\nJinja_ email templating python-jinja2 dev-python/jinja\npgp-mime_ secure email dev-python/pgp-mime [#pm]\nnose_ testing (optional) python-nose dev-python/nose\nNumPy_ statistics (optional) python-numpy dev-python/numpy\n========= ===================== ================ =========================\n\nIf NumPy is not installed, we'll fall back to internal implementations\nof the various statistical calculations.\n\nIf you are developing ``pygrader``, you can use `update-copyright`_ to\nkeep the copyright blurbs up to date.\n\n.. [#pm] In the `wtk overlay`_.\n\nInstalling by hand\n------------------\n\n``pygrader`` is available as a Git_ repository::\n\n $ git clone git://tremily.us/pygrader.git\n\nSee the homepage_ for details. To install the checkout, run the\nstandard::\n\n $ python setup.py install\n\nSubmodules\n----------\n\npgp-mime_ depends on pyassuan_, which requires Python 3.3. If your\ndistribution doesn't package Jinja_ or ``pgp-mime`` for Python 3.3,\nyou can use ``pygrader``'s Git submodules to easily fetch compatible\nversions. The submodules are stored in the ``dep/src`` directory with\nsymbolic links in ``dep`` itself. For example, the ``pgp-mime``\nsubmodule is kept in ``dep/src/pgp-mime`` with the symlink\n``dep/pgp_mime`` pointing to ``dep/pgp-mime/pgp_mime``. If you only\nneed a few submodules, you can initialize them explicitly::\n\n $ git submodule init pgp-mime pyassuan\n\nIf you want all of the submodules, use::\n\n $ git submodule init\n\nGit submodule will fetch (when necessary) and unpack the gitlinked\ncommit of initialized submodules with::\n\n $ git submodule update\n\nYou'll want to run ``update`` again after any superproject (in this\ncase, ``pygrader``) action that updates the gitlinks. Once you have\nchecked out the dependencies you need, point ``PYTHONPATH`` to the\n``dep`` directory whenever you run ``pygrader``. For example::\n\n $ PYTHONPATH=dep ./bin/pg.py ...\n\nUsage\n=====\n\nPygrader will help keep you organized in a course where the students\nsubmit homework via email, or the homework submissions are otherwise\ndigital (i.e. scanned in after submission). You can also use it to\nassign and `manage any type of grade via email`__. In the following\nsections, I'll walk you through local administration for the ``test``\ncourse.\n\n__ `Mailpipe details`_\n\nAll of the processing involves using the ``pg.py`` command. Run::\n\n $ pg.py --help\n\nfor details.\n\nSending email\n-------------\n\nPygrader receives submissions and assigns grades via email. In order\nto send email, it needs to connect to an SMTP_ server. See the\npgp-mime documentation for details on configuring you SMTP connection.\nYou can test your SMTP configuration by sending yourself a test\nmessage::\n\n $ pg.py -VVV smtp -a rincewind@uu.edu -t rincewind@uu.edu\n\nDefining the course\n-------------------\n\nOnce you've got email submission working, you need to configure the\ncourse you'll be grading. Each course lives in its own directory, and\nthe basic setup looks like the ``test`` example distributed with\npygrader. The file that you need to get started is the config file in\nthe course directory::\n\n $ cat test/course.conf\n [course]\n name: Physics 101\n assignments: Attendance 1, Attendance 2, Attendance 3, Attendance 4,\n Attendance 5, Attendance 6, Attendance 7, Attendance 8, Attendance 9,\n Assignment 1, Assignment 2, Exam 1, Exam 2\n robot: Robot101\n professors: Gandalf\n assistants: Sauron\n students: Bilbo Baggins, Frodo Baggins, Aragorn\n\n [Attendance 1]\n points: 1\n weight: 0.1/9\n due: 2011-10-03\n\n [Attendance 2]\n points: 1\n weight: 0.1/9\n due: 2011-10-04\n\n \u2026\n\n [Assignment 1]\n points: 10\n weight: 0.4/2\n due: 2011-10-10\n submittable: yes\n\n \u2026\n\n [Exam 2]\n points: 10\n weight: 0.4/2\n due: 2011-10-17\n\n [Robot101]\n nickname: phys-101 robot\n emails: phys101@tower.edu\n pgp-key: 4332B6E3\n\n [Gandalf]\n nickname: G-Man\n emails: g@grey.edu\n pgp-key: 4332B6E3\n\n [Sauron]\n emails: eye@tower.edu\n\n [Bilbo Baggins]\n nickname: Bill\n emails: bb@shire.org, bb@greyhavens.net\n\n \u2026\n\nThe format is a bit wordy, but it is also explicit and easily\nextensible. The time it takes to construct this configuration file\nshould be a small portion of the time you will spend grading\nsubmissions.\n\nIf a person has the ``pgp-key`` option set, that key will be used to\nencrypt messages to that person and sign messages from that person\nwith PGP_. It will also be used to authenticate ownership of incoming\nemails. You'll need to have GnuPG_ on your local host for this to\nwork, and the user running ``pygrader`` should have the associated\nkeys in their keychain.\n\nThe ``course.robot`` option defines a dummy person used to sign\nautomatically generated emails (e.g. responses to mailpipe-processed\nsubmissions).\n\nThe ``submittable`` option marks assignments that accept direct\nsubmission from students (e.g. homeworks). You probably don't want to\nset this option for attendance, since it would allow students to mark\nthemselves as having attended a class. ``submittable`` default to\n``False``.\n\nProcessing submissions\n----------------------\n\nAs the due date approaches, student submissions will start arriving in\nyour inbox. Use ``pg.py``'s ``mailpipe`` command to sort them into\ndirectories (using the ``pygrader.handler.submission`` handler). This\nwill also extract any files that were attached to the emails and place\nthem in that person's assignment directory::\n\n $ pg.py -d test mailpipe -m maildir -i ~/.maildir -o ./mail-old\n\nUse ``pg.py``'s ``todo`` command to check for ungraded submissions::\n\n $ pg.py -d test todo mail grade\n\nThen create ``grade`` files using your favorite editor. The first\nline of the grade file should be the student's grade for that\nassigment, expressed in a syntax that Python's ``float()`` understands\n(``1``, ``95``, ``2.5``, ``6.022e23``, etc.). If you wish, you may\nadd additional comment lines after the grade line, offering\nsuggestions for improvement, etc. This comment (if present) will be\nmailed to the student along with the grade itself. There are a number\nof example grade files in the ``test`` directory in ``pygrader``'s Git\nsource.\n\nTo see how everyone's doing, you can print a table of grades with\n``pg.py``'s ``tabulate`` command::\n\n $ pg.py -d test tabulate -s\n\nWhen you want to notify students of their grades, you can send them\nall out with ``pg.py``'s ``email`` command::\n\n $ pg.py -d test email assignment 'Exam 1'\n\nMailpipe details\n~~~~~~~~~~~~~~~~\n\nBesides accepting student submissions from incoming email,\n``mailpipe`` also accepts other types of requests, and can be\nconfigured to respond automatically:\n\n* Incoming student assignment submissions are archived (see the\n ``submit`` command).\n* Students can check their grades without having to bother anyone (see\n the ``get`` commands).\n* Professors and teaching assistants can request student submissions\n so that they can grade them (see the ``get`` commands).\n* Professors and TAs can request the grades for the entire class (see\n the ``get`` commands).\n* Professors and TAs can assign grades (see the ``grade`` command).\n\nTo enable automatic responses, you'll need to add the ``-r`` or\n``--respond`` argument when you call ``pg.py``.\n\nIf you get tired of filtering your inbox by hand using ``pg.py\nmailpipe``, you can (depending on how your mail delivery is setup) use\nprocmail_ to automatically run ``mailpipe`` automatically on incoming\nemail. There is an example ``.procmailrc`` in the\n``pygrader.mailpipe.mailpipe`` docstring that runs ``mailpipe``\nwhenever incoming emails have ``[phys160:submit]`` in their subject\nsomewhere.\n\nThe use of ``[TARGET]`` tags in the email subject allows users to\nunambiguously specify the purpose of their email. Currently supported\ntargets include (see the ``handlers`` argument to\n``pygrader.mailpipe``):\n\n``submit``\n student assignment submission. The remainder of the email subject\n should include the case insensitive name of the assignment being\n submitted (see ``pygrader.handler.submission._match_assignment``).\n An example subject would be::\n\n [submit] assignment 1\n\n``get``\n request information from the grade database. For students, the\n remainder of the email subject is irrelevant. Grades and comments\n for all graded assignments are returned in a single email. An\n example subject would be::\n\n [get] my grades\n\n Professors and TAs may request either a table of all grades for the\n course (\u00e0 la ``tabulate``), the full grades for a particular\n student, or a particular student's submission for a particular\n assignment. Example subjects are (respectively):\n\n [get] don't match any student names\n [get] Bilbo Baggins\n [get] Bilbo Baggins Assignment 1\n\n``grade``\n professors and TAs can submit a grade for a particular student on a\n particular assignment. The body of the (possibly signed or\n encrypted) email should be identical to the grade file that the\n sender wishes to create. An example subject would be::\n\n [grade] Bilbo Baggins Assignment 1\n\nTo allow you to easily sort the email, you can also prefix the target\nwith additional information (see\n``pygrader.mailpipe._get_message_target``). For example, if you were\nrunning several courses from the same email account, you'd want a way\nfor users to specify which course they were interacting with so you\ncould filter appropriately in your procmail rules. Everything in the\nsubject tag before an optional semicolon is ignored by ``mailpipe``,\nso the following subjects will be handled identically::\n\n [submit] assignment 1\n [phys101:submit] assignment 1\n [phys101:section2:submit] assignment 1\n\nTesting\n=======\n\nRun the internal unit tests using nose_::\n\n $ nosetests --with-doctest --doctest-tests pygrader\n\nIf a Python-3-version of ``nosetests`` is not the default on your\nsystem, you may need to try something like::\n\n $ nosetests-3.2 --with-doctest --doctest-tests pygrader\n\nLicence\n=======\n\nThis project is distributed under the `GNU General Public License\nVersion 3`_ or greater.\n\nAuthor\n======\n\nW. Trevor King\nwking@tremily.us\n\nRelated work\n============\n\nFor a similar project, see `Alex Heitzmann's pygrade`_, which keeps\nthe grade history in a single log file and provides more support for\nusing graphical interfaces.\n\n\n.. _PGP: http://en.wikipedia.org/wiki/Pretty_Good_Privacy\n.. _Gentoo: http://www.gentoo.org/\n.. _layman: http://layman.sourceforge.net/\n.. _wtk overlay: http://blog.tremily.us/posts/Gentoo_overlay/\n.. _Debian: http://www.debian.org/\n.. _Jinja: http://jinja.pocoo.org/\n.. _pgp-mime: http://blog.tremily.us/posts/pgp-mime/\n.. _pyassuan: http://blog.tremily.us/posts/pyassuan/\n.. _NumPy: http://numpy.scipy.org/\n.. _update-copyright: http://blog.tremily.us/posts/update-copyright/\n.. _Git: http://git-scm.com/\n.. _homepage: http://blog.tremily.us/posts/pygrader/\n.. _SMTP: http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol\n.. _GnuPG: http://www.gnupg.org/\n.. _procmail: http://www.procmail.org/\n.. _nose: http://readthedocs.org/docs/nose/en/latest/\n.. _GNU General Public License Version 3: http://www.gnu.org/licenses/gpl.html\n.. _Alex Heitzmann's pygrade: http://code.google.com/p/pygrade/", "description_content_type": null, "docs_url": null, "download_url": "http://git.tremily.us/?p=pygrader.git;a=snapshot;h=v0.3;sf=tgz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://blog.tremily.us/posts/pygrader/", "keywords": null, "license": "GNU General Public License (GPL)", "maintainer": null, "maintainer_email": null, "name": "pygrader", "package_url": "https://pypi.org/project/pygrader/", "platform": "all", "project_url": "https://pypi.org/project/pygrader/", "project_urls": { "Download": "http://git.tremily.us/?p=pygrader.git;a=snapshot;h=v0.3;sf=tgz", "Homepage": "http://blog.tremily.us/posts/pygrader/" }, "release_url": "https://pypi.org/project/pygrader/0.3/", "requires_dist": null, "requires_python": null, "summary": "Manage a course's grade database with email-based communication.", "version": "0.3" }, "last_serial": 797265, "releases": { "0.3": [ { "comment_text": "", "digests": { "md5": "3a25cd5118f3773d101d701630f388b2", "sha256": "92def843357141ddc23777cf94866d2ee507a0ac41a148dc483424f48b98ae08" }, "downloads": -1, "filename": "pygrader-0.3.tar.gz", "has_sig": false, "md5_digest": "3a25cd5118f3773d101d701630f388b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51566, "upload_time": "2013-01-22T13:49:23", "url": "https://files.pythonhosted.org/packages/09/cd/cae70dcc2ae3d5845d4a0a6bd7efb3ecd1ea88434a50ea83bbfc22691aaa/pygrader-0.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "3a25cd5118f3773d101d701630f388b2", "sha256": "92def843357141ddc23777cf94866d2ee507a0ac41a148dc483424f48b98ae08" }, "downloads": -1, "filename": "pygrader-0.3.tar.gz", "has_sig": false, "md5_digest": "3a25cd5118f3773d101d701630f388b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 51566, "upload_time": "2013-01-22T13:49:23", "url": "https://files.pythonhosted.org/packages/09/cd/cae70dcc2ae3d5845d4a0a6bd7efb3ecd1ea88434a50ea83bbfc22691aaa/pygrader-0.3.tar.gz" } ] }