Пример #1
0
    def get_context_data(self, **kwargs):
        # Get decisions
        try:
            decision1 = Decision.objects.select_related('job').get(
                identifier=self.kwargs['decision1'])
            decision2 = Decision.objects.select_related('job').get(
                identifier=self.kwargs['decision2'])
        except Decision.DoesNotExist:
            raise BridgeException(
                _("One of the selected decisions wasn't found"))

        # Check jobs access
        if not JobAccess(self.request.user, job=decision1.job).can_view\
                or not JobAccess(self.request.user, job=decision2.job).can_view:
            raise BridgeException(code=401)

        # Get or create comparison cache
        try:
            comparison_info = CompareDecisionsInfo.objects.get(
                decision1=decision1, decision2=decision2)
        except CompareDecisionsInfo.DoesNotExist:
            obj = FillComparisonCache(self.request.user, decision1, decision2)
            comparison_info = obj.info

        return {
            'decision1':
            decision1,
            'decision2':
            decision2,
            'data':
            ComparisonTableData(decision1,
                                decision2,
                                comparison_info=comparison_info)
        }
Пример #2
0
 def save(self, data):
     if self._copy:
         if not JobAccess(self._user).can_create():
             raise BridgeException(_("You don't have an access to create new jobs"))
         self.__create_job(data)
     else:
         if not JobAccess(self._user, self._job).can_edit():
             raise BridgeException(_("You don't have an access to edit this job"))
         self.__update_job(data)
     return self._job
Пример #3
0
 def get_context_data(self, **kwargs):
     if not JobAccess(self.request.user,
                      self.object).can_clear_verifications():
         raise BridgeException(
             _("You can't remove verification files of this job"))
     reports.utils.remove_verification_files(self.object)
     return {}
Пример #4
0
    def get_context_data(self, **kwargs):
        if not JobAccess(self.request.user, self.object).klever_core_access():
            raise BridgeException(
                "User '%s' don't have access to upload report for job '%s'" %
                (self.request.user.username, self.object.identifier))
        if self.object.status != JOB_STATUS[2][0]:
            raise BridgeException(
                'Reports can be uploaded only for processing jobs')

        archives = {}
        for f in self.request.FILES.getlist('file'):
            archives[f.name] = f

        if 'report' in self.request.POST:
            data = json.loads(self.request.POST['report'])
            err = UploadReport(self.object, data, archives).error
            if err is not None:
                raise BridgeException(err)
        elif 'reports' in self.request.POST:
            data = json.loads(self.request.POST['reports'])
            if not isinstance(data, list):
                raise BridgeException('Wrong format of reports data')
            for d in data:
                err = UploadReport(self.object, d, archives).error
                if err is not None:
                    raise BridgeException(err)
        else:
            raise BridgeException('Report json data is required')
        return {}
Пример #5
0
 def get_context_data(self, **kwargs):
     if not JobAccess(self.request.user, self.object.root.job).can_view():
         raise BridgeException(code=400)
     try:
         etv = GetETV(
             ArchiveFileContent(self.object, 'error_trace',
                                ERROR_TRACE_FILE).content.decode('utf8'),
             self.request.user)
     except Exception as e:
         logger.exception(e, stack_info=True)
         etv = None
     return {
         'report':
         self.object,
         'report_type':
         'unsafe',
         'parents':
         reports.utils.get_parents(self.object),
         'SelfAttrsData':
         reports.utils.report_attibutes(self.object),
         'MarkTable':
         ReportMarkTable(self.request.user, self.object,
                         self.get_view(VIEW_TYPES[10])),
         'etv':
         etv,
         'include_assumptions':
         self.request.user.extended.assumptions,
         'include_jquery_ui':
         True,
         'resources':
         reports.utils.get_leaf_resources(self.request.user, self.object)
     }
Пример #6
0
    def get_context_data(self, **kwargs):
        if not JobAccess(self.request.user, self.object.root.job).can_view():
            raise BridgeException(code=400)

        proof_content = None
        if self.object.proof:
            proof_content = ArchiveFileContent(
                self.object, 'proof', PROOF_FILE).content.decode('utf8')
        return {
            'report':
            self.object,
            'report_type':
            'safe',
            'parents':
            reports.utils.get_parents(self.object),
            'resources':
            reports.utils.get_leaf_resources(self.request.user, self.object),
            'SelfAttrsData':
            reports.utils.report_attibutes(self.object),
            'main_content':
            proof_content,
            'MarkTable':
            ReportMarkTable(self.request.user, self.object,
                            self.get_view(VIEW_TYPES[11]))
        }
