diff -r f7febf052997 -r e0dbcf98c13e server/lib/iri_tweet/models.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/server/lib/iri_tweet/models.py Tue Feb 14 18:38:48 2012 +0100 @@ -0,0 +1,290 @@ +from sqlalchemy import (Boolean, Column, Enum, BigInteger, Integer, String, + ForeignKey, DateTime, create_engine) +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import relationship, sessionmaker +import anyjson +import datetime +import email.utils +import iri_tweet + + +Base = declarative_base() + +APPLICATION_NAME = "IRI_TWITTER" +CONSUMER_KEY = "54ThDZhpEjokcMgHJOMnQA" +CONSUMER_SECRET = "wUoL9UL2T87tfc97R0Dff2EaqRzpJ5XGdmaN2XK3udA" +ACCESS_TOKEN_KEY = None +ACCESS_TOKEN_SECRET = None +#ACCESS_TOKEN_KEY= "47312923-LiNTtz0I18YXMVIrFeTuhmH7bOvYsK6p3Ln2Dc" +#ACCESS_TOKEN_SECRET = "r3LoXVcjImNAElUpWqTu2SG2xCdWFHkva7xeQoncA" + +def adapt_date(date_str): + ts = email.utils.parsedate_tz(date_str) #@UndefinedVariable + return datetime.datetime(*ts[0:7]) + +def adapt_json(obj): + if obj is None: + return None + else: + return anyjson.serialize(obj) + +class TweetMeta(type(Base)): + + def __init__(cls, name, bases, ns): #@NoSelf + def init(self, **kwargs): + for key, value in kwargs.items(): + if hasattr(self, key): + setattr(self, key, value) + super(cls, self).__init__() + setattr(cls, '__init__', init) + super(TweetMeta, cls).__init__(name, bases, ns) + + +class ProcessEvent(Base): + __metaclass__ = TweetMeta + __tablename__ = "tweet_process_event" + id = Column(Integer, primary_key=True, autoincrement=True) + ts = Column(DateTime, default=datetime.datetime.utcnow, index=True) + type = Column(Enum("start","pid","shutdown","error", "start_worker", "stop_worker", "model_version", "application_name", "application_version", name="process_event_type_enum"), nullable=False) + args = Column(String) + +class EntityType(Base): + __metaclass__ = TweetMeta + __tablename__ = "tweet_entity_type" + id = Column(Integer, primary_key=True, autoincrement=True) + label = Column(String) + +class Entity(Base): + __metaclass__ = TweetMeta + __tablename__ = "tweet_entity" + id = Column(Integer, primary_key=True) + tweet_id = Column(BigInteger, ForeignKey('tweet_tweet.id')) + type = Column(String) + entity_type_id = Column(Integer, ForeignKey('tweet_entity_type.id'), nullable=False) + entity_type = relationship("EntityType", backref="entities") + indice_start = Column(Integer) + indice_end = Column(Integer) + source = Column(String) + __mapper_args__ = {'polymorphic_on': type, 'polymorphic_identity': 'entity_entity', 'with_polymorphic':'*'} + + +class TweetSource(Base): + __metaclass__ = TweetMeta + __tablename__ = 'tweet_tweet_source' + id = Column(Integer, primary_key=True, autoincrement=True) + original_json = Column(String) + received_at = Column(DateTime, default=datetime.datetime.utcnow, index=True) + + +class TweetLog(Base): + + TWEET_STATUS = { + 'OK' : 1, + 'ERROR' : 2, + 'NOT_TWEET': 3, + } + __metaclass__ = TweetMeta + + __tablename__ = 'tweet_tweet_log' + id = Column(Integer, primary_key=True, autoincrement=True) + ts = Column(DateTime, default=datetime.datetime.utcnow, index=True) + tweet_source_id = Column(Integer, ForeignKey('tweet_tweet_source.id')) + tweet_source = relationship("TweetSource", backref="logs") + status = Column(Integer) + error = Column(String) + error_stack = Column(String) + + +class Tweet(Base): + __metaclass__ = TweetMeta + __tablename__ = 'tweet_tweet' + + id = Column(BigInteger, primary_key=True, autoincrement=False) + id_str = Column(String) + contributors = Column(String) + coordinates = Column(String) + created_at = Column(DateTime, index=True) + favorited = Column(Boolean) + geo = Column(String) + in_reply_to_screen_name = Column(String) + in_reply_to_status_id = Column(BigInteger) + in_reply_to_status_id_str = Column(String) + in_reply_to_user_id = Column(BigInteger) + in_reply_to_user_id_str = Column(String) + place = Column(String) + retweet_count = Column(String) + retweeted = Column(Boolean) + source = Column(String) + text = Column(String) + truncated = Column(Boolean) + user_id = Column(Integer, ForeignKey('tweet_user.id')) + user = relationship("User", backref="tweets") + tweet_source_id = Column(Integer, ForeignKey('tweet_tweet_source.id')) + tweet_source = relationship("TweetSource", backref="tweet") + entity_list = relationship(Entity, backref='tweet') + received_at = Column(DateTime, default=datetime.datetime.utcnow, index=True) + + +class UserMessage(Base): + __metaclass__ = TweetMeta + __tablename__ = "tweet_user_message" + + id = Column(Integer, primary_key=True) + user_id = Column(Integer, ForeignKey('tweet_user.id')) + user = relationship("User", backref="messages") + created_at = Column(DateTime, default=datetime.datetime.utcnow) + message_id = Column(Integer, ForeignKey('tweet_message.id')) + +class Message(Base): + __metaclass__ = TweetMeta + __tablename__ = "tweet_message" + + id = Column(Integer, primary_key=True) + created_at = Column(DateTime, default=datetime.datetime.utcnow) + text = Column(String) + users = relationship(UserMessage, backref='message') + + +class User(Base): + __metaclass__ = TweetMeta + __tablename__ = "tweet_user" + + id = Column(BigInteger, primary_key=True, autoincrement=False) + id_str = Column(String) + contributors_enabled = Column(Boolean) + created_at = Column(DateTime) + description = Column(String) + favourites_count = Column(Integer) + follow_request_sent = Column(Boolean) + followers_count = Column(Integer) + following = Column(String) + friends_count = Column(Integer) + geo_enabled = Column(Boolean) + is_translator = Column(Boolean) + lang = Column(String) + listed_count = Column(Integer) + location = Column(String) + name = Column(String) + notifications = Column(String) + profile_background_color = Column(String) + profile_background_image_url = Column(String) + profile_background_tile = Column(Boolean) + profile_image_url = Column(String) + profile_image_url_https = Column(String) + profile_link_color = Column(String) + profile_sidebar_border_color = Column(String) + profile_sidebar_fill_color = Column(String) + profile_text_color = Column(String) + default_profile_image = Column(String) + profile_use_background_image = Column(Boolean) + protected = Column(Boolean) + screen_name = Column(String, index=True) + show_all_inline_media = Column(Boolean) + statuses_count = Column(Integer) + time_zone = Column(String) + url = Column(String) + utc_offset = Column(Integer) + verified = Column(Boolean) + + +class Hashtag(Base): + __metaclass__ = TweetMeta + __tablename__ = "tweet_hashtag" + id = Column(Integer, primary_key=True) + text = Column(String, unique=True, index=True) + + +class Url(Base): + __metaclass__ = TweetMeta + __tablename__ = "tweet_url" + id = Column(Integer, primary_key=True) + url = Column(String, unique=True) + expanded_url = Column(String) + + +class MediaType(Base): + __metaclass__ = TweetMeta + __tablename__ = "tweet_media_type" + id = Column(Integer, primary_key=True, autoincrement=True) + label = Column(String, unique=True, index=True) + + + +class Media(Base): + __metaclass__ = TweetMeta + __tablename__ = "tweet_media" + id = Column(BigInteger, primary_key=True, autoincrement=False) + id_str = Column(String, unique=True) + media_url = Column(String, unique=True) + media_url_https = Column(String, unique=True) + url = Column(String) + display_url = Column(String) + expanded_url = Column(String) + sizes = Column(String) + type_id = Column(Integer, ForeignKey("tweet_media_type.id")) + type = relationship(MediaType, primaryjoin=type_id == MediaType.id) + + + +class EntityHashtag(Entity): + __tablename__ = "tweet_entity_hashtag" + __mapper_args__ = {'polymorphic_identity': 'entity_hashtag'} + id = Column(Integer, ForeignKey('tweet_entity.id'), primary_key=True) + hashtag_id = Column(Integer, ForeignKey("tweet_hashtag.id")) + hashtag = relationship(Hashtag, primaryjoin=hashtag_id == Hashtag.id) + + +class EntityUrl(Entity): + __tablename__ = "tweet_entity_url" + __mapper_args__ = {'polymorphic_identity': 'entity_url'} + id = Column(Integer, ForeignKey('tweet_entity.id'), primary_key=True) + url_id = Column(Integer, ForeignKey("tweet_url.id")) + url = relationship(Url, primaryjoin=url_id == Url.id) + +class EntityUser(Entity): + __tablename__ = "tweet_entity_user" + __mapper_args__ = {'polymorphic_identity': 'entity_user'} + id = Column(Integer, ForeignKey('tweet_entity.id'), primary_key=True) + user_id = Column(BigInteger, ForeignKey('tweet_user.id')) + user = relationship(User, primaryjoin=(user_id == User.id)) + + +class EntityMedia(Entity): + __tablename__ = "tweet_entity_media" + __mapper_args__ = {'polymorphic_identity': 'entity_media'} + id = Column(Integer, ForeignKey('tweet_entity.id'), primary_key=True) + media_id = Column(BigInteger, ForeignKey('tweet_media.id')) + media = relationship(Media, primaryjoin=(media_id == Media.id)) + +def add_model_version(session, must_commit=True): + pe = ProcessEvent(args=iri_tweet.get_version(), type="model_version") + session.add(pe) + if must_commit: + session.commit() + +def setup_database(*args, **kwargs): + + session_argname = [ 'autoflush','binds', "class_", "_enable_transaction_accounting","expire_on_commit", "extension", "query_cls", "twophase", "weak_identity_map", "autocommit"] + + kwargs_ce = dict((k, v) for k,v in kwargs.items() if (k not in session_argname and k != "create_all")) + + engine = create_engine(*args, **kwargs_ce) + metadata = Base.metadata + + kwargs_sm = {'bind': engine} + + kwargs_sm.update([(argname, kwargs[argname]) for argname in session_argname if argname in kwargs]) + + Session = sessionmaker(**kwargs_sm) + #set model version + + if kwargs.get('create_all', True): + metadata.create_all(engine) + session = Session() + try: + add_model_version(session) + finally: + session.close() + + return (engine, metadata, Session) +