from django.db import models from imagekit.models import ImageSpecField from imagekit.processors import ResizeToFill from django.utils.translation import ugettext_lazy as _ from django.contrib.auth import get_user_model def user_directory_path(instance, filename): # file will be uploaded to MEDIA_ROOT/photos// return 'photos/{0}/{1}'.format(instance.user.username, filename) class TimestampMixin(models.Model): created_at = models.DateTimeField(_("Created at"), auto_now_add=True) updated_at = models.DateTimeField(_("Updated at"), auto_now=True) class Meta: abstract = True class UserMixin(models.Model): user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, null=True, verbose_name=_("User")) def is_owned_by(self, user): return self.user is not None and user is not None and self.user.id == user.id class Meta: abstract = True class Album(TimestampMixin, UserMixin): title = models.CharField(_("Title"), max_length=255) description = models.TextField(_("Description"), null=True, blank=True) def __str__(self): return self.title class Meta: verbose_name = _('album') verbose_name_plural = _('albums') class Photo(TimestampMixin, UserMixin): photo = models.ImageField(_("Photo"), upload_to=user_directory_path) thumbnail = ImageSpecField( source='photo', format='JPEG', options={'quality': 80}, processors=[ResizeToFill(300, 200, upscale=False)]) title = models.CharField(_("Title"), max_length=255) # some optional data description = models.TextField(_("Description"), null=True, blank=True) taken_on = models.DateField(_("Taken on"), null=True, blank=True) album = models.ForeignKey(Album, on_delete=models.CASCADE, null=True) class Meta: verbose_name = _('photo') verbose_name_plural = _('photos')