Пример #1
0
 def set_local_path(self, dirname):
     self.repos = UrlRepos(dirname)
Пример #2
0
class PhotoManager(BaseManager):
    def __init__(self, session):
        super(PhotoManager, self).__init__(session, Photo)
        self.repos = None
        self.ignore_gifs = False
        self.get_thumbnail = True
        self.get_orig = False
        self.PhotoUrl = PhotoUrl
        self.PhotoSize = PhotoSize
        
    def set_local_path(self, dirname):
        self.repos = UrlRepos(dirname)
        
    def urlquery(self):
        return self.session.query(PhotoUrl)

    def get_photo_by_url(self, url):
        q = self.urlquery().filter_by(url=url)
        rows = q.all()
        if not len(rows):
            return None
        return rows.pop()

    def _add_size(self, photo, phototype, sizedata):
        pu = PhotoUrl()
        pu.phototype = phototype
        for key in ['url', 'width', 'height']:
            setattr(pu, key, sizedata[key])
        # database defaults to false
        if phototype == 'thumb' and self.get_thumbnail:
            pu.keep_local = True
        pu.filename = self.repos.relname(sizedata['url'])
        self.session.add(pu)
        pu = self.session.merge(pu)
        ps = PhotoSize()
        ps.photo_id = photo.id
        ps.url_id = pu.id
        self.session.add(ps)

    def add_photo(self, post_id, photo, altsizes=False):
        sizes = get_photo_sizes(photo)
        with transaction.manager:
            p = self.model()
            p.caption = photo['caption']
            if 'exif' in photo:
                p.exif = photo['exif']
            self.session.add(p)
            p = self.session.merge(p)
            pp = PostPhoto()
            pp.post_id = post_id
            pp.photo_id = p.id
            self.session.add(pp)
            for phototype in ['orig', 'thumb', 'smallsquare']:
                pudata = sizes[phototype]
                if pudata is not None:
                    pu = self.get_photo_by_url(pudata['url'])
                    if pu is None:
                        #print "Adding %s" % phototype
                        self._add_size(p, phototype, pudata)
            if altsizes:
                for pudata in sizes['alt']:
                    pu = self.get_photo_by_url(pudata['url'])
                    if pu is None:
                        self._add_size(p, 'alt', pudata)
        return self.session.merge(p)
    
    def download_photos(self, urls, set_keep_local=True,
                        ignore_gifs=True):
        download_urlobjs(self.session, urls, self.repos,
                         set_keep_local=set_keep_local,
                         ignore_gifs=ignore_gifs)

    def download_all_photos(self):
        q = self.urlquery().filter_by(keep_local=True)
        q = q.filter_by(request_status=None)
        self.download_photos(q.all(), set_keep_local=False)
        

    
    def download_all_orig(self):
        q = self.urlquery()
        q = q.filter_by(phototype='orig')
        repos = self.repos
        needed = [u for u in q if not repos.file_exists(u.url)]
        self.download_photos(needed, set_keep_local=False)
        
    def download_all_thumbs(self):
        q = self.urlquery().filter_by(keep_local=True)
        q = q.filter_by(request_status=None)
        q = q.filter_by(phototype='thumb')
        self.download_photos(q.all(), set_keep_local=False,
                             ignore_gifs=False)