'Grader user answer.
Checks if every draggable isplaced on proper target or  on proper
coordinates within radius of forgiveness (default is 10).
Returns: bool.'

def grade(self):

    for draggable in self.excess_draggables:
        if self.excess_draggables[draggable]:
            return False
    for (index, draggable_ids) in enumerate(self.correct_groups):
        current_rule = self.correct_positions[index].keys()[0]
        if ('number' in current_rule):
            rule_values = self.correct_positions[index][current_rule]
            self.correct_positions[index].pop(current_rule, None)
            parsed_rule = current_rule.replace('+', '').replace('number', '')
            self.correct_positions[index][parsed_rule] = rule_values
        else:
            self.user_groups[index] = list(set(self.user_groups[index]))
        if (sorted(draggable_ids) != sorted(self.user_groups[index])):
            return False
    for (index, _) in enumerate(self.correct_groups):
        rules_executed = 0
        for rule in ('exact', 'anyof', 'unordered_equal'):
            if self.correct_positions[index].get(rule, None):
                rules_executed += 1
                if (not self.compare_positions(self.correct_positions[index][rule], self.user_positions[index]['user'], flag=rule)):
                    return False
        if (not rules_executed):
            return False
    return True
