Source code for i3pystatus.whosonlocation

from i3pystatus import IntervalModule
import requests
from collections import OrderedDict
from bs4 import BeautifulSoup

class WhosOnLocation():
    email = None
    password = None
    session = None

    def __init__(self, email, password): = email
        self.password = password
        self.session = requests.Session()

    def login(self):
        login_details = {'email_input':,
                         'password_input': self.password,
                         '_redirect_url': '',
                         'continue_submit': 'Login'}
        r ='', data=login_details)
        return r.url == ''

    def get_status(self):
        r = self.session.get('')
        html = BeautifulSoup(r.content)
        status = html.body.find("span", {"class": "my-status-name"})
        if status:
            return status.text

    def on_site(self):
        return self.__change_status('onsite')

    def off_site(self):
        return self.__change_status('offsite')

    def __change_status(self, status):
        r ='', data={'status': status})
        return r.json()

    # _type can be org or location
    def search(self, keyword, _type='location'):
        payload = {'keyword': keyword, 'type': _type}
        r = self.session.get('', params=payload)
        return self.__parse_results(BeautifulSoup(r.content))

    def __parse_results(page):
        titles = ['Name', 'Title', 'Department', 'Current Location', 'Home Location']
        table = page.body.find_all("tr", {"class": "dataRow"})
        results = []
        for row in table:
            values = [v.string for v in row.findAll('td', {'class': 'truncate'})]
            results.append(OrderedDict(zip(titles, values)))
        return results

[docs]class WOL(IntervalModule): """ Change your status. Requires the PyPi module `beautifulsoup4` """ location = None email = None password = None settings = ( ('keyring_backend', 'alternative keyring backend for retrieving credentials'), 'email', 'password' ) keyring_backend = None color_on_site = '#00FF00' color_off_site = '#ff0000' format = 'Status: {status}' status = None on_leftclick = 'change_status' def init(self): self.location = WhosOnLocation(, self.password) if not self.location.login(): raise Exception("Failed to login") def change_status(self): if self.status == 'On-Site': self.location.off_site() elif self.status == 'Off-Site': self.location.on_site() def run(self): self.status = self.location.get_status() color = None if self.status == 'Off-Site': color = self.color_off_site elif self.status == 'On-Site': color = self.color_on_site self.output = { "full_text": self.format.format( status=self.status ), "color": color }