def do_import_adjustment_time(task, csv_lines, request):
    gevent.sleep(0)

    count_success = 0
    rts = record_time_store()
    for i, line in enumerate(csv_lines):
        tasklog = ImportTaskLog()
        tasklog.create_date = datetime.now(UTC)
        tasklog.line = i + 1
        tasklog.task = task
        tasklog.import_data = line
        try:
            task.process_lines = i + 1
            validate_adjustment_time_cvs_line(line, tasklog)
            email = line[ADJUSTMENT_TIME_CSV_COLS.index('email')]
            adjustment_time = int(line[ADJUSTMENT_TIME_CSV_COLS.index('time')]) * 60
            adjustment_type = line[ADJUSTMENT_TIME_CSV_COLS.index('type')]
            course_number = line[ADJUSTMENT_TIME_CSV_COLS.index('course_number')]
            try:
                comments = line[ADJUSTMENT_TIME_CSV_COLS.index('comments')]
            except:
                comments = ''
            user_id = str(User.objects.get(email=email).id)
            course_id = str(get_course_id(course_number))
            success = validate_adjustment_time(rts, user_id, adjustment_type, adjustment_time, course_id)
            if success:
                rts.set_adjustment_time(user_id, adjustment_type, adjustment_time, course_id)
                save_adjustment_log(request, user_id, adjustment_type, adjustment_time, course_number, comments)
            tasklog.error = 'ok'
        except Exception as e:
            tasklog.error = "%s" % e
            log.debug("import error %s" % e)
        finally:
            count_success += 1
            task.success_lines = count_success
            task.update_time = datetime.now(UTC)
            task.save()
            tasklog.save()

    tasklogs = ImportTaskLog.objects.filter(task=task).exclude(error='ok')
    if len(tasklogs):
        FIELDS = ["line", "username", "import_data", "create_date", "error"]
        TITLES = ["Line", "Useremail", "Import Data", "Create Date", "Error"]
        output = StringIO()
        writer = csv.DictWriter(output, fieldnames=FIELDS)
        writer.writerow(dict(zip(FIELDS, TITLES)))
        for d in tasklogs:
            row = {"line": d.line,
                   "username": d.username,
                   "import_data": d.import_data,
                   "create_date": d.create_date,
                   "error": d.error
                   }
            writer.writerow(row)
        output.seek(0)
        attach = [{'filename': 'log.csv', 'mimetype': 'text/csv', 'data': output.read()}]
        send_html_mail("Adjustment Time Import Report",
                       "Report of importing %s, see attachment." % task.filename,
                       settings.SUPPORT_EMAIL, [request.user.email], attach)
        output.close()
def save_adjustment_time(request):
    rts = record_time_store()
    adjustment_type = request.POST.get('type')
    adjustment_time = request.POST.get('time')
    course_id = request.POST.get('course_id')
    user_id = str(request.POST.get('user_id'))
    comments = request.POST.get('comments', None)
    success = validate_adjustment_time(rts, user_id, adjustment_type, adjustment_time, course_id)
    if success:
        rts.set_adjustment_time(user_id, adjustment_type, adjustment_time, course_id)
        save_adjustment_log(request, user_id, adjustment_type, adjustment_time, course_id, comments)
    return HttpResponse(json.dumps({'success': success}), content_type="application/json")