Пример #7
0
 def __accessed_changes(self, user):
     reports_to_del = []
     for report in self.changes:
         if not JobAccess(user, report.root.job).can_view():
             reports_to_del.append(report)
     for report in reports_to_del:
         del self.changes[report]
Пример #8
0
    def get_context_data(self, **kwargs):
        if not JobAccess(self.request.user, self.object.job).can_decide:
            raise BridgeException(
                _("You don't have an access to create job version"))
        context = super(DecisionCopyFormPage, self).get_context_data(**kwargs)
        decision_files = json.dumps(JSTreeConverter().make_tree(
            list(
                FileSystem.objects.filter(decision=self.object).values_list(
                    'name', 'file__hash_sum'))),
                                    ensure_ascii=False)

        other_decisions = Decision.objects.filter(job=self.object.job).order_by('id')\
            .exclude(status=DECISION_STATUS[0][0]).only('id', 'title', 'start_date')
        context.update({
            'job':
            self.object.job,
            'unique_name':
            get_unique_decision_name(self.object.job),
            'base_decision':
            self.object,
            'cancel_url':
            reverse('jobs:decision', args=[self.object.id]),
            'files_data':
            decision_files,
            'start_data':
            StartDecisionData(self.request.user, base_decision=self.object),
            'other_decisions':
            other_decisions
        })
        return context
Пример #9
0
    def get_context_data(self, **kwargs):
        if not JobAccess(self.request.user, self.object.decision.job).can_view:
            raise BridgeException(code=400)

        context = super().get_context_data(**kwargs)
        if self.object.decision.weight == DECISION_WEIGHT[0][0]:
            context['parents'] = get_parents(self.object)
        context.update({
            'report':
            self.object,
            'resources':
            report_resources(self.request.user, self.object),
            'SelfAttrsData':
            self.object.attrs.order_by('id').values_list(
                'id', 'name', 'value', 'data'),
            'MarkTable':
            SafeReportMarksTable(self.request.user, self.object,
                                 self.get_view(VIEW_TYPES[11]))
        })

        # Get parent coverage if exists
        cov_obj = CoverageArchive.objects.filter(
            report_id=self.object.parent_id).first()
        if cov_obj:
            context['coverage'] = LeafCoverageStatistics(cov_obj)

        return context
Пример #10
0
    def get_context_data(self, **kwargs):
        if not JobAccess(self.request.user, self.object.decision.job).can_view:
            raise BridgeException(code=400)
        context = super().get_context_data(**kwargs)
        context.update({
            'report':
            self.object,
            'resources':
            report_resources(self.request.user, self.object),
            'SelfAttrsData':
            self.object.attrs.order_by('id').values_list(
                'id', 'name', 'value', 'data'),
            'main_content':
            ArchiveFileContent(self.object, 'problem_description',
                               PROBLEM_DESC_FILE).content.decode('utf8'),
            'MarkTable':
            UnknownReportMarksTable(self.request.user, self.object,
                                    self.get_view(VIEW_TYPES[12]))
        })

        # Get parent coverage if exists and parent is verification report
        cov_obj = CoverageArchive.objects.filter(
            report_id=self.object.parent_id,
            report__verification=True).first()
        if cov_obj:
            context['coverage'] = LeafCoverageStatistics(cov_obj)

        if self.object.decision.weight == DECISION_WEIGHT[0][0]:
            context['parents'] = get_parents(self.object)
        return context
Пример #11
0
 def get_context_data(self, **kwargs):
     job = self.object.root.job
     if not JobAccess(self.request.user, job).can_view():
         raise BridgeException(code=400)
     return {
         'report':
         self.object,
         'status':
         reports.utils.ReportStatus(self.object),
         'data':
         reports.utils.ReportData(self.object),
         'resources':
         reports.utils.report_resources(self.object, self.request.user),
         'computer':
         reports.utils.computer_description(
             self.object.computer.description),
         'SelfAttrsData':
         reports.utils.ReportAttrsTable(self.object).table_data,
         'parents':
         reports.utils.get_parents(self.object),
         'reportdata':
         ViewJobData(self.request.user, self.get_view(VIEW_TYPES[2]),
                     self.object),
         'TableData':
         reports.utils.ReportChildrenTable(self.request.user,
                                           self.object,
                                           self.get_view(VIEW_TYPES[3]),
                                           page=self.request.GET.get(
                                               'page', 1))
     }
