def test_get_nonexistant_job_product(self):
     # make a deleted job:
     job = Job(job_name="counter")
     job.save()
     job_key = job.key()
     job.delete()
     
     response = self.client.get(reverse('jobs.product', args=(job_key,)))
     self.assertEqual(response.status_code, 404)
Exemple #2
0
    def test_get_nonexistant_job_product(self):
        # make a deleted job:
        job = Job(job_name="counter")
        job.save()
        job_key = job.key()
        job.delete()

        response = self.client.get(reverse('jobs.product', args=(job_key, )))
        self.assertEqual(response.status_code, 404)
Exemple #3
0
def create_job(kwargs):
    if 'name' not in kwargs or len(kwargs['name']) == 0:
        logger.error('The job name was not got')
        raise BridgeException()
    try:
        Job.objects.get(name=kwargs['name'])
    except ObjectDoesNotExist:
        pass
    else:
        raise BridgeException(_('The job name is already used'))

    if 'author' not in kwargs or not isinstance(kwargs['author'], User):
        logger.error('The job author was not got')
        raise BridgeException()
    newjob = Job(name=kwargs['name'], change_date=now(), change_author=kwargs['author'], parent=kwargs.get('parent'))

    if 'identifier' in kwargs and kwargs['identifier'] is not None:
        if Job.objects.filter(identifier=kwargs['identifier']).count() > 0:
            # This exception will be occurred only on jobs population (if for preset jobs identifier would be set)
            # or jobs uploading
            raise BridgeException(_('The job with specified identifier already exists'))
        newjob.identifier = kwargs['identifier']
    else:
        time_encoded = now().strftime("%Y%m%d%H%M%S%f%z").encode('utf-8')
        newjob.identifier = hashlib.md5(time_encoded).hexdigest()
    newjob.save()

    new_version = create_version(newjob, kwargs)

    if 'filedata' in kwargs:
        try:
            SaveFileData(kwargs['filedata'], new_version)
        except Exception as e:
            logger.exception(e)
            newjob.delete()
            raise BridgeException()
    if 'absolute_url' in kwargs:
        # newjob_url = reverse('jobs:job', args=[newjob.pk])
        # Notify(newjob, 0, {'absurl': kwargs['absolute_url'] + newjob_url})
        pass
    else:
        # Notify(newjob, 0)
        pass
    return newjob
Exemple #4
0
class JobForm:
    def __init__(self, user, job, action):
        self._user = user
        self._job = job
        self._copy = (action == 'copy')

    def get_context(self):
        data = {
            'job_id': self._job.id, 'name': self._job.name, 'parent': '',
            'description': self.job_version().description,
            'copy': self._copy, 'versions': []
        }

        # Get list of versions
        for j_version in self._job.versions.order_by('-version'):
            if self._job.version == j_version.version:
                title = _("Current version")
            else:
                job_time = j_version.change_date.astimezone(pytz.timezone(self._user.extended.timezone))
                title = '%s (%s): %s' % (
                    job_time.strftime("%d.%m.%Y %H:%M:%S"),
                    j_version.change_author.get_full_name(), j_version.comment)
            data['versions'].append({'version': j_version.version, 'title': title})

        if self._copy:
            data['parent'] = self._job.identifier
        else:
            if self._job.parent:
                data['parent'] = self._job.parent.identifier
        return data

    def job_version(self):
        return self._job.versions.get(version=self._job.version)

    def __is_parent_valid(self, parent):
        if self._copy:
            return True
        if self._job.parent == parent:
            return True
        while parent is not None:
            if parent.id == self._job.id:
                return False
            parent = parent.parent
        return True

    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

    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'))

    def __create_version(self, data):
        new_version = JobHistory(
            job=self._job, version=self._job.version, change_author=self._user,
            comment=data.get('comment', ''), description=data.get('description', '')
        )
        if 'global_role' in data and data['global_role'] in set(x[0] for x in JOB_ROLES):
            new_version.global_role = data['global_role']
        new_version.save()

        if 'user_roles' in data:
            try:
                UserRolesForm(self._user, new_version).save(data['user_roles'])
            except Exception:
                new_version.delete()
                raise
        if 'file_data' in data:
            try:
                UploadFilesTree(new_version, data['file_data'])
            except Exception:
                new_version.delete()
                raise
        return new_version

    def __create_job(self, data):
        if 'identifier' in data and data['identifier'] is not None:
            if Job.objects.filter(identifier=data['identifier']).count() > 0:
                raise BridgeException(_('The job with specified identifier already exists'))
            identifier = data['identifier']
        else:
            identifier = hashlib.md5(now().strftime("%Y%m%d%H%M%S%f%z").encode('utf-8')).hexdigest()

        self._job = Job(
            identifier=identifier, name=self.__check_name(data.get('name', '')), change_date=now(),
            parent=self.__get_parent(data.get('parent', ''))
        )
        if 'weight' in data and data['weight'] in list(x[0] for x in JOB_WEIGHT):
            self._job.weight = data['weight']
        self._job.save()

        try:
            new_version = self.__create_version(data)
        except Exception:
            self._job.delete()
            raise
        self._job.change_author = new_version.change_author
        self._job.change_date = new_version.change_date
        self._job.save()

    def __update_job(self, data):
        if self._job.version != int(data.get('last_version', 0)):
            raise BridgeException(_("Your version is expired, please reload the page"))

        self._job.parent = self.__get_parent(data.get('parent', ''))
        self._job.name = self.__check_name(data.get('name', ''))
        self._job.version += 1

        new_version = self.__create_version(data)
        self._job.change_author = new_version.change_author
        self._job.change_date = new_version.change_date
        self._job.save()

    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