def load_single_user_time(request):
    user = User.objects.get(id=request.POST.get('user_id'))
    row = {}
    rts = record_time_store()
    external_time = 0
    all_external_time = 0
    user_id = str(user.id)
    course_id = str(request.POST.get('course_id', None))
    if course_id:
        for enrollment in CourseEnrollment.enrollments_for_user(user):
            try:
                course = course_from_id(enrollment.course_id)
                all_external_time += rts.get_external_time(user_id, course.id)
            except ItemNotFoundError:
                #log.error("User {0} enrolled in non-existent course {1}".format(p.user.username, enrollment.course_id))
                pass
        all_course_time, all_discussion_time, portfolio_time = rts.get_stats_time(user_id)
        adjustment_time_totle = rts.get_adjustment_time(user_id, 'total', None)
        external_time = rts.get_external_time(user_id, course_id)
        course_time = rts.get_course_time(user_id, course_id, 'courseware')
        discussion_time = rts.get_course_time(user_id, course_id, 'discussion')
        collaboration_time = all_discussion_time + portfolio_time
        all_course_time = all_course_time + all_external_time
        total_time = all_course_time + collaboration_time + adjustment_time_totle
    else:
        for enrollment in CourseEnrollment.enrollments_for_user(user):
            try:
                course = course_from_id(enrollment.course_id)
                external_time += rts.get_external_time(user_id, course.id)
            except ItemNotFoundError:
                #log.error("User {0} enrolled in non-existent course {1}".format(p.user.username, enrollment.course_id))
                pass
        adjustment_time_totle = rts.get_adjustment_time(user_id, 'total', None)
        course_time, discussion_time, portfolio_time = rts.get_stats_time(user_id)
        all_course_time = course_time + external_time
        collaboration_time = discussion_time + portfolio_time
        total_time = all_course_time + collaboration_time + adjustment_time_totle

    row = {"id": user_id,
           "total_time": study_time_format(total_time, True),
           "collaboration_time": study_time_format(collaboration_time, True),
           "discussion_time": study_time_format(discussion_time, True),
           "portfolio_time": study_time_format(portfolio_time, True),
           "external_time": study_time_format(external_time, True),
           "course_time": study_time_format(course_time, True)
           }

    return HttpResponse(json.dumps({'row': row}), content_type="application/json")
def get_allcoursetime(user_id, course_id):
    user = User.objects.get(id=str(user_id))

    course_time = 0
    external_time = 0
    rts = record_time_store()
    all_course_time = 0
    all_course_time_unit = ""

    try:
        c = course_from_id(course_id)
        external_time = rts.get_external_time(str(user.id), c.id)
    except ItemNotFoundError:
        log.error("User {0} enrolled in non-existent course {1}"
                    .format(user.username, course_id))
    
    course_time = rts.get_course_time(str(user.id), course_id, 'courseware')
    all_course_time = course_time + external_time
    all_course_time_unit = recorded_time_format(all_course_time)
    
    return all_course_time_unit
def time_report_download_excel(request):
    import xlsxwriter
    output = StringIO()
    workbook = xlsxwriter.Workbook(output, {'in_memory': True})
    worksheet = workbook.add_worksheet()
    FIELDS = ["user_first_name", "user_last_name", "user_email", "district", "school", "total_time", "collaboration_time",
              "discussion_time", "portfolio_time", "external_time", "course_time", "complete_course_num", "current_course_num"]

    TITLES = ["First Name", "Last Name", "Email", "District", "School", "Total Time", "Collaboration Time",
              "Discussion Time", "Portfolio Time", "External Time", "Course Units Time", "Completed Course", "Current Courses"]
    for i, k in enumerate(TITLES):
        worksheet.write(0, i, k)
    row = 1
    rts = record_time_store()
    results = rts.get_time_report_result(str(request.user.id))
    for p in results:
        for i, k in enumerate(FIELDS):
            worksheet.write(row, i, p[k])
        row += 1
    response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    response['Content-Disposition'] = datetime.now().strftime('attachment; filename=users-time-report-%Y-%m-%d-%H-%M-%S.xlsx')
    workbook.close()
    response.write(output.getvalue())
    return response
def load_adjustment_time(request):
    rts = record_time_store()
    user_id = str(request.POST.get('user_id'))
    adjustment_time = rts.get_adjustment_time(user_id, request.POST.get('type'), request.POST.get('course_id'))
    return HttpResponse(json.dumps({'time': study_time_format(adjustment_time, True)}), content_type="application/json")
def get_time_table_result(request):
    rts = record_time_store()
    rows = rts.get_time_report_result(str(request.user.id))
    return HttpResponse(json.dumps({'rows': rows}), content_type="application/json")
