Skip to content

Instantly share code, notes, and snippets.

@fandrefh
Created July 29, 2020 17:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save fandrefh/ff6d8bbe047654174aa699072589539a to your computer and use it in GitHub Desktop.
Save fandrefh/ff6d8bbe047654174aa699072589539a to your computer and use it in GitHub Desktop.
# models.py
class User(AbstractBaseUser, PermissionsMixin):
username_validator = UnicodeUsernameValidator()
id = models.UUIDField(verbose_name=_('ID'), primary_key=True, default=uuid.uuid4, editable=False)
username = models.CharField(
_('Usuário'),
max_length=150,
unique=True,
help_text=_('Obrigatório. 150 caracteres ou menos. Letras, números e os símbolos @/./+/-/_ são permitidos.'),
validators=[username_validator],
error_messages={
'unique': _("Já existe um usuário com este username."),
},
blank=True, null=True
)
full_name = models.CharField(verbose_name=_('Nome'), max_length=150)
address = models.CharField(verbose_name=_('Endereço'), max_length=200, blank=True, default='')
area = models.CharField(verbose_name=_('Bairro'), max_length=50, blank=True, default='')
state = models.CharField(verbose_name=_('Estado'), max_length=2, choices=STATE_CHOICES, blank=True, default='')
city = models.CharField(verbose_name=_('Cidade'), max_length=50, blank=True, default='')
zip_code = models.CharField(verbose_name=_('CEP'), max_length=10, blank=True, default='')
complement = models.CharField(verbose_name=_('Complemento'), max_length=100, blank=True, default='')
cell_phone = models.CharField(verbose_name=_('Celular'), max_length=14, blank=True, default='')
cpf = models.CharField(verbose_name=_('CPF'), max_length=14, blank=True, null=True, unique=True)
rg = models.CharField(verbose_name=_('RG'), max_length=50, blank=True, null=True, unique=True)
birthday = models.DateField(verbose_name=_('Nascimento'), blank=True, null=True)
email = models.EmailField(verbose_name=_('E-mail'), unique=True)
photo = models.ImageField(verbose_name=_('Foto'), upload_to='photos', blank=True, default='')
is_staff = models.BooleanField(verbose_name=_('Staff'), default=False, help_text=_('Pode logar no Admin'))
is_active = models.BooleanField(
verbose_name=_("Ativo"),
default=True,
help_text=_('Desmarque esta opção em vez de deletar o usuário')
)
date_joined = models.DateTimeField(verbose_name=_('Data de cadastro'), default=timezone.now, editable=False)
objects = UserManager()
EMAIL_FIELD = 'email'
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['full_name']
class Meta:
verbose_name = _('Usuário')
verbose_name_plural = _('Usuários')
permissions = [
('jn_can_access_courses', _('Pode acessar os cursos')),
('jn_can_access_articles', _('Pode acessar os artigos')),
('jn_can_access_coaches', _('Pode contratar os Coaches')),
]
swappable = "AUTH_USER_MODEL"
def get_username(self):
return self.username
def get_full_name(self):
return self.full_name
def get_short_name(self):
short_name = self.full_name.split()[0] + ' ' + self.full_name.split()[-1]
return short_name.strip()
def email_user(self, subject, message, from_email=None, **kwargs):
send_mail(subject, message, from_email, [self.email], **kwargs)
@property
def pk(self):
return self.id.urn[9:]
# managers.py
class UserManager(BaseUserManager):
use_in_migrations = True
def _create_user(self, username, email, password, **extra_fields):
"""
Creates and saves a User with the given email and password.
"""
if not email:
raise ValueError(_('O e-mail é obrigatório'))
if username is None:
username = get_unique_username(email)
email = self.normalize_email(email)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, password=None, username=None, **extra_fields):
extra_fields.setdefault('is_superuser', False)
return self._create_user(username=username, email=email, password=password, **extra_fields)
def create_superuser(self, email, password, username=None, **extra_fields):
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_superuser') is not True:
raise ValueError(_('Super usuário precisa ter is_superuser=True'))
return self._create_user(username=username, email=email, password=password, **extra_fields)
# views.py
# Essa views foi só para testar a persistência
def add_user(request):
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
form.save()
form = UserForm()
return render(request, 'add_user.html', {'form': form})
@dannluciano
Copy link

E o form? E o template?

@fandrefh
Copy link
Author

forms.py

class UserForm(forms.ModelForm):

class Meta:
    model = User
    fields = ['full_name', 'email', 'password']

Template

{% csrf_token %}

Teste

{{ form.as_p }} Adicionar

Tá na mão!

@fandrefh
Copy link
Author

<form method="post">
    {% csrf_token %}
    <h1>Teste</h1>
    {{ form.as_p }}
    <button type="submit">Adicionar</button>
</form>
# Template, acabou formatando...

@fandrefh
Copy link
Author

fandrefh commented Aug 4, 2020

admin.py

`class CustomUserCreationForm(UserCreationForm):

class Meta(UserCreationForm.Meta):
    model = User

class CustomUserChangeForm(UserChangeForm):

class Meta(UserChangeForm.Meta):
    model = User

class CustomUserAdmin(UserAdmin):
form = CustomUserChangeForm
add_form = CustomUserCreationForm
model = User
list_display = (
"full_name",
"email",
"username",
"date_joined",
"last_login",
"is_active",
"is_staff",
"is_superuser",
)
ordering = ["is_superuser", "is_staff", "is_active"]
search_fields = ("full_name", "email", "username")

fieldsets = (
    (None, {"fields": ("full_name", "email", "password")}),
    (
        _("Personal info"),
        {"fields": ("cpf", "rg", "birthday")},
    ),
    (
        _("Permissions"),
        {
            "fields": (
                "is_active",
                "is_staff",
                "is_superuser",
                "groups",
                "user_permissions",
            )
        },
    ),
    (_("Important dates"), {"fields": ("last_login", "date_joined")}),
)

add_fieldsets = (
    (None, {"classes": ("wide",), "fields": ("full_name", "email", "password1", "password2")}),
)

readonly_fields = ("date_joined", "last_login")

def has_delete_permission(self, request, obj=None):
    return True

def has_add_permission(self, request, obj=None):
    return True

admin.site.register(User, CustomUserAdmin)`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment