home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyo (Python 2.5)
-
- from __future__ import with_statement
- from objects import NewsfeedItem
- from util.observe.observablelist import ObservableList
- from util import do, clamp, try_this, strftime_u
- import os.path as os
- from util.cacheable import cproperty
- from fbutil import one_per_day, one_per_x_per_day
- from collections import defaultdict
- from common import pref
- from util.cacheable import get_cache_root
- import time
- import datetime
- from datetime import date
- from util.xml_tag import tag
- from xml.sax.saxutils import escape
- import logging
- log = logging.getLogger('facebook.objects2')
- import traceback
- EXPIRE_TO_DISK = False
- from operator import attrgetter, itemgetter
- aid_getter = attrgetter('aid')
- second_item = itemgetter(1)
-
- def safe(s):
- return None if s is not None else s
-
-
- def writetag(f, t):
- return f.write(t._to_xml().encode('utf-8', 'ignore'))
-
-
- class Status(NewsfeedItem):
-
- def __init__(self, uid, name, time, message):
- NewsfeedItem.__init__(self)
- self.uid = uid
- self.name = name
- self.time = time
- self.message = message
-
-
- def get_link(self):
- return 'http://www.facebook.com/profile.php?id=%d' % self.uid
-
-
- def get_text(self):
- return u'%s %s' % (self.name, self.message)
-
-
-
- class SelfStatus(object):
-
- def __init__(self, name = None, message = None):
- self.name = name
- self.message = message
-
-
- def formated_name(self):
- if self.name is None:
- return _('This User')
-
- return self.name.encode('xml')
-
- formated_name = property(formated_name)
-
- def formated_message(self):
- if not self.message:
- return _('has no status')
-
- return self.message.encode('xml')
-
- formated_message = property(formated_message)
-
-
- class Profile(NewsfeedItem):
-
- def __init__(self, uid, name, time, sex):
- NewsfeedItem.__init__(self)
- self.uid = uid
- self.name = name
- self.sex = sex
- self.time = time
-
-
- def get_link(self):
- return 'http://www.facebook.com/profile.php?id=%d&highlight' % self.uid
-
-
- def get_text(self):
- return u'%s updated %s profile' % (self.name, self.his_her_their)
-
-
-
- class Album(NewsfeedItem):
-
- def __init__(self, uid, owner_name, time, aid, name, link):
- NewsfeedItem.__init__(self)
- self.time = time
- self.link = link
- self.aid = aid
- self.name = name
- self.owner = uid
- self.owner_name = owner_name
-
-
- def set_link(self, link):
- self._link = link
-
-
- def get_link(self):
- return self._link
-
-
- def get_text(self):
- return u'%s added new photos to album - %s' % (self.owner_name, self.name)
-
-
- def uid(self):
- return self.owner
-
- uid = property(uid)
-
-
- class WallNoteCount2(object):
-
- def __init__(self, user, time_ = None):
- self.time = None if time_ is not None else int(user.anon)
- self.uid = int(user.uid)
- self.name = str(user.name)
- self.wall_count = None if user.wall_count else -1
- self.notes_count = None if user.notes_count else -1
-
-
-
- class FriendsWall(NewsfeedItem):
-
- def __init__(self, uid, name, time, count):
- NewsfeedItem.__init__(self)
- self.uid = uid
- self.name = name
- self.time = time
- self.wall_count = count
-
-
- def get_link(self):
- return 'http://www.facebook.com/wall.php?id=%d' % self.uid
-
-
- def get_text(self):
- return u'%s has a new wall post' % self.name
-
-
-
- class FriendsNotes(NewsfeedItem):
-
- def __init__(self, uid, name, time, count):
- NewsfeedItem.__init__(self)
- self.uid = uid
- self.name = name
- self.time = time
- self.notes_count = count
-
-
- def get_link(self):
- return 'http://www.facebook.com/notes.php?id=%d' % self.uid
-
-
- def get_text(self):
- return u'%s added a new note' % self.name
-
-
-
- class Tagged(NewsfeedItem):
-
- def __init__(self, album, name, link):
- NewsfeedItem.__init__(self)
- self.time = max((lambda .0: for t in .0:
- t)(album.itervalues()))
- self.count = len(album)
- self.album_name = name
- self.link = link
-
-
- def set_link(self, link):
- self._link = link
-
-
- def get_link(self):
- return self._link
-
-
- def get_text(self):
- return u'You were tagged in %s photos in album %s' % (self.count, self.album_name)
-
-
-
- class Wall(NewsfeedItem):
-
- def __init__(self, uid, time, count):
- NewsfeedItem.__init__(self)
- self.uid = uid
- self.time = time
- self.wall_count = count
-
-
- def get_link(self):
- return 'http://www.facebook.com/wall.php?id=%d' % self.uid
-
-
- def get_text(self):
- return u'You have a new wall post'
-
-
-
- class CombinedFriendsWall(NewsfeedItem):
-
- def __init__(self, seq_of_walls):
- self.walls = list(seq_of_walls)
-
-
- def num_visible(self):
- return pref('facebook.combined_wall.num_visible', 5, int)
-
- num_visible = property(num_visible)
-
- def names(self):
- return sorted((lambda .0: for wall in .0:
- wall.name)(self.walls))
-
-
- def visible_walls(self):
- if len(self.walls) - self.num_visible < 2:
- return self.walls
- else:
- return self.walls[:self.num_visible]
-
-
- def number_more(self):
- if len(self.walls) - self.num_visible < 2:
- return 0
- else:
- return len(self.walls) - self.num_visible
-
-
- def get_text(self):
- names = self.names()
- return u', '.join(names[:-1]) + u' and ' + names[-1] + u' have new wall posts'
-
-
- def time(self):
- return self.walls[0].time
-
- time = property(time)
-
-
- class CombinedFriendsNotes(NewsfeedItem):
-
- def __init__(self, seq_of_notes):
- self.notes = list(seq_of_notes)
-
-
- def names(self):
- return sorted((lambda .0: for note in .0:
- note.name)(self.notes))
-
-
- def get_text(self):
- names = self.names()
- return u', '.join(names[:-1]) + u' and ' + names[-1] + u' wrote new notes'
-
-
- def time(self):
- return self.notes[0].time
-
- time = property(time)
-
- by_time = attrgetter('time')
-
- class User(object):
-
- def __init__(self, uid, nf, fb):
- self.nf = nf
- self.fb = fb
- self.uid = int(uid)
- self.name = None
- self.sex = None
- self.statuses = { }
- self.profiles = set()
- self.albums = defaultdict(dict)
- self.wall_counts = { }
- self.notes_counts = { }
- self.tags = defaultdict(dict)
- self.birthday = None
- self.birthyear = None
-
-
- def __repr__(self):
- return '<User %r %d>' % (self.name, self.uid)
-
-
- def __getstate__(self):
- d = dict(vars(self))
- d.pop('fb')
- d.pop('nf')
- d.pop('birthday', None)
- d.pop('birthyear', None)
- return d
-
-
- def __setstate__(self, d):
- self.birthday = None
- self.birthyear = None
- self.__dict__.update(d)
-
-
- def cache_path(self):
- return self.fb.cache_dir + str(hash(self.uid)) + '.dat'
-
- cache_path = property(cache_path)
-
- def practice_counts(self):
- wn_count = self.next_counts
- if wn_count.notes_count >= 0:
- n = self.notes_counts
-
- try:
- newest = max(n.iterkeys())
- if n[newest] < wn_count.notes_count:
- return True
- except ValueError:
- return False
- except:
- None<EXCEPTION MATCH>ValueError
-
-
- None<EXCEPTION MATCH>ValueError
- return False
-
-
- def counts(self, wn_count):
- self.next_counts = wn_count
- if wn_count.birthday:
-
- try:
- today = datetime.date.today()
-
- try:
- bday = time.strptime(wn_count.birthday, '%B %d, %Y')
- self.birthyear = bday.tm_year
- except ValueError:
- bday = time.strptime(wn_count.birthday, '%B %d')
- self.birthyear = None
-
- bday2 = datetime.date(today.year, bday.tm_mon, bday.tm_mday)
- if bday2 < today:
- bday2 = datetime.date(today.year + 1, bday.tm_mon, bday.tm_mday)
-
- self.birthday = bday2
- except Exception:
- e = None
- self.birthday = None
- self.birthyear = None
- getLogger = getLogger
- import logging
- log = getLogger('facebook.birthdays')
- log.error('failed to parse: %r because %r', wn_count.birthday, e)
- except:
- None<EXCEPTION MATCH>Exception
-
-
- None<EXCEPTION MATCH>Exception
-
-
- def roll_back_counts(self):
- if hasattr(self, 'next_counts'):
- del self.next_counts
-
-
-
- def commit_counts(self):
- if hasattr(self, 'next_counts'):
- wn_count = self.next_counts
- del self.next_counts
- self.name = unicode(wn_count.name)
- if wn_count.wall_count >= 0:
- w = self.wall_counts
- if w:
- newest = max(w.iterkeys())
- if w[newest] < wn_count.wall_count:
- w[wn_count.time] = wn_count.wall_count
- elif w[newest] > wn_count.wall_count:
- w[newest] = wn_count.wall_count
-
- else:
- w[wn_count.time] = wn_count.wall_count
- self.wall_counts = w
-
- if wn_count.notes_count >= 0:
- n = self.notes_counts
- if n:
- newest = max(n.iterkeys())
- if n[newest] < wn_count.notes_count:
- n[wn_count.time] = wn_count.notes_count
- elif n[newest] > wn_count.notes_count:
- n[newest] = wn_count.notes_count
-
- else:
- n[wn_count.time] = wn_count.notes_count
- self.notes_counts = n
-
-
-
-
- def status(self, user):
- self.name = unicode(user.name)
- s = self.statuses
-
- try:
- s[int(user.status.time)] = unicode(user.status.message)
- except (ValueError, AttributeError, KeyError):
- traceback.print_exc()
- log.info('status.time was probably empty')
- return None
-
- self.statuses = s
-
-
- def newest_status(self):
- if self.statuses:
- return self.statuses[max(self.statuses.iterkeys())]
-
-
-
- def profile(self, profile):
- p = self.profiles
- self.name = unicode(profile.name)
- self.sex = unicode(profile.sex)
- p.add((int(profile.profile_update_time), self.practice_counts()))
- self.profiles = p
-
-
- def album(self, album):
- a = self.albums
- time = int(album.modified)
- link = unicode(album.link)
- aid = int(album.aid)
- name = unicode(album.name)
- alb = a[aid]
- alb['name'] = name
- alb['link'] = link
- if 'times' in alb:
- alb['times'].append(time)
- else:
- alb['times'] = [
- time]
- self.albums = a
-
-
- def tag(self, photo):
- t = self.tags
- alb = t[int(photo.aid)]
- pid = int(photo.pid)
- created = int(photo.created)
- now = int(photo.anon)
- if pid not in alb:
- if created > self.nf.last_tag_time and created < now:
- alb[pid] = created
- else:
- alb[pid] = now
-
- self.tags = t
-
-
- def needed_alb_ids(self, ago):
- unknown_alb_ids = set(self.tags.keys()) - set(self.albums.keys())
- if unknown_alb_ids:
- for aid in list(unknown_alb_ids):
-
- try:
- if max(self.tags[aid].values()) < ago:
- unknown_alb_ids.remove(aid)
- continue
- except ValueError:
- unknown_alb_ids.remove(aid)
- continue
-
-
-
-
- return unknown_alb_ids
-
-
- def report(self, now):
- safename = safe(self.name)
- if self.uid == int(self.fb.uid):
- mywalls = [ Wall(self.uid, time, count) for time, count in sorted(self.wall_counts.iteritems())[1:] ]
- mywalls = one_per_day(mywalls, key = by_time)
- return mywalls
- elif self.name is not None:
- statuses = _[2]
- albums = []
- for aid, alb in self.albums.iteritems():
- name = alb['name']
- link = alb['link']
- for time in alb.get('times', []):
- albums.append(Album(self.uid, safename, time, aid, safe(name), link))
-
-
- albums = one_per_x_per_day(albums, aid_getter, by_time)
- profiles = _[3]
- profiles = one_per_day(profiles, key = by_time)
- walls = [ FriendsWall(self.uid, safename, time, count) for time, count in sorted(self.wall_counts.iteritems())[1:] ]
- walls = one_per_day(walls, key = by_time)
- new_walls = []
- update_before = self.fb.update_before
- for wall in walls:
- t = update_before(wall.time)
- if t is not None and wall.time - t < pref('facebook.newsfeed.min_wall_interval', 172800):
- new_walls.append(wall)
- continue
- []
-
- walls = new_walls
- notes = [ FriendsNotes(self.uid, safename, time, count) for time, count in sorted(self.notes_counts.iteritems())[1:] ]
-
- tags = []
- zerodate = date.fromtimestamp(0)
- for aid, alb in self.tags.iteritems():
- days = defaultdict(dict)
- for pid, time_ in alb.iteritems():
- days[date.fromtimestamp(time_)][pid] = time_
-
- for day, album in days.iteritems():
- if day != zerodate:
- if aid in self.albums:
- al = self.albums[aid]
- tags.append(Tagged(album, safe(al['name']), al['link']))
-
- aid in self.albums
-
-
- return statuses + profiles + albums + walls + notes + tags
-
-
- def expire_profiles(self, x, pop = False):
- retval = []
- for profile in list(self.profiles):
- if profile[0] < x:
- retval.append(profile)
- if pop:
- self.profiles.discard(profile)
-
- pop
-
- return retval
-
-
- def expire_statuses(self, x, pop = False):
- retval = []
- for t, status in list(self.statuses.items()):
- if t < x:
- retval.append((t, status))
- if pop:
- self.statuses.pop(t)
-
- pop
-
- return retval
-
-
- def expire_albums(self, x, pop = False):
- retval = []
- for aid, alb in list(self.albums.items()):
- for t in list(alb['times']):
- if t < x:
- retval.append((t, aid, alb['name'], alb['link']))
- if pop:
- alb['times'].remove(t)
-
- pop
-
- if not alb['times']:
- self.albums.pop(aid)
- continue
-
- return retval
-
-
- def expire_wall_counts(self, x, pop = False):
- temp = dict(self.wall_counts)
- skeys = sorted(temp.iterkeys())
- logkeys = (filter,)((lambda o: o < x), skeys)
- nologkeys = set(skeys) - set(logkeys)
- if logkeys:
- expired = (dict,)((lambda .0: for key in .0:
- (key, temp[key]))(logkeys[:-1]))
- else:
- expired = { }
- unexpired = (dict,)((lambda .0: for key in .0:
- (key, temp[key]))(nologkeys))
- if pop:
- for key in expired.iterkeys():
- del self.wall_counts[key]
-
-
- return (expired, unexpired)
-
-
- def expire_notes_counts(self, x, pop = False):
- temp = dict(self.notes_counts)
- skeys = sorted(temp.iterkeys())
- logkeys = (filter,)((lambda o: o < x), skeys)
- nologkeys = set(skeys) - set(logkeys)
- if logkeys:
- expired = (dict,)((lambda .0: for key in .0:
- (key, temp[key]))(logkeys[:-1]))
- else:
- expired = { }
- unexpired = (dict,)((lambda .0: for key in .0:
- (key, temp[key]))(nologkeys))
- if pop:
- for key in expired.iterkeys():
- del self.notes_counts[key]
-
-
- return (expired, unexpired)
-
-
-
- class UserDict(dict):
-
- def __getitem__(self, key):
-
- try:
- return dict.__getitem__(self, key)
- except KeyError:
- retval = User(key, self.nf, self.fb)
- dict.__setitem__(self, key, retval)
- return retval
-
-
-
- def __repr__(self):
- return '<UserDict [%r] %s>' % (vars(self), dict.__repr__(self))
-
-
-
- class ZeroTime(object):
- time = 0
-
-
- class NewsFeed2(ObservableList):
-
- def __repr__(self):
- return object.__repr__(self)
-
-
- def __init__(self, fb):
- self.fb = fb
- self.initialized = False
- ObservableList.__init__(self)
- self.fbtime = int(time.time())
- self.clock = self.fbtime
- self.self_status = None
-
-
- def post_login_init(self):
- self.initialized = True
- users = self.users
- users.nf = self
- users.fb = self.fb
- for val in users.values():
- val.nf = self
- val.fb = self.fb
-
- self.users = users
-
-
- def cache_crypt(self):
- return self.fb.cache_crypt
-
- cache_crypt = property(cache_crypt)
- users = cproperty(UserDict, box = dict, unbox = UserDict, user = True)
- uids = cproperty(list, user = True)
- last_tag_time = cproperty(0, user = True)
-
- def now(self):
- now = int(time.time())
- return (now - self.clock) + self.fbtime
-
- now = property(now)
-
- def cache_path(self):
- return os.path.join(self.fb.cache_dir, 'newsfeed.dat')
-
- cache_path = property(cache_path)
-
- def update_statuses(self, statuses):
- (do,)((lambda .0: for status in .0:
- self.users[int(status.uid)].status(status))(statuses))
-
-
- def commit_counts(self):
- do((lambda .0: for user in .0:
- user.commit_counts())(self.users.itervalues()))
-
-
- def roll_back_counts(self):
- do((lambda .0: for user in .0:
- user.roll_back_counts())(self.users.itervalues()))
-
-
- def most_recent_status_time(self):
-
- try:
- maxtime = max((lambda .0: for user in .0:
- for time in user.statuses:
- time)(self.users.itervalues()))
- except ValueError:
- maxtime = -1
-
- return maxtime
-
- most_recent_status_time = property(most_recent_status_time)
-
- def update_profiles(self, profiles):
- (do,)((lambda .0: for profile in .0:
- self.users[int(profile.uid)].profile(profile))(profiles))
-
-
- def most_recent_profile_time(self):
-
- try:
- maxtime = max((lambda .0: for user in .0:
- for time in user.profiles:
- time[0])(self.users.itervalues()))
- except ValueError:
- maxtime = -1
-
- return maxtime
-
- most_recent_profile_time = property(most_recent_profile_time)
-
- def update_albums(self, albums):
- (do,)((lambda .0: for album in .0:
- self.users[int(album.owner)].album(album))(albums))
-
-
- def most_recent_album_time(self):
-
- try:
- maxtime = max((lambda .0: for user in .0:
- for album in user.albums.itervalues():
- for time in album['times']:
- time)(self.users.itervalues()))
- except ValueError:
- maxtime = -1
-
- return maxtime
-
- most_recent_album_time = property(most_recent_album_time)
-
- def needed_alb_ids(self):
- ago = self.ago
- return (sum,)((lambda .0: for user in .0:
- list(user.needed_alb_ids(ago)))(self.users.itervalues()), [])
-
-
- def update_counts(self, counts):
- if len(counts):
- self.fbtime = counts[0].time
- self.clock = int(time.time())
- (do,)((lambda .0: for count in .0:
- self.users[int(count.uid)].counts(count))(counts))
-
-
-
- def update_tags(self, photos):
- if len(photos):
- (do,)((lambda .0: for photo in .0:
- self.users[int(photo.owner)].tag(photo))(photos))
- self.last_tag_time = int(photos[0].anon)
-
-
-
- def rebuild(self):
- importance = {
- Album: 30,
- Profile: 40,
- Status: 50,
- Tagged: 60,
- FriendsWall: 70,
- FriendsNotes: 80,
- Wall: 90,
- CombinedFriendsWall: 100 }
-
- def c(o1, o2):
- if cmp(o1.time, o2.time):
- return cmp(o1.time, o2.time)
-
- if type(o1) in importance and type(o2) in importance:
- return int(clamp(importance[type(o1)] - importance[type(o2)], -1, 1))
-
- return 0
-
- stuff = sorted(sum((lambda .0: for user in .0:
- user.report('foo'))(self.users.values()), []), cmp = c, reverse = True)
- newstuff = []
- while stuff:
- item = stuff.pop(0)
- if not isinstance(item, FriendsWall):
- newstuff.append(item)
- continue
-
- to_combine = []
- while True:
- to_combine.append(item)
-
- try:
- item = stuff.pop(0)
- if not item.time == to_combine[0].time and isinstance(item, FriendsWall) and stuff:
- stuff.insert(0, item)
- break
- continue
- break
- continue
-
- if len(to_combine) > 1:
- newstuff.append(CombinedFriendsWall(to_combine))
- continue
- newstuff.append(to_combine[0])
- stuff = newstuff
- newstuff = []
- while stuff:
- item = stuff.pop(0)
- if not isinstance(item, FriendsNotes):
- newstuff.append(item)
- continue
-
- to_combine = []
- while True:
- to_combine.append(item)
-
- try:
- item = stuff.pop(0)
- if not item.time == to_combine[0].time and isinstance(item, FriendsNotes) and stuff:
- stuff.insert(0, item)
- break
- continue
- break
- continue
-
- if len(to_combine) > 1:
- newstuff.append(CombinedFriendsNotes(to_combine))
- continue
- newstuff.append(to_combine[0])
- newest_status = self.users[self.fb.uid].newest_status()
- if not newest_status:
- newest_status = None
-
- self.self_status = SelfStatus(self.users[self.fb.uid].name, newest_status)
- self[:] = newstuff
- self.uids = self.users.keys()
- self.users = self.users
-
-
- def birthdays(self):
- for user in self.users.itervalues():
- if user.birthday is not None:
- yield (user, user.birthday)
- continue
-
-
-
- def sorted_birthdays(self):
- return sorted(self.birthdays(), key = second_item)
-
-
- def top_birthdays(self):
- bdays_ret = []
- i = 0
- bdays = iter(self.sorted_birthdays())
- while i < pref('facebook.newsfeed.num_birthdays', 5):
-
- try:
- (user, _bday) = bdays.next()
- if user.name:
- bdays_ret.append((user.name, strftime_u(user.birthday, '%B %d')))
- except StopIteration:
- break
-
- i += 1
- return bdays_ret
-
- top_birthdays = property(top_birthdays)
-
- def __iter__(self):
- stuff = self[:]
- last = False
- now = self.now
- today = date.fromtimestamp(now)
- yesterday = date.fromtimestamp(now - 86400)
- ago = self.ago
- times = sorted(self.fb.update_times, reverse = True)
- timebefore = None if times else 0
- uid_filters = [ int(num) for num in pref('facebook.newsfeed.user_filter', []) ]
- max_items = pref('facebook.newsfeed.max_items', default = 50, type = int)
- num_items = 0
- for thing in stuff:
- if hasattr(thing, 'uid') and thing.uid in uid_filters:
- continue
- elif thing.time < ago:
- continue
- elif not self.fb.filters['feed'].get(type(thing).__name__, True):
- continue
- elif isinstance(thing, CombinedFriendsWall) and not self.fb.filters['feed'].get('FriendsWall', True):
- continue
- elif isinstance(thing, CombinedFriendsNotes) and not self.fb.filters['feed'].get('FriendsNotes', True):
- continue
-
- timeafter = timebefore
- while timebefore > thing.time:
- timeafter = timebefore
- if times:
- timebefore = times.pop(0)
- continue
- timebefore = 0
- if timeafter - timebefore > 1800 and timebefore > 0:
- thing.correct_time = False
-
- this = date.fromtimestamp(thing.time)
- if not last and this != today:
- yield None
-
- if not last and this == today:
- pass
- elif last == this:
- pass
- elif this == yesterday:
- yield 'Yesterday'
- else:
- yield strftime_u(this, pref('facebook.newsfeed.dateformat', '%B %d'))
- yield thing
- num_items += 1
- last = this
-
-
-
- def ago(self):
- maxage = pref('facebook.newsfeed.maxage', 172800)
- maxage = (try_this,)((lambda : int(maxage)), 172800)
- now = self.now
- ago = None if maxage > 0 else 0
- return ago
-
- ago = property(ago)
-
- def logfile(self, day, fn):
- logfile = get_cache_root() / self.fb.cache_dir / strftime_u(day, '%Y-%m-%d') / fn
- if not logfile.parent.exists():
- logfile.parent.makedirs()
-
- return logfile
-
-
- def expire_statuses(self, ago, pop = False):
- for user in self.users.itervalues():
- for t, status in user.expire_statuses(ago, pop):
- yield (t, (user.uid, status))
-
-
-
-
- def _cleanup_statuses(self, ago):
- days = defaultdict(list)
- for status in self.expire_statuses(ago):
- days[date.fromtimestamp(status[0])].append(status)
-
- for day, statuses in days.iteritems():
- logfile = self.logfile(day, 'statuses.xml')
- statuses.sort()
-
- try:
- f = _[2]
- for uid, status in statuses:
- s = tag('user')
- s.uid = uid
- s.status.message = status
- s.status.time = t
- writetag(f, s)
- finally:
- pass
-
-
-
-
- def expire_profiles(self, ago, pop = False):
- for user in self.users.itervalues():
- uid = user.uid
- for t in user.expire_profiles(ago, pop):
- yield (t, uid)
-
-
-
-
- def _cleanup_profiles(self, ago):
- days = defaultdict(list)
- for profile in self.expire_profiles(ago):
- days[date.fromtimestamp(profile[0][0])].append(profile)
-
- for day, profiles in days.iteritems():
- logfile = self.logfile(day, 'profiles.xml')
- profiles.sort()
-
- try:
- f = _[2]
- for t, hidden in profiles:
- uid = None
- p = tag('user')
- p.uid = uid
- p.hidden = hidden
- p.profile_update_time = t
- writetag(f, p)
- finally:
- pass
-
-
-
-
- def expire_wall_counts(self, ago, pop = False):
- for user in self.users.itervalues():
- uid = user.uid
- for t, count in user.expire_wall_counts(ago, pop)[0].iteritems():
- yield (t, (uid, count))
-
-
-
-
- def _cleanup_wall_counts(self, ago):
- days = defaultdict(list)
- for wcount in self.expire_wall_counts(ago):
- days[date.fromtimestamp(wcount[0])].append(wcount)
-
- for day, counts in days.iteritems():
- logfile = self.logfile(day, 'wall_counts.xml')
- counts.sort()
-
- try:
- f = _[2]
- for uid, count in counts:
- c = tag('user')
- c.uid = uid
- c.wall_count = count
- c.time = t
- writetag(f, c)
- finally:
- pass
-
-
-
-
- def expire_notes_counts(self, ago, pop = False):
- for user in self.users.itervalues():
- uid = user.uid
- for t, count in user.expire_notes_counts(ago, pop)[0].iteritems():
- yield (t, (uid, count))
-
-
-
-
- def _cleanup_notes_counts(self, ago):
- days = defaultdict(list)
- for ncount in self.expire_notes_counts(ago):
- days[date.fromtimestamp(ncount[0])].append(ncount)
-
- for day, counts in days.iteritems():
- logfile = self.logfile(day, 'notes_counts.xml')
- counts.sort()
-
- try:
- f = _[2]
- for uid, count in counts:
- c = tag('user')
- c.uid = uid
- c.notes_count = count
- c.time = t
- writetag(f, c)
- finally:
- pass
-
-
-
-
- def expire_albums(self, ago, pop = False):
- for user in self.users.itervalues():
- uid = user.uid
- for t, aid, name, link in user.expire_albums(ago, pop):
- yield (t, (uid, aid, name, link))
-
-
-
-
- def _cleanup_albums(self, ago):
- days = defaultdict(list)
- for album in self.expire_albums(ago):
- days[date.fromtimestamp(album[0])].append(album)
-
- for day, albums in days.iteritems():
- logfile = self.logfile(day, 'album_updates.xml')
- albums.sort()
-
- try:
- f = _[2]
- for uid, aid, name, link in albums:
- a = tag('album')
- a.aid = aid
- a.owner = uid
- a.name = name
- a.link = link
- a.modified = t
- writetag(f, a)
- finally:
- pass
-
-
-
-
- def _cleanup(self):
- if not self.initialized:
- return None
-
- ago = self.ago
- print 'cleaning up before:', ago
-
- try:
- if EXPIRE_TO_DISK:
- self._cleanup_statuses(ago)
- except IOError:
- print 'IOERROR'
-
- do(self.expire_statuses(ago, True))
-
- try:
- if EXPIRE_TO_DISK:
- self._cleanup_profiles(ago)
- except IOError:
- print 'IOERROR'
-
- do(self.expire_profiles(ago, True))
-
- try:
- if EXPIRE_TO_DISK:
- self._cleanup_wall_counts(ago)
- except IOError:
- print 'IOERROR'
-
- do(self.expire_wall_counts(ago, True))
-
- try:
- if EXPIRE_TO_DISK:
- self._cleanup_notes_counts(ago)
- except IOError:
- print 'IOERROR'
-
- do(self.expire_notes_counts(ago, True))
-
- try:
- if EXPIRE_TO_DISK:
- self._cleanup_albums(ago)
- except IOError:
- print 'IOERROR'
-
- do(self.expire_albums(ago, True))
- self.users = self.users
- a = None if not list(self) else repr(list(self))
- self._cleanup_update_times()
- self.rebuild()
- b = None if a is None else repr(list(self))
-
-
- def _set_of_times(self):
- s = set()
- for user in self.users.itervalues():
- s.update(user.statuses.iterkeys())
- s.update((lambda .0: for prof in .0:
- prof[0])(user.profiles))
- for album in user.albums.values():
- s.update(album.get('times', []))
-
- s.update(user.notes_counts.keys())
- s.update(user.wall_counts.keys())
- for alb in user.tags.values():
- s.update(alb.values())
-
-
- return s
-
-
- def _cleanup_update_times(self):
- fb = self.fb
- current_known_dates = fb.newsfeed._set_of_times()
- indexes_before = (lambda x: x != -1)([]([], [ fb.idx_before(x) for x in current_known_dates ]))
- latest = fb.update_times[-100:]
- surround = []([ fb.update_times[x:x + 2] for x in indexes_before ], [])
- finished = sorted(set(surround + latest))
- fb.update_times = finished
-
-
-