示例#1
0
def verify_parameter_uniquesness(sender, **kwargs):
    parameter = kwargs.get('instance', None)
    if not isinstance(parameter, AbstractInteractionParameter):
        return
    cls = type(parameter)
    compounds_set = kwargs.get('pk_set', None)
    action = kwargs.get('action', None)
    if action in ('pre_add', ):
        if parameter.compounds.all().distinct().count() == 2:
            raise IntegrityError(
                'This interaction parameter has its compounds '
                'already defined')
        if len(compounds_set) == 2:
            compounds = list(compounds_set)
            qs = cls.objects.filter(
                compounds__id=compounds[0],
                eos=parameter.eos).filter(compounds__id=compounds[1])
        else:
            qs = cls.objects.filter(compounds__in=parameter.compounds.all()).\
                    filter(compounds__id__in=compounds_set, eos=parameter.eos)

        if parameter.setup:
            qs = qs.filter(setup=parameter.setup)
        else:
            qs = qs.filter(setup__isnull=True)

        if parameter.user:
            qs = qs.filter(user=parameter.user)
        else:
            qs = qs.filter(user__isnull=True)

        if qs.exists():
            raise IntegrityError(
                'Already exists a parameter matching these condition')
示例#2
0
    def save(self):
        '''
        Speichert das Objekt ab. Zuvor wird eine Reihe von Validierungen durchgeführt.

        Validierungen:

        * Name innerhalb des Projekts nicht eindeutig.
        * Fälligkeitsdatum liegt in der Vergangenheit.
        * Projekt ist bereits geschlossen.

        .. throws: IntegrityError Falls eine der Validierungen fehlschlägt.

        '''

        if Aufgabe.objects.filter(titel=self.titel, projekt=self.projekt).exclude(pk=self.pk).count() != 0:
            raise IntegrityError(c.FEHLER_AUFGABE_NAME)
        if self.faelligkeitsDatum < timezone.now():
            raise IntegrityError(c.FEHLER_AUFGABE_DATUM)
        if self.projekt.status == c.PROJEKT_STATUS_CL:
            raise IntegrityError(c.FEHLER_AUFGABE_PROJEKTSTATUS)
        if self.bearbeiter and self.status == c.AUFGABE_STATUS_OP:
            self.status = c.AUFGABE_STATUS_IP
        if not self.bearbeiter and self.status == c.AUFGABE_STATUS_IP:
            self.status = c.AUFGABE_STATUS_OP

        super(Aufgabe, self).save()
示例#3
0
def validating_students(sender, **kwargs):
    action = kwargs.get('action')
    reverse = kwargs.get('reverse')

    if action == 'pre_add':
        if reverse:
            student = kwargs.get('instance')
            dsessions = kwargs.get('pk_set')
            college = student.college
            for dsession in dsessions:
                dsession = DummySession.objects.get(pk=dsession)
                if dsession.dummy_company.college != college:
                    raise IntegrityError(
                        _('Student doesn\'t belong to this college, thus cannot be added to the session.'
                          ))
        else:
            dsession = kwargs.get('instance')
            students = kwargs.get('pk_set')
            college = dsession.dummy_company.college
            for student in students:
                student = Student.studying.get(
                    pk=student
                )  # Only currently studying students can be added to a session
                if student.college != college:
                    raise IntegrityError(
                        _('Student %s doesn\'t belong to this college, thus cannot be added to the session.'
                          % (student.profile.username)))
示例#4
0
 def clean(self):
     super().clean(self)
     if self.bookmark is None:
         if self.comment is None:
             raise IntegrityError(
                 'A like must be made to either a bookmark or comment')
         elif self.comment is not None:
             raise IntegrityError(
                 'A like cannot be made to both a bookmark and a comment')
