--- a/script/lib/iri_tweet/models.py Wed Apr 06 17:34:27 2011 +0200
+++ b/script/lib/iri_tweet/models.py Wed Apr 06 17:38:39 2011 +0200
@@ -1,10 +1,10 @@
-from sqlalchemy import Boolean, Table, Column, BigInteger, Integer, String, \
- MetaData, ForeignKey, DateTime, create_engine
+from sqlalchemy import (Boolean, Column, BigInteger, Integer, String, ForeignKey,
+ DateTime, create_engine)
from sqlalchemy.ext.declarative import declarative_base
-from sqlalchemy.orm import relationship, backref
+from sqlalchemy.orm import relationship
+import anyjson
import datetime
import email.utils
-import anyjson
Base = declarative_base()
@@ -12,11 +12,13 @@
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)
+ ts = email.utils.parsedate_tz(date_str) #@UndefinedVariable
return datetime.datetime(*ts[0:7])
def adapt_json(obj):
@@ -72,7 +74,24 @@
for key, value in kwargs.items():
if hasattr(self,key):
setattr(self,key,value)
+
+class UserMessage(Base):
+ __tablename__ = "tweet_user_message"
+
+ id = Column(Integer, primary_key = True)
+ user_id = Column(Integer, ForeignKey('tweet_user.id'))
+ created_at = Column(DateTime, default=datetime.datetime.now())
+ message_id = Column(Integer, ForeignKey('tweet_message.id'))
+
+class Message(Base):
+ __tablename__ = "tweet_message"
+
+ id = Column(Integer, primary_key = True)
+ created_at = Column(DateTime, default=datetime.datetime.now())
+ text = Column(String)
+ users = relationship(UserMessage, backref='message')
+
class User(Base):
__tablename__ = "tweet_user"
@@ -112,12 +131,12 @@
utc_offset = Column(Integer)
verified= Column(Boolean)
tweets = relationship(Tweet, backref='user')
+ messages = relationship(UserMessage, backref='user')
def __init__(self, **kwargs):
for key, value in kwargs.items():
if hasattr(self,key):
- setattr(self,key,value)
-
+ setattr(self,key,value)
class Hashtag(Base):
Binary file script/lib/iri_tweet/models.pyc has changed
--- a/script/lib/iri_tweet/tweet_twitter_user.py Wed Apr 06 17:34:27 2011 +0200
+++ b/script/lib/iri_tweet/tweet_twitter_user.py Wed Apr 06 17:38:39 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()
--- a/script/lib/iri_tweet/utils.py Wed Apr 06 17:34:27 2011 +0200
+++ b/script/lib/iri_tweet/utils.py Wed Apr 06 17:38:39 2011 +0200
@@ -1,15 +1,17 @@
-from models import *
-from sqlalchemy.sql import select, or_
-import anyjson
+from models import Tweet, User, Hashtag, EntityHashtag, EntityUser, Url, \
+ EntityUrl, CONSUMER_KEY, CONSUMER_SECRET, APPLICATION_NAME, ACCESS_TOKEN_KEY, \
+ ACCESS_TOKEN_SECRET, adapt_date, adapt_json
+from sqlalchemy.sql import select, or_ #@UnresolvedImport
+import anyjson #@UnresolvedImport
import datetime
import email.utils
-import logging
+import logging #@UnresolvedImport
import os.path
import sys
-import twitter
-import twitter.oauth
-import twitter.oauth_dance
-import twitter_text
+import twitter.oauth #@UnresolvedImport
+import twitter.oauth_dance #@UnresolvedImport
+import twitter_text #@UnresolvedImport
+
CACHE_ACCESS_TOKEN = {}
@@ -22,7 +24,7 @@
return CACHE_ACCESS_TOKEN[application_name]
if token_file_path and os.path.exists(token_file_path):
- logging.debug("reading token from file %s" % token_file_path)
+ logging.debug("reading token from file %s" % token_file_path) #@UndefinedVariable
CACHE_ACCESS_TOKEN[application_name] = twitter.oauth.read_token_file(token_file_path)
return CACHE_ACCESS_TOKEN[application_name]
#read access token info from path
@@ -34,7 +36,7 @@
return CACHE_ACCESS_TOKEN[application_name]
def parse_date(date_str):
- ts = email.utils.parsedate_tz(date_str)
+ ts = email.utils.parsedate_tz(date_str) #@UndefinedVariable
return datetime.datetime(*ts[0:7])
def clean_keys(dict_val):
@@ -103,7 +105,7 @@
self.token_filename = token_filename
def __get_user(self, user_dict):
- logging.debug("Get user : " + repr(user_dict))
+ logging.debug("Get user : " + repr(user_dict)) #@UndefinedVariable
user_id = user_dict.get("id",None)
user_name = user_dict.get("screen_name", user_dict.get("name", None))
@@ -130,8 +132,8 @@
else:
user_dict = t.users.show(screen_name=user_name)
except Exception as e:
- logging.info("get_user : TWITTER ERROR : " + repr(e))
- logging.info("get_user : TWITTER ERROR : " + str(e))
+ logging.info("get_user : TWITTER ERROR : " + repr(e)) #@UndefinedVariable
+ logging.info("get_user : TWITTER ERROR : " + str(e)) #@UndefinedVariable
user_dict = adapt_fields(user_dict, fields_adapter["stream"]["user"])
if "id" not in user_dict:
@@ -145,7 +147,7 @@
return user
def __process_entity(self, ind, ind_type):
- logging.debug("Process_entity : " + repr(ind) + " : " + repr(ind_type))
+ logging.debug("Process_entity : " + repr(ind) + " : " + repr(ind_type)) #@UndefinedVariable
ind = clean_keys(ind)
@@ -200,7 +202,7 @@
'urls' : process_urls
}[ind_type]()
- logging.debug("Process_entity entity_dict: " + repr(entity_dict))
+ logging.debug("Process_entity entity_dict: " + repr(entity_dict)) #@UndefinedVariable
if entity:
self.session.add(entity)
self.session.flush()
@@ -217,7 +219,7 @@
# get or create user
user = self.__get_user(self.json_dict["user"])
if user is None:
- logging.warning("USER not found " + repr(self.json_dict["user"]))
+ logging.warning("USER not found " + repr(self.json_dict["user"])) #@UndefinedVariable
ts_copy["user"] = None
ts_copy["user_id"] = None
else:
@@ -265,7 +267,7 @@
user = self.__get_user(user_fields)
if user is None:
- logging.warning("USER not found " + repr(user_fields))
+ logging.warning("USER not found " + repr(user_fields)) #@UndefinedVariable
tweet_fields["user"] = None
tweet_fields["user_id"] = None
else:
@@ -310,8 +312,8 @@
else:
logging_config["filename"] = options.logfile
- logging_config["level"] = max(logging.NOTSET, min(logging.CRITICAL, logging.WARNING - 10 * options.verbose + 10 * options.quiet))
- logging.basicConfig(**logging_config)
+ logging_config["level"] = max(logging.NOTSET, min(logging.CRITICAL, logging.WARNING - 10 * options.verbose + 10 * options.quiet)) #@UndefinedVariable
+ logging.basicConfig(**logging_config) #@UndefinedVariable
options.debug = (options.verbose-options.quiet > 0)
@@ -328,7 +330,7 @@
query = session.query(Tweet).join(EntityHashtag).join(Hashtag)
if tweet_exclude_table is not None:
- query = query.filter(~Tweet.id.in_(select([tweet_exclude_table.c.id])))
+ query = query.filter(~Tweet.id.in_(select([tweet_exclude_table.c.id]))) #@UndefinedVariable
query = query.filter(Tweet.created_at >= start_date).filter(Tweet.created_at <= end_date)
@@ -338,7 +340,7 @@
return l
htags = reduce(merge_hash, hashtags, [])
- query = query.filter(or_(*map(lambda h: Hashtag.text.contains(h), htags)))
+ query = query.filter(or_(*map(lambda h: Hashtag.text.contains(h), htags))) #@UndefinedVariable
return query
@@ -347,7 +349,7 @@
query = session.query(User).join(Tweet).join(EntityHashtag).join(Hashtag)
if tweet_exclude_table is not None:
- query = query.filter(~Tweet.id.in_(select([tweet_exclude_table.c.id])))
+ query = query.filter(~Tweet.id.in_(select([tweet_exclude_table.c.id]))) #@UndefinedVariable
query = query.filter(Tweet.created_at >= start_date).filter(Tweet.created_at <= end_date)
@@ -357,7 +359,7 @@
return l
htags = reduce(merge_hash, hashtags, [])
- query = query.filter(or_(*map(lambda h: Hashtag.text.contains(h), htags)))
+ query = query.filter(or_(*map(lambda h: Hashtag.text.contains(h), htags))) #@UndefinedVariable
return query.distinct()
Binary file script/lib/iri_tweet/utils.pyc has changed
--- a/web/about.php Wed Apr 06 17:34:27 2011 +0200
+++ b/web/about.php Wed Apr 06 17:38:39 2011 +0200
@@ -14,8 +14,8 @@
<!-- Import fancy-type plugin for the sample page. -->
<link rel="stylesheet" href="res/blueprint/plugins/fancy-type/screen.css" type="text/css" media="screen, projection">
- <link rel="stylesheet" href="custom.css" type="text/css" media="screen, projection">
- <link rel="stylesheet" href="tabs-slideshow.css" type="text/css" media="screen, projection">
+ <link rel="stylesheet" href="res/css/custom.css" type="text/css" media="screen, projection">
+ <link rel="stylesheet" href="res/css/tabs-slideshow.css" type="text/css" media="screen, projection">
<link rel="stylesheet" type="text/css" href="res/jquery.fancybox/fancybox/jquery.fancybox-1.3.4.css" media="screen">
<link rel="stylesheet" type="text/css" href="res/niceforms/niceforms-custom.css" media="screen" >
--- a/web/client.php Wed Apr 06 17:34:27 2011 +0200
+++ b/web/client.php Wed Apr 06 17:38:39 2011 +0200
@@ -60,7 +60,7 @@
<!-- Import fancy-type plugin for the sample page. -->
<link rel="stylesheet" href="res/blueprint/plugins/fancy-type/screen.css" type="text/css" media="screen, projection">
- <link rel="stylesheet" href="custom.css" type="text/css" media="screen, projection">
+ <link rel="stylesheet" href="res/css/custom.css" type="text/css" media="screen, projection">
<link rel="stylesheet" type="text/css" href="res/jquery.fancybox/fancybox/jquery.fancybox-1.3.4.css" media="screen">
<link rel="stylesheet" type="text/css" href="res/niceforms/niceforms-custom.css" media="screen" >
--- a/web/custom.css Wed Apr 06 17:34:27 2011 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,117 +0,0 @@
-/* -----------------------------------------------------------------------
-
-
- IRI - Live tweet annotation CSS
- http://www.iri.centrepompidou.fr
-
- * Copyright (c) 2010-Present. See LICENSE for more info. (cecill-C)
- * Contributor : Samuel Huron
-
------------------------------------------------------------------------ */
-
-body {background-image:url(images/bgd.jpg);background-repeat:repeat-x;background-color:#f7f6f6;font-family: 'PT Sans', arial, serif; }
-textarea {margin-left:3px;height: 60px;width: 330px;padding:5px;background-image:url(images/tweetWriterBgdTxtArea.gif);background-repeat:no-repeat;border: none;}
-.loginbutton{margin-left:3px;height: 60px;width: 330px;padding:5px;background-image:url(images/tweetWriterBgdUnconnect.gif);background-repeat:no-repeat;border: none;margin-bottom:10px;color:#fff;}
-.loginlink{text-decoration:none;color:#fff;}
-.menuLink:active {text-decoration:none;}
-.menuLink:visited {text-decoration:none;}
-h3{font-size: 1.5em;line-height: 1;margin-bottom: 0.3em;}
-
-#Aboutbox{background-image:url(images/about_bgd.jpg);background-repeat:no-repeat;width:600px;height:360px;overflow:auto; border:1px solid #fff;}
-.lightBorder{padding:20px;}
-.lightTitle{font-size: 48px;font-weight:900;color:#e6e6e6;font-family: 'Geo', arial, serif;line-height:80%}
-.lightSubTitle{font-size: 24px;font-weight:bold;color:#262626; width:250px;line-height:80%}
-.lightDescription{font-size: 12px;color:#000; width:288px;text-align:justify;margin-top:15px;}
-.lightButton{width:134px;height:22px;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;}
-.lightButton:active{width:134px;height:22px;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;}
-.lightButton:over{text-decoration:none;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;}
-
-
-.logo{padding-right:10px;float:left;}
-.menu{float:left;height:62px;border-left:1px solid #c3c3c3;list-style-type:none;padding:0px;margin:0px;}
-.menuUnderline{margin-left:0px;padding-left:0px;background-image:url(images/menu_underline.gif);background-repeat:no-repeat;background-position:left bottom; width:205px;margin-top:3px;}
-.menuLink{text-decoration:none; margin:5px; color:#000}
-.menuLink:active {text-decoration:none;}
-.menuLink:visited {text-decoration:none;}
-
-.tweetContainer{position:absolute; margin-top:70px;}
-.tweetWriter{background-image:url(images/tweetWriterBgd.gif);width:359px;height:136px;padding:10px;position:absolute; margin-top:70px;}
-.tweetWriterTitle{color:4b4b4b;font-family: 'PT Sans Narrow', arial, serif;}
-.tweetExplain{background-image:url(images/tweetExplainBgd.gif);width:359px;height:510px;padding:10px;position:absolute; margin-top:70px;}
-
-.tweetReader{width:377px;height:450px;position:absolute; margin-top:225px;border:1px solid #c3c3c3;background:#ffffff;}
-.tweetButton{float:right;margin-right:5px;}
-
-.timelinePlayer{border:1px solid #c3c3c3;width:650px;height:650px;}
-.videoLivePlayer{border:1px solid #c3c3c3;width:500px;height:375px;}
-.videoLive{width:500px;height:378px;background:#fff;float:left;margin-top:20px;padding:5px;}
-.videoLiveProgram{width:500px;margin-top:425px;margin-left:392px;position:absolute;}
-.videoLiveProgram2{width:500px;margin-top:470px;margin-left:392px;position:absolute;}
-
-.videoLiveProgramTitle{color:#4b4b4b;font-family: 'PT Sans Narrow', arial, serif;font-size: 1.5em;padding:5px;border:1px solid #c3c3c3;background-color:#efefef;background-image:url(images/bgdTitle.jpg);background-repeat:no-repeat;}
-.videoLiveProgramDescription{padding:5px;border:1px solid #c3c3c3;padding:5px;border-top:none;background-color:#fff;background-image:url(images/bgdDescription.jpg);background-repeat:no-repeat;height:193px;overflow:scroll;}
-
-
-.footer{margin-top:770px;width:900px;height:20px;position:absolute;text-align:center;}
-.footerLink{text-decoration:none; margin:5px; color:#000;font-family: 'PT Sans Narrow', arial, serif;font-size: 1.1em;}
-.footerLink:active {text-decoration:none;}
-.footerLink:visited {text-decoration:none;}
-
-.tooltip {display:none;background:transparent url(images/white_arrow.png);font-size:12px;height:70px;width:160px;padding:25px;color:#000;}
-
-.timeline{height:28px;border: 1px solid #ccc;}
-.timeFragment {float:left;position:relative;float:left;}
-.timeFrame {border-left: 1px solid #AAA;border-right: 1px solid #AAA;height:10px;float:left;position:relative;}
-.bigTimeFrame {border-right: 1px solid #ccc;float:left;position:relative;}
-
-.arrowContainer{height:10px;width:100%;}
-
-.cleaner {clear:both;}
-.txt{visibility:hidden;}
-
-
-.clear { /* generic container (i.e. div) for floating buttons */
- overflow: hidden;
- width: 100%;
-}
-
-a.button_w { background: transparent url('images/bg_button_a_w.png') no-repeat scroll top right; color: #444;display: block;float: left;font: normal 12px arial, sans-serif;height: 24px;margin-right: 6px;padding-right: 18px; text-decoration: none;}
-a.button_w span { background: transparent url('images/bg_button_span_w.png') no-repeat; display: block;line-height: 14px; padding: 5px 0 5px 18px;}
-
-a.button_b { background: transparent url('images/bg_button_a_b.png') no-repeat scroll top right; color: #fff;display: block;float: left;font: bold 12px arial, sans-serif;height: 24px;margin-right: 6px;padding-right: 18px; text-decoration: none;}
-a.button_b span { background: transparent url('images/bg_button_span_b.png') no-repeat; display: block;line-height: 14px; padding: 5px 0 5px 18px;}
-
-#question{background: transparent url('images/bt_blue.png') no-repeat; width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; }
-#question:active {text-decoration:none;}
-#question:visited {text-decoration:none;}
-#reference{background: transparent url('images/bt_yellow.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; }
-#reference:active {text-decoration:none;}
-#reference:visited {text-decoration:none;}
-#positive{background: transparent url('images/bt_green.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; }
-#positive:active {text-decoration:none;}
-#positive:visited {text-decoration:none;}
-#negative{background: transparent url('images/bt_red.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; }
-#negative:active {text-decoration:none;}
-#negative:visited {text-decoration:none;}
-
-.introBox{width:880px;height:280px;padding:10px;position:absolute; margin-top:70px;}
-.aboutBox{background-image:url(images/archivesBoxBody.gif);width:900px;position:absolute; margin-top:70px;}
-.archivesBox{background-image:url(images/archivesBoxBody.gif);width:900px;position:absolute; margin-top:450px;}
-.archivesBoxContainer{padding:10px;width:880px;padding-bottom:0px;display:block; }
-.archivesBoxClear { /* generic container (i.e. div) for floating buttons */
- overflow: hidden;
- width: 100%;
- background-image:url(images/archivesBoxBody.gif);
- height:10px;
-}
-.archivesBoxFooter{background-repeat:no-repeat;background-position:left bottom;background-image:url(images/archivesBoxFooter.gif);width:100%;height:3px;}
-.archivesBoxHeader{background-repeat:no-repeat;background-position:left top;background-image:url(images/archivesBoxHeader.gif);width:100%;height:3px;}
-
-.archivesTitle{color:4b4b4b;font-family: 'PT Sans Narrow', arial, serif;font-size:24px;}
-.archivesVideoBox{margin:5px;padding:5px;position:relative;display:inline-block;float:left;border: solid 1px #ccc;background:#f2f2f2;cursor:pointer;}
-.AVBtitle{font-weight:bold;font-family: 'PT Sans Narrow', arial, serif; font-size:18px;}
-
-.slideTitle{font-size:20px;}
-.slideText{font-size:15px;}
-.slides{background-repeat:no-repeat;background-position:right top;}
-#minilogo{background-repeat:no-repeat;background-position:left top;background-image:url(images/pol_color.gif);width:46px;height:10px;margin-top:50px;z-index:9;position:absolute;margin-left:100px;}}
\ No newline at end of file
--- a/web/index.php Wed Apr 06 17:34:27 2011 +0200
+++ b/web/index.php Wed Apr 06 17:38:39 2011 +0200
@@ -39,8 +39,8 @@
<!-- Import fancy-type plugin for the sample page. -->
<link rel="stylesheet" href="res/blueprint/plugins/fancy-type/screen.css" type="text/css" media="screen, projection">
- <link rel="stylesheet" href="custom.css" type="text/css" media="screen, projection">
- <link rel="stylesheet" href="tabs-slideshow.css" type="text/css" media="screen, projection">
+ <link rel="stylesheet" href="res/css/custom.css" type="text/css" media="screen, projection">
+ <link rel="stylesheet" href="res/css/tabs-slideshow.css" type="text/css" media="screen, projection">
<link rel="stylesheet" type="text/css" href="res/jquery.fancybox/fancybox/jquery.fancybox-1.3.4.css" media="screen">
<link rel="stylesheet" type="text/css" href="res/niceforms/niceforms-custom.css" media="screen" >
@@ -199,10 +199,12 @@
<!-- -->
<h3 class="archivesTitle">Les derniers événements qui ont utilisé le tweet polemic : </h3>
<div id="AVB1" class="archivesVideoBox">
- <img src="images/tail_enmi2010.jpg" width="270" height="150"/>
+ <a href="http://amateur.iri.centrepompidou.fr/nouveaumonde/enmi/conf/program/2010_2" target="_blank">
+ <img src="images/tail_enmi2010.jpg" width="270" height="150"/>
+ </a>
<div class="AVBtitle">ENMI 2010</div>
<div class="AVBtext">
- par <a href="#">IRI</a> au Centre Pompidou
+ par <a href="http://www.iri.centrepompidou.fr">IRI</a> au Centre Pompidou
<br/>les 14 et 15 décembre 2010 |· 08:30 - 10:30
</div>
</div>
@@ -213,7 +215,7 @@
</a>
<div class="AVBtitle">Clay Shirky le net, le surplus cognitif</div>
<div class="AVBtext">
- par <a href="#">RSLN</a> à Micorsoft France
+ par <a href="http://www.rslnmag.fr/">RSLN</a> à Micorsoft France
<br/>le lundi 31 janvier 2011·| 08:30 - 10:30
</div>
</div>
@@ -224,7 +226,7 @@
</a>
<div class="AVBtitle">OPENDATA</div>
<div class="AVBtext">
- par <a href="#">RSLN</a> à Micorsoft France
+ par <a href="http://www.rslnmag.fr/">RSLN</a> à Micorsoft France
<br/>le jeudi 17 mars 2011 | 14:30 - 17:15
</div>
</div>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/web/res/css/custom.css Wed Apr 06 17:38:39 2011 +0200
@@ -0,0 +1,117 @@
+/* -----------------------------------------------------------------------
+
+
+ IRI - Live tweet annotation CSS
+ http://www.iri.centrepompidou.fr
+
+ * Copyright (c) 2010-Present. See LICENSE for more info. (cecill-C)
+ * Contributor : Samuel Huron
+
+----------------------------------------------------------------------- */
+
+body {background-image:url(images/bgd.jpg);background-repeat:repeat-x;background-color:#f7f6f6;font-family: 'PT Sans', arial, serif; }
+textarea {margin-left:3px;height: 60px;width: 330px;padding:5px;background-image:url(images/tweetWriterBgdTxtArea.gif);background-repeat:no-repeat;border: none;}
+.loginbutton{margin-left:3px;height: 60px;width: 330px;padding:5px;background-image:url(images/tweetWriterBgdUnconnect.gif);background-repeat:no-repeat;border: none;margin-bottom:10px;color:#fff;}
+.loginlink{text-decoration:none;color:#fff;}
+.menuLink:active {text-decoration:none;}
+.menuLink:visited {text-decoration:none;}
+h3{font-size: 1.5em;line-height: 1;margin-bottom: 0.3em;}
+
+#Aboutbox{background-image:url(images/about_bgd.jpg);background-repeat:no-repeat;width:600px;height:360px;overflow:auto; border:1px solid #fff;}
+.lightBorder{padding:20px;}
+.lightTitle{font-size: 48px;font-weight:900;color:#e6e6e6;font-family: 'Geo', arial, serif;line-height:80%}
+.lightSubTitle{font-size: 24px;font-weight:bold;color:#262626; width:250px;line-height:80%}
+.lightDescription{font-size: 12px;color:#000; width:288px;text-align:justify;margin-top:15px;}
+.lightButton{width:134px;height:22px;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;}
+.lightButton:active{width:134px;height:22px;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;}
+.lightButton:over{text-decoration:none;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;}
+
+
+.logo{padding-right:10px;float:left;}
+.menu{float:left;height:62px;border-left:1px solid #c3c3c3;list-style-type:none;padding:0px;margin:0px;}
+.menuUnderline{margin-left:0px;padding-left:0px;background-image:url(images/menu_underline.gif);background-repeat:no-repeat;background-position:left bottom; width:205px;margin-top:3px;}
+.menuLink{text-decoration:none; margin:5px; color:#000}
+.menuLink:active {text-decoration:none;}
+.menuLink:visited {text-decoration:none;}
+
+.tweetContainer{position:absolute; margin-top:70px;}
+.tweetWriter{background-image:url(images/tweetWriterBgd.gif);width:359px;height:136px;padding:10px;position:absolute; margin-top:70px;}
+.tweetWriterTitle{color:4b4b4b;font-family: 'PT Sans Narrow', arial, serif;}
+.tweetExplain{background-image:url(images/tweetExplainBgd.gif);width:359px;height:510px;padding:10px;position:absolute; margin-top:70px;}
+
+.tweetReader{width:377px;height:450px;position:absolute; margin-top:225px;border:1px solid #c3c3c3;background:#ffffff;}
+.tweetButton{float:right;margin-right:5px;}
+
+.timelinePlayer{border:1px solid #c3c3c3;width:650px;height:650px;}
+.videoLivePlayer{border:1px solid #c3c3c3;width:500px;height:375px;}
+.videoLive{width:500px;height:378px;background:#fff;float:left;margin-top:20px;padding:5px;}
+.videoLiveProgram{width:500px;margin-top:425px;margin-left:392px;position:absolute;}
+.videoLiveProgram2{width:500px;margin-top:470px;margin-left:392px;position:absolute;}
+
+.videoLiveProgramTitle{color:#4b4b4b;font-family: 'PT Sans Narrow', arial, serif;font-size: 1.5em;padding:5px;border:1px solid #c3c3c3;background-color:#efefef;background-image:url(images/bgdTitle.jpg);background-repeat:no-repeat;}
+.videoLiveProgramDescription{padding:5px;border:1px solid #c3c3c3;padding:5px;border-top:none;background-color:#fff;background-image:url(images/bgdDescription.jpg);background-repeat:no-repeat;height:193px;overflow:scroll;}
+
+
+.footer{margin-top:770px;width:900px;height:20px;position:absolute;text-align:center;}
+.footerLink{text-decoration:none; margin:5px; color:#000;font-family: 'PT Sans Narrow', arial, serif;font-size: 1.1em;}
+.footerLink:active {text-decoration:none;}
+.footerLink:visited {text-decoration:none;}
+
+.tooltip {display:none;background:transparent url(images/white_arrow.png);font-size:12px;height:70px;width:160px;padding:25px;color:#000;}
+
+.timeline{height:28px;border: 1px solid #ccc;}
+.timeFragment {float:left;position:relative;float:left;}
+.timeFrame {border-left: 1px solid #AAA;border-right: 1px solid #AAA;height:10px;float:left;position:relative;}
+.bigTimeFrame {border-right: 1px solid #ccc;float:left;position:relative;}
+
+.arrowContainer{height:10px;width:100%;}
+
+.cleaner {clear:both;}
+.txt{visibility:hidden;}
+
+
+.clear { /* generic container (i.e. div) for floating buttons */
+ overflow: hidden;
+ width: 100%;
+}
+
+a.button_w { background: transparent url('images/bg_button_a_w.png') no-repeat scroll top right; color: #444;display: block;float: left;font: normal 12px arial, sans-serif;height: 24px;margin-right: 6px;padding-right: 18px; text-decoration: none;}
+a.button_w span { background: transparent url('images/bg_button_span_w.png') no-repeat; display: block;line-height: 14px; padding: 5px 0 5px 18px;}
+
+a.button_b { background: transparent url('images/bg_button_a_b.png') no-repeat scroll top right; color: #fff;display: block;float: left;font: bold 12px arial, sans-serif;height: 24px;margin-right: 6px;padding-right: 18px; text-decoration: none;}
+a.button_b span { background: transparent url('images/bg_button_span_b.png') no-repeat; display: block;line-height: 14px; padding: 5px 0 5px 18px;}
+
+#question{background: transparent url('images/bt_blue.png') no-repeat; width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; }
+#question:active {text-decoration:none;}
+#question:visited {text-decoration:none;}
+#reference{background: transparent url('images/bt_yellow.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; }
+#reference:active {text-decoration:none;}
+#reference:visited {text-decoration:none;}
+#positive{background: transparent url('images/bt_green.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; }
+#positive:active {text-decoration:none;}
+#positive:visited {text-decoration:none;}
+#negative{background: transparent url('images/bt_red.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; }
+#negative:active {text-decoration:none;}
+#negative:visited {text-decoration:none;}
+
+.introBox{width:880px;height:280px;padding:10px;position:absolute; margin-top:70px;}
+.aboutBox{background-image:url(images/archivesBoxBody.gif);width:900px;position:absolute; margin-top:70px;}
+.archivesBox{background-image:url(images/archivesBoxBody.gif);width:900px;position:absolute; margin-top:450px;}
+.archivesBoxContainer{padding:10px;width:880px;padding-bottom:0px;display:block; }
+.archivesBoxClear { /* generic container (i.e. div) for floating buttons */
+ overflow: hidden;
+ width: 100%;
+ background-image:url(images/archivesBoxBody.gif);
+ height:10px;
+}
+.archivesBoxFooter{background-repeat:no-repeat;background-position:left bottom;background-image:url(images/archivesBoxFooter.gif);width:100%;height:3px;}
+.archivesBoxHeader{background-repeat:no-repeat;background-position:left top;background-image:url(images/archivesBoxHeader.gif);width:100%;height:3px;}
+
+.archivesTitle{color:4b4b4b;font-family: 'PT Sans Narrow', arial, serif;font-size:24px;}
+.archivesVideoBox{margin:5px;padding:5px;position:relative;display:inline-block;float:left;border: solid 1px #ccc;background:#f2f2f2;cursor:pointer;}
+.AVBtitle{font-weight:bold;font-family: 'PT Sans Narrow', arial, serif; font-size:18px;}
+
+.slideTitle{font-size:20px;}
+.slideText{font-size:15px;}
+.slides{background-repeat:no-repeat;background-position:right top;}
+#minilogo{background-repeat:no-repeat;background-position:left top;background-image:url(images/pol_color.gif);width:46px;height:10px;margin-top:50px;z-index:9;position:absolute;margin-left:100px;}}
\ No newline at end of file