script/lib/iri_tweet/tweet_twitter_user.py
changeset 98 6e8930a1b8f7
parent 82 210dc265c70f
child 243 9213a63fa34a
--- a/script/lib/iri_tweet/tweet_twitter_user.py	Thu Mar 31 12:45:50 2011 +0200
+++ b/script/lib/iri_tweet/tweet_twitter_user.py	Wed Apr 06 16:39:42 2011 +0200
@@ -1,11 +1,16 @@
-from optparse import OptionParser
-from utils import *
-import models
-from sqlalchemy.orm import sessionmaker, mapper
-import logging
+from iri_tweet.models import setup_database, Message, UserMessage, User
+from iri_tweet.utils import (get_oauth_token, get_user_query, set_logging_options, 
+    set_logging, parse_date)
+from optparse import OptionParser #@UnresolvedImport
+from sqlalchemy import BigInteger
+from sqlalchemy.orm import sessionmaker
+from sqlalchemy.schema import MetaData, Table, Column
+from sqlalchemy.sql import and_
+import datetime
+import logging #@UnresolvedImport
+import sys
 import time
 import twitter
-import sys
 
 APPLICATION_NAME = "Tweet recorder user"
 CONSUMER_KEY = "Vdr5ZcsjI1G3esTPI8yDg"
@@ -34,6 +39,8 @@
                       help="password", metavar="PASSWORD")    
     parser.add_option("-t", dest="token_filename", metavar="TOKEN_FILENAME", default=".oauth_token",
                       help="Token file name")
+    parser.add_option("-S", dest="simulate", metavar="SIMULATE", default=False, action="store_true", help="Simulate call to twitter. Do not change the database")
+    parser.add_option("-f", dest="force", metavar="FORCE", default=False, action="store_true", help="force sending message to all user even if it has already been sent")
 
 
     set_logging_options(parser)
@@ -47,21 +54,20 @@
     
     set_logging(options)
         
-    logging.debug("OPTIONS : " + repr(options))
+    logging.debug("OPTIONS : " + repr(options)) #@UndefinedVariable
 
     if not options.message or len(options.message) == 0:
         sys.exit()
 
-    engine, metadata = setup_database('sqlite:///'+options.database, echo=((options.verbose-options.quiet)>0), create_all = False)        
+    engine, metadata = setup_database('sqlite:///'+options.database, echo=((options.verbose-options.quiet)>0), create_all = True)        
     
     Session = sessionmaker()
     conn = engine.connect()
     try :
-        session = Session(bind=conn)
+        session = Session(bind=conn, autoflush=True, autocommit=True)
         try:
             metadata = MetaData(bind=conn)
             tweet_exclude_table = Table("tweet_exclude", metadata, Column('id', BigInteger, primary_key=True), prefixes=['TEMPORARY'])
-            #mapper(TweetExclude, tweet_exclude_table)
             metadata.create_all()
 
             start_date_str = options.start_date
@@ -80,8 +86,18 @@
                 te = ts + duration
                 end_date = start_date + datetime.timedelta(seconds=duration)
             
+            base_message = options.message.decode(sys.getfilesystemencoding())
+            #get or create message
+            message_obj = session.query(Message).filter(Message.text == base_message).first()
+            if not message_obj :
+                message_obj = Message(text=base_message)
+                session.add(message_obj) 
+                session.flush()           
+            
             query = get_user_query(session, start_date, end_date, hashtags, tweet_exclude_table)
-            #query = query.filter(User.screen_name == "tibo_c")
+
+            if not options.force:
+                query = query.outerjoin(UserMessage, and_(User.id == UserMessage.user_id, UserMessage.message_id == message_obj.id)).filter(UserMessage.message_id == None)
                 
             query_res = query.all()
             
@@ -91,12 +107,15 @@
             for user in query_res:
                 screen_name = user.screen_name
                 
-                message = u"@%s: %s" % (screen_name, options.message.decode(sys.getfilesystemencoding()))
-                logging.debug("new status : " + message)
-                t.statuses.update(status=message)
-                
-
+                message = u"@%s: %s" % (screen_name, base_message)
+                logging.debug("new status : " + message) #@UndefinedVariable
+                if not options.simulate:
+                    t.statuses.update(status=message)
+                    user_message = UserMessage(user_id=user.id, message_id=message_obj.id)
+                    session.add(user_message)
+                    session.flush()
         finally:
+            # if message created and simulate, do not  
             session.close()
     finally:
         conn.close()