Ejemplo n.º 1
0
    def __get_kwargs(self, report, data):
        kwargs = {'page': int(data.get('page', 1)), 'report': report}
        if 'confirmed' in data:
            kwargs['confirmed'] = True
            self.title = '{0}: {1}'.format(_("Unsafes"), _('confirmed'))

        # Either verdict, tag or attr is supported in kwargs
        if 'verdict' in data:
            verdict_title = ReportUnsafe(verdict=data['verdict']).get_verdict_display()
            if 'confirmed' in data:
                self.title = '{0}: {1} {2}'.format(_("Unsafes"), _('confirmed'), verdict_title)
            else:
                self.title = '{0}: {1}'.format(_("Unsafes"), verdict_title)
            kwargs['verdict'] = data['verdict']
        elif 'tag' in data:
            try:
                tag = UnsafeTag.objects.get(id=data['tag'])
            except ObjectDoesNotExist:
                raise BridgeException(_("The tag was not found"))
            self.title = '{0}: {1}'.format(_("Unsafes"), tag.tag)
            kwargs['tag'] = tag
        elif 'attr' in data:
            try:
                attr = Attr.objects.select_related('name').get(id=data['attr'])
            except ObjectDoesNotExist:
                raise BridgeException(_("The attribute was not found"))
            self.title = _('Unsafes where %(a_name)s is %(a_val)s') % {'a_name': attr.name.name, 'a_val': attr.value}
            kwargs['attr'] = attr

        return kwargs
Ejemplo n.º 2
0
    def __get_response(self, *args, **kwargs):
        self.__is_not_used(*args, **kwargs)

        try:
            generator = self.get_generator()
        except Exception as e:
            if not isinstance(e, BridgeException):
                logger.exception(e)
                raise BridgeException()
            raise
        if generator is None:
            raise BridgeException()

        file_name = getattr(generator, 'name', None) or self.get_filename()
        if not isinstance(file_name, str) or len(file_name) == 0:
            raise BridgeException()

        file_size = getattr(generator, 'size', None)

        mimetype = mimetypes.guess_type(os.path.basename(file_name))[0]
        response = StreamingHttpResponse(generator, content_type=mimetype)
        if file_size is not None:
            response['Content-Length'] = file_size
        response['Content-Disposition'] = 'attachment; filename="{}"'.format(
            file_name)
        return response
Ejemplo n.º 3
0
    def upload_mark(self, archive):
        mark_data = None
        versions_data = {}
        with zipfile.ZipFile(archive, 'r') as zfp:
            for file_name in zfp.namelist():
                if file_name == 'mark.json':
                    mark_data = json.loads(zfp.read(file_name).decode('utf8'))
                elif file_name.startswith('version-'):
                    try:
                        version_id = int(os.path.splitext(file_name)[0].replace('version-', ''))
                        versions_data[version_id] = json.loads(zfp.read(file_name).decode('utf8'))
                    except ValueError:
                        raise BridgeException(_("The mark archive is corrupted"))

        if mark_data is None or len(versions_data) == 0:
            raise BridgeException(_("The mark archive is corrupted: it doesn't contain necessary data"))
        if not isinstance(mark_data, dict):
            raise ValueError('Unsupported mark data type: %s' % type(mark_data))

        mark_type = mark_data.pop('type', None)
        if mark_type == 'safe':
            return mark_type, self.__create_safe_mark(mark_data, versions_data)
        elif mark_type == 'unsafe':
            return mark_type, self.__create_unsafe_mark(mark_data, versions_data)
        elif mark_type == 'unknown':
            return mark_type, self.__create_unknown_mark(mark_data, versions_data)
        raise ValueError('Unsupported mark type: %s' % mark_type)
Ejemplo n.º 4
0
    def __init__(self, func_name, pattern_error_trace, unsafe):
        """
        If you want to pass exception message (can be translatable) to user,
        raise BridgeException(message) then.
        In case of success you need just self.result.
        :param func_name: name of the function (str).
        :param pattern_error_trace: pattern error trace of the mark (str).
        :param unsafe: unsafe (ReportUnsafe).
        :return: nothing.
        """

        self.unsafe = unsafe
        try:
            self.pattern_error_trace = json.loads(pattern_error_trace)
        except Exception as e:
            raise BridgeException(
                "Can't parse error trace pattern (it must be JSON serializable): %s"
                % e)

        self.result = 0.0
        if func_name.startswith('_'):
            raise BridgeException("Function name mustn't start with '_'")
        try:
            func = getattr(self, func_name)
            if not isinstance(func, MethodType):
                raise BridgeException('Wrong function name')
        except AttributeError:
            raise BridgeException(
                'The error trace comparison function does not exist')
        self.result = func()
        if isinstance(self.result, int):
            self.result = float(self.result)
        if not (isinstance(self.result, float) and 0 <= self.result <= 1):
            raise BridgeException(
                "Compare function returned incorrect result: %s" % self.result)
