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)
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)
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)
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)
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
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
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({})
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)
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({})
def test_func(self): project = Project.objects.get(pk=self.kwargs['pk']) return project_extras.proj_permission_level(project, self.request.user.profile) > 0