Пример #12
0
 def get_context_data(self, **kwargs):
     try:
         decision1 = Decision.objects.select_related('job').get(
             id=self.kwargs['decision1'])
         decision2 = Decision.objects.select_related('job').get(
             id=self.kwargs['decision2'])
     except Decision.DoesNotExist:
         raise BridgeException(
             _("One of the selected decisions wasn't found"))
     if not JobAccess(self.request.user, job=decision1.job).can_view\
             or not JobAccess(self.request.user, job=decision2.job).can_view:
         raise BridgeException(code=401)
     return {
         'decision1': decision1,
         'decision2': decision2,
         'data': ComparisonTableData(decision1, decision2)
     }
Пример #13
0
 def get_context_data(self, **kwargs):
     context = super().get_context_data(**kwargs)
     if not JobAccess(self.request.user, self.object.root.job).can_view():
         raise BridgeException(code=400)
     tbl = reports.utils.UnknownsTable(self.request.user, self.object,
                                       self.get_view(VIEW_TYPES[6]),
                                       self.request.GET)
     context.update({'report': self.object, 'TableData': tbl})
     return context
Пример #14
0
 def to_representation(self, instance):
     if not isinstance(instance, JobHistory):
         raise exceptions.APIException('Wrong serializer usage')
     value = super().to_representation(instance)
     if JobAccess(self.context['request'].user, instance.job).can_view:
         value['href'] = reverse('jobs:job', args=[instance.job_id])
     if len(value['comment']) > 50:
         value['display_comment'] = value['comment'][:47] + '...'
     return value
Пример #15
0
    def get_generator(self):
        self.object = self.get_object()
        if not JobAccess(self.request.user, self.object.root.job).can_view():
            return BridgeErrorResponse(400)
        if not self.object.log:
            raise BridgeException(_("The component doesn't have log"))

        content = ArchiveFileContent(self.object, 'log', LOG_FILE).content
        self.file_size = len(content)
        return FileWrapper(BytesIO(content), 8192)
Пример #16
0
 def has_object_permission(self, request, view, obj):
     if isinstance(obj, Job):
         job = obj
     elif isinstance(obj, Decision):
         job = obj.job
     elif isinstance(obj, ReportComponent):
         job = obj.decision.job
     else:
         return False
     return JobAccess(request.user, job).can_view
Пример #17
0
 def post(self, request, decision1, decision2):
     try:
         d1 = Decision.objects.select_related('job').get(id=decision1)
         d2 = Decision.objects.select_related('job').get(id=decision2)
     except Decision.DoesNotExist:
         raise exceptions.APIException(
             _('One of the decisions was not found'))
     if not JobAccess(self.request.user, job=d1.job).can_view \
             or not JobAccess(self.request.user, job=d2.job).can_view:
         raise exceptions.PermissionDenied(
             _("You don't have an access to one of the selected jobs"))
     try:
         CompareDecisionsInfo.objects.get(user=self.request.user,
                                          decision1=d1,
                                          decision2=d2)
     except CompareDecisionsInfo.DoesNotExist:
         FillComparisonCache(self.request.user, d1, d2)
     return Response(
         {'url': reverse('reports:comparison', args=[d1.id, d2.id])})
Пример #18
0
    def __get_jobs_tree(self):
        # Job order parameter
        jobs_order = 'id'
        if 'order' in self.view and len(self.view['order']) == 2:
            if self.view['order'][1] == 'title':
                jobs_order = 'name'
            elif self.view['order'][1] == 'date':
                jobs_order = 'change_date'
            elif self.view['order'][1] == 'start':
                jobs_order = 'solvingprogress__start_date'
            elif self.view['order'][1] == 'finish':
                jobs_order = 'solvingprogress__finish_date'
            if self.view['order'][0] == 'up':
                jobs_order = '-' + jobs_order

        # Jobs tree structure
        tree_struct = {}
        for job in Job.objects.only('id', 'parent_id'):
            tree_struct[job.id] = job.parent_id

        # Filters for jobs
        filters, unfilters = self.__view_filters()
        filters = Q(**filters)
        for unf_v in unfilters:
            filters &= ~Q(**{unf_v: unfilters[unf_v]})

        # Jobs' ids with view access
        accessed = JobAccess(self._user).can_view_jobs(filters)

        # Add parents without access to show the tree structure
        jobs_in_tree = set(accessed)
        for j_id in accessed:
            parent = tree_struct[j_id]
            while parent is not None:
                jobs_in_tree.add(parent)
                parent = tree_struct[parent]

        # Get ordered list of jobs
        jobs_list = list(j.id for j in Job.objects.filter(id__in=jobs_in_tree).order_by(jobs_order).only('id'))

        # Function collects children tree for specified job id (p_id)
        def get_job_children(p_id):
            children = []
            for oj_id in jobs_list:
                if tree_struct[oj_id] == p_id:
                    children.append({'id': oj_id, 'parent': p_id})
                    children.extend(get_job_children(oj_id))
            return children

        # Get roots' ids for DB reqeusts optimizations
        roots = dict((r_id, j_id) for r_id, j_id in ReportRoot.objects.filter(job_id__in=accessed)
                     .values_list('id', 'job_id'))

        return get_job_children(None), accessed, roots
