Skip to content

Commit

Permalink
Merge pull request #312 from jmalm/dev
Browse files Browse the repository at this point in the history
#310: Use rating for favorited
  • Loading branch information
derneuere authored Aug 16, 2021
2 parents 46592da + 03ca87b commit 8cf95f9
Show file tree
Hide file tree
Showing 12 changed files with 159 additions and 40 deletions.
22 changes: 22 additions & 0 deletions api/migrations/0011_a_add_rating.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 3.1.8 on 2021-08-06 11:32

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('api', '0010_merge_20210725_1547'),
]

run_before = [
('api', '0011_b_migrate_favorited_to_rating')
]

operations = [
migrations.AddField(
model_name='photo',
name='rating',
field=models.IntegerField(db_index=True, default=0),
),
]
33 changes: 33 additions & 0 deletions api/migrations/0011_b_migrate_favorited_to_rating.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 3.1.8 on 2021-08-06 11:32

from django.db import migrations
from constance import config as site_config


def favorited_to_rating(apps, schema_editor):
Photo = apps.get_model('api', 'Photo')
for photo in Photo.objects.all():
photo.rating = 4 if photo.favorited else 0
photo.save()


def rating_to_favorited(apps, schema_editor):
Photo = apps.get_model('api', 'Photo')
for photo in Photo.objects.all():
photo.favorited = photo.rating >= 4
photo.save()


class Migration(migrations.Migration):

dependencies = [
('api', '0011_a_add_rating'),
]

run_before = [
('api', '0011_c_remove_favorited')
]

operations = [
migrations.RunPython(favorited_to_rating, rating_to_favorited)
]
17 changes: 17 additions & 0 deletions api/migrations/0011_c_remove_favorited.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 3.1.8 on 2021-08-06 11:32

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('api', '0011_b_migrate_favorited_to_rating'),
]

operations = [
migrations.RemoveField(
model_name='photo',
name='favorited',
),
]
18 changes: 18 additions & 0 deletions api/migrations/0012_add_favorite_min_rating.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.1.8 on 2021-08-08 17:05

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('api', '0011_c_remove_favorited'),
]

operations = [
migrations.AddField(
model_name='user',
name='favorite_min_rating',
field=models.IntegerField(db_index=True, default=4),
),
]
7 changes: 6 additions & 1 deletion api/models/photo.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,12 @@ class Photo(models.Model):
search_captions = models.TextField(blank=True, null=True, db_index=True)
search_location = models.TextField(blank=True, null=True, db_index=True)

favorited = models.BooleanField(default=False, db_index=True)
# `favorited` has been removed.
# Data migrations:
# `favorited = false` => `rating = 0`
# `favorited = true` => `rating = 4`
rating = models.IntegerField(default=0, db_index=True)

hidden = models.BooleanField(default=False, db_index=True)
video = models.BooleanField(default=False)
owner = models.ForeignKey(
Expand Down
5 changes: 4 additions & 1 deletion api/models/user.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.contrib.auth.models import AbstractUser
from django.db import models
from django_cryptography.fields import encrypt

import ownphotos.settings

class User(AbstractUser):
scan_directory = models.CharField(max_length=512, db_index=True)
Expand All @@ -18,6 +18,9 @@ class User(AbstractUser):
nextcloud_scan_directory = models.CharField(
max_length=512, db_index=True, null=True)

favorite_min_rating = models.IntegerField(
default=ownphotos.settings.DEFAULT_FAVORITE_MIN_RATING, db_index=True)

def get_admin_user():
return User.objects.get(is_superuser=True)

Expand Down
10 changes: 5 additions & 5 deletions api/views/albums.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ def get_queryset(self):
Prefetch('photos',queryset=Photo.objects.filter(hidden=False).only(
'image_hash',
'public',
'favorited',
'rating',
'hidden',
'exif_timestamp'
))
) \
.only('id','title','favorited','timestamp','created_on','gps_lat','gps_lon') \
.only('id','title','rating','timestamp','created_on','gps_lat','gps_lon') \
.order_by('-timestamp')

@cache_response(CACHE_TTL, key_func=CustomObjectKeyConstructor())
Expand Down Expand Up @@ -73,10 +73,10 @@ def get_queryset(self):
'shared_to',
'public',
'exif_timestamp',
'favorited',
'rating',
'hidden'))
) \
.only('id','title','timestamp','favorited','shared_to') \
.only('id','title','timestamp','rating','shared_to') \
.order_by('-timestamp')

@cache_response(CACHE_TTL, key_func=CustomObjectKeyConstructor())
Expand Down Expand Up @@ -117,7 +117,7 @@ def get_queryset(self):
'faces__photo',
queryset=Photo.objects.filter(Q(faces__photo__hidden=False) &
Q(owner=self.request.user)).distinct().order_by('-exif_timestamp').only(
'image_hash', 'exif_timestamp', 'favorited', 'public',
'image_hash', 'exif_timestamp', 'rating', 'public',
'hidden')))

