Commit 1981ee50 by Julia Hansbrough

Fixed CertificateStatusReportModel

parent d3277c99
...@@ -10,6 +10,7 @@ from boto.exception import BotoServerError # this is a super-class of SESError ...@@ -10,6 +10,7 @@ from boto.exception import BotoServerError # this is a super-class of SESError
from django.dispatch import receiver from django.dispatch import receiver
from django.db import models from django.db import models
from django.db.models import Sum
from django.conf import settings from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.mail import send_mail from django.core.mail import send_mail
...@@ -18,6 +19,8 @@ from django.utils.translation import ugettext as _ ...@@ -18,6 +19,8 @@ from django.utils.translation import ugettext as _
from django.db import transaction from django.db import transaction
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from decimal import Decimal
from xmodule.modulestore.django import modulestore from xmodule.modulestore.django import modulestore
from xmodule.course_module import CourseDescriptor from xmodule.course_module import CourseDescriptor
from xmodule.modulestore.exceptions import ItemNotFoundError from xmodule.modulestore.exceptions import ItemNotFoundError
...@@ -671,22 +674,27 @@ class ItemizedPurchaseReport(Report): ...@@ -671,22 +674,27 @@ class ItemizedPurchaseReport(Report):
class CertificateStatusReport(Report): class CertificateStatusReport(Report):
def get_query(self, start_date, send_date): def get_query(self, start_date, send_date):
results = [] results = []
for course_id in settings.COURSE_LISTINGS: for course_id in settings.COURSE_LISTINGS['default']:
cur_course = get_course_by_id(course) cur_course = get_course_by_id(course_id)
university = cur_course.org university = cur_course.org
course = cur_course.number + " " + course.display_name #TODO add term (i.e. Fall 2013)? course = cur_course.number + " " + cur_course.display_name #TODO add term (i.e. Fall 2013)?
enrollments = CourseEnrollment.objects.filter(course_id=course_id) enrollments = CourseEnrollment.objects.filter(course_id=course_id)
total_enrolled = enrollments.objects.count() total_enrolled = enrollments.count()
audit_enrolled = enrollments.objects.filter(mode="audit").count() audit_enrolled = enrollments.filter(mode="audit").count()
honor_enrolled = enrollments.objects.filter(mode="honor").count() honor_enrolled = enrollments.filter(mode="honor").count()
verified_enrollments = enrollments.objects.filter(mode="verified") verified_enrollments = enrollments.filter(mode="verified")
verified_enrolled = verified_enrollments.objects.count() verified_enrolled = verified_enrollments.count()
gross_rev = CertificateItem.objects.filter(course_id=course_id, mode="verified").aggregate(Sum('unit_cost')) gross_rev_temp = CertificateItem.objects.filter(course_id=course_id, mode="verified").aggregate(Sum('unit_cost'))
gross_rev_over_min = gross_rev - (CourseMode.objects.get('course_id').min_price * verified_enrollments) gross_rev = gross_rev_temp['unit_cost__sum']
gross_rev_over_min = gross_rev - (CourseMode.objects.get(course_id=course_id,mode_slug="verified").min_price * verified_enrolled)
num_verified_over_min = 0 # TODO clarify with billing what exactly this means num_verified_over_min = 0 # TODO clarify with billing what exactly this means
refunded_enrollments = CertificateItem.objects.filter(course_id='course_id', mode="refunded") refunded_enrollments = CertificateItem.objects.filter(course_id='course_id', mode="refunded")
number_of_refunds = refunded_enrollments.objects.count() number_of_refunds = refunded_enrollments.count()
dollars_refunded = refunded_enrollments.objects.aggregate(Sum('unit_cost')) dollars_refunded_temp = refunded_enrollments.aggregate(Sum('unit_cost'))
if dollars_refunded_temp['unit_cost__sum'] is None:
dollars_refunded = Decimal(0.00)
else:
dollars_refunded = dollars_refunded_temp['unit_cost__sum']
result = [ result = [
university, university,
...@@ -727,8 +735,8 @@ class CertificateStatusReport(Report): ...@@ -727,8 +735,8 @@ class CertificateStatusReport(Report):
class UniversityRevenueShareReport(Report): class UniversityRevenueShareReport(Report):
def get_query(self, start_date, end_date): def get_query(self, start_date, end_date):
results = [] results = []
for course_id in settings.COURSE_LISTINGS: for course_id in settings.COURSE_LISTINGS['default']:
cur_course = get_course_by_id(course) cur_course = get_course_by_id(course_id)
university = cur_course.org university = cur_course.org
course = cur_course.number + " " + course.display_name course = cur_course.number + " " + course.display_name
num_transactions = 0 # TODO clarify with building what transactions are included in this (purchases? refunds? etc) num_transactions = 0 # TODO clarify with building what transactions are included in this (purchases? refunds? etc)
......
...@@ -490,11 +490,41 @@ class CertificateStatusReportTest(ModuleStoreTestCase): ...@@ -490,11 +490,41 @@ class CertificateStatusReportTest(ModuleStoreTestCase):
FIVE_MINS = datetime.timedelta(minutes=5) FIVE_MINS = datetime.timedelta(minutes=5)
def setUp(self): def setUp(self):
self.user = UserFactory.create() # Need to make a *lot* of users for this one
self.user.first_name = "John" self.user1 = UserFactory.create()
self.user.last_name = "Doe" self.user1.first_name = "John"
self.user.save() self.user1.last_name = "Doe"
self.user1.save()
self.user2 = UserFactory.create()
self.user2.first_name = "Jane"
self.user2.last_name = "Deer"
self.user2.save()
self.user3 = UserFactory.create()
self.user3.first_name = "Joe"
self.user3.last_name = "Miller"
self.user3.save()
self.user4 = UserFactory.create()
self.user4.first_name = "Simon"
self.user4.last_name = "Blackquill"
self.user4.save()
self.user5 = UserFactory.create()
self.user5.first_name = "Super"
self.user5.last_name = "Mario"
self.user5.save()
self.user6 = UserFactory.create()
self.user6.first_name = "Princess"
self.user6.last_name = "Peach"
self.user6.save()
# Two are verified, three are audit, one honor
self.course_id = "MITx/999/Robot_Super_Course" self.course_id = "MITx/999/Robot_Super_Course"
settings.COURSE_LISTINGS['default'] = [self.course_id]
self.cost = 40 self.cost = 40
self.course = CourseFactory.create(org='MITx', number='999', display_name=u'Robot Super Course') self.course = CourseFactory.create(org='MITx', number='999', display_name=u'Robot Super Course')
course_mode = CourseMode(course_id=self.course_id, course_mode = CourseMode(course_id=self.course_id,
...@@ -509,12 +539,33 @@ class CertificateStatusReportTest(ModuleStoreTestCase): ...@@ -509,12 +539,33 @@ class CertificateStatusReportTest(ModuleStoreTestCase):
min_price=self.cost) min_price=self.cost)
course_mode2.save() course_mode2.save()
self.cart = Order.get_cart_for_user(self.user) # User 1 & 2 will be verified
CertificateItem.add_to_order(self.cart, self.course_id, self.cost, 'verified') self.cart1 = Order.get_cart_for_user(self.user1)
self.cart.purchase() CertificateItem.add_to_order(self.cart1, self.course_id, self.cost, 'verified')
self.cart1.purchase()
self.cart2 = Order.get_cart_for_user(self.user2)
CertificateItem.add_to_order(self.cart2, self.course_id, self.cost, 'verified')
self.cart2.purchase()
# Users 3, 4, and 5 are audit
CourseEnrollment.get_or_create_enrollment(self.user3, self.course_id).update_enrollment(mode="audit")
CourseEnrollment.get_or_create_enrollment(self.user4, self.course_id).update_enrollment(mode="audit")
CourseEnrollment.get_or_create_enrollment(self.user5, self.course_id).update_enrollment(mode="audit")
# User 6 is honor
CourseEnrollment.get_or_create_enrollment(self.user6, self.course_id).update_enrollment(mode="honor")
self.now = datetime.datetime.now(pytz.UTC) self.now = datetime.datetime.now(pytz.UTC)
# bluh need to test some refunds
test_time = datetime.datetime.now(pytz.UTC)
CORRECT_CSV = dedent("""
University,Course,Total Enrolled,Audit Enrollment,Honor Code Enrollment,Verified Enrollment,Gross Revenue,Gross Revenue over the Minimum,Number of Verified over the Minimum,Number of Refunds,Dollars Refunded
MITx,999 Robot Super Course,6,3,1,2,80.00,0.00,0,0,0
""".format(time_str=str(test_time)))
# TODO finish these tests. This is just a basic test to start with, making sure the regular # TODO finish these tests. This is just a basic test to start with, making sure the regular
# flow doesn't throw any strange errors while running # flow doesn't throw any strange errors while running
def test_basic(self): def test_basic(self):
...@@ -523,7 +574,9 @@ class CertificateStatusReportTest(ModuleStoreTestCase): ...@@ -523,7 +574,9 @@ class CertificateStatusReportTest(ModuleStoreTestCase):
refunded_certs = report.get_query(self.now - self.FIVE_MINS, self.now + self.FIVE_MINS) refunded_certs = report.get_query(self.now - self.FIVE_MINS, self.now + self.FIVE_MINS)
csv_file = StringIO.StringIO() csv_file = StringIO.StringIO()
report.make_report(report_type, csv_file, self.now - self.FIVE_MINS, self.now + self.FIVE_MINS) report.make_report(report_type, csv_file, self.now - self.FIVE_MINS, self.now + self.FIVE_MINS)
# TODO no time restrictions yet csv = csv_file.getvalue()
self.assertEqual(csv.replace('\r\n', '\n').strip(), self.CORRECT_CSV.strip())
# TODO no time restrictions ye
# TODO: finish this test class # TODO: finish this test class
@override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE) @override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment