def clean(self, value): if not value or not value.strip(): if self.required: raise forms.ValidationError(self.error_messages['required']) return [] names = [x.strip().lower() for x in value.split(',')] # this must be case-insensitive! groups = Group.objects.filter(name__in=names).select_related('data') error = set(names) - set(x.name.lower() for x in groups) # Do not immediately reject if len(error) > 0. List *all* invalid or # inaccessible groups. # Check permissions. Skip user private groups. usergroups = [x.data for x in groups if x.data] visible = filter_objects_with_permission(usergroups, self.user, VIEW, model=UserGroup) if len(visible) != len(usergroups): hidden_ids = set(x.group_id for x in usergroups) \ - set(x.group_id for x in visible) error |= set(x.name.lower() for x in groups if x.id in hidden_ids) if error: raise forms.ValidationError( u'Nepostojeće ili nedostupne grupe ili korisnici: %s' \ % ', '.join(error)) return groups
def check_prerequisites(prerequisites, user, task_id): """ Check if all given ids are accessible. Returns the list of ids and list of accessible task instances. """ if not prerequisites.strip(): return [], [] try: # Remove duplicates ids = set([int(x) for x in prerequisites.split(',')]) except ValueError: raise forms.ValidationError('Nevaljan format!') if task_id and task_id in ids: raise forms.ValidationError(u'Zadatak ne može biti sam sebi preduvjet!') tasks = Task.objects.filter(id__in=ids) accessible = filter_objects_with_permission(tasks, user, VIEW, model=Task) if len(ids) != len(accessible): diff = ids - set(x.id for x in accessible) raise forms.ValidationError('Nepoznati ili nedostupni zadaci: {}' \ .format(', '.join(str(x) for x in diff))) for x in accessible: if not x.solvable: raise forms.ValidationError( u'Nije moguće slati rješenja za zadatak #{}!'.format(x.id)) return ids, accessible