示例#5
0
def validate_requester(sender, **kwargs):
	requester = kwargs.get('instance')
	user = requester.requester
	if user.type not in ['C', 'CO', 'F']:
		raise IntegrityError('This user type is not allowed to create download requestes')
	batch = requester.requested.batch
	if user.type == 'CO':
		if not user.company.associations.filter(college=batch.college, approved=True).exists():
			raise IntegrityError('The company requesting doesn\'t have any session with requested college')
	def clean(self, *args, **kwargs):
		super(SelectionCriteria, self).clean()
		years = self.years.split(',')
		for each in years:
			if not each and len(years) > 1:
				raise IntegrityError(_('There must not be any spaces in the years.'))
			elif len(each) > 1:
				raise IntegrityError(_('Make sure the year is entered in the proper desired format'))
			elif each.isalpha() and int(each) > 6:
				raise IntegrityError(_('Maximum year value can be 6.'))
示例#7
0
def validate_student(sender, **kwargs):
    student = kwargs.pop('instance')
    college = student.college
    course = student.course
    if college and course:
        if not college.courses.filter(pk=course.pk):
            raise IntegrityError(_("Invalid college and course options."))
        elif int(student.year) > int(student.course.max_years):
            raise IntegrityError(
                _("Invalid current year. Exceeds the max duration offered by the course."
                  ))
示例#8
0
文件: orm.py 项目: kcns008/maas
def make_unique_violation():
    """Make a serialization exception.

    Artificially construct an exception that resembles what Django's ORM would
    raise when PostgreSQL fails a transaction because of a unique violation.

    :returns: an instance of :py:class:`IntegrityError` that will pass the
        `is_unique_violation` predicate.
    """
    exception = IntegrityError()
    exception.__cause__ = UniqueViolation()
    assert is_unique_violation(exception)
    return exception
示例#9
0
def enforce_blacklist(sender, instance, **kwargs):
    """
    Prevents certain usernames from being created

    Checks usernmames against settings.BLACKLISTED_USERNAMES
    """
    if instance is not None:
        username = instance.username.lower()
        if not username:
            raise IntegrityError("Username required.")
        if username in [x.lower() for x in settings.BLACKLISTED_USERNAMES]:
            raise IntegrityError(
                "Failed to create user. The name {0} is reserved"
                "for DataHub use.".format(username))
def validating_students(sender, **kwargs):
	session = kwargs.get('instance', None)
	action = kwargs.get('action', None)
	reverse = kwargs.get('reverse')
	
	if action == 'pre_add' and not reverse: # Validation when reverse=True, i.e. student has applied using the form, is taken care of in the views
		# Validating if the admin adds incorrectly
			students = kwargs.get('pk_set', None)
			for student in students:
				student = Student.studying.get(pk=student) # Only currently studying students can be addded to a session
				if student.college != session.association.college:
					raise IntegrityError(_('Student %s doesn\'t belong to this college, thus cannot be added to the session.'))
				if not session.association.streams.filter(pk=student.stream.pk).exists():
					raise IntegrityError(_('Student %s doesn\'t belong to this programme, thus cannot be added to the session.'))
示例#11
0
def comment_block(request, object):
    """
    Returns the info needed to be used with the comments template

    Params:
        request: The request instance
        object: The object to comment on (for instance an Event)
    """

    if 'new_comment' in request.POST:
        comment_form = CommentForm(object, request.POST)

        if comment_form.is_valid():

            comment = comment_form.save(commit=False)
            comment.user = request.user
            comment.save()

            comment_form = CommentForm(object)

            request.message_success(_("Comment added successfully!"))

    else:
        comment_form = CommentForm(object)

    try:
        object.comments
    except:
        raise IntegrityError(
            "Models using comments should have a generic relation named 'comments' to the Comment model!"
        )
    return {'form': comment_form, 'list': object.comments.all()}
