db.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from pymongo import MongoClient,errors
  2. from bson.objectid import ObjectId
  3. import datetime
  4. import re
  5. class db():
  6. DB="alexis"
  7. def __init__(self):
  8. self.client = MongoClient('localhost', 27017)
  9. self.c_sources=self.client[self.DB]["sources"]
  10. self.c_articles=self.client[self.DB]["articles"]
  11. def jsonable(self, el):
  12. if el is None or "_id" not in el:
  13. return el
  14. el["_id"]=str(el["_id"])
  15. return el
  16. def filter_articles(self, filter, limit=80):
  17. db_filter={}
  18. db_filter["matches"]=True
  19. db_filter["scrap_date"]={}
  20. if "maxdate" in filter and len(filter["maxdate"])>7:
  21. db_filter["scrap_date"]["$lt"]=datetime.datetime.strptime(filter["maxdate"],"%Y-%m-%d")
  22. if "mindate" in filter and len(filter["mindate"])>7:
  23. db_filter["scrap_date"]["$gt"]=datetime.datetime.strptime(filter["mindate"],"%Y-%m-%d")
  24. if db_filter["scrap_date"]=={}:
  25. del db_filter["scrap_date"]
  26. db_filter["weight"]={"$gt":int(filter["minweight"])}
  27. print(db_filter)
  28. #{'site': 'site', 'mindate': 'mind', 'maxddate': 'maxd', 'minweight': 'minwe'}
  29. return [ self.jsonable(p) for p in self.c_articles.find(db_filter,{"html":0,"text":0}).limit(limit) ]
  30. def articles(self, id=None, limit=100):
  31. if id is None:
  32. return [ self.jsonable(p) for p in self.c_articles.find({"matches":True},{"html":0,"text":0}).limit(limit) ]
  33. ret=self.c_articles.find_one({"_id":ObjectId(id)})
  34. return self.jsonable(ret)
  35. def sources(self,id=None):
  36. if id is None:
  37. return [ self.jsonable(p) for p in self.c_sources.find() ]
  38. ret=self.c_sources.find_one({"_id":ObjectId(id)})
  39. return self.jsonable(ret)
  40. def rss_sources(self):
  41. return [ p for p in self.c_sources.find({"rss":1}) ]
  42. def insert_article(self,o):
  43. try:
  44. self.c_articles.insert_one(o)
  45. return True
  46. except errors.DuplicateKeyError:
  47. print("Dup")
  48. return False
  49. def article_exists(self,url):
  50. ret=self.c_articles.find_one({'url':url})
  51. if ret is None:
  52. return False
  53. return True
  54. def lower_arr(self,arr):
  55. return [a.lower() for a in arr]
  56. def get_keywords(self,category):
  57. kw=self.client[self.DB]["keywords"]
  58. #FIXME, split on "|" or regex
  59. ret = [ {"weight":k["weight"],
  60. "kw": k["keyword"],
  61. "pattern": self.lower_arr(k["keyword"].split("|")) } for k in kw.find({}) ]#FIXME, categories
  62. return ret