@cache_response(CACHE_TTL, key_func=CustomObjectKeyConstructor())
Expand Down
16 changes: 9 additions & 7 deletions api/views/photos.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import six
from api.views.serializers_serpy import PigPhotoSerilizer, GroupedPhotosSerializer
from api.views.pagination import HugeResultsSetPagination
from constance import config as site_config
from rest_framework import filters, viewsets
from django.db.models import Q
from rest_framework_extensions.cache.decorators import cache_response
from api.views.caching import CustomListKeyConstructor, CustomObjectKeyConstructor, CACHE_TTL
from api.models import Photo
from api.models import Photo, User
from rest_framework.response import Response
from api.views.PhotosGroupedByDate import get_photos_ordered_by_date
from api.drf_optimize import OptimizeRelatedModelViewSetMetaclass
Expand All @@ -18,7 +19,7 @@ class RecentlyAddedPhotoListViewSet(viewsets.ModelViewSet):
def get_queryset(self):
latestDate = Photo.visible.filter(Q(owner=self.request.user)).only('added_on').order_by('-added_on').first().added_on
queryset = Photo.visible.filter(Q(owner=self.request.user) & Q(aspect_ratio__isnull=False) & Q(added_on__year=latestDate.year, added_on__month=latestDate.month, added_on__day=latestDate.day)).only(
'image_hash', 'exif_timestamp', 'favorited', 'public','added_on',
'image_hash', 'exif_timestamp', 'rating', 'public','added_on',
'hidden').order_by('-added_on')
return queryset

Expand All @@ -34,9 +35,10 @@ class FavoritePhotoListViewset(viewsets.ModelViewSet):
pagination_class = HugeResultsSetPagination

def get_queryset(self):
user = User.objects.get(username=self.request.user)
return Photo.objects.filter(
Q(favorited=True) & Q(hidden=False) & Q(owner=self.request.user)).only(
'image_hash', 'exif_timestamp', 'favorited', 'public',
Q(rating__gte=user.favorite_min_rating) & Q(hidden=False) & Q(owner=self.request.user)).only(
'image_hash', 'exif_timestamp', 'rating', 'public',
'hidden').order_by('-exif_timestamp')

@cache_response(CACHE_TTL, key_func=CustomObjectKeyConstructor())
Expand All @@ -56,7 +58,7 @@ class HiddenPhotoListViewset(viewsets.ModelViewSet):
def get_queryset(self):
return Photo.objects.filter(
Q(hidden=True) & Q(owner=self.request.user)).only(
'image_hash', 'exif_timestamp', 'favorited', 'public',
'image_hash', 'exif_timestamp', 'rating', 'public',
'hidden').order_by('-exif_timestamp')

@cache_response(CACHE_TTL, key_func=CustomObjectKeyConstructor())
Expand All @@ -80,11 +82,11 @@ def get_queryset(self):
username = self.request.query_params['username']
return Photo.visible.filter(
Q(public=True) & Q(owner__username=username)).only(
'image_hash', 'exif_timestamp', 'favorited',
'image_hash', 'exif_timestamp', 'rating',
'hidden').order_by('-exif_timestamp')

return Photo.visible.filter(Q(public=True)).only(
'image_hash', 'exif_timestamp', 'favorited',
'image_hash', 'exif_timestamp', 'rating',
'hidden').order_by('-exif_timestamp')

@cache_response(CACHE_TTL, key_func=CustomObjectKeyConstructor())
Expand Down
27 changes: 18 additions & 9 deletions api/views/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class Meta:
class PhotoEditSerializer(serializers.ModelSerializer):
class Meta:
model = Photo
fields = ('image_hash', 'hidden', 'favorited', 'video')
fields = ('image_hash', 'hidden', 'rating', 'video')

