def set_local_path(self, dirname): self.repos = UrlRepos(dirname)
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)