diff -r 861cae17abda -r 6e8930a1b8f7 script/lib/iri_tweet/tweet_twitter_user.py --- 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()