def handle(self, *args, **options):
        if len(args) < 3:
            print "Missing course or quiz handle or quiz type!"
        
        try:
            ready_course = Course.objects.get(handle= args[0], mode='ready')
        except Course.DoesNotExist:
            print "Failed to find course with given handle"
            return

        if args[1] == 'video':
            try:
                ready_quiz = Video.objects.get(course=ready_course, slug=args[2])
            except Video.DoesNotExist:
                print "Failed to find video with given slug"
                return
        elif args[1] == 'problemset':
            try:
                ready_quiz = ProblemSet.objects.get(course=ready_course, slug=args[2])
            except ProblemSet.DoesNotExist:
                print "Failed to find problemset with given slug"
                return
        else:
            print "Second arg must be either 'video' or 'problemset'"
            return
        
        save_to_s3 = True if (len(args) > 3 and args[3] == '1') else False
        
        report = gen_quiz_full_report(ready_course, ready_quiz, save_to_s3)
        if save_to_s3:
            if report['path']: print "Report successfully written to: %s" % report['path']
            else: print "Failed to generate report or write it to S3!"
Esempio n. 2
0
    def handle(self, *args, **options):
        if len(args) < 3:
            print "Missing course or quiz handle or quiz type!"

        try:
            ready_course = Course.objects.get(handle=args[0], mode='ready')
        except Course.DoesNotExist:
            print "Failed to find course with given handle"
            return

        if args[1] == 'video':
            try:
                ready_quiz = Video.objects.get(course=ready_course,
                                               slug=args[2])
            except Video.DoesNotExist:
                print "Failed to find video with given slug"
                return
        elif args[1] == 'problemset':
            try:
                ready_quiz = ProblemSet.objects.get(course=ready_course,
                                                    slug=args[2])
            except ProblemSet.DoesNotExist:
                print "Failed to find problemset with given slug"
                return
        else:
            print "Second arg must be either 'video' or 'problemset'"
            return

        save_to_s3 = True if (len(args) > 3 and args[3] == '1') else False

        report = gen_quiz_full_report(ready_course, ready_quiz, save_to_s3)
        if save_to_s3:
            if report['path']:
                print "Report successfully written to: %s" % report['path']
            else:
                print "Failed to generate report or write it to S3!"
