创建用户

时间:2017-09-12 07:20:58

标签: python django

我对Django很新,我希望这就像我认为的那样容易。

我编写了一个自定义Django应用程序,它使用SaltStack作为后端来启动AWS实例。当实例出现时,它会添加使用SSH密钥创建它的用户。

我需要为每个用户提供UID和GID,以便我们可以在Linux主机上为他们创建用户帐户。现在,这需要管理员为每个新用户创建并在用户可以使用该工具之前手动更新管理界面中的这些字段。

我希望在创建用户时,Django可以通过配置文件搜索已经使用过的UID / GID,增加1,然后自动将其分配给新创建的用户

这是我的个人资料模型:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    linux_username = models.CharField(max_length=50, blank=True)
    linux_uid = models.CharField(max_length=10, blank=True)
    linux_gid = models.CharField(max_length=10, blank=True)
    linux_ssh_authkey = models.TextField(max_length=1000, blank=True)

@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.created(user=instance)
    instance.profile.save()

我希望这是有道理的 - 当用户注册时,他们会选择一个linux用户名并上传他们的SSH公钥。但是,我们仍然需要以管理员身份填写UID和GID字段。例如,我是4001,如果另一个用户注册,他将是4002。

有没有办法在update_user_profile函数中添加一小段代码来自动填充这些字段?

我已经尝试了一点点但是无法弄清楚如何轮询数据库以获取下一个可用的UID / GID并为新用户设置它。

非常感谢任何帮助!

谢谢!

2 个答案:

答案 0 :(得分:0)

是的,您可以为此覆盖Profile的save()方法。

class Profile(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   linux_username = models.CharField(max_length=50, blank=True)
   linux_uid = models.CharField(max_length=10, blank=True)
   linux_gid = models.CharField(max_length=10, blank=True)
   linux_ssh_authkey = models.TextField(max_length=1000, blank=True)

   def save(self, force_insert=False, force_update=False, using=None,
         update_fields=None):  
       if not self.id:
         try:
            last_user_profile = User.objects.latest('date_joined').profile
            self.linux_uid = str(int(last_user_profile.linux_uid)+1)
            self.linux_gid = str(int(last_user_profile.linux_gid)+1)
         except User.DoesNotExist:
           self.linux_uid = '0000'
           self.linux_gid = '0000'
       return super(Profile, self).save()

上面的代码将获取最新用户的个人资料,并将1添加到UID和GID并存储它。如果没有用户已经注册,它将为UID和GID提供默认值'0000'。

答案 1 :(得分:0)

我想我找到了答案,尽管可能有更好的方法来做到这一点。感谢Ajmal Noushad让我指向正确的方向。这是最终的代码对我有用 - 如果有更好的方法,请告诉我。

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    linux_username = models.CharField(max_length=50, blank=True)
    linux_uid = models.CharField(max_length=10, blank=True)
    linux_gid = models.CharField(max_length=10, blank=True)
    linux_ssh_authkey = models.TextField(max_length=1000, blank=True)


@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

    try:
        last_user_joined = User.objects.all().order_by('date_joined').reverse()[1].profile
        instance.profile.linux_uid = str(int(last_user_joined.linux_uid)+1)
        instance.profile.linux_gid = str(int(last_user_joined.linux_gid)+1)
    except User.DoesNotExist:
        instance.profile.linux_uid = '0000'
        instance.profile.linux_gid = '0000'

    instance.profile.save()

这将为用户创建配置文件,并使用列表中的下一个可用UID自动填充其UID,但它基于最后创建的用户,而不是最高的UID。因此,如果您创建用户并手动将UID设置为4002,而另一个用户已经拥有4003,则下一个用户也将自动获得4003。还有改进的余地,但我认为这暂时可行。

感谢大家的帮助!