예제 #1
0
 def handle(self, *args, **options):
   reset_classes_json("management command")
   reset_tools_json("management_command")
   products = products_json(None)
   f = open(os.path.join(settings.STATIC_ROOT,"products.js"),'w')
   f.write(products.content)
   f.close()
예제 #2
0
 def handle(self, *args, **options):
     reset_classes_json("management command")
     reset_tools_json("management_command")
     products = products_json(None)
     f = open(os.path.join(settings.STATIC_ROOT, "products.js"), 'w')
     f.write(products.content)
     f.close()
예제 #3
0
def handle_successful_payment(sender, **kwargs):
    from course.models import Enrollment, Session, reset_classes_json

    # these two errors occurred because of the donate button on the front page.
    # they can be removed by checking for that
    if not sender.txn_type == "cart":
        # handled by membership.listeners
        return
    params = QueryDict(sender.query)
    _uid = str(params.get('custom', None))
    user, new_user = get_or_create_student(params)
    user.active = True
    user.save()
    if params.get('invoice', None):
        return handle_successful_store_payment(sender, user)
    if not "num_cart_items" in params:
        mail_admins("No cart items found for %s" % sender.txn_id, "")
        return
    item_count = int(params['num_cart_items'])

    enrollments = []
    error_sessions = []
    fails = []
    for i in range(1, item_count + 1):
        pp_amount = float(params['mc_gross_%d' % i])
        quantity = int(params['quantity%s' % i])

        try:
            session = Session.objects.get(id=int(params['item_number%d' %
                                                        (i, )]))
        except Session.DoesNotExist:
            fails.append(("Session not found", traceback.format_exc()))
            continue
        except ValueError:
            fails.append(
                ("Non-integer session number", traceback.format_exc()))
            continue

        enrollment, new = Enrollment.objects.get_or_create(user=user,
                                                           session=session)
        if enrollment.transaction_ids and (sender.txn_id
                                           in enrollment.transaction_ids):
            fails.append(
                ("Multiple transaction ids blocked for enrollment #%s" %
                 enrollment.id, ""))
            continue
        enrollment.transaction_ids = (enrollment.transaction_ids
                                      or "") + sender.txn_id + "|"
        NotifyCourse.objects.filter(user=user, course=session.course).delete()
        if new:
            enrollment.quantity = quantity
        else:
            enrollment.quantity += quantity
        enrollment.save()
        enrollments.append(enrollment)
        price_multiplier = (100 - user.level.discount_percentage) / 100.
        # We're ignoring people who overpay since this happens when a member doesn't login (no discount)
        if pp_amount < price_multiplier * session.course.fee * int(quantity):
            l = [
                "PP cost: %s" % pp_amount,
                "Expected Cost: %s" %
                (price_multiplier * session.course.fee * int(quantity)),
                "discount: %s" % user.level.discount_percentage,
                "Session Fee: %s" % session.course.fee,
                "Session Id: %s" % session.id,
                "Quantity: %s" % enrollment.quantity,
                "PP Email: %s" % sender.payer_email,
                "U Email: %s" % user.email,
                "u_id: %s" % _uid,  #if this is none they won't get a discount
            ]
            error_sessions.append("\n".join(l))
        if enrollment.session.total_students > enrollment.session.course.max_students:
            s = "Session #%s overfilled. Please see https://txrxlabs.org/admin/course/session/%s/"
            mail_admins("My Course over floweth",
                        s % (enrollment.session.pk, enrollment.session.pk))

    if fails:
        body = "=======\n\n".join(["%s\n%s\n\n" % (s, b) for s, b in fails])
        mail_admins("%s fails in purchasing process" % len(fails), body)
    values = {
        'enrollments': enrollments,
        'user': user,
        'new_user': new_user,
        'settings': settings
    }
    if enrollments:
        body = render_to_string("email/course_enrollment.html", values)
        subject = "Course enrollment confirmation"
        send_mail(subject, body, settings.DEFAULT_FROM_EMAIL, [user.email])
    if error_sessions:
        mail_admins("Enrollment Error", "\n\n".join(error_sessions))
    reset_classes_json("classes reset during course enrollment")