def update(self, instance, validated_data):
#import pdb; pdb.set_trace()
Expand All @@ -46,7 +46,7 @@ class Meta:
model = Photo
fields = (
'image_hash',
'favorited',
'rating',
'hidden',
'exif_timestamp',
'public',
Expand All @@ -56,7 +56,7 @@ class Meta:
class PhotoSuperSimpleSerializerWithAddedOn(serializers.ModelSerializer):
class Meta:
model = Photo
fields = ('image_hash', 'favorited', 'hidden', 'exif_timestamp',
fields = ('image_hash', 'rating', 'hidden', 'exif_timestamp',
'public', 'added_on', 'video')


Expand All @@ -70,7 +70,7 @@ class Meta:
'exif_timestamp',
'exif_gps_lat',
'exif_gps_lon',
'favorited',
'rating',
'geolocation_json',
'public',
'video'
Expand Down Expand Up @@ -102,7 +102,7 @@ class Meta:
'square_thumbnail_url', 'big_square_thumbnail_url',
'small_square_thumbnail_url', 'tiny_square_thumbnail_url',
'geolocation_json', 'exif_json', 'people', 'image_url',
'image_hash', 'image_path', 'favorited', 'hidden', 'public',
'image_hash', 'image_path', 'rating', 'hidden', 'public',
'shared_to', 'similar_photos', 'video')

def get_similar_photos(self, obj):
Expand Down Expand Up @@ -620,13 +620,16 @@ class Meta:
},
'nextcloud_app_password': {
'write_only': True
},
'favorite_min_rating': {
'required': False
}
}
fields = ('id', 'username', 'email', 'scan_directory', 'confidence', 'semantic_search_topk', 'first_name',
'public_photo_samples', 'last_name', 'public_photo_count',
'date_joined', 'password', 'avatar', 'photo_count',
'nextcloud_server_address', 'nextcloud_username',
'nextcloud_app_password', 'nextcloud_scan_directory', 'avatar_url')
'nextcloud_app_password', 'nextcloud_scan_directory', 'avatar_url', 'favorite_min_rating')

def validate_nextcloud_app_password(self, value):
return value
Expand Down Expand Up @@ -698,7 +701,7 @@ class ManageUserSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = ('username', 'scan_directory', 'confidence', 'semantic_search_topk', 'last_login', 'date_joined',
'photo_count', 'id')
'photo_count', 'id', 'favorite_min_rating')
extra_kwargs = {
'password': {
'write_only': True
Expand Down Expand Up @@ -732,6 +735,12 @@ def update(self, instance, validated_data):
instance.save()
logger.info("Updated semantic_search_topk for user {}".format(
instance.semantic_search_topk))
if 'favorite_min_rating' in validated_data:
new_favorite_min_rating = validated_data.pop('favorite_min_rating')
instance.favorite_min_rating = new_favorite_min_rating
instance.save()
logger.info("Updated favorite_min_rating for user {}".format(
instance.favorite_min_rating))
cache.clear()
return instance

Expand All @@ -741,7 +750,7 @@ class SharedToMePhotoSuperSimpleSerializer(serializers.ModelSerializer):

class Meta:
model = Photo
fields = ('image_hash', 'favorited', 'hidden', 'exif_timestamp',
fields = ('image_hash', 'rating', 'hidden', 'exif_timestamp',
'public', 'owner', 'video')


Expand All @@ -752,7 +761,7 @@ class SharedPhotoSuperSimpleSerializer(serializers.ModelSerializer):

class Meta:
model = Photo
fields = ('image_hash', 'favorited', 'hidden', 'exif_timestamp',
fields = ('image_hash', 'rating', 'hidden', 'exif_timestamp',
'public', 'owner', 'shared_to', 'video')


Expand Down
10 changes: 5 additions & 5 deletions api/views/serializers_serpy.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import serpy
from api.util import logger
from api.views.PhotosGroupedByDate import get_photos_ordered_by_date
from constance import config as site_config

#Serpy is used, because it is way faster when serializing than the django restframework
class DateTimeField(serpy.Field):
Expand All @@ -22,10 +23,9 @@ class SimpleUserSerializer(serpy.Serializer):
last_name = serpy.StrField()


# 'image_hash', 'favorited', 'hidden', 'exif_timestamp','public', 'owner', 'shared_to'
class SharedPhotoSuperSimpleSerializer(serpy.Serializer):
image_hash = serpy.StrField()
favorited = serpy.BoolField()
rating = serpy.IntField()
public = serpy.BoolField()
hidden = serpy.BoolField()
video = serpy.BoolField()
Expand All @@ -37,7 +37,7 @@ class SharedPhotoSuperSimpleSerializer(serpy.Serializer):

class PhotoSuperSimpleSerializer(serpy.Serializer):
image_hash = serpy.StrField()
favorited = serpy.BoolField()
rating = serpy.IntField()
public = serpy.BoolField()
hidden = serpy.BoolField()
video = serpy.BoolField()
Expand All @@ -46,7 +46,7 @@ class PhotoSuperSimpleSerializer(serpy.Serializer):

class PhotoSuperSimpleSerializerWithAddedOn(serpy.Serializer):
image_hash = serpy.StrField()
favorited = serpy.BoolField()
rating = serpy.IntField()
public = serpy.BoolField()
hidden = serpy.BoolField()
video = serpy.BoolField()
Expand All @@ -62,7 +62,7 @@ class PigPhotoSerilizer(serpy.Serializer):
birthTime = serpy.StrField(attr='exif_timestamp')
aspectRatio = serpy.FloatField(attr='aspect_ratio')
type = serpy.MethodField("get_type")
favorited = serpy.BoolField('favorited')
rating = serpy.IntField('rating')

def get_type(self, obj):
if(obj.video):
Expand Down
Loading

0 comments on commit 8cf95f9

Please sign in to comment.