示例#12
0
def signup(request):
    if request.method == 'POST':
        try:
            req_data = json.loads(request.body.decode())
            username = req_data["username"]
            email = req_data["email"]
            password = req_data["password"]
            role = req_data["role"]
        except (KeyError, JSONDecodeError) as error:
            return HttpResponseBadRequest(error)

        try:
            same_name = User.objects.filter(username=username).count()
            same_email = User.objects.filter(email=email).count()
            if same_name > 0 or same_email > 0:
                raise IntegrityError()
            user = User.objects.create_user(
                username=username, email=email, salt="", role=role, password=password)
            if role == User.Role.Coder:
                Coder(user=user).save()
            elif role == User.Role.Manager:
                Manager(user=user).save()
            elif role == User.Role.Researcher:
                Researcher(user=user).save()
        except IntegrityError:
            return HttpResponse(status=409)

        return HttpResponse(status=201)

    return HttpResponseNotAllowed(['POST'])
示例#13
0
def cart_pre_save(sender, instance, **kwargs):
    # There can only be one active (uncheckedout) cart
    try:
        cart = Cart.objects.filter(user=instance.user, checked_out=False)
        if cart.count() > 1: raise IntegrityError('This user already have an active cart')
    except Cart.DoesNotExist:
        pass
示例#14
0
    def save_return_table(self, table_name, table_rows, request):
        """
        Persist Return Table of data to database.
        :param table_name:
        :param table_rows:
        :param request:
        :return:
        """
        try:
            # wrap atomic context here to allow natural handling of a Record
            # Modified concurrent error. (optimistic lock)
            # get the Return Table record and save immediately to check if
            # it has been concurrently modified.
            return_table, created = ReturnTable.objects.get_or_create(
                name=table_name, ret=self)
            return_table.save()
            # delete any existing rows as they will all be recreated
            return_table.returnrow_set.all().delete()
            return_rows = [
                ReturnRow(return_table=return_table, data=row)
                for row in table_rows
            ]

            ReturnRow.objects.bulk_create(return_rows)

            # log transaction
            self.log_user_action(
                ReturnUserAction.ACTION_SAVE_REQUEST.format(self), request)

        except RecordModifiedError:
            raise IntegrityError(
                'A concurrent save occurred please refresh page details.')
        except BaseException:
            raise
示例#15
0
    def check_restrictions_multiple_voters(voting_id, voters):
        """
        This method checks all the conditions that must be satisfied in order for the census objects to be created:

        1. The voting id must exist.
        2. All the voters ids must exist.
        3. All the census objects must not already exist in the database.
        4. All the voters must pass the voting age and gender restricctions if any.

        :return: True if all conditions are passed, an Exception is raised otherwise.
        """

        # This will fail if any of the elements does not exist
        voting = Voting.objects.get(id=voting_id)
        users = []
        invalid_ids = []
        for voter_id in voters:
            try:
                users.append(User.objects.get(id=voter_id))
            except ObjectDoesNotExist:
                invalid_ids.append(voter_id)

        if len(invalid_ids) > 0:
            raise ValidationError(
                'The following user IDs aren\'t valid: {}'.format(invalid_ids))

        for user in users:
            if Census.objects.filter(voting_id=voting_id,
                                     voter_id=user.id).count():
                raise IntegrityError(
                    'The user "{}" with id "{}" is already in this census'.
                    format(user.username, user.id))
            Census.gender_and_age(voting, user)

        return True
示例#16
0
    def check_restrictions_multiple_voters(voting_id, voters):
        """
        This method checks all the conditions that must be satisfied in order for the census objects to be created:

        1. The voting id must exist.
        2. All the voters ids must exist.
        3. All the census objects must not already exist in the database.
        4. All the voters must pass the voting age and gender restricctions if any.

        :return: True if all conditions are passed, an Exception is raised otherwise.
        """

        # This will fail if any of the elements does not exist
        voting = Voting.objects.get(id=voting_id)
        users = [User.objects.get(id=voter_id) for voter_id in voters]

        for voter_id in voters:
            if Census.objects.filter(voting_id=voting_id,
                                     voter_id=voter_id).count():
                raise IntegrityError(
                    'Conflict: The census (voting_id:{},voter_id:{}) already exists'
                    .format(voting_id, voter_id))

        for user in users:
            Census.gender_and_age(voting, user)

        return True
示例#17
0
文件: app.py 项目: ymd-one/arkid-core
    def save(self, *args, **kwargs):  # pylint: disable=arguments-differ
        if APP.valid_objects.filter(uid=self.uid).exclude(pk=self.pk).exists():
            msg = "UNIQUE constraint failed: " \
                "oneid_meta.APP UniqueConstraint(fields=['uid'], condition=Q(is_del='False')"
            raise IntegrityError(msg)

        super(APP, self).save(*args, **kwargs)
 def update(self,
            filename=None,
            batch_id=None,
            prev_batch_id=None,
            producer=None,
            count=None):
     """Creates an history model instance.
     """
     # TODO: refactor model enforce unique batch_id
     # TODO: refactor model to not allow NULLs
     if not filename:
         raise BatchHistoryError('Invalid filename. Got None')
     if not batch_id:
         raise BatchHistoryError('Invalid batch_id. Got None')
     if not prev_batch_id:
         raise BatchHistoryError('Invalid prev_batch_id. Got None')
     if not producer:
         raise BatchHistoryError('Invalid producer. Got None')
     if self.exists(batch_id=batch_id):
         raise IntegrityError('Duplicate batch_id')
     try:
         obj = self.model.objects.get(batch_id=batch_id)
     except self.model.DoesNotExist:
         obj = self.model(filename=filename,
                          batch_id=batch_id,
                          prev_batch_id=prev_batch_id,
                          producer=producer,
                          total=count)
         obj.transaction_file.name = filename
         obj.save()
     return obj
示例#19
0
 def clean(self):
     for player in self.players.all():
         if Team.objects.filter(league=self.league).exclude(
                 id=self.pk).filter(players__name=player.name):
             raise IntegrityError(
                 '%s is already on a team in this league: %s' %
                 (player.name, self.name))
示例#20
0
    def _make_result(self, entity, fields):
        """
        Decodes values for the given fields from the database entity.

        The entity is assumed to be a dict using field database column
        names as keys. Decodes values using `value_from_db` as well as
        the standard `convert_values`.
        """
        result = []
        for field in fields:
            value = entity.get(field.column, NOT_PROVIDED)
            if value is NOT_PROVIDED:
                value = field.get_default()
            else:
                value = self.ops.value_from_db(value, field)
                # This is the default behavior of ``query.convert_values``
                # until django 1.8, where multiple converters are a thing.
                value = self.connection.ops.convert_values(value, field)

                if hasattr(field, "from_db_value"):
                    value = field.from_db_value(value, None, self.connection,
                                                None)
            if value is None and not field.null:
                raise IntegrityError("Non-nullable field %s can't be None!" %
                                     field.name)
            result.append(value)
        return result
示例#21
0
    def execute_sql(self, return_id=False):
        field_values = {}
        pk = self.query.get_meta().pk
        for (field, value), column in zip(self.query.values,
                                          self.query.columns):

            # Raise an exception for non-nullable fields without a value.
            if field is not None:
                if not field.null and value is None:
                    raise IntegrityError("You can't set %s (a non-nullable "
                                         "field) to None!" % field.name)

            # Use the primary key field when our sql.Query provides a
            # value without a field.
            if field is None:
                field = pk
            assert field.column == column
            assert field not in field_values

            # Prepare value for database, note that query.values have
            # already passed through get_db_prep_save.
            value = self.ops.value_for_db(value, field)

            field_values[field] = value

        key = self.insert(field_values, return_id=return_id)

        # Pass the key value through normal database deconversion.
        return self.ops.convert_values(self.ops.value_from_db(key, pk), pk)