Пример #19
0
    def get_generator(self):
        self.object = self.get_object()
        if not JobAccess(self.request.user,
                         self.object.report.root.job).can_view():
            raise BridgeException(code=400)
        if not self.object.data:
            raise BridgeException(_("The attribute doesn't have data"))

        content = self.object.data.file.read()
        self.file_size = len(content)
        return FileWrapper(BytesIO(content), 8192)
Пример #20
0
 def has_object_permission(self, request, view, obj):
     if request.user.is_manager or request.user.is_service:
         return True
     if isinstance(obj, Job):
         job = obj
     elif isinstance(obj, Decision):
         job = obj.job
     elif isinstance(obj, ReportComponent):
         job = obj.decision.job
     else:
         return False
     return JobAccess(request.user, job).is_author
Пример #21
0
 def get_context_data(self, **kwargs):
     if not JobAccess(self.request.user, self.object.decision.job).can_view:
         raise BridgeException(code=400)
     return {
         'report':
         self.object,
         'include_jquery_ui':
         True,
         'etv':
         GetETV(
             ArchiveFileContent(self.object, 'error_trace',
                                ERROR_TRACE_FILE).content.decode('utf8'),
             self.request.user)
     }
Пример #22
0
    def get_context_data(self, **kwargs):
        if not JobAccess(self.request.user, self.object.root.job).can_view():
            raise BridgeException(code=400)
        if not self.object.log:
            raise BridgeException(_("The component doesn't have log"))

        content = ArchiveFileContent(self.object, 'log', LOG_FILE).content
        if len(content) > 10**5:
            content = str(
                _('The component log is huge and can not be shown but you can download it'
                  ))
        else:
            content = content.decode('utf8')
        return {'content': content}
Пример #23
0
 def get_context_data(self, **kwargs):
     if not JobAccess(self.request.user, self.object.root.job).can_view():
         raise BridgeException(code=400)
     return {
         'report':
         self.object,
         'include_assumptions':
         self.request.user.extended.assumptions,
         'etv':
         GetETV(
             ArchiveFileContent(self.object, 'error_trace',
                                ERROR_TRACE_FILE).content.decode('utf8'),
             self.request.user)
     }
Пример #24
0
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        # Check view access
        context['job_access'] = JobAccess(self.request.user, self.object)
        if not context['job_access'].can_view:
            raise PermissionDenied(ERRORS[400])
        context['parents'] = self.object.preset.get_ancestors(
            include_self=True).only('id', 'name', 'type')
        context['user_roles'] = UserRole.objects.filter(job=self.object).select_related('user')\
            .order_by('user__first_name', 'user__last_name', 'user__username')
        context['preset_changed'] = is_preset_changed(self.object)
        context['decisions'] = Decision.objects.filter(job=self.object).exclude(status=DECISION_STATUS[0][0])\
            .select_related('configuration').order_by('-start_date')
        return context
Пример #25
0
    def get_context_data(self, **kwargs):
        if not JobAccess(self.request.user,
                         self.object.report.root.job).can_view():
            raise BridgeException(code=400)
        if not self.object.data:
            raise BridgeException(_("The attribute doesn't have data"))

        content = self.object.data.file.read()
        if len(content) > 10**5:
            content = str(
                _('The attribute data is huge and can not be shown but you can download it'
                  ))
        else:
            content = content.decode('utf8')
        return {'content': content}
