Example #1
0
class FacilityDatasetViewSet(ValuesViewset):
    permission_classes = (KolibriAuthPermissions,)
    filter_backends = (KolibriAuthPermissionsFilter,)
    serializer_class = FacilityDatasetSerializer

    values = (
        "id",
        "learner_can_edit_username",
        "learner_can_edit_name",
        "learner_can_edit_password",
        "learner_can_sign_up",
        "learner_can_delete_account",
        "learner_can_login_with_no_password",
        "show_download_button_in_learn",
        "description",
        "location",
        "registered",
        "preset",
    )

    field_map = {"allow_guest_access": lambda x: allow_guest_access()}

    def get_queryset(self):
        queryset = FacilityDataset.objects.filter(
            collection__kind=collection_kinds.FACILITY
        )
        facility_id = self.request.query_params.get("facility_id", None)
        if facility_id is not None:
            queryset = queryset.filter(collection__id=facility_id)
        return queryset
Example #2
0
 def get(self, request):
     """
     Redirects a guest user to a learner accessible page.
     """
     if allow_guest_access():
         return HttpResponseRedirect(get_url_by_role(user_kinds.LEARNER))
     return RootURLRedirectView.as_view()(request)
Example #3
0
class FacilityDatasetViewSet(ValuesViewset):
    permission_classes = (KolibriAuthPermissions,)
    filter_backends = (KolibriAuthPermissionsFilter,)
    serializer_class = FacilityDatasetSerializer

    values = (
        "id",
        "learner_can_edit_username",
        "learner_can_edit_name",
        "learner_can_edit_password",
        "learner_can_sign_up",
        "learner_can_delete_account",
        "learner_can_login_with_no_password",
        "show_download_button_in_learn",
        "description",
        "location",
        "registered",
        "preset",
    )

    field_map = {"allow_guest_access": lambda x: allow_guest_access()}

    def get_queryset(self):
        queryset = FacilityDataset.objects.filter(
            collection__kind=collection_kinds.FACILITY
        )
        facility_id = self.request.query_params.get("facility_id", None)
        if facility_id is not None:
            queryset = queryset.filter(collection__id=facility_id)
        return queryset

    @decorators.action(methods=["post"], detail=True)
    def resetsettings(self, request, pk):
        try:
            dataset = FacilityDataset.objects.get(pk=pk)
            if not request.user.can_update(dataset):
                raise PermissionDenied("You cannot reset this facility's settings")
            dataset.reset_to_default_settings()
            data = FacilityDatasetSerializer(dataset).data
            return Response(data)
        except FacilityDataset.DoesNotExist:
            raise Http404("Facility does not exist")
Example #4
0
def extract_facility_statistics(facility):

    dataset_id = facility.dataset_id

    settings = {
        name: getattr(facility.dataset, name)
        for name in facility_settings if hasattr(facility.dataset, name)
    }

    settings.update(allow_guest_access=allow_guest_access())

    learners = FacilityUser.objects.filter(dataset_id=dataset_id).exclude(
        roles__kind__in=[role_kinds.ADMIN, role_kinds.COACH])
    coaches = FacilityUser.objects.filter(
        dataset_id=dataset_id,
        roles__kind__in=[role_kinds.ADMIN, role_kinds.COACH])

    usersessions = UserSessionLog.objects.filter(dataset_id=dataset_id)
    contsessions = ContentSessionLog.objects.filter(dataset_id=dataset_id,
                                                    time_spent__lt=3600 * 2)

    # the aggregates below are used to calculate the first and most recent times this device was used
    usersess_agg = usersessions.filter(
        start_timestamp__gt=datetime.datetime(2016, 1, 1)).aggregate(
            first=Min("start_timestamp"),
            last=Max("last_interaction_timestamp"))
    contsess_agg = contsessions.filter(
        start_timestamp__gt=datetime.datetime(2016, 1, 1)).aggregate(
            first=Min("start_timestamp"), last=Max("end_timestamp"))

    # extract the first and last times we've seen logs, ignoring any that are None
    first_times = [
        d["first"] for d in [usersess_agg, contsess_agg] if d["first"]
    ]
    last_times = [d["last"] for d in [usersess_agg, contsess_agg] if d["last"]]

    # since newly provisioned devices won't have logs, we don't know whether we have an available datetime object
    first_interaction_timestamp = (getattr(min(first_times), "strftime", None)
                                   if first_times else None)
    last_interaction_timestamp = (getattr(max(last_times), "strftime", None)
                                  if last_times else None)

    sesslogs_by_kind = (contsessions.order_by("kind").values("kind").annotate(
        count=Count("kind")))
    sesslogs_by_kind = {log["kind"]: log["count"] for log in sesslogs_by_kind}

    summarylogs = ContentSummaryLog.objects.filter(dataset_id=dataset_id)

    contsessions_user = contsessions.exclude(user=None)
    contsessions_anon = contsessions.filter(user=None)

    # calculate learner stats
    learner_stats = calculate_demographic_stats(dataset_id=dataset_id,
                                                learners=True)

    # calculate non-learner stats
    non_learner_stats = calculate_demographic_stats(dataset_id=dataset_id,
                                                    learners=False)

    # fmt: off
    return {
        # facility_id
        "fi":
        base64.encodestring(hashlib.md5(
            facility.id.encode()).digest())[:10].decode(),
        # settings
        "s":
        settings,
        # learners_count
        "lc":
        learners.count(),
        # learner_login_count
        "llc":
        usersessions.exclude(
            user__roles__kind__in=[role_kinds.ADMIN, role_kinds.COACH
                                   ]).distinct().count(),
        # coaches_count
        "cc":
        coaches.count(),
        # coach_login_count
        "clc":
        usersessions.filter(
            user__roles__kind__in=[role_kinds.ADMIN, role_kinds.COACH
                                   ]).distinct().count(),
        # first
        "f":
        first_interaction_timestamp("%Y-%m-%d")
        if first_interaction_timestamp else None,
        # last
        "l":
        last_interaction_timestamp("%Y-%m-%d")
        if last_interaction_timestamp else None,
        # summ_started
        "ss":
        summarylogs.count(),
        # summ_complete
        "sc":
        summarylogs.exclude(completion_timestamp=None).count(),
        # sess_kinds
        "sk":
        sesslogs_by_kind,
        # lesson_count
        "lec":
        Lesson.objects.filter(dataset_id=dataset_id).count(),
        # exam_count
        "ec":
        Exam.objects.filter(dataset_id=dataset_id).count(),
        # exam_log_count
        "elc":
        ExamLog.objects.filter(dataset_id=dataset_id).count(),
        # att_log_count
        "alc":
        AttemptLog.objects.filter(dataset_id=dataset_id).count(),
        # exam_att_log_count
        "ealc":
        ExamAttemptLog.objects.filter(dataset_id=dataset_id).count(),
        # sess_user_count
        "suc":
        contsessions_user.count(),
        # sess_anon_count
        "sac":
        contsessions_anon.count(),
        # sess_user_time
        "sut":
        int((contsessions_user.aggregate(
            total_time=Sum("time_spent"))["total_time"] or 0) / 60),
        # sess_anon_time
        "sat":
        int((contsessions_anon.aggregate(
            total_time=Sum("time_spent"))["total_time"] or 0) / 60),
        # demographic_stats_learner
        "dsl":
        learner_stats,
        # demographic_stats_non_learner
        "dsnl":
        non_learner_stats,
    }
Example #5
0
 def get_allow_guest_access(self, instance):
     return allow_guest_access()