def download_detail(self, request, **kwargs):
        self.is_authenticated(request)
        self.throttle_check(request)

        pk = kwargs.pop('pk', None)
        module = self._meta.queryset.get(pk=pk)

        file_to_download = module.getAbsPath()
        schedule = module.get_default_schedule()
        has_completed_trackers = Tracker.has_completed_trackers(
            module, request.user)
        cohort = Cohort.member_now(module, request.user)
        if cohort:
            if cohort.schedule:
                schedule = cohort.schedule

        # add scheduling XML file
        if schedule or has_completed_trackers:
            file_to_download = settings.MODULE_UPLOAD_DIR + "temp/" + str(
                request.user.id) + "-" + module.filename
            shutil.copy2(module.getAbsPath(), file_to_download)
            zip = zipfile.ZipFile(file_to_download, 'a')
            if schedule:
                zip.writestr(module.shortname + "/schedule.xml",
                             schedule.to_xml_string())
            if has_completed_trackers:
                zip.writestr(module.shortname + "/tracker.xml",
                             Tracker.to_xml_string(module, request.user))
            zip.close()

        wrapper = FileWrapper(file(file_to_download))
        response = HttpResponse(wrapper, content_type='application/zip')
        response['Content-Length'] = os.path.getsize(file_to_download)
        response['Content-Disposition'] = 'attachment; filename="%s"' % (
            module.filename)

        md = ModuleDownload()
        md.user = request.user
        md.module = module
        md.module_version = module.version
        md.save()

        module_downloaded.send(sender=self, module=module, user=request.user)

        return response
def module_download_callback(sender, **kwargs):
    user = kwargs.get('user')
    module = kwargs.get('module')
    
    # check not superuser
    if user.is_superuser:
        return 
    
    if not module.is_first_download(user):
        return 
    
    p = Points()
    p.points = 50
    p.type = 'moduledownloaded'
    p.description = "Module downloaded: " + module.get_title()
    p.user = user
    p.module = module
    p.cohort = Cohort.student_member_now(module,user)
    p.save()
    return
    def download_detail(self, request, **kwargs):
        self.is_authenticated(request)
        self.throttle_check(request)
        
        pk = kwargs.pop('pk', None)
        module = self._meta.queryset.get(pk = pk)
        
        file_to_download = module.getAbsPath();
        schedule = module.get_default_schedule()
        has_completed_trackers = Tracker.has_completed_trackers(module,request.user)
        cohort = Cohort.member_now(module,request.user)
        if cohort:
            if cohort.schedule:
                schedule = cohort.schedule
        
        # add scheduling XML file     
        if schedule or has_completed_trackers:
            file_to_download = settings.MODULE_UPLOAD_DIR +"temp/"+ str(request.user.id) + "-" + module.filename
            shutil.copy2(module.getAbsPath(), file_to_download)
            zip = zipfile.ZipFile(file_to_download,'a')
            if schedule:
                zip.writestr(module.shortname +"/schedule.xml",schedule.to_xml_string())
            if has_completed_trackers:
                zip.writestr(module.shortname +"/tracker.xml",Tracker.to_xml_string(module,request.user))
            zip.close()

        wrapper = FileWrapper(file(file_to_download))
        response = HttpResponse(wrapper, content_type='application/zip')
        response['Content-Length'] = os.path.getsize(file_to_download)
        response['Content-Disposition'] = 'attachment; filename="%s"' %(module.filename)
        
        md = ModuleDownload()
        md.user = request.user
        md.module = module
        md.module_version = module.version
        md.save()
        
        module_downloaded.send(sender=self, module=module, user=request.user)
        
        return response
 def dehydrate(self, bundle):
     # Include full download url
     if bundle.request.is_secure():
         prefix = 'https://'
     else:
         prefix = 'http://'
     bundle.data['url'] = prefix + bundle.request.META['SERVER_NAME'] + bundle.data['resource_uri'] + 'download/'
     # make sure title is shown as json object (not string representation of one)
     bundle.data['title'] = json.loads(bundle.data['title'])
     
     module = Module.objects.get(pk=bundle.obj.pk)
     schedule = module.get_default_schedule()
     cohort = Cohort.member_now(module,bundle.request.user)
     if cohort:
         if cohort.schedule:
             schedule = cohort.schedule
     if schedule:
         bundle.data['schedule'] = schedule.lastupdated_date.strftime("%Y%m%d%H%M%S")
         sr = ScheduleResource()
         bundle.data['schedule_uri'] = sr.get_resource_uri(schedule)
     
     return bundle