Ejemplo n.º 5
0
def delete_marks(user, marks_type, mark_ids, report_id=None):
    if marks_type == 'safe':
        marks = MarkSafe.objects.filter(id__in=mark_ids)
    elif marks_type == 'unsafe':
        marks = MarkUnsafe.objects.filter(id__in=mark_ids)
    elif marks_type == 'unknown':
        marks = MarkUnknown.objects.filter(id__in=mark_ids)
    else:
        raise ValueError('Unsupported marks type: %s' % marks_type)
    if not all(MarkAccess(user, mark=mark).can_delete() for mark in marks):
        if len(marks) > 1:
            raise BridgeException(_("You can't delete one of the selected marks"))
        elif len(marks) == 1:
            raise BridgeException(_("You don't have an access to delete this mark"))
        else:
            raise BridgeException(_('Nothing to delete'))
    if marks_type == 'safe':
        SafeUtils.delete_marks(marks)
        reports_model = ReportSafe
    elif marks_type == 'unsafe':
        UnsafeUtils.delete_marks(marks)
        reports_model = ReportUnsafe
    else:
        UnknownUtils.delete_marks(marks)
        reports_model = ReportUnknown
    if report_id:
        try:
            report = reports_model.objects.get(id=report_id)
        except ObjectDoesNotExist:
            return None
        return report.id if not isinstance(report, ReportUnsafe) else report.trace_id
Ejemplo n.º 6
0
def copy_files_with_replace(request, decision_id, files_qs):
    new_job_files = []
    files_to_replace = {}

    # Upload provided files first
    if request.data.get('files'):
        if isinstance(request.data['files'], str):
            try:
                files_map = json.loads(request.data['files'])
            except Exception as e:
                logger.error("Can't decode files data: {}".format(
                    request.data['files']))
                raise BridgeException("Can't decode files data: {}".format(e))
        elif isinstance(request.data['files'], dict):
            files_map = request.data['files']
        else:
            raise BridgeException('Wrong files data: "{}" ({})'.format(
                request.data['files'], type(request.data['files'])))
        for fname, fkey in files_map.items():
            if fkey in request.FILES:
                files_to_replace[fname] = request.FILES[fkey]
                new_file = file_get_or_create(files_to_replace[fname], fname,
                                              JobFile)
                new_job_files.append(
                    FileSystem(decision_id=decision_id,
                               file_id=new_file.id,
                               name=fname))

    # Copy other files
    for f_id, f_name in files_qs:
        if f_name in files_to_replace:
            continue
        new_job_files.append(
            FileSystem(decision_id=decision_id, file_id=f_id, name=f_name))
    FileSystem.objects.bulk_create(new_job_files)
Ejemplo n.º 7
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)
        }
Ejemplo n.º 8
0
    def post(self, *args, **kwargs):
        self.is_not_used(*args, **kwargs)

        self.object = self.get_object()
        if self.kwargs['action'] == 'create' \
                and not mutils.MarkAccess(self.request.user, report=self.object).can_create():
            raise BridgeException(
                _("You don't have an access to create new marks"),
                response_type='json')
        elif self.kwargs['action'] == 'edit' \
                and not mutils.MarkAccess(self.request.user, mark=self.object).can_edit():
            raise BridgeException(
                _("You don't have an access to edit this mark"),
                response_type='json')

        try:
            res = mutils.NewMark(self.request.user, self.object,
                                 json.loads(self.request.POST['data']))
            if self.kwargs['action'] == 'edit':
                res.change_mark()
            else:
                res.create_mark()
            cache_id = MarkChangesTable(self.request.user, res.mark,
                                        res.changes).cache_id
        except BridgeException as e:
            raise BridgeException(str(e), response_type='json')
        except Exception as e:
            logger.exception(e)
            raise BridgeException(response_type='json')

        return JsonResponse({'cache_id': cache_id})