예제 #4
0
def handle_successful_payment(sender, **kwargs):
  from course.models import Enrollment, Session, reset_classes_json

  # these two errors occurred because of the donate button on the front page.
  # they can be removed by checking for that
  if not sender.txn_type == "cart":
    # handled by membership.listeners
    return
  params = QueryDict(sender.query)
  _uid = str(params.get('custom',None))
  user,new_user = get_or_create_student(params)
  user.active = True
  user.save()
  if params.get('invoice',None):
    return handle_successful_store_payment(sender,user)
  if not "num_cart_items" in params:
    mail_admins("No cart items found for %s"%sender.txn_id,"")
    return
  item_count = int(params['num_cart_items'])

  enrollments = []
  error_sessions = []
  fails = []
  for i in range(1, item_count+1):
    pp_amount = float(params['mc_gross_%d'%i])
    quantity = int(params['quantity%s'%i])

    try:
      session = Session.objects.get(id=int(params['item_number%d' % (i, )]))
    except Session.DoesNotExist:
      fails.append(("Session not found",traceback.format_exc()))
      continue
    except ValueError:
      fails.append(("Non-integer session number",traceback.format_exc()))
      continue

    enrollment,new = Enrollment.objects.get_or_create(user=user, session=session)
    if enrollment.transaction_ids and (sender.txn_id in enrollment.transaction_ids):
      fails.append(("Multiple transaction ids blocked for enrollment #%s"%enrollment.id,""))
      continue
    enrollment.transaction_ids = (enrollment.transaction_ids or "") + sender.txn_id + "|"
    NotifyCourse.objects.filter(user=user,course=session.course).delete()
    if new:
      enrollment.quantity = quantity
    else:
      enrollment.quantity += quantity
    enrollment.save()
    enrollments.append(enrollment)
    price_multiplier = (100-user.level.discount_percentage) / 100.
    # We're ignoring people who overpay since this happens when a member doesn't login (no discount)
    if pp_amount < price_multiplier*session.course.fee * int(quantity):
      l = [
        "PP cost: %s"%pp_amount,
        "Expected Cost: %s"%(price_multiplier*session.course.fee * int(quantity)),
        "discount: %s"%user.level.discount_percentage,
        "Session Fee: %s"%session.course.fee,
        "Session Id: %s"%session.id,
        "Quantity: %s"%enrollment.quantity,
        "PP Email: %s"%sender.payer_email,
        "U Email: %s"%user.email,
        "u_id: %s"%_uid, #if this is none they won't get a discount
      ]
      error_sessions.append("\n".join(l))
    if enrollment.session.total_students > enrollment.session.course.max_students:
      s = "Session #%s overfilled. Please see https://txrxlabs.org/admin/course/session/%s/"
      mail_admins("My Course over floweth",s%(enrollment.session.pk,enrollment.session.pk))

  if fails:
    body = "=======\n\n".join(["%s\n%s\n\n"%(s,b) for s,b in fails])
    mail_admins("%s fails in purchasing process"%len(fails),body)
  values = {
    'enrollments': enrollments,
    'user': user,
    'new_user': new_user,
    'settings': settings
  }
  if enrollments:
    body = render_to_string("email/course_enrollment.html",values)
    subject = "Course enrollment confirmation"
    send_mail(subject,body,settings.DEFAULT_FROM_EMAIL,[user.email])
  if error_sessions:
    mail_admins("Enrollment Error","\n\n".join(error_sessions))
  reset_classes_json("classes reset during course enrollment")
예제 #5
0
 def handle(self, *args, **options):
   reset_classes_json("management command")
   reset_tools_json("management_command")
예제 #6
0
 def handle(self, *args, **options):
     reset_classes_json("management command")
     reset_tools_json("management_command")