def tracker_callback(sender, **kwargs):
    tracker = kwargs.get('instance')
    
    # check not superuser
    if tracker.user.is_superuser:
        return 
    
    if not tracker.is_first_tracker_today():
        return
    
    if not tracker.activity_exists():
        return
    
    if not tracker.completed:
        return
    
    type = 'activitycompleted'
    points = 10
    if tracker.get_activity_type() == "media":
        description =  "Media played: " + tracker.get_activity_title()
        type = 'mediaplayed'
        points = 20
    else:
        description = "Activity completed: " + tracker.get_activity_title()    
       
    p = Points()
    p.points = points
    p.type = type
    p.description = description
    p.user = tracker.user
    p.module = tracker.module
    p.cohort = Cohort.student_member_now(tracker.module,tracker.user)
    p.save()
    
    # test if tracker submitted on time
    
    return
    def dehydrate(self, bundle):
        # Include full download url
        if bundle.request.is_secure():
            prefix = 'https://'
        else:
            prefix = 'http://'
        bundle.data['url'] = prefix + bundle.request.META[
            'SERVER_NAME'] + bundle.data['resource_uri'] + 'download/'
        # make sure title is shown as json object (not string representation of one)
        bundle.data['title'] = json.loads(bundle.data['title'])

        module = Module.objects.get(pk=bundle.obj.pk)
        schedule = module.get_default_schedule()
        cohort = Cohort.member_now(module, bundle.request.user)
        if cohort:
            if cohort.schedule:
                schedule = cohort.schedule
        if schedule:
            bundle.data['schedule'] = schedule.lastupdated_date.strftime(
                "%Y%m%d%H%M%S")
            sr = ScheduleResource()
            bundle.data['schedule_uri'] = sr.get_resource_uri(schedule)

        return bundle
def quizattempt_callback(sender, **kwargs):
    quiz_attempt = kwargs.get('instance')
    
    # Check user doesn't own the quiz
    quiz = quiz_attempt.quiz
    if quiz.owner == quiz_attempt.user:
        return
    
    # give 5 points to quiz owner
    if quiz_attempt.is_first_attempt_today() and not quiz.owner.is_superuser:
        p = Points()
        p.points = 5
        p.user = quiz.owner
        p.type = 'userquizattempt'
        p.description = quiz_attempt.user.username + " attempted your quiz: " + quiz.title
        p.save() 
     
    # check not superuser
    if quiz_attempt.user.is_superuser:
        return 
    
    # find out if this quiz is part of a module
    module = None
    digest = quiz_attempt.get_quiz_digest()
    if digest is not None:
        # TODO - what are chances of 2 modules having the exact same activity? and what to do if they do?
        acts = Activity.objects.filter(digest=digest)
        for a in acts:
            module = a.section.module
        
    # find out is user is part of the cohort for this module
    cohort = None
    if module is not None:
        cohort = Cohort.student_member_now(module,quiz_attempt.user)
              
    if quiz_attempt.is_first_attempt():
        # If it's the first time they've attempted this quiz award 20 points
        p = Points()
        p.points = 20
        p.type = 'firstattempt'
        p.user = quiz_attempt.user
        p.description = "Bonus points for your first attempt at: " + quiz.title
        p.module = module
        p.cohort = cohort
        p.save()
    
        # add percentage points for their first attempt
        if quiz_attempt.get_score_percent() > 0:
            p = Points()
            p.points = quiz_attempt.get_score_percent()
            p.type = 'firstattemptscore'
            p.description = "Score for first attempt at quiz: " + quiz.title
            p.user = quiz_attempt.user
            p.module = module
            p.cohort = cohort
            p.save()
        
        # if you get 100% on first attempt get bonus of 50 points
        if quiz_attempt.get_score_percent() == 100:
            p = Points()
            p.points = 50
            p.type = 'firstattemptbonus'
            p.description = "Bonus points for getting 100% in first attempt at quiz: " + quiz.title
            p.user = quiz_attempt.user
            p.module = module
            p.cohort = cohort
            p.save()
            
    elif quiz_attempt.is_first_attempt_today():
        # If it's the first time today they've attempted this quiz award 10 points
        p = Points()
        p.points = 10
        p.type = 'quizattempt'
        p.user = quiz_attempt.user
        p.description = "Quiz attempt at: " + quiz.title
        p.module = module
        p.cohort = cohort
        p.save()
    
    return