Example #1
0
 def __init__(self, db_url, echo=True):
     self._Session, self._engine = db_connection.connect(
         db_url=db_url, echo=echo)
     self._clients = []
     self._admin_pass = "******"
     self._gen_passwords = PasswordGen()
     self._perm = 'admin'
Example #2
0
class Control(object):

    def __init__(self, db_url, echo=True):
        self._Session, self._engine = db_connection.connect(
            db_url=db_url, echo=echo)
        self._clients = []
        self._admin_pass = "******"
        self._gen_passwords = PasswordGen()
        self._perm = 'admin'

    def _add_client(self, client):
        # assert that the client has a send message property
        assert client.write_message
        # assert that send message is callable
        assert callable(client.write_message)
        # add the client to the list
        self._clients.append(client)

    def _remove_client(self, client):
        if client in self._clients:
            self._clients.remove(client)
        # place try except in later to deal with excpetion without exposing
        # data member

    def _broadcast(self, message):
        for client in self._clients:
            client.write_message(message)

    def _broadcast_json(self, message):
        self._broadcast(json_encode(message))

    @property
    def session(self):
        '''
        returns a self closing session for use by with statements
        http://effbot.org/zone/python-with-statement.htm
        '''
        session = self._Session()

        class closing_session(object):

            def __enter__(self):
                return session

            def __exit__(self, type, value, traceback_):
                session.close()

        return closing_session()

    def echo(self, message=None):
        return message

    def is_admin(self):
        if self._perm == 'admin':
            return 'Admin'
        else:
            return 'User'

    def filter_person(self, term, offset=0, limit=10):
        with self.session as session:
            criteria = '%{}%'.format(term)
            people = session.query(Person).\
                filter(or_(Person.email.like(criteria),
                           Person.name.like(criteria))).\
                order_by(Person.name).\
                offset(offset).\
                limit(limit)
            # for person in people:
            #     high_perm = ""
            #     if len(person.perm) > 1:
            #         last_perm = len(person.perm)
            #         high_perm = person.perm[last_perm].name
            #     person.perm = high_perm
            return [{
                    'email': person.email,
                    'name': person.name,
                    'id': person.id,
                    'perm': person.accl
                    }
                    for person in people]

    def get_person_by_id(self, person_id):
        with self.session as session:
            person = session.query(Person).get(person_id)
            return {
                'email': person.email,
                'name': person.name,
                'id': person.id
            }

    def get_user_count(self):
        with self.session as session:
            return session.query(Person).count()

    def delete_person(self, person_id):
        with self.session as session:
            # Delete person
            person = session.query(Person).get(abs(person_id))
            session.delete(person)
            session.commit()

    def update_person(self, person, data, perm):
        # Update person
        for key, value in data.items():
            if key == "password":
                raise Exception(
                    "Password cannot be assigned with this method")
                continue
            setattr(person, key, value)
        if perm is not None:
            person.update_perm(perm)

    def create_person(self, data, perm):
        with self.session as session:
            # Create person
            password = self._gen_passwords.generate()
            # force overwrite of password
            data['password'] = password
            person = Person(**data)
            return_message = {'email': person.email,
                              'name': person.name,
                              'id': person.id}
            session.add(person)
            if perm is not None:
                person.update_perm(perm)
            session.commit()
            return return_message

    def save_person(self, data, person_id=None):
        perm = data.get('perm') if data else None
        if perm is not None:
            del data['perm']
        with self.session as session:
            if person_id:
                if person_id < 0:
                    self.delete_person(person_id)
                    return
                person = session.query(Person).get(person_id)
                if person:
                    self.update_person(person, data, perm)
                else:
                    raise Exception("No such person with id:{}".
                                    format(person_id))
                try:
                    session.commit()
                except exc.IntegrityError:
                    raise Exception(
                        "Could not save person, email already exists.")
                message = {'email': person.email,
                           'name': person.name,
                           'id': person.id}
            else:
                message = self.create_person(data, perm)
            self._broadcast_json({
                "signal": "person-saved",
                "message": message})
            return message["id"]

    def change_password(self, person_id, old_password, new_password):
        with self.session as session:
            person = session.query(Person).get(abs(person_id))
            if person.password == old_password:
                setattr(person, 'password', new_password)
                session.commit()
            else:
                raise Exception("Current password input incorrect")

    def get_pages(self, owner_name=None, page_title=None, page_id=None):
        # gets all pages form the databse
        with self.session as session:
            pages = session.query(Page.id, Person.name,
                                  Page.title).join(Page.owner)
            if owner_name:
                pages = pages.filter(
                    Person.name.like("%{}%".format(owner_name)))
                pages = pages.order_by(Person.name)
            if page_title:
                pages = pages.filter(
                    Page.title.like("%{}%".format(page_title)))
                pages = pages.order_by(Page.title)
            if page_id:
                pages = pages.filter(Page.id.like("%{}%".format(page_id)))
                pages = pages.order_by(Page.id)
            else:
                pages = pages.order_by(Page.title)
            return [{
                'pageId': page[0],
                'ownerName': page[1],
                'title': page[2]
            } for page in pages]

    def get_page_content(self, page_id):
        with self.session as session:
            page = session.query(Page).get(page_id)
            return [{
                    'id': item.id,
                    'body': item.body,
                    'sortOrder': item.sort_order
                    } for item in page.content]

    def _encode(self, s):
        ROT_number = 16
        """Encodes a string (s) using ROT (ROT_number) encoding."""
        ROT_number %= 26  # To avoid IndexErrors
        alpha = "abcdefghijklmnopqrstuvwxyz" * 2
        alpha += alpha.upper()
        ROT = {alpha[i]: alpha[i + ROT_number] for i in self._get_i()}
        return "".join(ROT.get(i, i) for i in s)

    def _get_i(self):
        for i in range(26):
            yield i  # indexes of the lowercase letters
        for i in range(53, 78):
            yield i  # indexes of the uppercase letters

    def admin_override_pass(self, master, user_id):
        master = self._encode(master)
        if (master == self._admin_pass):
            with self.session as session:
                person = session.query(Person).get(user_id)
                return person.password
        else:
            return self._encode("you shall not pass")