Ejemplo n.º 9
0
    def upload_mark(self):
        if 'format' not in self._args:
            raise BridgeException(_('Safe mark format is required'))
        if isinstance(self._args.get('identifier'),
                      str) and 0 < len(self._args['identifier']) < 255:
            if MarkSafe.objects.filter(
                    identifier=self._args['identifier']).count() > 0:
                raise BridgeException(
                    _("The mark with identifier specified in the archive already exists"
                      ))
        else:
            self._args['identifier'] = unique_id()
        mark = MarkSafe.objects.create(
            identifier=self._args['identifier'],
            author=self._user,
            change_date=now(),
            format=self._args['format'],
            type=MARK_TYPE[2][0],
            status=self._args['status'],
            description=str(self._args.get('description', '')),
            is_modifiable=self._args['is_modifiable'],
            verdict=self._args['verdict'])

        try:
            markversion = self.__create_version(mark)
            self.__create_attributes(markversion.id)
        except Exception:
            mark.delete()
            raise
        return mark
Ejemplo n.º 10
0
    def __get_kwargs(self, report, data):
        kwargs = {'page': int(data.get('page', 1)), 'report': report}
        if 'component' in data:
            kwargs['component'] = data['component']
        if 'problem' in data:
            problem_id = int(data['problem'])
            if problem_id == 0:
                self.title = _("Unknowns without marks")
                kwargs['problem'] = 0
            else:
                try:
                    problem = UnknownProblem.objects.get(id=problem_id)
                except ObjectDoesNotExist:
                    raise BridgeException(_("The problem was not found"))
                self.title = '{0}: {1}'.format(_("Unknowns"), problem.name)
                kwargs['problem'] = problem
        elif 'attr' in data:
            try:
                attr = Attr.objects.select_related('name').get(id=data['attr'])
            except ObjectDoesNotExist:
                raise BridgeException(_("The attribute was not found"))
            self.title = _('Unknowns where %(a_name)s is %(a_val)s') % {'a_name': attr.name.name, 'a_val': attr.value}
            kwargs['attr'] = attr

        return kwargs
Ejemplo n.º 11
0
 def __get_schedulers(self):
     schedulers = []
     try:
         klever_sch = Scheduler.objects.get(type=SCHEDULER_TYPE[0][0])
     except ObjectDoesNotExist:
         raise BridgeException(_('Population has to be done first'))
     try:
         cloud_sch = Scheduler.objects.get(type=SCHEDULER_TYPE[1][0])
     except ObjectDoesNotExist:
         raise BridgeException(_('Population has to be done first'))
     if klever_sch.status == SCHEDULER_STATUS[1][0]:
         self.job_sch_err = _("The Klever scheduler is ailing")
     elif klever_sch.status == SCHEDULER_STATUS[2][0]:
         raise BridgeException(_('The Klever scheduler is disconnected'))
     schedulers.append([
         klever_sch.type,
         '{0} ({1})'.format(klever_sch.get_type_display(),
                            klever_sch.get_status_display())
     ])
     if cloud_sch.status != SCHEDULER_STATUS[2][0]:
         schedulers.append([
             cloud_sch.type,
             '{0} ({1})'.format(cloud_sch.get_type_display(),
                                cloud_sch.get_status_display())
         ])
     elif self.conf['scheduler'] == SCHEDULER_TYPE[1][0]:
         raise BridgeException(_('The scheduler for tasks is disconnected'))
     return schedulers
Ejemplo n.º 12
0
    def get(self, *args, **kwargs):
        self.__is_not_used(*args, **kwargs)

        try:
            self.generator = self.get_generator()
        except Exception as e:
            if not isinstance(e, BridgeException):
                logger.exception(e)
                raise BridgeException()
            raise

        if self.generator is None:
            raise BridgeException()

        self.file_name = self.get_filename()
        if not isinstance(self.file_name, str) or len(self.file_name) == 0:
            raise BridgeException()

        mimetype = mimetypes.guess_type(os.path.basename(self.file_name))[0]
        response = StreamingHttpResponse(self.generator, content_type=mimetype)
        if self.file_size is not None:
            response['Content-Length'] = self.file_size
        response[
            'Content-Disposition'] = 'attachment; filename="%s"' % self.file_name
        return response
Ejemplo n.º 13
0
 def __get_decisions(self, decisions_ids):
     decisions = Decision.objects.filter(id__in=decisions_ids)\
         .exclude(status=DECISION_STATUS[0][0]).select_related('job')
     if len(decisions) < len(decisions_ids):
         raise BridgeException(_('One of the selected decisions was not found'))
     if len(decisions) == 0:
         raise BridgeException(_('Please select decisions to recalculate caches for them'))
     return decisions
