def get(self, request, project_uuid, format=None): try: project = Project.objects.get(uuid=project_uuid) except Project.DoesNotExist: raise ValidationError(_('Project does not exist.')) is_administrator(request, self, project) checklists = [] for checklist in models.Checklist.objects.all(): users = project.get_users() qs = models.Answer.objects.filter(user__in=users, question__checklist=checklist) total = checklist.questions.count() * users.count() positive_count = qs.filter( value=F('question__correct_answer')).count() negative_count = (qs.exclude(value__isnull=True).exclude( value=F('question__correct_answer')).count()) unknown_count = total - positive_count - negative_count checklists.append( dict( name=checklist.name, uuid=checklist.uuid, positive_count=positive_count, negative_count=negative_count, unknown_count=unknown_count, score=get_score(positive_count, total) if total > 0 else 100, # consider empty lists as fully compliant )) return Response(checklists)
def get(self, request, project_uuid, format=None): try: project = Project.objects.get(uuid=project_uuid) except Project.DoesNotExist: raise ValidationError(_('Project does not exist.')) is_administrator(request, self, project) checklists = [] for checklist in models.Checklist.objects.all(): qs = models.Answer.objects.filter(project=project, question__checklist=checklist) total = checklist.questions.count() positive_count = qs.filter(value=True).count() negative_count = qs.filter(value=False).count() unknown_count = total - positive_count - negative_count checklists.append( dict( name=checklist.name, uuid=checklist.uuid, positive_count=positive_count, negative_count=negative_count, unknown_count=unknown_count, score=round(100 * positive_count / total, 2) if total > 0 else 100, # consider empty lists as fully compliant )) return Response(checklists)
def check_catalog_permissions(self, scope): if isinstance(scope, ServiceSettings) and not self.request.user.is_staff: raise ValidationError( _('Only staff is allowed to manage global catalogs.')) if isinstance(scope, models.Cluster): is_administrator(self.request.user, scope.project)
def delete_permission_check(request, view, obj=None): if not obj: return if obj.service_project_link.service.settings.shared: if settings.WALDUR_OPENSTACK['MANAGER_CAN_MANAGE_TENANTS']: structure_permissions.is_manager(request, view, obj) else: structure_permissions.is_owner(request, view, obj) else: structure_permissions.is_administrator(request, view, obj)
def check_permissions_for_console(request, view, instance=None): if not instance: return if request.user.is_staff: return if settings.WALDUR_OPENSTACK_TENANT['ALLOW_CUSTOMER_USERS_OPENSTACK_CONSOLE_ACCESS']: structure_permissions.is_administrator(request, view, instance) else: raise exceptions.PermissionDenied()
def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data, many=True) serializer.is_valid(raise_exception=True) try: project = Project.objects.get(uuid=self.kwargs['project_uuid']) except Project.DoesNotExist: raise ValidationError(_('Project does not exist.')) is_administrator(request, self, project) try: checklist = models.Checklist.objects.get( uuid=self.kwargs['checklist_uuid']) except models.Checklist.DoesNotExist: raise ValidationError(_('Checklist does not exist.')) for answer in serializer.validated_data: try: question = checklist.questions.get( uuid=answer['question_uuid']) except models.Question.DoesNotExist: raise ValidationError(_('Question does not exist.')) models.Answer.objects.update_or_create( question=question, project=project, defaults={ 'user': request.user, 'value': answer['value'], }, ) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def check_permissions_for_resource_actions(request, view, resource=None): if not resource: return structure_permissions.is_administrator(request, view, resource)
def validate_project(self, project): structure_permissions.is_administrator(self.context['request'], self.context['view'], project) return project