aboutsummaryrefslogtreecommitdiff
path: root/mongodb.py
diff options
context:
space:
mode:
Diffstat (limited to 'mongodb.py')
-rw-r--r--mongodb.py253
1 files changed, 253 insertions, 0 deletions
diff --git a/mongodb.py b/mongodb.py
new file mode 100644
index 00000000..d00b453e
--- /dev/null
+++ b/mongodb.py
@@ -0,0 +1,253 @@
+#! /usr/bin/env python
+# -*- coding: utf-8 -*-
+
+__author__ = "Cedric Bonhomme"
+__version__ = "$Revision: 0.1 $"
+__date__ = "$Date: 2012/03/03 $"
+__revision__ = "$Date: 2012/03/03 $"
+__copyright__ = "Copyright (c) Cedric Bonhomme"
+__license__ = "GPLv3"
+
+import time
+import pymongo
+
+from operator import itemgetter, attrgetter
+
+class Articles(object):
+ """
+ """
+ def __init__(self, url='localhost', port=27017):
+ """
+ Instantiates the connection.
+ """
+ self.connection = pymongo.connection.Connection(url, port)
+ self.db = self.connection.pyaggr3g470r
+
+ def add_collection(self, new_collection):
+ """
+ Creates a new collection for a new feed.
+ """
+ collection = self.db[new_collection["feed_id"]]
+ #collection.create_index([("feed_link", pymongo.ASCENDING)], {"unique":True, "sparse":True})
+ collection.insert(new_collection)
+
+ def add_articles(self, articles, feed_id):
+ """
+ Add article(s) in a collection.
+ """
+ collection = self.db[str(feed_id)]
+
+ collection.create_index([("article_date", pymongo.DESCENDING)], \
+ {"unique":False, "sparse":False})
+
+ for article in articles:
+ cursor = collection.find({"article_id":article["article_id"]})
+ if cursor.count() == 0:
+ collection.insert(article)
+
+ def delete_feed(self, feed_id):
+ """
+ Delete a collection (feed with all articles).
+ """
+ self.db.drop_collection(feed_id)
+
+ def delete_article(self, feed_id, article_id):
+ """
+ Delete an article.
+ """
+ collection = self.db[str(feed_id)]
+ collection.find_and_modify(query={"article_id":article_id}, remove=True)
+
+ def get_collection(self, feed_id):
+ """
+ """
+ return self.db[str(feed_id)].find().next()
+
+ def get_all_articles(self):
+ """
+ Return all articles from all collections.
+ """
+ articles = []
+ collections = self.db.collection_names()
+ for collection_name in collections:
+ collection = self.db[collection_name]
+ articles.extend([article for article in collection.find({'type':1})])
+ return articles
+
+ def get_article(self, feed_id, article_id):
+ """
+ """
+ collection = self.db[str(feed_id)]
+ return collection.find({"article_id":article_id}).next()
+
+ def get_all_collections(self, condition=None):
+ """
+ """
+ feeds = []
+ collections = self.db.collection_names()
+ for collection_name in collections:
+ if collection_name != "system.indexes":
+ if condition is None:
+ cursor = self.db[collection_name].find({"type":0})
+ else:
+ cursor = self.db[collection_name].find({"type":0, condition[0]:condition[1]})
+ if cursor.count() != 0:
+ feeds.append(cursor.next())
+ feeds.sort(key = lambda elem: elem['feed_title'].lower())
+ return feeds
+
+ def get_articles_from_collection(self, feed_id, condition=None):
+ """
+ Return all the articles of a collection.
+ """
+ collection = self.db[str(feed_id)]
+ if condition is None:
+ cursor = collection.find({"type":1})
+ else:
+ cursor = collection.find({"type":1, condition[0]:condition[1]})
+ return cursor.sort([("article_date", pymongo.DESCENDING)])
+
+ def print_articles_from_collection(self, collection_id):
+ """
+ Print the articles of a collection.
+ """
+ collection = self.db[str(collection_id)]
+ cursor = collection.find({"type":1})
+ print "Article for the collection", collection_id
+ for d in cursor:
+ print d
+ print
+
+ def nb_articles(self, feed_id=None):
+ """
+ Return the number of users.
+ """
+ if feed_id is not None:
+ collection = self.db[feed_id]
+ cursor = collection.find({'type':1})
+ return cursor.count()
+ else:
+ nb_articles = 0
+ for feed_id in self.db.collection_names():
+ nb_articles += self.nb_articles(feed_id)
+ return nb_articles
+
+ def nb_favorites(self, feed_id=None):
+ if feed_id is not None:
+ collection = self.db[feed_id]
+ cursor = collection.find({'type':1, 'article_like':True})
+ return cursor.count()
+ else:
+ nb_favorites = 0
+ for feed_id in self.db.collection_names():
+ nb_favorites += self.nb_favorites(feed_id)
+ return nb_favorites
+
+ def nb_mail_notifications(self):
+ """
+ Return the number of subscribed feeds.
+ """
+ nb_mail_notifications = 0
+ for feed_id in self.db.collection_names():
+ collection = self.db[feed_id]
+ cursor = collection.find({'type':0, 'mail':True})
+ nb_mail_notifications += cursor.count()
+ return nb_mail_notifications
+
+ def nb_unread_articles(self, feed_id=None):
+ if feed_id is not None:
+ collection = self.db[feed_id]
+ cursor = collection.find({'article_readed':False})
+ return cursor.count()
+ else:
+ unread_articles = 0
+ for feed_id in self.db.collection_names():
+ unread_articles += self.nb_unread_articles(feed_id)
+ return unread_articles
+
+ def like_article(self, like, feed_id, article_id):
+ """
+ Like or unlike an article.
+ """
+ collection = self.db[str(feed_id)]
+ collection.update({"article_id": article_id}, {"$set": {"article_like": like}})
+
+ def mark_as_read(self, readed, feed_id=None, article_id=None):
+ """
+ """
+ if feed_id != None and article_id != None:
+ collection = self.db[str(feed_id)]
+ collection.update({"article_id": article_id, "article_readed":not readed}, {"$set": {"article_readed": readed}})
+ elif feed_id != None and article_id == None:
+ collection = self.db[str(feed_id)]
+ collection.update({"type": 1, "article_readed":not readed}, {"$set": {"article_readed": readed}}, multi=True)
+ else:
+ for feed_id in self.db.collection_names():
+ self.mark_as_read(readed, feed_id, None)
+
+ def list_collections(self):
+ """
+ List all collections (feed).
+ """
+ collections = self.db.collection_names()
+ return collections
+
+ # Functions on database
+ def drop_database(self):
+ """
+ Drop all the database
+ """
+ self.connection.drop_database('pyaggr3g470r')
+
+
+if __name__ == "__main__":
+ # Point of entry in execution mode.
+ articles = Articles()
+
+
+ # Create a collection for a stream
+ collection_dic = {"collection_id": 42,\
+ "feed_image": "Image", \
+ "feed_title": "Title", \
+ "feed_link": "Link", \
+ "site_title": "Site link", \
+ "mail": True, \
+ }
+
+ #articles.add_collection(collection_dic)
+
+
+
+ # Add an article in the newly created collection
+ article_dic1 = {"article_id": 51, \
+ "article_date": "Today", \
+ "article_link": "Link of the article", \
+ "article_title": "The title", \
+ "article_content": "The content of the article", \
+ "article_readed": True, \
+ "article_like": True \
+ }
+
+ article_dic2 = {"article_id": 52, \
+ "article_date": "Yesterday", \
+ "article_link": "Link", \
+ "article_title": "Hello", \
+ "article_content": "The content of the article", \
+ "article_readed": True, \
+ "article_like": True \
+ }
+
+ #articles.add_articles([article_dic1, article_dic2], 42)
+
+
+ # Print articles of the collection
+ #articles.print_articles_from_collection("http://esr.ibiblio.org/?feed=rss2")
+
+
+ print "All articles:"
+ #print articles.get_all_articles()
+
+
+
+ # Drop the database
+ articles.drop_database() \ No newline at end of file
bgstack15