import uuid
from django.db import models
from django.conf import settings


class BaseModelMixin(models.Model):
    """
        Base model mixin to create 'created' and 'id' field for all models
    """
    created = models.DateTimeField(auto_now_add=True)
    id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)

    class Meta:
        abstract = True


class Profile(BaseModelMixin, models.Model):
    """
        Profile model to store profiles
    """
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
                                null=True, blank=True)
    name = models.CharField(max_length=200, blank=True, null=True)
    email = models.EmailField(max_length=200, blank=True, null=True)
    username = models.CharField(max_length=200, blank=True, null=True)
    location = models.CharField(max_length=200, blank=True, null=True)
    short_intro = models.CharField(max_length=200, blank=True, null=True)
    bio = models.TextField(blank=True, null=True)
    profile_image = models.ImageField(blank=True, null=True, upload_to='profiles/',
                                      default='profiles/user-default.png')
    social_github = models.CharField(max_length=200, blank=True, null=True)
    social_linkedin = models.CharField(max_length=200, blank=True, null=True)
    social_twitter = models.CharField(max_length=200, blank=True, null=True)
    social_youtube = models.CharField(max_length=200, blank=True, null=True)
    social_website = models.CharField(max_length=200, blank=True, null=True)

    def __str__(self):
        return str(self.user.username)


class Skill(BaseModelMixin, models.Model):
    """
        Skill model to store user skills
    """
    owner = models.ForeignKey(Profile, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)

    def __str__(self):
        return str(self.name)


class Message(BaseModelMixin, models.Model):
    """
        Message model to store messages for each user
    """
    sender = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True, blank=True)
    recipient = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True,
                                  blank=True, related_name='messages')
    is_read = models.BooleanField(default=False, null=True)
    name = models.CharField(max_length=200, null=True, blank=True)
    email = models.EmailField(max_length=200, null=True, blank=True)
    subject = models.CharField(max_length=200, null=True, blank=True)
    body = models.TextField()

    def __str__(self):
        return f"{self.subject}"

    class Meta:
        ordering = ('is_read', '-created',)

import uuid
from django.db import models
from django.conf import settings


class BaseModelMixin(models.Model):
    """
        Base model mixin to create 'created' and 'id' field for all models
    """
    created = models.DateTimeField(auto_now_add=True)
    id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)

    class Meta:
        abstract = True


class Profile(BaseModelMixin, models.Model):
    """
        Profile model to store profiles
    """
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,
                                null=True, blank=True)
    name = models.CharField(max_length=200, blank=True, null=True)
    email = models.EmailField(max_length=200, blank=True, null=True)
    username = models.CharField(max_length=200, blank=True, null=True)
    location = models.CharField(max_length=200, blank=True, null=True)
    short_intro = models.CharField(max_length=200, blank=True, null=True)
    bio = models.TextField(blank=True, null=True)
    profile_image = models.ImageField(blank=True, null=True, upload_to='profiles/',
                                      default='profiles/user-default.png')
    social_github = models.CharField(max_length=200, blank=True, null=True)
    social_linkedin = models.CharField(max_length=200, blank=True, null=True)
    social_twitter = models.CharField(max_length=200, blank=True, null=True)
    social_youtube = models.CharField(max_length=200, blank=True, null=True)
    social_website = models.CharField(max_length=200, blank=True, null=True)

    def __str__(self):
        return str(self.user.username)


class Skill(BaseModelMixin, models.Model):
    """
        Skill model to store user skills
    """
    owner = models.ForeignKey(Profile, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)
    description = models.TextField(null=True, blank=True)

    def __str__(self):
        return str(self.name)


class Message(BaseModelMixin, models.Model):
    """
        Message model to store messages for each user
    """
    sender = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True, blank=True)
    recipient = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True,
                                  blank=True, related_name='messages')
    is_read = models.BooleanField(default=False, null=True)
    name = models.CharField(max_length=200, null=True, blank=True)
    email = models.EmailField(max_length=200, null=True, blank=True)
    subject = models.CharField(max_length=200, null=True, blank=True)
    body = models.TextField()

    def __str__(self):
        return f"{self.subject}"

    class Meta:
        ordering = ('is_read', '-created',)

Base model mixin to create 'created' and 'id' field for all models Profile model to store profiles Skill model to store user skills Message model to store messages for each user