color: add ColoredFormatter for more transparent coloring.
[pygrader.git] / pygrader / handler / get.py
index c5797fa95dca2cc53bc0f449042fa9d989bd8f50..a42fa25e6d446fa6c949d8c06e98004489cfc8bd 100644 (file)
@@ -14,8 +14,6 @@ import os.path as _os_path
 import pgp_mime as _pgp_mime
 
 from .. import LOG as _LOG
-from ..color import color_string as _color_string
-from ..color import standard_colors as _standard_colors
 from ..email import construct_text_email as _construct_text_email
 from ..email import construct_email as _construct_email
 from ..storage import assignment_path as _assignment_path
@@ -35,9 +33,8 @@ class InvalidStudent (_InvalidSubjectMessage):
         self.students = students
 
 
-def run(basedir, course, original, message, person, subject,
-        trust_email_infrastructure=False,
-        use_color=None, dry_run=False, **kwargs):
+def run(basedir, course, message, person, subject,
+        trust_email_infrastructure=False, dry_run=False, **kwargs):
     """
     >>> from pgp_mime.email import encodedMIMEText
     >>> from ..model.grade import Grade
@@ -61,8 +58,8 @@ def run(basedir, course, original, message, person, subject,
     Unauthenticated messages are refused by default.
 
     >>> process(
-    ...     basedir=course.basedir, course=course.course, original=message,
-    ...     message=message, person=person, subject='[get]', max_late=0)
+    ...     basedir=course.basedir, course=course.course, message=message,
+    ...     person=person, subject='[get]', max_late=0)
     UnsignedMessage error:
     unsigned message
 
@@ -79,8 +76,8 @@ def run(basedir, course, original, message, person, subject,
     Students without grades get a reasonable response.
 
     >>> process(
-    ...     basedir=course.basedir, course=course.course, original=message,
-    ...     message=message, person=person, subject='[get]', max_late=0,
+    ...     basedir=course.basedir, course=course.course, message=message,
+    ...     person=person, subject='[get]', max_late=0,
     ...     trust_email_infrastructure=True)
     ... # doctest: +ELLIPSIS, +REPORT_UDIFF
     respond with:
@@ -94,8 +91,8 @@ def run(basedir, course, original, message, person, subject,
 
     >>> message.authenticated = True
     >>> process(
-    ...     basedir=course.basedir, course=course.course, original=message,
-    ...     message=message, person=person, subject='[get]', max_late=0)
+    ...     basedir=course.basedir, course=course.course, message=message,
+    ...     person=person, subject='[get]', max_late=0)
     ... # doctest: +ELLIPSIS, +REPORT_UDIFF
     respond with:
     Content-Type: text/plain; charset="us-ascii"
@@ -125,9 +122,8 @@ def run(basedir, course, original, message, person, subject,
     ...     points=10, comment='Looks good.')
     >>> course.course.grades.append(grade)
     >>> process(
-    ...     basedir=course.basedir, course=course.course, original=message,
-    ...     message=message, person=person, subject='[get]',
-    ...     max_late=0)
+    ...     basedir=course.basedir, course=course.course, message=message,
+    ...     person=person, subject='[get]', max_late=0)
     ... # doctest: +ELLIPSIS, +REPORT_UDIFF
     respond with:
     Content-Type: multipart/signed; protocol="application/pgp-signature"; micalg="pgp-sha1"; boundary="===============...=="
@@ -181,9 +177,8 @@ def run(basedir, course, original, message, person, subject,
     ...     course.course.find_people(email='eye@tower.edu'))[0]
     >>> person.pgp_key = None
     >>> process(
-    ...     basedir=course.basedir, course=course.course, original=message,
-    ...     message=message, person=person, subject='[get]',
-    ...     max_late=0)
+    ...     basedir=course.basedir, course=course.course, message=message,
+    ...     person=person, subject='[get]', max_late=0)
     ... # doctest: +ELLIPSIS, +REPORT_UDIFF
     respond with:
     Content-Type: multipart/signed; protocol="application/pgp-signature"; micalg="pgp-sha1"; boundary="===============...=="
@@ -224,9 +219,8 @@ def run(basedir, course, original, message, person, subject,
     They can also request grades for a particular student.
 
     >>> process(
-    ...     basedir=course.basedir, course=course.course, original=message,
-    ...     message=message, person=person,
-    ...     subject='[get] {}'.format(student.name),
+    ...     basedir=course.basedir, course=course.course, message=message,
+    ...     person=person, subject='[get] {}'.format(student.name),
     ...     max_late=0)
     ... # doctest: +ELLIPSIS, +REPORT_UDIFF
     respond with:
@@ -288,7 +282,7 @@ def run(basedir, course, original, message, person, subject,
     >>> try:
     ...     _handle_submission(
     ...         basedir=course.basedir, course=course.course,
-    ...         original=submission, message=submission, person=student,
+    ...         message=submission, person=student,
     ...         subject='[submit] Assignment 1')
     ... except _Response:
     ...     pass
@@ -296,8 +290,8 @@ def run(basedir, course, original, message, person, subject,
     Now lets request the submissions.
 
     >>> process(
-    ...     basedir=course.basedir, course=course.course, original=message,
-    ...     message=message, person=person,
+    ...     basedir=course.basedir, course=course.course, message=message,
+    ...     person=person,
     ...     subject='[get] {}, {}'.format(student.name, 'Assignment 1'),
     ...     max_late=0)
     ... # doctest: +ELLIPSIS, +REPORT_UDIFF
@@ -366,24 +360,22 @@ def run(basedir, course, original, message, person, subject,
     if trust_email_infrastructure:
         authenticated = True
     else:
-        authenticated = hasattr(message, 'authenticated') and message.authenticated
+        authenticated = (
+            hasattr(message, 'authenticated') and message.authenticated)
     if not authenticated:
         raise _UnsignedMessage()
     if 'assistants' in person.groups or 'professors' in person.groups:
         email = _get_admin_email(
-            basedir=basedir, course=course, original=original,
-            person=person, subject=subject, use_color=use_color)
+            basedir=basedir, course=course, person=person, subject=subject)
     elif 'students' in person.groups:
         email = _get_student_email(
-            basedir=basedir, course=course, original=original,
-            person=person, use_color=use_color)
+            basedir=basedir, course=course, person=person)
     else:
         raise NotImplementedError(
             'strange groups {} for {}'.format(person.groups, person))
     raise _Response(message=email)
 
-def _get_student_email(basedir, course, original, person, student=None,
-                       use_color=None):
+def _get_student_email(basedir, course, person, student=None):
     if student is None:
         student = person
         targets = None
@@ -411,7 +403,7 @@ def _get_student_email(basedir, course, original, person, student=None,
     return email
 
 def _get_student_submission_email(
-    basedir, course, original, person, assignments, student, use_color=None):
+    basedir, course, person, assignments, student):
     subject = '{} assignment submissions for {}'.format(
         course.name, student.name)
     text = '{}:\n  * {}\n'.format(
@@ -437,14 +429,14 @@ def _get_student_submission_email(
         author=course.robot, targets=[person], subject=subject,
         message=message)
 
-def _get_admin_email(basedir, course, original, person, subject,
-                     use_color=None):
+def _get_admin_email(basedir, course, person, subject):
     lsubject = subject.lower()
     students = [p for p in course.find_people()
                 if p.name.lower() in lsubject]
     if len(students) == 0:
         stream = _io.StringIO()
-        _tabulate(course=course, statistics=True, stream=stream)
+        _tabulate(
+            course=course, statistics=True, stream=stream, use_color=False)
         text = stream.getvalue()
         email = _construct_text_email(
             author=course.robot, targets=[person],
@@ -456,13 +448,11 @@ def _get_admin_email(basedir, course, original, person, subject,
                        if a.name.lower() in lsubject]
         if len(assignments) == 0:
             email = _get_student_email(
-                basedir=basedir, course=course, original=original,
-                person=person, student=student, use_color=use_color)
+                basedir=basedir, course=course, person=person, student=student)
         else:
             email = _get_student_submission_email(
-                basedir=basedir, course=course, original=original,
-                person=person, student=student, assignments=assignments,
-                use_color=use_color)
+                basedir=basedir, course=course, person=person, student=student,
+                assignments=assignments)
     else:
         raise InvalidStudent(students=students)
     return email