예제 #1
0
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
예제 #2
0
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()