Esempio n. 3
0
def generate_and_email_reports(username, course_handle, requested_reports, email_title, email_message, attach_reports_to_email = True):
    # Generates the list of reports in requested_reports, and sends it to the staff of the given course.
    ready_course = Course.objects.get(handle=course_handle, mode='ready')
    
    # Generate requested reports
    reports = []
    for rr in requested_reports:
        if rr['type'] == 'dashboard':
            logger.info("User %s requested to generate dashboard report for course %s." % (username, course_handle))
            report = gen_course_dashboard_report(ready_course, save_to_s3=True)
            report['type'] = rr['type']
            if report:
                reports.append(report)
                logger.info("Dashboard report for course %s generated successfully for user %s." % (course_handle, username))
            else:
                logger.info("Failed to generate dashboard report for course %s for user %s." % (course_handle, username))
            
        elif rr['type'] == 'video_full':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info("Missing slug -- Failed to generate video full report")
            else:
                slug = rr['slug']
                logger.info("User %s requested to generate video full report for course %s video slug %s." % (username, course_handle, slug))
                # If instructors ask for a report for a quiz that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    quiz = Video.objects.get(course=ready_course, slug=slug)
                except Video.DoesNotExist:
                    quiz = Video.objects.get(course=ready_course.image, slug=slug)
                    
                report = gen_quiz_full_report(ready_course, quiz, save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info("Video full report for course %s video %s generated successfully for user %s." % (course_handle, slug, username))
                else:
                    logger.info("Failed to generate video full report for course %s video %s for user %s." % (course_handle, slug, username))
                    
        elif rr['type'] == 'video_summary':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info("Missing slug -- Failed to generate video report")
            else:
                slug = rr['slug']
                logger.info("User %s requested to generate video summary report for course %s video slug %s." % (username, course_handle, slug))
                # If instructors ask for a report for a quiz that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    quiz = Video.objects.get(course=ready_course, slug=slug)
                except Video.DoesNotExist:
                    quiz = Video.objects.get(course=ready_course.image, slug=slug)
                    
                report = gen_quiz_summary_report(ready_course, quiz, save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info("Video summary report for course %s video %s generated successfully for user %s." % (course_handle, slug, username))
                else:
                    logger.info("Failed to generate video summary report for course %s video %s for user %s." % (course_handle, slug, username))
                    
        elif rr['type'] == 'class_roster':
            logger.info("User %s requested to generate class roster for course %s." % (username, course_handle))
            report = gen_class_roster(ready_course, save_to_s3=True)
            report['type'] = rr['type']
            if report:
                reports.append(report)
                logger.info("Class roster for course %s generated successfully for user %s." % (course_handle, username))
            else:
                logger.info("Failed to generate class roster for course %s for user %s." % (course_handle, username))
                    
        elif rr['type'] == 'course_assessments':
            logger.info("User %s requested to generate course assessments report for course %s." % (username, course_handle))
            report = gen_course_assessments_report(ready_course, save_to_s3=True)
            report['type'] = rr['type']
            if report:
                reports.append(report)
                logger.info("Course assessments report for course %s generated successfully for user %s." % (course_handle, username))
            else:
                logger.info("Failed to generate course assessments report for course %s for user %s." % (course_handle, username))
                
        elif rr['type'] == 'assessment_full':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info("Missing slug -- Failed to generate assessment full report")
            else:
                slug = rr['slug']
                logger.info("User %s requested to generate assessment full report for course %s assessment slug %s." % (username, course_handle, slug))
                
                # If instructors ask for a report for an exam that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    exam = Exam.objects.get(course=ready_course, slug=slug)
                except Exam.DoesNotExist:
                    exam = Exam.objects.get(course=ready_course.image, slug=slug)
                    
                report = gen_assessment_full_report(ready_course, exam, save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info("Assessment full report for course %s assessment %s generated successfully for user %s." % (course_handle, slug, username))
                else:
                    logger.info("Failed to generate assessment full report for course %s assessment %s for user %s." % (course_handle, slug, username))
                    
        elif rr['type'] == 'assessment_summary':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info("Missing slug -- Failed to generate assessment summary report")
            else:
                slug = rr['slug']
                logger.info("User %s requested to generate assessment summary report for course %s assessment slug %s." % (username, course_handle, slug))
                
                # If instructors ask for a report for a quiz that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    exam = Exam.objects.get(course=ready_course, slug=slug)
                except Exam.DoesNotExist:
                    exam = Exam.objects.get(course=ready_course.image, slug=slug)
                    
                report = gen_assessment_summary_report(ready_course, exam, save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info("Assessment summary report for course %s assessment %s generated successfully for user %s." % (course_handle, slug, username))
                else:
                    logger.info("Failed to generate assessment summary report for course %s assessment %s for user %s." % (course_handle, slug, username))
                            

        elif rr['type'] == 'survey_summary':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info("Missing slug -- Failed to generate survey summary report")
            else:
                slug = rr['slug']
                logger.info("User %s requested to generate survey summary report for course %s survey slug %s." % (username, course_handle, slug))
                
                # If instructors ask for a report for a survey that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    survey = Exam.objects.get(course=ready_course, slug=slug)
                except Exam.DoesNotExist:
                    survey = Exam.objects.get(course=ready_course.image, slug=slug)
                    
                report = gen_survey_summary_report(ready_course, survey, save_to_s3=True)
                report['type'] = rr['type']
                
                reports.append(report)
                logger.info("Survey summary report for course %s assessment %s generated successfully for user %s." % (course_handle, slug, username))
            
            
        elif rr['type'] == 'assessment_student_scores':
            logger.info("User %s requested to generate assessment student scores report for course %s." % (username, course_handle))
            report = gen_assessment_student_scores_report(ready_course, save_to_s3=True)
            report['type'] = rr['type']
            
            reports.append(report)
            logger.info("Assessment student scores report for course %s generated successfully for user %s." % (course_handle, username))            
            
    send_emails = getattr(settings, 'EMAIL_NIGHTLY_REPORTS', False)
    if send_emails:
        # Email Generated Reports
        staff_email = ready_course.contact
        if not staff_email:
            logger.info("Failed to email reports for course %s -- Missing course contact email" % (course_handle))
        else:
            if len(reports) == 0:
                logger.info("Not sending reports email to %s, because no reports were generated." % staff_email)
                return
                
            email = EmailMessage(
                email_title,             # Title
                email_message,           # Message
                settings.SERVER_EMAIL,   # From
                [staff_email, ],         # To
            )
            if attach_reports_to_email:
                for report in reports:
                    if report['type'] in ['problemset_summary', 'video_summary']:
                        report_name = report['name'][:-4] + '_summary.csv'
                    else:
                        report_name = report['name']
                        
                    email.attach(report_name, report['content'], 'text/csv')
                
            email.send()
Esempio n. 4
0
def generate_and_email_reports(username,
                               course_handle,
                               requested_reports,
                               email_title,
                               email_message,
                               attach_reports_to_email=True):
    # Generates the list of reports in requested_reports, and sends it to the staff of the given course.
    ready_course = Course.objects.get(handle=course_handle, mode='ready')

    # Generate requested reports
    reports = []
    for rr in requested_reports:
        if rr['type'] == 'dashboard':
            logger.info(
                "User %s requested to generate dashboard report for course %s."
                % (username, course_handle))
            report = gen_course_dashboard_report(ready_course, save_to_s3=True)
            report['type'] = rr['type']
            if report:
                reports.append(report)
                logger.info(
                    "Dashboard report for course %s generated successfully for user %s."
                    % (course_handle, username))
            else:
                logger.info(
                    "Failed to generate dashboard report for course %s for user %s."
                    % (course_handle, username))

        elif rr['type'] == 'course_quizzes':
            logger.info(
                "User %s requested to generate course quizzes report for course %s."
                % (username, course_handle))
            report = gen_course_quizzes_report(ready_course, save_to_s3=True)
            report['type'] = rr['type']
            if report:
                reports.append(report)
                logger.info(
                    "Course quizzes report for course %s generated successfully for user %s."
                    % (course_handle, username))
            else:
                logger.info(
                    "Failed to generate course quizzes report for course %s for user %s."
                    % (course_handle, username))

        elif rr['type'] == 'problemset_full':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info(
                    "Missing slug -- Failed to generate problem set full report"
                )
            else:
                slug = rr['slug']
                logger.info(
                    "User %s requested to generate problemset full report for course %s problemset slug %s."
                    % (username, course_handle, slug))

                # If instructors ask for a report for a quiz that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    quiz = ProblemSet.objects.get(course=ready_course,
                                                  slug=slug)
                except ProblemSet.DoesNotExist:
                    quiz = ProblemSet.objects.get(course=ready_course.image,
                                                  slug=slug)

                report = gen_quiz_full_report(ready_course,
                                              quiz,
                                              save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info(
                        "Problemset full report for course %s problemset %s generated successfully for user %s."
                        % (course_handle, slug, username))
                else:
                    logger.info(
                        "Failed to generate problemset full report for course %s problemset %s for user %s."
                        % (course_handle, slug, username))

        elif rr['type'] == 'problemset_summary':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info(
                    "Missing slug -- Failed to generate problem set summary report"
                )
            else:
                slug = rr['slug']
                logger.info(
                    "User %s requested to generate problemset summary report for course %s problemset slug %s."
                    % (username, course_handle, slug))

                # If instructors ask for a report for a quiz that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    quiz = ProblemSet.objects.get(course=ready_course,
                                                  slug=slug)
                except ProblemSet.DoesNotExist:
                    quiz = ProblemSet.objects.get(course=ready_course.image,
                                                  slug=slug)

                report = gen_quiz_summary_report(ready_course,
                                                 quiz,
                                                 save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info(
                        "Problemset summary report for course %s problemset %s generated successfully for user %s."
                        % (course_handle, slug, username))
                else:
                    logger.info(
                        "Failed to generate problemset summary report for course %s problemset %s for user %s."
                        % (course_handle, slug, username))

        elif rr['type'] == 'video_full':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info(
                    "Missing slug -- Failed to generate video full report")
            else:
                slug = rr['slug']
                logger.info(
                    "User %s requested to generate video full report for course %s video slug %s."
                    % (username, course_handle, slug))
                # If instructors ask for a report for a quiz that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    quiz = Video.objects.get(course=ready_course, slug=slug)
                except Video.DoesNotExist:
                    quiz = Video.objects.get(course=ready_course.image,
                                             slug=slug)

                report = gen_quiz_full_report(ready_course,
                                              quiz,
                                              save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info(
                        "Video full report for course %s video %s generated successfully for user %s."
                        % (course_handle, slug, username))
                else:
                    logger.info(
                        "Failed to generate video full report for course %s video %s for user %s."
                        % (course_handle, slug, username))

        elif rr['type'] == 'video_summary':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info("Missing slug -- Failed to generate video report")
            else:
                slug = rr['slug']
                logger.info(
                    "User %s requested to generate video summary report for course %s video slug %s."
                    % (username, course_handle, slug))
                # If instructors ask for a report for a quiz that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    quiz = Video.objects.get(course=ready_course, slug=slug)
                except Video.DoesNotExist:
                    quiz = Video.objects.get(course=ready_course.image,
                                             slug=slug)

                report = gen_quiz_summary_report(ready_course,
                                                 quiz,
                                                 save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info(
                        "Video summary report for course %s video %s generated successfully for user %s."
                        % (course_handle, slug, username))
                else:
                    logger.info(
                        "Failed to generate video summary report for course %s video %s for user %s."
                        % (course_handle, slug, username))

        elif rr['type'] == 'class_roster':
            logger.info(
                "User %s requested to generate class roster for course %s." %
                (username, course_handle))
            report = gen_class_roster(ready_course, save_to_s3=True)
            report['type'] = rr['type']
            if report:
                reports.append(report)
                logger.info(
                    "Class roster for course %s generated successfully for user %s."
                    % (course_handle, username))
            else:
                logger.info(
                    "Failed to generate class roster for course %s for user %s."
                    % (course_handle, username))

    # Email Generated Reports
    staff_email = ready_course.contact
    if not staff_email:
        logger.info(
            "Failed to email reports for course %s -- Missing course contact email"
            % (course_handle))
    else:
        if len(reports) == 0:
            logger.info(
                "Not sending reports email to %s, because no reports were generated."
                % staff_email)
            return

        email = EmailMessage(
            email_title,  # Title
            email_message,  # Message
            SERVER_EMAIL,  # From
            [
                staff_email,
            ],  # To
        )
        if attach_reports_to_email:
            for report in reports:
                if report['type'] in ['problemset_summary', 'video_summary']:
                    report_name = report['name'][:-4] + '_summary.csv'
                else:
                    report_name = report['name']

                email.attach(report_name, report['content'], 'text/csv')

        email.send()
Esempio n. 5
0
from django.core.management.base import BaseCommand, CommandError
from django.core.management.base import BaseCommand, CommandError
from c2g.models import *
from django.contrib.auth.models import User,Group
from django.db import connection, transaction
from datetime import datetime, timedelta
from courses.reports.generation.gen_course_dashboard_report import *
from courses.reports.generation.gen_quiz_summary_report import *
from courses.reports.generation.gen_quiz_full_report import *

class Command(BaseCommand):
    help = "Test generate one instance of every possible report for a single course (if arg supplied), or all courses\n"
    
    def handle(self, *args, **options):
        save_to_s3 = True
        
        if len(args) == 0:
            now = datetime.now()
            courses = Course.objects.filter(mode='ready', calendar_end__gt=now)
        else:    
            try:
                courses = [Course.objects.get(handle= args[0], mode='ready')]
            except Course.DoesNotExist:
                print "Failed to find course with given handle"
                return
        for ready_course in courses:
            # Generate course dashboard report
            report = gen_course_dashboard_report(ready_course, save_to_s3)
            if save_to_s3:
                if report['path']: print "Report successfully written to: %s" % report['path']
                else: print "Failed to generate report or write it to S3!"
Esempio n. 7
0
def generate_and_email_reports(username, course_handle, requested_reports, email_title, email_message):
    # Generates the list of reports in requested_reports, and sends it to the staff of the given course.
    ready_course = Course.objects.get(handle=course_handle, mode='ready')
    
    # Generate requested reports
    reports = []
    for rr in requested_reports:
        if rr['type'] == 'dashboard':
            logger.info("User %s requested to generate dashboard report for course %s." % (username, course_handle))
            report = gen_course_dashboard_report(ready_course, save_to_s3=True)
            report['type'] = rr['type']
            if report:
                reports.append(report)
                logger.info("Dashboard report for course %s generated successfully for user %s." % (course_handle, username))
            else:
                logger.info("Failed to generate dashboard report for course %s for user %s." % (course_handle, username))
            
        elif rr['type'] == 'course_quizzes':
            logger.info("User %s requested to generate course quizzes report for course %s." % (username, course_handle))
            report = gen_course_quizzes_report(ready_course, save_to_s3=True)
            report['type'] = rr['type']
            if report:
                reports.append(report)
                logger.info("Course quizzes report for course %s generated successfully for user %s." % (course_handle, username))
            else:
                logger.info("Failed to generate course quizzes report for course %s for user %s." % (course_handle, username))
                
        elif rr['type'] == 'problemset_full':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info("Missing slug -- Failed to generate problem set full report")
            else:
                slug = rr['slug']
                logger.info("User %s requested to generate problemset full report for course %s problemset slug %s." % (username, course_handle, slug))
                
                # If instructors ask for a report for a quiz that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    quiz = ProblemSet.objects.get(course=ready_course, slug=slug)
                except ProblemSet.DoesNotExist:
                    quiz = ProblemSet.objects.get(course=ready_course.image, slug=slug)
                    
                report = gen_quiz_full_report(ready_course, quiz, save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info("Problemset full report for course %s problemset %s generated successfully for user %s." % (course_handle, slug, username))
                else:
                    logger.info("Failed to generate problemset full report for course %s problemset %s for user %s." % (course_handle, slug, username))
                    
        elif rr['type'] == 'problemset_summary':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info("Missing slug -- Failed to generate problem set summary report")
            else:
                slug = rr['slug']
                logger.info("User %s requested to generate problemset summary report for course %s problemset slug %s." % (username, course_handle, slug))
                
                # If instructors ask for a report for a quiz that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    quiz = ProblemSet.objects.get(course=ready_course, slug=slug)
                except ProblemSet.DoesNotExist:
                    quiz = ProblemSet.objects.get(course=ready_course.image, slug=slug)
                    
                report = gen_quiz_summary_report(ready_course, quiz, save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info("Problemset summary report for course %s problemset %s generated successfully for user %s." % (course_handle, slug, username))
                else:
                    logger.info("Failed to generate problemset summary report for course %s problemset %s for user %s." % (course_handle, slug, username))
            
        elif rr['type'] == 'video_full':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info("Missing slug -- Failed to generate video full report")
            else:
                slug = rr['slug']
                logger.info("User %s requested to generate video full report for course %s video slug %s." % (username, course_handle, slug))
                # If instructors ask for a report for a quiz that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    quiz = Video.objects.get(course=ready_course, slug=slug)
                except Video.DoesNotExist:
                    quiz = Video.objects.get(course=ready_course.image, slug=slug)
                    
                report = gen_quiz_full_report(ready_course, quiz, save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info("Video full report for course %s video %s generated successfully for user %s." % (course_handle, slug, username))
                else:
                    logger.info("Failed to generate video full report for course %s video %s for user %s." % (course_handle, slug, username))
                    
        elif rr['type'] == 'video_summary':
            if (not 'slug' in rr) or (not rr['slug']):
                logger.info("Missing slug -- Failed to generate video report")
            else:
                slug = rr['slug']
                logger.info("User %s requested to generate video summary report for course %s video slug %s." % (username, course_handle, slug))
                # If instructors ask for a report for a quiz that doesn't have a live instance, pass the draft instance instead. The report generators will handle this special case
                try:
                    quiz = Video.objects.get(course=ready_course, slug=slug)
                except Video.DoesNotExist:
                    quiz = Video.objects.get(course=ready_course.image, slug=slug)
                    
                report = gen_quiz_summary_report(ready_course, quiz, save_to_s3=True)
                report['type'] = rr['type']
                if report:
                    reports.append(report)
                    logger.info("Video summary report for course %s video %s generated successfully for user %s." % (course_handle, slug, username))
                else:
                    logger.info("Failed to generate video summary report for course %s video %s for user %s." % (course_handle, slug, username))
                    
        elif rr['type'] == 'class_roster':
            logger.info("User %s requested to generate class roster for course %s." % (username, course_handle))
            report = gen_class_roster(ready_course, save_to_s3=True)
            report['type'] = rr['type']
            if report:
                reports.append(report)
                logger.info("Class roster for course %s generated successfully for user %s." % (course_handle, username))
            else:
                logger.info("Failed to generate class roster for course %s for user %s." % (course_handle, username))
                    
            
    # Email Generated Reports
    staff_email = ready_course.contact
    if not staff_email:
        logger.info("Failed to email reports for course %s -- Missing course contact email" % (course_handle))
    else:
        if len(reports) == 0:
            logger.info("Not sending reports email to %s, because no reports were generated." % staff_email)
            return
            
        email = EmailMessage(
            email_title, # Title
            email_message, # Message
            SERVER_EMAIL, # From
            [staff_email, '*****@*****.**'], # To
        )
        for report in reports:
            if report['type'] in ['problemset_summary', 'video_summary']:
                report_name = report['name'][:-4] + '_summary.csv'
            else:
                report_name = report['name']
                
            email.attach(report_name, report['content'], 'text/csv')
            
        email.send()