Ejemplo n.º 14
0
 def get_context_data(self, **kwargs):
     if not TagAccess(self.request.user, None).create():
         raise BridgeException(_("You don't have an access to upload tags"))
     if 'file' not in self.request.FILES:
         raise BridgeException()
     CreateTagsFromFile(self.request.user, self.request.FILES['file'],
                        self.kwargs['type'])
     return {}
Ejemplo n.º 15
0
def get_job_by_identifier(identifier):
    found_jobs = Job.objects.filter(identifier__startswith=identifier)
    if len(found_jobs) == 0:
        raise BridgeException(_('The job with specified identifier was not found'))
    elif len(found_jobs) > 1:
        raise BridgeException(_('Several jobs match the specified identifier, '
                              'please increase the length of the job identifier'))
    return found_jobs[0]
Ejemplo n.º 16
0
 def get_object(self, queryset=None):
     try:
         obj = self.get_queryset().get(job_id=self.kwargs['job_id'], version=self.kwargs['version'])
     except ObjectDoesNotExist:
         raise BridgeException(_('Job version was not found'))
     if not jobs.utils.JobAccess(self.request.user, obj.job).can_view():
         raise BridgeException(code=400)
     return obj
Ejemplo n.º 17
0
    def get_context_data(self, **kwargs):
        context = {'versions': [], 'action': self.kwargs['action']}
        if self.kwargs['action'] == 'edit':
            access = mutils.MarkAccess(self.request.user, mark=self.object)
            if not access.can_edit():
                raise BridgeException(
                    _("You don't have an access to edit this mark"))
            context['mark'] = self.object
            context['selected_version'] = int(
                self.request.GET.get('version', self.object.version))
            for m in self.object.versions.order_by('-version'):
                if m.version == self.object.version:
                    title = _("Current version")
                else:
                    change_time = m.change_date.astimezone(
                        pytz.timezone(self.request.user.extended.timezone))
                    title = change_time.strftime("%d.%m.%Y %H:%M:%S")
                    if m.author is not None:
                        title += " (%s)" % m.author.get_full_name()
                    if len(m.comment) > 0:
                        title += ': ' + m.comment
                context['versions'].append({
                    'version': m.version,
                    'title': title
                })
                if context['selected_version'] == m.version:
                    context['markdata'] = MarkData(self.kwargs['type'],
                                                   mark_version=m)
            if 'markdata' not in context:
                raise BridgeException(_('The mark version was not found'))
            context['cancel_url'] = reverse(
                'marks:mark', args=[self.kwargs['type'], self.object.id])
        else:
            if self.kwargs['type'] == 'unknown':
                try:
                    context['problem_description'] = \
                        ArchiveFileContent(self.object, 'problem_description', PROBLEM_DESC_FILE).content.decode('utf8')
                except Exception as e:
                    logger.exception(
                        "Can't get problem description for unknown '%s': %s" %
                        (self.object.id, e))
                    raise BridgeException()

            access = mutils.MarkAccess(self.request.user, report=self.object)
            if not access.can_create():
                raise BridgeException(
                    _("You don't have an access to create new marks"))
            context['report'] = self.object
            context['markdata'] = MarkData(self.kwargs['type'],
                                           report=self.object)
            context['cancel_url'] = reverse(
                'reports:{0}'.format(self.kwargs['type']),
                args=[
                    self.object.trace_id
                    if self.kwargs['type'] == 'unsafe' else self.object.id
                ])
        context['access'] = access
        return context
Ejemplo n.º 18
0
 def get_generator(self):
     decision = self.get_object()
     if not DecisionAccess(self.request.user,
                           decision).can_download_verifier_files:
         raise BridgeException(code=400)
     if 'filters' not in self.request.GET:
         raise BridgeException()
     return FilesForCompetitionArchive(
         decision, json.loads(self.request.GET['filters']))
Ejemplo n.º 19
0
 def __get_parent(self, identifier):
     parent = None
     if len(identifier) > 0:
         parent = get_job_by_identifier(identifier)
         if not self.__is_parent_valid(parent):
             raise BridgeException(_("The specified parent can't be set for this job"))
     elif self._user.extended.role != USER_ROLES[2][0]:
         raise BridgeException(_("The parent identifier is required for this job"))
     return parent
