# -*- coding: utf-8 -*- """ A profile viewer and editor for VK user objects.""" from __future__ import unicode_literals import webbrowser import logging import arrow import requests import languageHandler import output from mysc.thread_utils import call_threaded from sessionmanager import utils from . import base log = logging.getLogger("controller.profiles") class userProfilePresenter(base.basePresenter): def __init__(self, session, user_id, view, interactor): """ Default constructor: @session vk.session: The main session object, capable of calling VK methods. @user_id integer: User ID to retrieve information of. At the current time, only users (and not communities) are supported. """ super(userProfilePresenter, self).__init__(view=view, interactor=interactor, modulename="user_profile") # self.person will hold a reference to the user object when retrieved from VK. self.person = None self.session = session self.user_id = user_id # Get information in a threaded way here. # Note: We do not handle any race condition here because due to the presenter only sending pubsub messages, # Nothing happens if the pubsub send messages to the interactor after the latter has been destroyed. # Pubsub messages are just skipped if there are no listeners for them. call_threaded(self.get_basic_information) self.run() def get_basic_information(self): """ Gets and inserts basic user information. See https://vk.com/dev/users.get""" # List of fields (information) to retrieve. For a list of fields available for user objects, # see https://vk.com/dev/fields fields = "first_name, last_name, bdate, city, country, home_town, photo_200_orig, online, site, status, last_seen, occupation, relation, relatives, personal, connections, activities, interests, music, movies, tv, books, games, about, quotes, can_write_private_message, contacts, has_mobile, universities, education, schools" # ToDo: this method supports multiple user IDS, I'm not sure if this may be of any help for profile viewer. person = self.session.vk.client.users.get(user_ids=self.user_id, fields=fields) # If VK does not return anything it is very likely we have found a community. if len(person) == 0: return output.speak(_("Information for groups is not supported, yet.")) person = person[0] # toDo: remove this print when I will be done with creation of profile viewer logic. # print(person) # From this part we will format data from VK so users will see it in the GUI control. # Format full name. n = "{0} {1}".format(person["first_name"], person["last_name"]) # format phones if person.get("mobile_phone") != None and person.get("mobile_phone") != "": self.send_message("enable_control", tab="main_info", control="mobile_phone") self.send_message("set", tab="main_info", control="mobile_phone", value=person["mobile_phone"]) if person.get("home_phone") != None and person.get("home_phone") != "": self.send_message("enable_control", tab="main_info", control="home_phone") self.send_message("set", tab="main_info", control="home_phone", value=person["home_phone"]) # Format birthdate. if "bdate" in person and person["bdate"] != "": self.send_message("enable_control", tab="main_info", control="bdate") # VK can display dd.mm or dd.mm.yyyy birthdates. So let's compare the string lenght to handle both cases accordingly. if len(person["bdate"]) <= 5: # dd.mm d = arrow.get(person["bdate"], "D.M") self.send_message("set", tab="main_info", control="bdate", value=d.format(_("MMMM D"), locale=languageHandler.curLang[:2])) else: # mm.dd.yyyy d = arrow.get(person["bdate"], "D.M.YYYY") # Calculate user's years. now = arrow.get() timedelta = now-d years = int(timedelta.days/365) date = d.format(_("MMMM D, YYYY"), locale=languageHandler.curLang[:2]) msg = _("{date} ({age} years)").format(date=date, age=years) self.send_message("set", tab="main_info", control="bdate", value=msg) # Format current city and home town city = "" if "home_town" in person and person["home_town"] != "": home_town = person["home_town"] self.send_message("enable_control", tab="main_info", control="home_town") self.send_message("set", tab="main_info", control="home_town", value=home_town) if "city" in person and len(person["city"]) > 0: city = person["city"]["title"] if "country" in person and person["country"] != "": if city != "": city = city+", {0}".format(person["country"]["title"]) else: city = person["country"]["title"] self.send_message("enable_control", tab="main_info", control="city") self.send_message("set", tab="main_info", control="city", value=city) self.send_message("set", tab="main_info", control="name", value=n) # Format title user = self.session.get_user(person["id"]) self.send_message("set_title", value=_("{user1_nom}'s profile").format(**user)) # Format website (or websites, if there are multiple of them). if "site" in person and person["site"] != "": self.send_message("enable_control", tab="main_info", control="website") self.send_message("set", tab="main_info", control="website", value=person["site"]) self.send_message("enable_control", tab="main_info", control="go_site") # Format status message. if "status" in person and person["status"] != "": self.send_message("enable_control", tab="main_info", control="status") self.send_message("set", tab="main_info", control="status", value=person["status"]) # Format occupation. # toDo: Research in this field is needed. Sometimes it returns university information even if users have active work places. if "occupation" in person and person["occupation"] != None: if person["occupation"]["type"] == "work": c1 = _("Work ") elif person["occupation"]["type"] == "school": c1 = _("Student ") elif person["occupation"]["type"] == "university": c1 = _("Student ") if "name" in person["occupation"] and person["occupation"]["name"] != "": c2 = _("In {0}").format(person["occupation"]["name"],) else: c2 = "" self.send_message("enable_control", tab="main_info", control="occupation") self.send_message("set", tab="main_info", control="occupation", value=c1+c2) # format relationship status. # ToDo: When dating someone, the button associated to the information should point to the profile of the user. if "relation" in person and person["relation"] != 0: if person["relation"] == 1: r = _("Single") elif person["relation"] == 2: if "relation_partner" in person: r = _("Dating with {0} {1}").format(person["relation_partner"]["first_name"], person["relation_partner"]["last_name"]) else: r = _("Dating") elif person["relation"] == 3: r = _("Engaged with {0} {1}").format(person["relation_partner"]["first_name"], person["relation_partner"]["last_name"]) elif person["relation"] == 4: if "relation_partner" in person: r = _("Married to {0} {1}").format(person["relation_partner"]["first_name"], person["relation_partner"]["last_name"]) else: r = _("Married") elif person["relation"] == 5: r = _("It's complicated") elif person["relation"] == 6: r = _("Actively searching") elif person["relation"] == 7: r = _("In love") self.send_message("enable_control", tab="main_info", control="relation") self.send_message("set_label", tab="main_info", control="relation", value=_("Relationship: ")+r) # format last seen. if "last_seen" in person and person["last_seen"] != False: original_date = arrow.get(person["last_seen"]["time"]) # Translators: This is the date of last seen last_seen = _("{0}").format(original_date.humanize(locale=languageHandler.curLang[:2]),) self.send_message("enable_control", tab="main_info", control="last_seen") self.send_message("set", tab="main_info", control="last_seen", value=last_seen) self.person = person # Adds photo to the dialog. # ToDo: Need to ask if this has a visible effect in the dialog. if "photo_200_orig" in person: img = requests.get(person["photo_200_orig"]) self.send_message("load_image", image=requests.get(person["photo_200_orig"])) output.speak(_("Profile loaded")) def get_urls(self, *args, **kwargs): """ Allows to visit an user's website. """ text = self.person["site"] # Let's search for URLS with a regexp, as there are users with multiple websites in their profiles. urls = utils.find_urls_in_text(text) if len(urls) == 0: output.speak(_("No URL addresses were detected.")) return return urls def visit_url(self, url): output.speak(_("Opening URL...")) webbrowser.open_new_tab(url)