Пример #26
0
 def get_generator(self):
     instance = self.get_object()
     decisions_ids = self.request.GET.getlist('decision')
     if decisions_ids:
         for decision in Decision.objects.filter(
                 job=instance, id__in=decisions_ids).select_related('job'):
             if not DecisionAccess(self.request.user,
                                   decision).can_download:
                 raise BridgeException(code=408,
                                       back=reverse('jobs:job',
                                                    args=[instance.id]))
         return JobArchiveGenerator(instance, decisions_ids)
     if not JobAccess(self.request.user, instance).can_download:
         raise BridgeException(code=400,
                               back=reverse('jobs:job', args=[instance.id]))
     return JobArchiveGenerator(instance)
Пример #27
0
    def get(self, request, pk):
        assert pk
        instance = self.get_object()
        if not JobAccess(self.request.user,
                         instance.report.decision.job).can_view:
            raise exceptions.PermissionDenied(
                _("You don't have an access to the job"))
        if not instance.data:
            raise BridgeException(_("The attribute doesn't have data"))

        content = instance.data.file.read()
        if len(content) > 10**5:
            content = str(
                _('The attribute data is huge and can not be shown but you can download it'
                  ))
        else:
            content = content.decode('utf8')
        return HttpResponse(content)
Пример #28
0
 def get_context_data(self, **kwargs):
     if not JobAccess(self.request.user, self.object).can_decide:
         raise BridgeException(
             _("You don't have an access to create job version"))
     context = super(DecisionFormPage, self).get_context_data(**kwargs)
     preset_job = self.object.preset.get_ancestors(
         include_self=True).filter(type=PRESET_JOB_TYPE[1][0]).first()
     other_decisions = Decision.objects.filter(job=self.object).order_by('id')\
         .exclude(status=DECISION_STATUS[0][0]).only('id', 'title', 'start_date')
     context.update({
         'job': self.object,
         'unique_name': get_unique_decision_name(self.object),
         'cancel_url': reverse('jobs:job', args=[self.object.id]),
         'files_data': preset_job_files_tree_json(preset_job),
         'current_conf': settings.DEF_KLEVER_CORE_MODE,
         'start_data': StartDecisionData(self.request.user),
         'other_decisions': other_decisions
     })
     return context
Пример #29
0
    def get(self, request, *args, **kwargs):
        self.object = self.get_object()

        # Check job access
        if not JobAccess(self.request.user, self.object.decision.job).can_view:
            raise BridgeException(code=400)

        # Get safes data
        safes_data = SafesTable(self.request.user, self.object,
                                self.get_view(VIEW_TYPES[5]), self.request.GET)

        # Get context
        context = self.get_context_data(report=self.object)

        # Redirect if needed
        if hasattr(safes_data, 'redirect'):
            return HttpResponseRedirect(safes_data.redirect)

        context['TableData'] = safes_data
        return self.render_to_response(context)
Пример #30
0
def get_jobs_to_download(user, job_ids, decision_ids):
    jobs_qs_filter = Q()
    if job_ids:
        jobs_qs_filter |= Q(id__in=job_ids)
    if decision_ids:
        jobs_qs_filter |= Q(decision__id__in=decision_ids)
    if not jobs_qs_filter:
        raise BridgeException(
            _("Please select jobs or/and decisions you want to download"),
            back=reverse('jobs:tree'))

    # Collect selected jobs
    jobs_to_download = {}
    for job in Job.objects.filter(jobs_qs_filter):
        jobs_to_download[job.id] = {'instance': job, 'decisions': []}

    if not jobs_to_download:
        raise BridgeException(_("Jobs were not found"),
                              back=reverse('jobs:tree'))

    # Collect selected decisions
    for decision in Decision.objects.filter(
            pk__in=decision_ids).select_related('job'):
        if decision.job_id not in jobs_to_download:
            # Unexpected behavior
            continue
        jobs_to_download[decision.job_id]['decisions'].append(decision.id)
        if not DecisionAccess(user, decision).can_download:
            raise BridgeException(
                _("You don't have an access to one of the selected decisions"),
                back=reverse('jobs:tree'))

    # Check access to jobs without any selected decision (all decisions will be downloaded)
    for job_id in jobs_to_download:
        if not jobs_to_download[job_id]['decisions']:
            if not JobAccess(
                    user, jobs_to_download[job_id]['instance']).can_download:
                raise BridgeException(
                    _("You don't have an access to one of the selected jobs"),
                    back=reverse('jobs:tree'))
    return jobs_to_download