Esempio n. 1
0
def get_data(album, photo=None, page=1, site_url=None, is_mobile=False):
    data = {
        'URL_PHOTOS': getattr(settings, 'WEBXIANG_PHOTOS_URL', 'data/'),
        'LAZY_LOADING': getattr(settings, 'WEBXIANG_PHOTOS_LAZY', False),
        'meta': {
            'template': 'default.html',
            'style': 'base.css',
            'title': 'Albums',
            'robots': 'noindex,nofollow',
            'custom_menu': False,
            'columns': 3,
            'ppp': 36,
            'reverse_order': False,
            'default_thumb_size': (180, 180),
            'cover': None,
        },
        'entries': [],
    }

    album_data = _open_albumfile(album)
    if not album_data:
        return None

    data['meta'].update(album_data.get('meta', {}))
    data['meta']['title_gallery'] = data['meta']['title'] or album
    data['entries'] = album_data.get('entries', [])

    # force mobile template
    if data['meta']['template'] == 'story' and is_mobile:
        data['meta']['template'] = 'floating'
        data['meta']['thumbs_skip'] = False

    baseurl = data['URL_PHOTOS']
    meta_path = data['meta'].get('path', '')

    # set a constant entry indexes
    for i, entry in enumerate(data['entries'], start=1):
        entry['index'] = i

    reverse_order = bool(data['meta']['reverse_order'])
    if reverse_order:
        data['entries'] = list(reversed(data['entries']))

    if photo and photo != 'geomap':
        mode = 'photo'
        lentries = len(data['entries'])

        photo_idx = photo.split('/')[0]
        if photo_idx.isdigit():
            photo_idx = int(photo_idx)
        else:
            photo_idx = None
            if not photo.lower().endswith('.jpg'):
                photo += '.jpg'
            for idx, ent in enumerate(data['entries']):
                if isinstance(ent['image'], six.string_types):
                    f = ent['image']
                else:
                    f = ent['image']['file']
                if photo == f:
                    if reverse_order:
                        photo_idx = lentries - idx
                    else:
                        photo_idx = idx + 1
                    break
            if photo_idx is None:
                return None

        if reverse_order:
            idx = lentries - photo_idx
            data['meta']['title'] = '#%s - %s' % \
                (photo_idx, data['meta']['title'] or album)
            prev_idx = photo_idx + 1 if photo_idx < lentries else None
            next_idx = photo_idx - 1 if photo_idx > 1 else None
        else:
            idx = photo_idx - 1
            data['meta']['title'] = '#%s - %s' % \
                (photo_idx, data['meta']['title'] or album)
            prev_idx = photo_idx - 1 if photo_idx > 1 else None
            next_idx = photo_idx + 1 if photo_idx < lentries else None

        entry = data['entry'] = data['entries'][idx]

        # determine canonical photo url
        canon_link = '%s/%s' % (photo_idx, entry['slug']) \
            if 'slug' in entry else photo_idx
        data['canonical_url'] = reverse('photo', kwargs={
            'album': album,
            'photo': canon_link})

        if prev_idx is not None:
            if reverse_order:
                slug = data['entries'][idx - 1].get('slug')
            else:
                slug = data['entries'][prev_idx - 1].get('slug')
            prev_photo = '%s/%s' % (prev_idx, slug) if slug else prev_idx
            data['prev_entry'] = reverse('photo', kwargs={
                'album': album,
                'photo': prev_photo})
        else:
            data['prev_entry'] = None

        if next_idx is not None:
            if reverse_order:
                slug = data['entries'][idx + 1].get('slug')
            else:
                slug = data['entries'][next_idx - 1].get('slug')
            next_photo = '%s/%s' % (next_idx, slug) if slug else next_idx
            data['next_entry'] = reverse('photo', kwargs={
                'album': album,
                'photo': next_photo})
        else:
            data['next_entry'] = None

        img = entry.get('image')
        if isinstance(img, six.string_types):
            f = entry['image']
            path = meta_path
            size = entry.get('size') or data[
                'meta'].get('default_image_size')
        elif img:
            f = entry['image']['file']
            path = entry['image'].get('path', meta_path)
            size = entry['image'].get('size') or data[
                'meta'].get('default_image_size')
        else:  # video
            _parse_video_entry(entry)
            path = meta_path
            f = size = ''

        path = urllib.parse.urljoin(baseurl, path)
        entry['url'] = urllib.parse.urljoin(path, f)
        entry['size'] = size

        if reverse_order:
            page = int(math.floor((lentries - photo_idx) /
                                  float(data['meta']['ppp'])) + 1)
        else:
            page = int(math.ceil(photo_idx / float(data['meta']['ppp'])))

        entry['link'] = reverse('album', kwargs={'album': album})
        if page > 1:
            entry['link'] += page_url({}, album, '', page)

        data['meta']['description'] = entry.get('description',
                                                data['meta']['title'])
        data['meta']['copyright'] = entry.get('copyright') or \
            data['meta'].get('copyright')

        points = {}
        if 'geo' in entry:
            p = entry['geo']
            if p not in points:
                points[p] = []
            if 'exif' in entry:
                del entry['exif']
            points[p].append(entry)
        points = sorted([(k, v) for k, v in list(points.items())],
                        key=lambda x: x[1][0]['index'])
        wxpb_settings = getattr(settings, 'WXPB_SETTINGS', None) or {}
        wxpb_settings.update(data.get('settings') or {})
        wxpb_settings['geo_points'] = points
        data['wxpb_settings'] = json.dumps(wxpb_settings)

    else:
        if photo == 'geomap':
            mode = 'geomap'
        else:
            mode = 'album'

        if mode == 'geomap':
            data['meta']['ppp'] = 500

        paginator = Paginator(data['entries'], data['meta']['ppp'])
        try:
            data['entries'] = paginator.page(page)
        except (EmptyPage, InvalidPage):
            data['entries'] = paginator.page(paginator.num_pages)
            page = paginator.num_pages

        # use a limited page range
        pg_range = 6
        cindex = paginator.page_range.index(page)
        cmin, cmax = cindex - pg_range, cindex + pg_range
        if cmin < 0:
            cmin = 0
        paginator.page_range_limited = paginator.page_range[cmin:cmax]

        for i, entry in enumerate(data['entries'].object_list):

            img = entry.get('image')
            path = data['meta'].get('path', meta_path)
            path = urllib.parse.urljoin(baseurl, path)
            if isinstance(img, six.string_types):
                entry['url_full'] = urllib.parse.urljoin(path, img)
            elif img:
                entry['url_full'] = urllib.parse.urljoin(path, img['file'])

            if data['meta'].get('thumbs_skip'):
                img = entry.get('image')
                path = data['meta'].get('path', meta_path)
                item_type = 'image'
            else:
                img = entry.get('thumb', entry.get('image'))
                path = data['meta'].get('path_thumb', meta_path)
                item_type = 'thumb'

            if img:
                if isinstance(img, six.string_types):
                    f = img
                    entry['size'] = data['meta'].get('default_%s_size' %
                                                     item_type)
                else:
                    f = img['file']
                    path = img.get('path',
                                   data['meta'].get('path_thumb', meta_path))
                    entry['size'] = img.get(
                        'size',
                        data['meta'].get('default_%s_size' % item_type))

                path = urllib.parse.urljoin(baseurl, path)
                entry['url'] = urllib.parse.urljoin(path, f)

                if 'link' in entry:
                    pass
                elif 'album' in entry:
                    entry['link'] = reverse('album', kwargs={
                        'album': entry['album']})
                else:
                    slug = entry.get('slug')
                    link = '%s/%s' % (entry['index'], slug) \
                        if slug else entry['index']
                    entry['link'] = reverse('photo', kwargs={
                        'album': album,
                        'photo': link})

            else:  # non-image entries
                path = urllib.parse.urljoin(baseurl, meta_path)
                _parse_video_entry(entry)

        # grouping entries into columns
        columns = int(data['meta'].get('columns', 3))
        if columns:
            data['groups'] = (
                (e for e in t if e != None)
                for t in zip_longest(
                        *(iter(data['entries'].object_list),) * columns)
            )

        # set up geo points
        if mode == 'geomap':
            points = {}
            for entry in data['entries'].object_list:
                if 'geo' in entry:
                    p = entry['geo']
                    if p not in points:
                        points[p] = []
                    if 'exif' in entry:
                        del entry['exif']
                    points[p].append(entry)
            points = sorted([(k, v) for k, v in list(points.items())],
                            key=lambda x: x[1][0]['index'])
            wxpb_settings = getattr(settings, 'WXPB_SETTINGS', None) or {}
            wxpb_settings.update(data.get('settings') or {})
            wxpb_settings['geo_points'] = points
            data['wxpb_settings'] = json.dumps(wxpb_settings)
            del data['entries']

    if data['meta']['style'] and not data['meta']['style'].endswith('.css'):
        data['meta']['style'] += '.css'

    # handle cover's URL
    cover = data['meta']['cover']
    if cover and not cover.startswith('/'):
        cover = urllib.parse.urljoin(path, cover)
    if cover and site_url:
        cover = urllib.parse.urljoin(site_url, cover)
    data['meta']['cover'] = cover

    ctx = {
        'mode': mode,
        'album': album,
    }
    ctx.update(data)

    return ctx
