def get_album_detail_payload(user, album): album_member = AlbumMember.objects.filter(user=user, album=album).first() members = get_album_members_payload(album.id) photos = get_album_photos_payload(user.id, album.id) creator = { 'id': album.creator.id, 'nickname': album.creator.nickname, 'last_online': album.creator.last_online, 'avatar_url': album.creator.get_avatar_url(), 'user_glance_score': album.creator.user_glance_score } if album_member: name = album_name_or_members(album_member) last_access = album_member.last_access num_new_photos = album_member.get_num_new_photos() else: name = album.name last_access = None num_new_photos = 0 payload = { 'id': album.id, 'name': name, 'creator': creator, 'date_created': album.date_created, 'last_updated': album.last_updated, 'last_access': last_access, 'num_new_photos': num_new_photos, 'members': members, 'photos': photos } return payload
def get_album_list_payload(user_id): if connection.vendor == 'sqlite': am_last_access_offset = \ """ datetime(am.last_access, '0.1 second') """ else: am_last_access_offset = \ """ (am.last_access + INTERVAL '0.001 second') """ cursor = connection.cursor() cursor.execute( """ SELECT album_id0, album_name0, album_date_created0, album_last_updated0, album_revision_number0, album_last_access0, album_num_new_photos0, album_creator_id0, album_creator_nickname0, album_creator_last_online0, album_creator_avatar_file0, album_creator_user_glance_score0 FROM (SELECT am.album_id as album_id0, am.last_access as album_last_access0, (CASE WHEN am.last_access IS NULL THEN (SELECT COUNT(*) FROM photos_photo WHERE photos_photo.album_id = am.album_id AND photos_photo.author_id != %s) ELSE (SELECT COUNT(*) FROM photos_photo WHERE photos_photo.album_id = am.album_id AND photos_photo.author_id != %s AND photos_photo.date_created > """ + am_last_access_offset + """) END) as album_num_new_photos0 FROM photos_album_members am WHERE am.user_id = %s) as T1, (SELECT a.id as album_id1, a.name as album_name0, a.date_created as album_date_created0, a.last_updated as album_last_updated0, a.revision_number as album_revision_number0, a.creator_id as album_creator_id0, phone_auth_user.nickname as album_creator_nickname0, phone_auth_user.last_online as album_creator_last_online0, phone_auth_user.avatar_file as album_creator_avatar_file0, phone_auth_user.user_glance_score as album_creator_user_glance_score0 FROM photos_album a LEFT OUTER JOIN phone_auth_user ON a.creator_id = phone_auth_user.id) as T2 WHERE album_id0 = album_id1 """, [user_id, user_id, user_id]) albums = collections.OrderedDict() for row in cursor.fetchall(): (row_album_id, row_album_name, row_album_date_created, row_album_last_updated, row_album_revision_number, row_album_last_access, row_album_num_new_photos, row_album_creator_id, row_album_creator_nickname, row_album_creator_last_online, row_album_creator_avatar_file, row_album_creator_user_glance_score) = row albums[row_album_id] = { 'id': row_album_id, # TODO Could be optimized. Instead of a seperate query for each album, do # one big query of all the members of all the albums: 'name': album_name_or_members(AlbumMember.objects.get(user__id=user_id, album__id=row_album_id)), 'creator': { 'id': row_album_creator_id, 'nickname': row_album_creator_nickname, 'last_online': row_album_creator_last_online, 'avatar_url': avatar_url_from_avatar_file_data(row_album_creator_avatar_file), 'user_glance_score': row_album_creator_user_glance_score }, 'date_created': row_album_date_created, 'last_updated': row_album_last_updated, 'etag': u'{0}'.format(row_album_revision_number), # See: photos.models.Album.get_etag # TODO: This is not optimized, we should do a single SQL query to # get all photos of all albums, instead of a separate query per # album: 'latest_photos': get_album_photos_payload(user_id, row_album_id, only_newest=2), 'num_new_photos': row_album_num_new_photos, 'last_access': row_album_last_access } return albums.values()