from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models

'''
    @name : Account
    @desc : Account model. This model is generic to represent a user that has an
    account in the ShopIT application. This user can be the store manager or the
    mobile app user.
'''
class Account(AbstractBaseUser):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=50, unique=True)

    first_name = models.CharField(max_length=50, blank=True)
    last_name = models.CharField(max_length=50, blank=True)

    is_admin = models.BooleanField(default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = AccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def __unicode__(self):
        return self.email

    def get_full_name(self):
        return ' '.join([self.first_name, self.last_name])

    def get_short_name(self):
        return self.first_name

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models

'''
    @name : AccountManager
    @desc : AccountManager model. The AccountManager is responsible to manage
    the creation of users and superusers.
'''
class AccountManager(BaseUserManager):
    def create_user(self, email, password=None, **kwargs):
        if not email:
            raise ValueError('Users must have a valid email adress.')
        if not kwargs.get('username'):
            raise ValueError('Users must have a valid username.')

        account = self.model(
            email = self.normalize_email(email), username= kwargs.get('username')
        )

        account.set_password(password)
        account.save()
        return account

    def create_superuser(self, email, password, **kwargs):
        account = self.create_user(email, password, **kwargs)
        account.is_admin = True
        account.save()
        return account

'''
    @name : Account
    @desc : Account model. This model is generic to represent a user that has an
    account in the ShopIT application. This user can be the store manager or the
    mobile app user.
'''
class Account(AbstractBaseUser):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=50, unique=True)

    first_name = models.CharField(max_length=50, blank=True)
    last_name = models.CharField(max_length=50, blank=True)

    is_admin = models.BooleanField(default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = AccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def __unicode__(self):
        return self.email

    def get_full_name(self):
        return ' '.join([self.first_name, self.last_name])

    def get_short_name(self):
        return self.first_name

Add the account manager that support the creation of accounts.
Add the account manager that support the creation of accounts.

  from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
  from django.db import models
+ 
+ '''
+     @name : AccountManager
+     @desc : AccountManager model. The AccountManager is responsible to manage
+     the creation of users and superusers.
+ '''
+ class AccountManager(BaseUserManager):
+     def create_user(self, email, password=None, **kwargs):
+         if not email:
+             raise ValueError('Users must have a valid email adress.')
+         if not kwargs.get('username'):
+             raise ValueError('Users must have a valid username.')
+ 
+         account = self.model(
+             email = self.normalize_email(email), username= kwargs.get('username')
+         )
+ 
+         account.set_password(password)
+         account.save()
+         return account
+ 
+     def create_superuser(self, email, password, **kwargs):
+         account = self.create_user(email, password, **kwargs)
+         account.is_admin = True
+         account.save()
+         return account
  
  '''
      @name : Account
      @desc : Account model. This model is generic to represent a user that has an
      account in the ShopIT application. This user can be the store manager or the
      mobile app user.
  '''
  class Account(AbstractBaseUser):
      email = models.EmailField(unique=True)
      username = models.CharField(max_length=50, unique=True)
  
      first_name = models.CharField(max_length=50, blank=True)
      last_name = models.CharField(max_length=50, blank=True)
  
      is_admin = models.BooleanField(default=False)
  
      created_at = models.DateTimeField(auto_now_add=True)
      updated_at = models.DateTimeField(auto_now=True)
  
      objects = AccountManager()
  
      USERNAME_FIELD = 'email'
      REQUIRED_FIELDS = ['username']
  
      def __unicode__(self):
          return self.email
  
      def get_full_name(self):
          return ' '.join([self.first_name, self.last_name])
  
      def get_short_name(self):
          return self.first_name
  
Add the account manager that support the creation of accounts.
## Code Before:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models

'''
    @name : Account
    @desc : Account model. This model is generic to represent a user that has an
    account in the ShopIT application. This user can be the store manager or the
    mobile app user.
'''
class Account(AbstractBaseUser):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=50, unique=True)

    first_name = models.CharField(max_length=50, blank=True)
    last_name = models.CharField(max_length=50, blank=True)

    is_admin = models.BooleanField(default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = AccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def __unicode__(self):
        return self.email

    def get_full_name(self):
        return ' '.join([self.first_name, self.last_name])

    def get_short_name(self):
        return self.first_name

## Instruction:
Add the account manager that support the creation of accounts.
## Code After:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models

'''
    @name : AccountManager
    @desc : AccountManager model. The AccountManager is responsible to manage
    the creation of users and superusers.
'''
class AccountManager(BaseUserManager):
    def create_user(self, email, password=None, **kwargs):
        if not email:
            raise ValueError('Users must have a valid email adress.')
        if not kwargs.get('username'):
            raise ValueError('Users must have a valid username.')

        account = self.model(
            email = self.normalize_email(email), username= kwargs.get('username')
        )

        account.set_password(password)
        account.save()
        return account

    def create_superuser(self, email, password, **kwargs):
        account = self.create_user(email, password, **kwargs)
        account.is_admin = True
        account.save()
        return account

'''
    @name : Account
    @desc : Account model. This model is generic to represent a user that has an
    account in the ShopIT application. This user can be the store manager or the
    mobile app user.
'''
class Account(AbstractBaseUser):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=50, unique=True)

    first_name = models.CharField(max_length=50, blank=True)
    last_name = models.CharField(max_length=50, blank=True)

    is_admin = models.BooleanField(default=False)

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = AccountManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def __unicode__(self):
        return self.email

    def get_full_name(self):
        return ' '.join([self.first_name, self.last_name])

    def get_short_name(self):
        return self.first_name