示例#22
0
def users(replace: bool = False,
          ignore_errors: bool = False) -> Dict[str, str]:
    """Initializes users preconfigured in 'accounts.yaml' in the 'configs' directory
    See the '_users_output' function for how the emails and passwords are stored

    :param replace: Replace existing users with the ones specified in the init configuration
    :param ignore_errors: Ignore errors and continue the initialization process
    :return: A dictionary containing new superusers' username as keys and passwords as values
    """

    user_list = dict()
    if 'users' in configs.resolve('accounts.init'):
        for user_config in configs.resolve('accounts.init.users'):
            try:
                if replace:
                    try:
                        user = CustomUser.objects.get_by_natural_key(
                            user_config['username'])
                        user.delete()
                        verbose.warn("User '%s' found and deleted" %
                                     user_config['username'])

                    except ObjectNotFound:
                        pass

                user = CustomUser.objects.create_user(user_config['username'],
                                                      user_config['email'],
                                                      user_config['password'])

                if 'groups' in user_config:
                    user.groups.set([
                        Group.objects.get_by_natural_key(g)
                        for g in user_config['groups']
                    ])

                if 'permissions' in user_config:
                    user.user_permissions.set([
                        Permission.objects.get(codename=p)
                        for p in user_config['permissions']
                    ])

                [
                    setattr(user, k, v) for k, v in user_config.items()
                    if k not in ('username', 'password', 'email', 'groups',
                                 'permissions')
                ]

                user.save()
                user_list[user_config['email']] = user_config['password']

            except IntegrityError:
                message = "User '%s' or email '%s' already exists" % (
                    user_config['username'], user_config['email'])
                if ignore_errors:
                    verbose.error(message)
                else:
                    raise IntegrityError(message)

    _users_output(user_list, 'users')
    return user_list
示例#23
0
def siswa_pre_save(sender, instance, **kwargs):
    try:
        siswa = Siswa.objects.filter(Q(nis=instance.nis) | Q(nisn=instance.nisn))
        if siswa and instance not in siswa:
            raise IntegrityError('NIS or NISN must be unique.')
    except ObjectDoesNotExist:
        pass
示例#24
0
def create_provider(provider):
    """
    Creating HostProvider object

    :param provider: HostProvider object in dictionary format
    :type provider: dict
    :return: HostProvider object
    :rtype: models.HostProvider
    """
    bundle_hash = provider.pop('bundle_hash')
    ex_id = provider.pop('id')
    try:
        same_name_provider = HostProvider.objects.get(name=provider['name'])
        if same_name_provider.prototype.bundle.hash != bundle_hash:
            raise IntegrityError(
                'Name of provider already in use in another bundle')
        create_file_from_config(same_name_provider, provider['config'])
        return ex_id, same_name_provider
    except HostProvider.DoesNotExist:
        prototype = get_prototype(bundle_hash=bundle_hash, type='provider')
        config = provider.pop('config')
        provider = HostProvider.objects.create(prototype=prototype,
                                               config=create_config(config),
                                               **provider)
        create_file_from_config(provider, config)
        return ex_id, provider
示例#25
0
    def clone(self, user):
        ''' clone this map for a specific user '''
        usermap = Map.objects.filter(name=self.name, user=user).first()
        if usermap:
            raise IntegrityError('Map already exists.')

        # query groups and evaluate queryset
        groups = list(self.group_set.all())

        # clone ourselves
        usermap = self
        usermap.pk = None
        usermap.user = user
        usermap.save()

        # clone groups and layers
        for group in groups:
            # query layers and evaluate queryset
            layers = list(group.layer_set.all())
            group.pk = None
            group.map = usermap
            group.save()
            for layer in layers:
                layer.pk = None
                layer.map = usermap
                layer.group = group
                layer.save()

        return usermap