def do_get_report_data(task, data, request, course_id=None):
    gevent.sleep(0)
    count_success = 0
    rows = []
    rts = record_time_store()
    for i, p in enumerate(data):
        try:
            external_time = 0
            all_external_time = 0
            complete_course_num = 0
            current_course_num = 0
            user_id = str(p.user.id)
            if course_id:
                for enrollment in CourseEnrollment.enrollments_for_user(p.user):
                    try:
                        course = course_from_id(enrollment.course_id)
                        all_external_time += rts.get_external_time(user_id, course.id)
                        field_data_cache = FieldDataCache([course], course.id, p.user)
                        course_instance = get_module(p.user, request, course.location, field_data_cache, course.id, grade_bucket_type='ajax')

                        if course_instance.complete_course:
                            complete_course_num += 1
                        else:
                            current_course_num += 1
                    except ItemNotFoundError:
                        #log.error("User {0} enrolled in non-existent course {1}".format(p.user.username, enrollment.course_id))
                        pass
                all_course_time, all_discussion_time, portfolio_time = rts.get_stats_time(user_id)
                external_time = rts.get_external_time(user_id, course_id)
                course_time = rts.get_course_time(user_id, course_id, 'courseware')
                discussion_time = rts.get_course_time(user_id, course_id, 'discussion')
                collaboration_time = all_discussion_time + portfolio_time
                all_course_time = all_course_time + all_external_time
                
                #@begin:add pd_time in time_report
                #@date:2016-06-03
                pd_time = 0;
                pd_time_tmp = PepRegStudent.objects.values('student_id').annotate(credit_sum=Sum('student_credit')).filter(student_id=user_id)
                if pd_time_tmp:
                    pd_time = pd_time_tmp[0]['credit_sum'] * 3600
                total_time = all_course_time + collaboration_time + rts.get_adjustment_time(user_id, 'total') + pd_time
                #total_time = all_course_time + collaboration_time + rts.get_adjustment_time(user_id, 'total')
                #@end
            else:
                for enrollment in CourseEnrollment.enrollments_for_user(p.user):
                    try:
                        course = course_from_id(enrollment.course_id)
                        external_time += rts.get_external_time(user_id, course.id)
                        field_data_cache = FieldDataCache([course], course.id, p.user)
                        course_instance = get_module(p.user, request, course.location, field_data_cache, course.id, grade_bucket_type='ajax')

                        if course_instance.complete_course:
                            complete_course_num += 1
                        else:
                            current_course_num += 1
                    except ItemNotFoundError:
                        #log.error("User {0} enrolled in non-existent course {1}".format(p.user.username, enrollment.course_id))
                        pass
                course_time, discussion_time, portfolio_time = rts.get_stats_time(user_id)
                all_course_time = course_time + external_time
                collaboration_time = discussion_time + portfolio_time
                
                #@begin:add pd_time in time_report
                #@date:2016-06-03
                pd_time = 0;
                pd_time_tmp = PepRegStudent.objects.values('student_id').annotate(credit_sum=Sum('student_credit')).filter(student_id=user_id)
                if pd_time_tmp:
                    pd_time = pd_time_tmp[0]['credit_sum'] * 3600
                total_time = all_course_time + collaboration_time + rts.get_adjustment_time(user_id, 'total') + pd_time
                #total_time = all_course_time + collaboration_time + rts.get_adjustment_time(user_id, 'total')
                #@end

            rows.append({'id': p.user.id,
                         'user_first_name': p.user.first_name,
                         'user_last_name': p.user.last_name,
                         'user_email': p.user.email,
                         'district': attstr(p, "district.name"),
                         'school': attstr(p, "school.name"),
                         "total_time": study_time_format(total_time, True),
                         "collaboration_time": study_time_format(collaboration_time, True),
                         "discussion_time": study_time_format(discussion_time, True),
                         "portfolio_time": study_time_format(portfolio_time, True),
                         "pd_time": study_time_format(pd_time, True), #2016-06-03 add pd_time in time_report
                         "external_time": study_time_format(external_time, True),
                         "course_time": study_time_format(course_time, True),
                         "complete_course_num": complete_course_num,
                         "current_course_num": current_course_num
                         })
            task.process_num = i + 1
        except Exception as e:
            db.transaction.rollback()
        finally:
            count_success += 1
            task.success_num = count_success
            task.update_time = datetime.now(UTC)
            task.save()
    rts.set_time_report_result(str(request.user.id), rows)
    task.task_read = True
    task.save()
    db.transaction.commit()