119 lines
4.7 KiB
Python
119 lines
4.7 KiB
Python
from zoteroconf import user_id, user_key
|
|
|
|
from itertools import islice
|
|
from functools import partial
|
|
|
|
from pyzotero.zotero import Zotero
|
|
import logging
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class Zotero2(Zotero):
|
|
def __init__(self, user_id = None, user_key = None):
|
|
self.__params = {}
|
|
super(Zotero2,self).__init__(user_id,user_key)
|
|
def set_parameters(self, **kwargs):
|
|
self.__params.update(kwargs)
|
|
def _to_iterator(self, f, *args, **kwargs):
|
|
current_start = self.__params.get("start", 0)
|
|
params = self.__params.copy()
|
|
|
|
params["start"] = current_start
|
|
more_items = True
|
|
|
|
while more_items:
|
|
self.add_parameters(**params)
|
|
items = f(*args,**kwargs)
|
|
for item in items:
|
|
yield item
|
|
params["start"] += len(items)
|
|
if len(items) == 0:
|
|
more_items = False
|
|
def __getattribute__(self, name):
|
|
if name in ['items','item','top','children','tag_items', 'group_items','group_top',
|
|
'group_item','group_item_children', 'group_items_tag',
|
|
'group_collection_items', 'group_collection_item',
|
|
'group_collection_top','collection_items','get_subset',
|
|
'collections','collections_sub','group_collections',
|
|
'group_collection',
|
|
'groups','tags','item_tags','group_tags','group_item_tags']:
|
|
#f = super(Zotero2,self).items
|
|
f = getattr(super(Zotero2,self),name)
|
|
#return self._to_iterator(f)
|
|
return partial(self._to_iterator,f)
|
|
else:
|
|
return super(Zotero2,self).__getattribute__(name)
|
|
#def items(self):
|
|
# f = super(Zotero2,self).items
|
|
# return self._to_iterator(f)
|
|
#def items0(self):
|
|
# current_start = self._params.get("start", 1)
|
|
# params = self._params
|
|
#
|
|
# params["start"] = current_start
|
|
# more_items = True
|
|
#
|
|
# while more_items:
|
|
# self.add_parameters(**params)
|
|
# items = super(Zotero2,self).items()
|
|
# for item in items:
|
|
# yield item
|
|
# params["start"] += len(items)
|
|
# if len(items) == 0:
|
|
# more_items = False
|
|
|
|
class MyZotero(Zotero2):
|
|
def __init__(self, user_id=user_id, user_key=user_key):
|
|
super(MyZotero,self).__init__(user_id,user_key)
|
|
def items_in_unglue_it_collection(self):
|
|
return self.collection_items('3RKQ23IP')
|
|
def compare_keys(self,max,pagesize1,pagesize2):
|
|
set1 = self.item_keys(max,pagesize1)
|
|
set2 = self.item_keys(max,pagesize2)
|
|
|
|
print "length: ", len(set1), len(set2)
|
|
print set1 ^ set2
|
|
def item_keys(self, max, page_size):
|
|
self.set_parameters(limit=page_size)
|
|
items = self.items()
|
|
item_set = set()
|
|
for (i, item) in enumerate(islice(items,max)):
|
|
item_set.add((item["group_id"], item["key"], item["title"]))
|
|
print i, (item["group_id"], item["key"], item["title"])
|
|
return item_set
|
|
def get_all_items(self):
|
|
print len(self.item_keys(5000,99))
|
|
def get_books(self,max=10000):
|
|
self.set_parameters(sort="type", itemType="book")
|
|
items = self.items()
|
|
for (i, item) in enumerate(islice(items,max)):
|
|
if item.get("itemType") == 'book':
|
|
yield {'group_id':item["group_id"], 'key':item["key"], 'title':item["title"],
|
|
'itemType':item.get("itemType"), 'isbn':item.get("ISBN", None)}
|
|
def upload_to_unglue_it(self,unglueit_user_name, max):
|
|
from regluit.core import bookloader
|
|
from django.contrib.auth.models import User
|
|
|
|
user = User.objects.get(username=unglueit_user_name)
|
|
books = self.get_books(max=max)
|
|
for book in books:
|
|
try:
|
|
isbn = book['isbn']
|
|
if isbn:
|
|
edition = bookloader.add_by_isbn(isbn)
|
|
# let's not trigger too much traffic to Google books for now
|
|
# regluit.core.tasks.add_related.delay(isbn)
|
|
user.wishlist.works.add(edition.work)
|
|
logger.info("Work with isbn %s added to wishlist.", isbn)
|
|
except Exception, e:
|
|
logger.info ("error adding ISBN %s: %s", isbn, e)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
zot = MyZotero()
|
|
#zot.compare_keys(24,7,3)
|
|
to_unglue = list(zot.items_in_unglue_it_collection())
|
|
print len(to_unglue), [item["title"] for item in to_unglue]
|
|
for (i,b) in enumerate(zot.get_books(300)):
|
|
print b
|
|
#zot.upload_to_unglue_it('RaymondYee',5000)
|
|
#print zot.get_all_items() |