diff --git a/users/migrations/0074_auto_20180814_1059.py b/users/migrations/0074_auto_20180814_1059.py index ced792f4..e3e8527f 100644 --- a/users/migrations/0074_auto_20180814_1059.py +++ b/users/migrations/0074_auto_20180814_1059.py @@ -15,7 +15,7 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='user', name='email', - field=models.EmailField(blank=True, help_text='External email address allowing us to contact you.', max_length=254), + field=models.EmailField(blank=True, null=True, help_text='External email address allowing us to contact you.', max_length=254), ), migrations.AlterField( model_name='user', diff --git a/users/models.py b/users/models.py index 7331a460..0fe2cd62 100755 --- a/users/models.py +++ b/users/models.py @@ -104,6 +104,7 @@ def linux_user_validator(login): params={'label': login}, ) + def get_fresh_user_uid(): """ Renvoie le plus petit uid non pris. Fonction très paresseuse """ uids = list(range( @@ -131,6 +132,7 @@ def get_fresh_gid(): class UserManager(BaseUserManager): """User manager basique de django""" + def _create_user( self, pseudo, @@ -197,6 +199,7 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, ) email = models.EmailField( blank=True, + null=True, help_text="External email address allowing us to contact you." ) local_email_redirect = models.BooleanField( @@ -563,13 +566,15 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, user_ldap.gid = LDAP['user_gid'] if '{SSHA}' in self.password or '{SMD5}' in self.password: # We remove the extra $ added at import from ldap - user_ldap.user_password = self.password[:6] + self.password[7:] + user_ldap.user_password = self.password[:6] + \ + self.password[7:] elif '{crypt}' in self.password: # depending on the length, we need to remove or not a $ - if len(self.password)==41: + if len(self.password) == 41: user_ldap.user_password = self.password else: - user_ldap.user_password = self.password[:7] + self.password[8:] + user_ldap.user_password = self.password[:7] + \ + self.password[8:] user_ldap.sambat_nt_password = self.pwd_ntlm.upper() if self.get_shell: @@ -614,7 +619,7 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, send_mail( 'Bienvenue au %(name)s / Welcome to %(name)s' % { 'name': AssoOption.get_cached_value('name') - }, + }, '', GeneralOption.get_cached_value('email_from'), [self.email], @@ -657,8 +662,8 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, une machine inconnue sur le compte de l'user""" all_interfaces = self.user_interfaces(active=False) if all_interfaces.count() > OptionalMachine.get_cached_value( - 'max_lambdauser_interfaces' - ): + 'max_lambdauser_interfaces' + ): return False, "Maximum de machines enregistrees atteinte" if not nas_type: return False, "Re2o ne sait pas à quel machinetype affecter cette\ @@ -961,7 +966,7 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, 'force': self.can_change_force, 'selfpasswd': self.check_selfpasswd, 'local_email_redirect': self.can_change_local_email_redirect, - 'local_email_enabled' : self.can_change_local_email_enabled, + 'local_email_enabled': self.can_change_local_email_enabled, } self.__original_state = self.state @@ -969,9 +974,22 @@ class User(RevMixin, FieldPermissionModelMixin, AbstractBaseUser, """Check if this pseudo is already used by any mailalias. Better than raising an error in post-save and catching it""" if (EMailAddress.objects - .filter(local_part=self.pseudo.lower()).exclude(user_id=self.id) + .filter(local_part=self.pseudo.lower()).exclude(user_id=self.id) ): raise ValidationError("This pseudo is already in use.") + if not self.local_email_enabled and not self.email: + raise ValidationError( + {'email': ( + 'There is neither a local email address nor an external' + ' email address for this user.' + ), } + ) + if self.local_email_redirect and not self.email: + raise ValidationError( + {'local_email_redirect': ( + 'You cannot redirect your local email if no external email ' + 'has been set.'), } + ) def __str__(self): return self.pseudo @@ -1109,7 +1127,8 @@ def user_post_save(**kwargs): Synchronise le ldap""" is_created = kwargs['created'] user = kwargs['instance'] - EMailAddress.objects.get_or_create(local_part=user.pseudo.lower(), user=user) + EMailAddress.objects.get_or_create( + local_part=user.pseudo.lower(), user=user) if is_created: user.notif_inscription() user.state_sync() @@ -1132,6 +1151,7 @@ def user_group_relation_changed(**kwargs): mac_refresh=False, group_refresh=True) + @receiver(post_delete, sender=Adherent) @receiver(post_delete, sender=Club) @receiver(post_delete, sender=User) @@ -1520,7 +1540,7 @@ class Request(models.Model): hours=GeneralOption.get_cached_value( 'req_expire_hrs' ) - )) + )) if not self.token: self.token = str(uuid.uuid4()).replace('-', '') # remove hyphens super(Request, self).save() @@ -1810,4 +1830,3 @@ class EMailAddress(RevMixin, AclMixin, models.Model): if "@" in self.local_part: raise ValidationError("The local part cannot contain a @") super(EMailAddress, self).clean(*args, **kwargs) -