示例#26
0
def set_id_random(account, tries=3):
    '''
    Attempt to generate and save unique account.id_random
    :param int tries: to generate unique id_random field (> 0)
    '''
    if account.id_random:
        return

    id_rand = False

    # make sure we do not overwrite existing id with new one
    if account.pk:
        checked_data = account.__class__.objects.values('id_random').get(
            pk=account.pk)
        if checked_data and 'id_random' in checked_data:
            id_rand = checked_data['id_random']

    if not id_rand:

        # Try to generate unique `id_random` field
        for i in range(tries):
            id_rand = id_random()
            if not account.__class__.objects.filter(
                    id_random=id_rand).exists():
                break
        else:
            error = "Could not produce unique ID for {0} model.".format(
                type(account))
            raise IntegrityError(error)

    account.id_random = id_rand
    def create_module(self, module_code, module_name, module_credits,
                      module_level, semester, delivery_language,
                      module_leader):
        """
        Method to create a module model
        """
        # ensure that module leader is not None
        if module_leader is None:
            raise IntegrityError("Module Leader cannot be None")

        # check that credits do not exceed ranges
        if module_credits < 10 or module_credits > 120:
            raise ValueError(
                "Module credits must be between 10 to 120 credits")

        model = self.model.objects.create(module_code=module_code,
                                          module_name=module_name,
                                          module_credits=module_credits,
                                          module_level=module_level,
                                          semester=semester,
                                          delivery_language=delivery_language,
                                          module_leader=module_leader)

        module_leader.is_module_leader = True
        module_leader.save()
        return model
    def get_prep_value(self, value: LocalizedIntegerValue) -> dict:
        """Gets the value in a format to store into the database."""

        # apply default values
        default_values = LocalizedIntegerValue(self.default)
        if isinstance(value, LocalizedIntegerValue):
            for lang_code, _ in settings.LANGUAGES:
                local_value = value.get(lang_code)
                if local_value is None:
                    value.set(lang_code, default_values.get(lang_code, None))

        prepped_value = super().get_prep_value(value)
        if prepped_value is None:
            return None

        # make sure all values are proper integers
        for lang_code, _ in settings.LANGUAGES:
            local_value = prepped_value[lang_code]
            try:
                if local_value is not None:
                    int(local_value)
            except (TypeError, ValueError):
                raise IntegrityError(
                    'non-integer value in column "%s.%s" violates '
                    "integer constraint" % (self.name, lang_code))

            # convert to a string before saving because the underlying
            # type is hstore, which only accept strings
            prepped_value[lang_code] = (str(local_value)
                                        if local_value is not None else None)

        return prepped_value
示例#29
0
    def execute_sql(self, return_id=False):
        self.pre_sql_setup()

        to_insert = []
        pk_field = self.query.get_meta().pk
        for obj in self.query.objs:
            field_values = {}
            for field in self.query.fields:
                value = field.get_db_prep_save(
                    getattr(obj, field.attname) if self.query.raw else
                    field.pre_save(obj, obj._state.adding),
                    connection=self.connection)
                if value is None and not field.null and not field.primary_key:
                    raise IntegrityError("You can't set %s (a non-nullable "
                                         "field) to None!" % field.name)

                # Prepare value for database, note that query.values have
                # already passed through get_db_prep_save.
                value = self.ops.value_for_db(value, field)

                field_values[field.column] = value
            to_insert.append(field_values)

        key = self.insert(to_insert, return_id=return_id)

        # Pass the key value through normal database deconversion.
        return self.ops.convert_values(self.ops.value_from_db(key, pk_field),
                                       pk_field)
示例#30
0
def create_user_db_and_data_folder_if_needed(sender, instance, **kwargs):
    """
    Creates a Postgres role and db and data folder to go with new Django users.

    Raises an exception if the role, database, or user data folder exists
    before this user.
    """
    username = instance.username
    hashed_password = instance.password

    # The Django user doesn't exist yet, so we can't just try to create a
    # DataHubManager connection as the user. We need to act as the db
    # superuser and check for any existing db role or database.
    db_exists = DataHubManager.database_exists(username)
    user_exists = DataHubManager.user_exists(username)
    user_data_folder_exists = DataHubManager.user_data_folder_exists(username)
    if db_exists and user_exists and user_data_folder_exists:
        # Make sure new users don't inherit orphaned roles or databases that
        # are missing a matching Django user.
        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            raise IntegrityError("Failed to create user. That name is already"
                                 " in use by an orphaned user.")
    elif not db_exists and not user_exists and not user_data_folder_exists:
        try:
            DataHubManager.create_user(username=username,
                                       password=hashed_password)
        except OperationalError:
            raise
    else:
        raise Exception("Failed to create user. That name is already"
                        " in use by either a role, database, or data folder.")