예제 #1
0
def label_skew_label(request, data_pk):
    """This is called when an admin manually labels a datum on the skew page. It
    annotates a single datum with the given label, and profile with null as the time.

    Args:
        request: The request to the endpoint
        data_pk: Primary key of data
    Returns:
        {}
    """

    datum = Data.objects.get(pk=data_pk)
    project = datum.project
    label = Label.objects.get(pk=request.data['labelID'])
    profile = request.user.profile
    response = {}

    current_training_set = project.get_current_training_set()
    if project_extras.proj_permission_level(datum.project, profile) >= 2:
        with transaction.atomic():
            DataLabel.objects.create(data=datum,
                                     label=label,
                                     profile=profile,
                                     training_set=current_training_set,
                                     time_to_label=None,
                                     timestamp=timezone.now())
    else:
        response['error'] = "Invalid permission. Must be an admin."

    return Response(response)
예제 #2
0
def discard_data(request, data_pk):
    """Move a datum to the RecycleBin. This removes it from
       the admin dataqueue. This is used only in the skew table by the admin.

    Args:
        request: The POST request
        pk: Primary key of the data
    Returns:
        {}
    """
    data = Data.objects.get(pk=data_pk)
    profile = request.user.profile
    project = data.project
    response = {}

    # Make sure coder is an admin
    if project_extras.proj_permission_level(data.project, profile) > 1:
        # remove it from the admin queue
        queue = Queue.objects.get(project=project, type="admin")
        DataQueue.objects.get(data=data, queue=queue).delete()
        IRRLog.objects.filter(data=data).delete()
        Data.objects.filter(pk=data_pk).update(irr_ind=False)
        RecycleBin.objects.create(data=data, timestamp=timezone.now())

        # remove any IRR log data
        irr_records = IRRLog.objects.filter(data=data)
        irr_records.delete()

    else:
        response['error'] = 'Invalid credentials. Must be an admin.'

    return Response(response)
예제 #3
0
def restore_data(request, data_pk):
    """Move a datum out of the RecycleBin.
    Args:
        request: The POST request
        pk: Primary key of the data
    Returns:
        {}
    """
    data = Data.objects.get(pk=data_pk)
    profile = request.user.profile
    response = {}

    # Make sure coder is an admin
    if project_extras.proj_permission_level(data.project, profile) > 1:
        # remove it from the recycle bin
        queue = Queue.objects.get(project=data.project, type="admin")
        DataQueue.objects.create(data=data, queue=queue)

        # update redis
        settings.REDIS.sadd(redis_serialize_set(queue),
                            redis_serialize_data(data))

        RecycleBin.objects.get(data=data).delete()
    else:
        response["error"] = "Invalid credentials. Must be an admin."

    return Response(response)
예제 #4
0
def skip_data(datum, profile):
    '''
    Record that a given datum has been skipped
    '''
    project = datum.project

    IRRLog.objects.create(data=datum,
                          profile=profile,
                          label=None,
                          timestamp=timezone.now())
    num_history = IRRLog.objects.filter(data=datum).count()
    # if the datum is irr or processed irr, dont add to admin queue yet
    if datum.irr_ind or num_history > 0:
        # if the IRR history has more than the needed number of labels , it is
        # already processed so don't do anything else
        if num_history <= project.num_users_irr:
            process_irr_label(datum, None)

        # unassign the skipped item
        assignment = AssignedData.objects.get(data=datum, profile=profile)
        assignment.delete()
    else:
        # Make sure coder still has permissions before labeling data
        if project_extras.proj_permission_level(project, profile) > 0:
            move_skipped_to_admin_queue(datum, profile, project)
예제 #5
0
    def has_permission(self, request, view):
        if "project_pk" in view.kwargs:
            project = Project.objects.get(pk=view.kwargs["project_pk"])
        elif "data_pk" in view.kwargs:
            project = Data.objects.get(pk=view.kwargs["data_pk"]).project
        else:
            return False

        return project_extras.proj_permission_level(project,
                                                    request.user.profile) > 0
예제 #6
0
    def get_context_data(self, **kwargs):
        ctx = super(ProjectCode, self).get_context_data(**kwargs)
        project = Project.objects.get(pk=self.kwargs['pk'])
        ctx['pk'] = self.kwargs['pk']
        admin = project_extras.proj_permission_level(project, self.request.user.profile) > 1
        if admin:
            ctx['admin'] = "true"
        else:
            ctx['admin'] = "false"
        ctx['project'] = Project.objects.get(pk=self.kwargs['pk'])

        return ctx
예제 #7
0
def enter_coding_page(request, project_pk):
    """API request meant to be sent when a user navigates onto the coding page
       captured with 'beforeload' event.
    Args:
        request: The GET request
    Returns:
        {}
    """
    profile = request.user.profile
    project = Project.objects.get(pk=project_pk)
    # check that no other admin is using it. If they are not, give this admin permission
    if project_extras.proj_permission_level(project, profile) > 1:
        if AdminProgress.objects.filter(project=project).count() == 0:
            AdminProgress.objects.create(project=project,
                                         profile=profile,
                                         timestamp=timezone.now())
    return Response({})
예제 #8
0
def restore_data(request, data_pk):
    """Move a datum out of the RecycleBin.
    Args:
        request: The POST request
        pk: Primary key of the data
    Returns:
        {}
    """
    data = Data.objects.get(pk=data_pk)
    profile = request.user.profile
    response = {}

    # Make sure coder is an admin
    if project_extras.proj_permission_level(data.project, profile) > 1:
        # remove it from the recycle bin
        RecycleBin.objects.get(data=data).delete()
    else:
        response['error'] = 'Invalid credentials. Must be an admin.'

    return Response(response)
예제 #9
0
def leave_coding_page(request, project_pk):
    """API request meant to be sent when a user navigates away from the coding page
       captured with 'beforeunload' event.  This should use assign_data to remove
       any data currently assigned to the user and re-add it to redis

    Args:
        request: The GET request
    Returns:
        {}
    """
    profile = request.user.profile
    project = Project.objects.get(pk=project_pk)
    assigned_data = AssignedData.objects.filter(profile=profile)

    for assignment in assigned_data:
        unassign_datum(assignment.data, profile)

    if project_extras.proj_permission_level(project, profile) > 1:
        if AdminProgress.objects.filter(project=project,
                                        profile=profile).count() > 0:
            prog = AdminProgress.objects.get(project=project, profile=profile)
            prog.delete()
    return Response({})
예제 #10
0
    def test_func(self):
        project = Project.objects.get(pk=self.kwargs['pk'])

        return project_extras.proj_permission_level(project, self.request.user.profile) > 0