db.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. from pymongo import MongoClient,errors,DESCENDING,ASCENDING
  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. if "site" in filter and filter["site"] != "":
  27. db_filter["source_name"]={"$regex":".*%s.*"%filter["site"], "$options": 'i'}
  28. if "minweight" in filter and filter["minweight"] != "":
  29. db_filter["weight"]={"$gt":int(filter["minweight"])}
  30. if "keyword" in filter and len(filter["keyword"]) >0:
  31. db_filter["kw"]={"$all": filter["keyword"]}
  32. #print(db_filter)
  33. res = self.c_articles.find(db_filter,{"html":0,"text":0})
  34. if res is not None:
  35. q = res.sort("scrap_date",DESCENDING).limit(limit)
  36. count = q.count()
  37. else:
  38. q = []
  39. count = 0
  40. return { 'articles': [ self.jsonable(p) for p in q ],
  41. 'count' : count }
  42. def article(self, id):
  43. ret=self.c_articles.find_one({"_id":ObjectId(id)})
  44. return self.jsonable(ret)
  45. def sources(self,id=None):
  46. if id is None:
  47. return [ self.jsonable(p) for p in self.c_sources.find() ]
  48. ret=self.c_sources.find_one({"_id":ObjectId(id)})
  49. return self.jsonable(ret)
  50. def rss_sources(self):
  51. return [ p for p in self.c_sources.find({"rss":1}) ]
  52. def insert_article(self,o):
  53. try:
  54. self.c_articles.insert_one(o)
  55. return True
  56. except errors.DuplicateKeyError:
  57. print("Dup")
  58. return False
  59. def purge_error(self):
  60. self.c_articles.remove({'error':True})
  61. def article_exists(self,url):
  62. ret=self.c_articles.find_one({'url':url})
  63. if ret is None:
  64. return False
  65. return True
  66. def lower_arr(self,arr):
  67. return [a.lower() for a in arr]
  68. def get_keywords_list(self):
  69. kw=self.client[self.DB]["keywords"]
  70. return [ k["keyword"] for k in kw.find({}) ]
  71. def get_keywords(self,category):
  72. kw=self.client[self.DB]["keywords"] #FIXME, split on "|" or regex
  73. ret = [ {"weight":k["weight"],
  74. "kw": k["keyword"],
  75. "pattern": self.lower_arr(k["keyword"].split("|")) } for k in kw.find({}) ]#FIXME, categories
  76. return ret
  77. def add_source(self,url,rss,selector,name):
  78. self.c_sources.insert({"link":url,
  79. "rss":rss,
  80. "selector":selector,
  81. "name":name,
  82. "category":0})