Skip to content

Commit

Permalink
add support for making photos public, allow admin to allow/disallow n…
Browse files Browse the repository at this point in the history
…ew signup
  • Loading branch information
Hooram Nam committed Jun 17, 2018
1 parent 60eaae8 commit b1f0c1b
Show file tree
Hide file tree
Showing 9 changed files with 339 additions and 34 deletions.
16 changes: 16 additions & 0 deletions api/middleware.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
class FingerPrintMiddleware(object):
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initializatio

def __call__(self, request):
response = self.get_response(request)
import hashlib
fingerprint_raw = "".join((request.META.get("HTTP_USER_AGENT", ""),
request.META.get("HTTP_ACCEPT_ENCODING",
"")))
# print(fingerprint_raw)
fingerprint = hashlib.md5(fingerprint_raw.encode('utf-8')).hexdigest()
request.fingerprint = fingerprint
# print(fingerprint)
return response
21 changes: 21 additions & 0 deletions api/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,10 @@ class Photo(models.Model):
owner = models.ForeignKey(
User, on_delete=models.SET(get_deleted_user), default=None)

shared_to = models.ManyToManyField(User, related_name='photo_shared_to')

public = models.BooleanField(default=False, db_index=True)

def _generate_md5(self):
hash_md5 = hashlib.md5()
with open(self.image_path, "rb") as f:
Expand Down Expand Up @@ -622,6 +626,9 @@ class AlbumThing(models.Model):
owner = models.ForeignKey(
User, on_delete=models.SET(get_deleted_user), default=None)

shared_to = models.ManyToManyField(
User, related_name='album_thing_shared_to')

class Meta:
unique_together = ('title', 'owner')

Expand All @@ -640,6 +647,9 @@ class AlbumPlace(models.Model):
owner = models.ForeignKey(
User, on_delete=models.SET(get_deleted_user), default=None)

shared_to = models.ManyToManyField(
User, related_name='album_place_shared_to')

class Meta:
unique_together = ('title', 'owner')

Expand All @@ -657,6 +667,9 @@ class AlbumDate(models.Model):
owner = models.ForeignKey(
User, on_delete=models.SET(get_deleted_user), default=None)

shared_to = models.ManyToManyField(
User, related_name='album_date_shared_to')

class Meta:
unique_together = ('date', 'owner')

Expand All @@ -678,6 +691,9 @@ class AlbumAuto(models.Model):
owner = models.ForeignKey(
User, on_delete=models.SET(get_deleted_user), default=None)

shared_to = models.ManyToManyField(
User, related_name='album_auto_shared_to')

class Meta:
unique_together = ('timestamp', 'owner')

Expand Down Expand Up @@ -752,6 +768,11 @@ class AlbumUser(models.Model):
owner = models.ForeignKey(
User, on_delete=models.SET(get_deleted_user), default=None)

shared_to = models.ManyToManyField(
User, related_name='album_user_shared_to')

public = models.BooleanField(default=False, db_index=True)


class LongRunningJob(models.Model):
JOB_SCAN_PHOTOS = 1
Expand Down
53 changes: 47 additions & 6 deletions api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
import time
from api.util import logger
from datetime import datetime
from django.contrib.auth import get_user_model
from django.db.models import Count
from django.db.models import Q
from django.db.models import Prefetch


class PhotoEditSerializer(serializers.ModelSerializer):
Expand All @@ -25,7 +29,13 @@ class Meta:
class PhotoSuperSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Photo
fields = ('image_hash', 'favorited', 'hidden', 'exif_timestamp')
fields = (
'image_hash',
'favorited',
'hidden',
'exif_timestamp',
'public',
)


class PhotoSimpleSerializer(serializers.ModelSerializer):
Expand All @@ -41,6 +51,7 @@ class Meta:
'exif_gps_lon',
'favorited',
'geolocation_json',
'public',
)


Expand Down Expand Up @@ -69,7 +80,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')
'image_hash', 'image_path', 'favorited', 'hidden', 'public')

def get_thumbnail_url(self, obj):
try:
Expand Down Expand Up @@ -552,7 +563,12 @@ class Meta:

def get_people(self, obj):
# ipdb.set_trace()
photos = obj.photos.all().prefetch_related('faces__person')
photos = obj.photos.all().prefetch_related(
Prefetch(
'faces__person',
queryset=Person.objects.all().annotate(
viewable_face_count=Count('faces'))))

res = []
for photo in photos:
faces = photo.faces.all()
Expand Down Expand Up @@ -583,18 +599,43 @@ def get_job_type_str(self, obj):
return dict(LongRunningJob.JOB_TYPES)[obj.job_type]


class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'password', 'email')
write_only_fields = ('password', )
read_only_fields = ('id', 'scan_directory')

def create(self, validated_data):
user = User.objects.create(
username=validated_data['username'],
email=validated_data['email'],
)

user.set_password(validated_data['password'])
user.save()

return user


class ManageUserSerializer(serializers.ModelSerializer):
photo_count = serializers.SerializerMethodField()

class Meta:
model = User
model = get_user_model()
fields = ('username', 'scan_directory', 'last_login', 'date_joined',
'photo_count', 'id')
extra_kwargs = {
'password': {
'write_only': True
},
}

def get_photo_count(self, obj):
return Photo.objects.filter(owner=obj).count()

def update(self, instance, validated_data):
instance.scan_directory = validated_data['scan_directory']
instance.save()
if 'scan_directory' in validated_data:
instance.scan_directory = validated_data.pop('scan_directory')
instance.save()
return instance
9 changes: 6 additions & 3 deletions api/serializers_serpy.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import ipdb
import serpy


class DateTimeField(serpy.Field):
def to_value(self, value):
try:
Expand All @@ -11,17 +12,19 @@ def to_value(self, value):
except:
ipdb.set_trace()


class PhotoSuperSimpleSerializer(serpy.Serializer):
image_hash = serpy.StrField()
favorited = serpy.BoolField()
public = serpy.BoolField()
hidden = serpy.BoolField()
exif_timestamp = DateTimeField()



class AlbumDateListWithPhotoHashSerializer(serpy.Serializer):
# photos = PhotoSuperSimpleSerializer(many=True, call=True, attr='ordered_photos')
photos = PhotoSuperSimpleSerializer(many=True, call=True, attr='photos.all')
# photos = PhotoSuperSimpleSerializer(many=True, call=True, attr='ordered_photos')
photos = PhotoSuperSimpleSerializer(
many=True, call=True, attr='photos.all')
location = serpy.Field()
id = serpy.IntField()
date = DateTimeField()
Expand Down
Loading

0 comments on commit b1f0c1b

Please sign in to comment.