robertvari

User and profile full example

Apr 13th, 2020
574
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.34 KB | None | 0 0
  1. from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
  2. from django.db.models.signals import pre_save, post_save, post_delete
  3. from django.dispatch import receiver
  4. from django.utils.text import slugify
  5. from django.db import models
  6. import time, os, shutil
  7. from PIL import Image
  8.  
  9. from .managers import CreativeUserManager
  10.  
  11.  
  12. class CreativeUser(AbstractBaseUser, PermissionsMixin):
  13.     email = models.EmailField('Email', unique=True)
  14.  
  15.     USERNAME_FIELD = 'email'
  16.     REQUIRED_FIELDS = []
  17.  
  18.     # auto fill on create
  19.     username = models.CharField(max_length=200, blank=True, unique=True)
  20.  
  21.     is_staff = models.BooleanField(default=False)
  22.     is_active = models.BooleanField(default=True)
  23.     date_joined = models.DateTimeField(auto_now_add=True)
  24.  
  25.     objects = CreativeUserManager()
  26.  
  27.     def __str__(self):
  28.         return self.email
  29.  
  30.  
  31. def photo_directory_path(instance, filename):
  32.     return f'profiles/{instance.user.username}/{filename}'
  33.  
  34.  
  35. class Profile(models.Model):
  36.     user = models.OneToOneField(CreativeUser, on_delete=models.CASCADE, related_name='profile')
  37.     slug = models.SlugField(unique=True, blank=True)
  38.     full_name = models.CharField('Full name', max_length=200, blank=True)
  39.     image = models.ImageField(upload_to=photo_directory_path, blank=True)
  40.     job = models.CharField(max_length=200, blank=True)
  41.     location = models.CharField(max_length=200, blank=True)
  42.     about = models.TextField(max_length=5000, blank=True)
  43.  
  44.     def save(self, *args, **kwargs):
  45.         try:
  46.             profile = Profile.objects.get(id=self.id)
  47.             if profile:
  48.                 if profile.image.name != self.image.name:
  49.                     profile.image.delete(save=False)
  50.         except Exception as e:
  51.             print(e)
  52.  
  53.         super().save(*args, **kwargs)
  54.  
  55.         if self.image:
  56.             image_path = self.image.path
  57.             img = Image.open(image_path)
  58.  
  59.             if img.size[0] > 300 or img.size[1] > 300:
  60.                 img.thumbnail((300, 300))
  61.                 img.save(image_path)
  62.  
  63.     def __str__(self):
  64.         return self.user.email
  65.  
  66.  
  67. # create username
  68. @receiver(pre_save, sender=CreativeUser)
  69. def create_username(sender, instance, **kwargs):
  70.     if not instance.username:
  71.         username = slugify(instance.email.split("@")[0])
  72.  
  73.         # check if this username is unique
  74.         if CreativeUser.objects.filter(username=username).exists():
  75.             username = f'{username}-{int(time.time())}'
  76.  
  77.         instance.username = username
  78.  
  79.  
  80. # create a profile for a new
  81. @receiver(post_save, sender=CreativeUser)
  82. def create_profile(sender, instance, **kwargs):
  83.     if kwargs['created']:
  84.         Profile.objects.create(user=instance)
  85.  
  86.  
  87. # create slug for profile
  88. @receiver(pre_save, sender=Profile)
  89. def slug_generator(sender, instance, **kwargs):
  90.     if not instance.slug:
  91.         instance.slug = instance.user.username
  92.  
  93.  
  94. # cleanup profile pictures
  95. @receiver(post_delete, sender=Profile)
  96. def file_cleanup(sender, instance, **kwargs):
  97.     if instance.image:
  98.         image_path = instance.image.path
  99.         if not os.path.exists(image_path):
  100.             return
  101.  
  102.         os.remove(image_path)
  103.  
  104.         # delete folder as well
  105.         folder_name = os.path.dirname(image_path)
  106.         if not os.listdir(folder_name):
  107.             shutil.rmtree(folder_name, ignore_errors=True)
Advertisement
Add Comment
Please, Sign In to add comment