Source code for pskb_website.models.user

"""
User related model code
"""

import json

from .. import remote
from .. import cache
from . import lib


[docs]def find_user(username=None): """ Find a user object with given username :param username: Optional username to search for, if no username given the currently logged in user will be returned (if any) :returns: User object Note the email field on the returned user object is only valid when reading the logged in user (i.e. when NOT passing a username). We cannot read email information for users who have not authenticated the application. """ if username is not None: user_info = cache.read_user(username) if user_info is not None: return User.from_json(user_info) user_info = remote.read_user_from_github(username) if not user_info: return None user = User(user_info['name'], user_info['login']) user.email = user_info['email'] # Request is for logged in user only if username is None: email = remote.primary_github_email_of_logged_in() user.email = email user.avatar_url = user_info['avatar_url'] user.location = user_info['location'] user.blog = user_info['blog'] # Github has added and removed support for bio so be careful try: user.bio = user_info['bio'] except KeyError: pass # User a longer timeout b/c not anticipating user's name,etc. to change # very often cache.save_user(user.login, lib.to_json(user), timeout=60 * 30) return user
[docs]class User(object): """Object representing user""" def __init__(self, name, login): """ Initialize user :param name: Name of user :param login: Login/username of user """ self.name = name or login self.login = login self.email = None self.avatar_url = None self.bio = None self.location = None self.blog = None self._is_collaborator = None def __repr__(self): return '<login: %s>' % (self.login) @property def is_collaborator(self, owner=None, repo=None): """ Determine if user is a collaborator on repo :param owner: Owner of repository defaults to REPO_OWNER config value :param repo: Name of repository defaults to REPO_NAME config value """ if self._is_collaborator is not None: return self._is_collaborator for login in remote.read_repo_collaborators_from_github(owner, repo): if login == self.login: return True return False @is_collaborator.setter def is_collaborator(self, value): """ Set if user is collaborator :param value: True or False """ self._is_collaborator = value
[docs] @staticmethod def from_json(str_): """ Create user object from json string :param str_: json string representing user :returns: User object """ dict_ = json.loads(str_) # Required arguments name = dict_.pop('name', None) login = dict_.pop('login', None) user = User(name, login) for attr, value in dict_.iteritems(): setattr(user, attr, value) return user