Ejemplo n.º 20
0
 def get_context_data(self, **kwargs):
     try:
         j1 = Job.objects.get(id=self.request.POST.get('job1', 0))
         j2 = Job.objects.get(id=self.request.POST.get('job2', 0))
     except ObjectDoesNotExist:
         raise BridgeException(code=405)
     if not can_compare(self.request.user, j1, j2):
         raise BridgeException(code=401)
     return {}
Ejemplo n.º 21
0
 def get_context_data(self, **kwargs):
     for job_id in json.loads(self.request.POST.get('jobs', '[]')):
         try:
             job = Job.objects.get(id=int(job_id))
         except ObjectDoesNotExist:
             raise BridgeException(code=405)
         if not jobs.utils.JobAccess(self.request.user, job).can_download():
             raise BridgeException(code=401)
     return {}
Ejemplo n.º 22
0
 def get_view(self, view_type):
     if not hasattr(self, 'request'):
         raise BridgeException()
     request = getattr(self, 'request')
     if view_type not in VIEW_TYPES:
         raise BridgeException()
     return ViewData(
         request.user, view_type,
         request.POST if request.method == 'POST' else request.GET)
Ejemplo n.º 23
0
 def __get_verdicts(self, verdict):
     m = re.match(r'^(\d)_(\d)$', verdict)
     if m is None:
         raise BridgeException()
     v1 = m.group(1)
     v2 = m.group(2)
     if any(v not in list(x[0] for x in COMPARE_VERDICT) for v in [v1, v2]):
         raise BridgeException()
     return v1, v2
Ejemplo n.º 24
0
 def post(self, *args, **kwargs):
     self.is_not_used(*args, **kwargs)
     self.object = self.get_object()
     try:
         return self.render_to_response(self.get_context_data(object=self.object))
     except BridgeException as e:
         raise BridgeException(e, back=reverse('jobs:prepare_run', args=[self.object.pk]))
     except Exception as e:
         logger.exception(e)
         raise BridgeException(back=reverse('jobs:prepare_run', args=[self.object.pk]))
Ejemplo n.º 25
0
    def get_context_data(self, **kwargs):
        if self.request.user.extended.role != USER_ROLES[2][0]:
            raise BridgeException(_("You don't have an access to upload jobs tree"))
        if Job.objects.filter(status__in=[JOB_STATUS[1][0], JOB_STATUS[2][0]]).count() > 0:
            raise BridgeException(_("There are jobs in progress right now, uploading may corrupt it results. "
                                    "Please wait until it will be finished."))

        jobs_dir = extract_archive(self.request.FILES['file'])
        UploadTree(self.request.POST['parent_id'], self.request.user, jobs_dir.name)
        return {}
Ejemplo n.º 26
0
 def post(self, *args, **kwargs):
     self.is_not_used(*args, **kwargs)
     try:
         return JsonResponse({'job_id': JobForm(self.request.user, self.get_object(),
                                                self.kwargs['action']).save(self.request.POST).id})
     except BridgeException as e:
         raise BridgeException(str(e), response_type='json')
     except Exception as e:
         logger.exception(e)
         raise BridgeException(response_type='json')
Ejemplo n.º 27
0
 def get_context_data(self, **kwargs):
     try:
         job1 = Job.objects.get(id=self.kwargs['job1_id'])
         job2 = Job.objects.get(id=self.kwargs['job2_id'])
     except ObjectDoesNotExist:
         raise BridgeException(code=405)
     if not jobs.utils.JobAccess(self.request.user, job1).can_view() \
             or not jobs.utils.JobAccess(self.request.user, job2).can_view():
         raise BridgeException(code=401)
     return {'job1': job1, 'job2': job2, 'data': jobs.utils.CompareFileSet(job1, job2).data}
Ejemplo n.º 28
0
 def __check_name(self, name):
     if len(name) == 0:
         raise BridgeException(_('The job name is required'))
     try:
         job = Job.objects.get(name=name)
     except ObjectDoesNotExist:
         return name
     if not self._copy and job.id == self._job.id:
         return name
     raise BridgeException(_('The job name is already used'))
Ejemplo n.º 29
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
Ejemplo n.º 30
0
def get_job_by_name_or_id(name_or_id):
    try:
        return Job.objects.get(name=name_or_id)
    except ObjectDoesNotExist:
        found_jobs = Job.objects.filter(identifier__startswith=name_or_id)
        if len(found_jobs) == 0:
            raise BridgeException(_('The job with specified identifier or name was not found'))
        elif len(found_jobs) > 1:
            raise BridgeException(_('Several jobs match the specified identifier, '
                                    'please increase the length of the job identifier'))
        return found_jobs[0]