Source code for pypump.models.person
##
# Copyright (C) 2013 Jessica T. (Tsyesika) <xray7224@googlemail.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
##
import six
from pypump.models import PumpObject, Addressable
from pypump.exception import PyPumpException
from pypump.models.feed import (Followers, Following, Lists,
Favorites, Inbox, Outbox)
[docs]class Person(PumpObject, Addressable):
""" This object represents a pump.io **person**,
a person is a user on the pump.io network.
:param webfinger: User ID in ``nickname@hostname`` format.
Example:
>>> alice = pump.Person('alice@example.org')
>>> print(alice.summary)
Hi, I'm Alice
>>> mynote = pump.Note('Hey Alice, it's Bob!')
>>> mynote.to = alice
>>> mynote.send()
"""
object_type = 'person'
_ignore_attr = ['liked', 'in_reply_to']
_mapping = {
"username": "preferredUsername",
"location":"location",
}
_inbox = None
_outbox = None
_followers = None
_following = None
_favorites = None
_lists = None
@property
def outbox(self):
""" :class:`Outbox feed <pypump.models.feed.Outbox>` with all
:class:`activities <pypump.models.activity.Activity>` sent by the person.
Example:
>>> for activity in pump.me.outbox[:2]:
... print(activity)
...
pypumptest2 unliked a comment in reply to a note
pypumptest2 deleted a note
"""
self._outbox = self._outbox or Outbox(self.links['activity-outbox'], pypump=self._pump)
return self._outbox
@property
def followers(self):
""" :class:`Feed <pypump.models.feed.Feed>` with all
:class:`Person <pypump.models.person.Person>` objects following the person.
Example:
>>> alice = pump.Person('alice@example.org')
>>> for follower in alice.followers[:2]:
... print(follower.id)
...
acct:bob@example.org
acct:carol@example.org
"""
self._followers = self._followers or Followers(self.links['followers'], pypump=self._pump)
return self._followers
@property
def following(self):
""" :class:`Feed <pypump.models.feed.Feed>` with all
:class:`Person <pypump.models.person.Person>` objects followed by the person.
Example:
>>> bob = pump.Person('bob@example.org')
>>> for followee in bob.following[:3]:
... print(followee.id)
...
acct:alice@example.org
acct:duncan@example.org
"""
self._following = self._following or Following(self.links['following'], pypump=self._pump)
return self._following
@property
def favorites(self):
""" :class:`Feed <pypump.models.feed.Feed>` with all objects
liked/favorited by the person.
Example:
>>> for like in pump.me.favorites[:3]:
... print(like)
...
note by alice@example.org
image by bob@example.org
comment by evan@e14n.com
"""
self._favorites = self._favorites or Favorites(self.links['favorites'], pypump=self._pump)
return self._favorites
@property
def lists(self):
""" :class:`Lists feed <pypump.models.feed.Lists>` with all lists
owned by the person.
Example:
>>> for list in pump.me.lists:
... print(list)
...
Acquaintances
Family
Coworkers
Friends
"""
self._lists = self._lists or Lists(self.links['lists'], pypump=self._pump)
return self._lists
@property
def inbox(self):
""" :class:`Inbox feed <pypump.models.feed.Inbox>` with all
:class:`activities <pypump.models.activity.Activity>`
received by the person, can only be read if logged in as the owner.
Example:
>>> for activity in pump.me.inbox[:2]:
... print(activity.id)
...
https://microca.st/api/activity/BvqXQOwXShSey1HxYuJQBQ
https://pumpyourself.com/api/activity/iQGdnz5-T-auXnbUUdXh-A
"""
if not self.isme:
raise PyPumpException("You can't read other people's inboxes")
self._inbox = self._inbox or Inbox(self.links['activity-inbox'], pypump=self._pump)
return self._inbox
@property
def webfinger(self):
return self.id.replace("acct:", "")
@property
def server(self):
return self.id.split("@")[-1]
@property
def isme(self):
return (self.username == self._pump.client.nickname and self.server == self._pump.client.server)
def __init__(self, webfinger=None, **kwargs):
super(Person, self).__init__(**kwargs)
if isinstance(webfinger, six.string_types):
if "@" not in webfinger: # TODO do better validation
raise PyPumpException("Not a valid webfinger: %s" % webfinger)
self.id = "acct:{0}".format(webfinger)
self.username = webfinger.split("@")[0]
self._add_link('self', "{0}://{1}/api/user/{2}/profile".format(
self._pump.protocol, self.server, self.username)
)
try:
data = self._pump.request(self.links['self'])
self.unserialize(data)
except:
pass
def serialize(self, verb):
data = super(Person, self).serialize()
data.update({
"verb": verb,
"object": {
"id": self.id,
"objectType": self.object_type,
"displayName": self.display_name,
"summary": self.summary,
}
})
return data
[docs] def follow(self):
""" Follow person """
self._verb('follow')
[docs] def unfollow(self):
""" Unfollow person """
self._verb('stop-following')
[docs] def update(self):
# TODO update location
""" Updates person object"""
data = self.serialize(verb="update")
self._post_activity(data)
def __repr__(self):
return "<{type}: {webfinger}>".format(
type=self.object_type.capitalize(),
webfinger=getattr(self, 'webfinger', 'unknown')
)
def __unicode__(self):
return u"{0}".format(self.display_name or self.username or self.webfinger)