Esempio n. 2
0
def get_data(album, photo=None, page=1, site_url=None, is_mobile=False):
    data = {
        'URL_PHOTOS': getattr(settings, 'WEBXIANG_PHOTOS_URL', 'data/'),
        'LAZY_LOADING': getattr(settings, 'WEBXIANG_PHOTOS_LAZY', False),
        'meta': {
            'template': 'default.html',
            'style': 'base.css',
            'title': 'Albums',
            'robots': 'noindex,nofollow',
            'custom_menu': False,
            'columns': 3,
            'ppp': 36,
            'reverse_order': False,
            'default_thumb_size': (180, 180),
            'cover': None,
        },
        'entries': [],
    }

    album_data = _open_albumfile(album)
    if not album_data:
        return None

    data['meta'].update(album_data.get('meta', {}))
    data['meta']['title_gallery'] = data['meta']['title'] or album
    data['entries'] = album_data.get('entries', [])

    # force mobile template
    if data['meta']['template'] == 'story' and is_mobile:
        data['meta']['template'] = 'floating'
        data['meta']['thumbs_skip'] = False

    baseurl = data['URL_PHOTOS']
    meta_path = data['meta'].get('path', '')

    # set a constant entry indexes
    for i, entry in enumerate(data['entries'], start=1):
        entry['index'] = i

    reverse_order = bool(data['meta']['reverse_order'])
    if reverse_order:
        data['entries'] = list(reversed(data['entries']))

    if photo and photo != 'geomap':
        mode = 'photo'
        lentries = len(data['entries'])

        photo_idx = photo.split('/')[0]
        if photo_idx.isdigit():
            photo_idx = int(photo_idx)
        else:
            photo_idx = None
            if not photo.lower().endswith('.jpg'):
                photo += '.jpg'
            for idx, ent in enumerate(data['entries']):
                if isinstance(ent['image'], six.string_types):
                    f = ent['image']
                else:
                    f = ent['image']['file']
                if photo == f:
                    if reverse_order:
                        photo_idx = lentries - idx
                    else:
                        photo_idx = idx + 1
                    break
            if photo_idx is None:
                return None

        if reverse_order:
            idx = lentries - photo_idx
            data['meta']['title'] = '#%s - %s' % \
                (photo_idx, data['meta']['title'] or album)
            prev_idx = photo_idx + 1 if photo_idx < lentries else None
            next_idx = photo_idx - 1 if photo_idx > 1 else None
        else:
            idx = photo_idx - 1
            data['meta']['title'] = '#%s - %s' % \
                (photo_idx, data['meta']['title'] or album)
            prev_idx = photo_idx - 1 if photo_idx > 1 else None
            next_idx = photo_idx + 1 if photo_idx < lentries else None

        entry = data['entry'] = data['entries'][idx]

        # determine canonical photo url
        canon_link = '%s/%s' % (photo_idx, entry['slug']) \
            if 'slug' in entry else photo_idx
        data['canonical_url'] = reverse('photo',
                                        kwargs={
                                            'album': album,
                                            'photo': canon_link
                                        })

        if prev_idx is not None:
            if reverse_order:
                slug = data['entries'][idx - 1].get('slug')
            else:
                slug = data['entries'][prev_idx - 1].get('slug')
            prev_photo = '%s/%s' % (prev_idx, slug) if slug else prev_idx
            data['prev_entry'] = reverse('photo',
                                         kwargs={
                                             'album': album,
                                             'photo': prev_photo
                                         })
        else:
            data['prev_entry'] = None

        if next_idx is not None:
            if reverse_order:
                slug = data['entries'][idx + 1].get('slug')
            else:
                slug = data['entries'][next_idx - 1].get('slug')
            next_photo = '%s/%s' % (next_idx, slug) if slug else next_idx
            data['next_entry'] = reverse('photo',
                                         kwargs={
                                             'album': album,
                                             'photo': next_photo
                                         })
        else:
            data['next_entry'] = None

        img = entry.get('image')
        if isinstance(img, six.string_types):
            f = entry['image']
            path = meta_path
            size = entry.get('size') or data['meta'].get('default_image_size')
        elif img:
            f = entry['image']['file']
            path = entry['image'].get('path', meta_path)
            size = entry['image'].get('size') or data['meta'].get(
                'default_image_size')
        else:  # video
            _parse_video_entry(entry)
            path = meta_path
            f = size = ''

        path = urllib.parse.urljoin(baseurl, path)
        entry['url'] = urllib.parse.urljoin(path, f)
        entry['size'] = size

        if reverse_order:
            page = int(
                math.floor((lentries - photo_idx) /
                           float(data['meta']['ppp'])) + 1)
        else:
            page = int(math.ceil(photo_idx / float(data['meta']['ppp'])))

        entry['link'] = reverse('album', kwargs={'album': album})
        if page > 1:
            entry['link'] += page_url({}, album, '', page)

        data['meta']['description'] = entry.get('description',
                                                data['meta']['title'])
        data['meta']['copyright'] = entry.get('copyright') or \
            data['meta'].get('copyright')

    else:
        if photo == 'geomap':
            mode = 'geomap'
        else:
            mode = 'album'

        if mode == 'geomap':
            data['meta']['ppp'] = 500

        paginator = Paginator(data['entries'], data['meta']['ppp'])
        try:
            data['entries'] = paginator.page(page)
        except (EmptyPage, InvalidPage):
            data['entries'] = paginator.page(paginator.num_pages)
            page = paginator.num_pages

        # use a limited page range
        pg_range = 6
        cindex = paginator.page_range.index(page)
        cmin, cmax = cindex - pg_range, cindex + pg_range
        if cmin < 0:
            cmin = 0
        paginator.page_range_limited = paginator.page_range[cmin:cmax]

        for i, entry in enumerate(data['entries'].object_list):

            img = entry.get('image')
            path = data['meta'].get('path', meta_path)
            path = urllib.parse.urljoin(baseurl, path)
            if isinstance(img, six.string_types):
                entry['url_full'] = urllib.parse.urljoin(path, img)
            elif img:
                entry['url_full'] = urllib.parse.urljoin(path, img['file'])

            if data['meta'].get('thumbs_skip'):
                img = entry.get('image')
                path = data['meta'].get('path', meta_path)
                item_type = 'image'
            else:
                img = entry.get('thumb', entry.get('image'))
                path = data['meta'].get('path_thumb', meta_path)
                item_type = 'thumb'

            if img:
                if isinstance(img, six.string_types):
                    f = img
                    entry['size'] = data['meta'].get('default_%s_size' %
                                                     item_type)
                else:
                    f = img['file']
                    path = img.get('path',
                                   data['meta'].get('path_thumb', meta_path))
                    entry['size'] = img.get(
                        'size',
                        data['meta'].get('default_%s_size' % item_type))

                path = urllib.parse.urljoin(baseurl, path)
                entry['url'] = urllib.parse.urljoin(path, f)

                if 'link' in entry:
                    pass
                elif 'album' in entry:
                    entry['link'] = reverse('album',
                                            kwargs={'album': entry['album']})
                else:
                    slug = entry.get('slug')
                    link = '%s/%s' % (entry['index'], slug) \
                        if slug else entry['index']
                    entry['link'] = reverse('photo',
                                            kwargs={
                                                'album': album,
                                                'photo': link
                                            })

            else:  # non-image entries
                path = urllib.parse.urljoin(baseurl, meta_path)
                _parse_video_entry(entry)

        # grouping entries into columns
        columns = int(data['meta'].get('columns', 3))
        if columns:
            data['groups'] = ((e for e in t if e != None) for t in zip_longest(
                *(iter(data['entries'].object_list), ) * columns))

        # set up geo points
        if mode == 'geomap':
            points = {}
            for entry in data['entries'].object_list:
                if 'geo' in entry:
                    p = entry['geo']
                    if p not in points:
                        points[p] = []
                    if 'exif' in entry:
                        del entry['exif']
                    points[p].append(entry)
            points = sorted([(k, v) for k, v in list(points.items())],
                            key=lambda x: x[1][0]['index'])
            wxpb_settings = getattr(settings, 'WXPB_SETTINGS', None) or {}
            wxpb_settings.update(data.get('settings') or {})
            wxpb_settings['geo_points'] = points
            data['wxpb_settings'] = json.dumps(wxpb_settings)
            del data['entries']

    if data['meta']['style'] and not data['meta']['style'].endswith('.css'):
        data['meta']['style'] += '.css'

    # handle cover's URL
    cover = data['meta']['cover']
    if cover and not cover.startswith('/'):
        cover = urllib.parse.urljoin(path, cover)
    if cover and site_url:
        cover = urllib.parse.urljoin(site_url, cover)
    data['meta']['cover'] = cover

    ctx = {
        'mode': mode,
        'album': album,
    }
    ctx.update(data)

    return ctx