コード例 #1
0
ファイル: test_sqlsession.py プロジェクト: webmaven/ptah
    def test_sa_session_nested(self):
        err = None

        try:
            with ptah.sa_session() as sa:
                with ptah.sa_session() as sa:
                    pass
        except Exception as e:
            err = e

        self.assertIsNotNone(err)
コード例 #2
0
ファイル: todo.py プロジェクト: ptahproject/heroku-ptah
    def msg_load(self, data):
        with ptah.sa_session() as sa:
            data = []
            for todo in sa.query(Todo).all():
                data.append(self.get_info(todo))

            self.send('list', {'tasks':sorted(data,key=lambda i:i['created'])})
コード例 #3
0
ファイル: crud.py プロジェクト: ptahproject/heroku-ptah
    def __call__(self):
        self.tinfo = ptah.resolve(self.params['turi'])

        with ptah.sa_session() as sa:
            self.session = sa
            self.context = ptah.resolve(self.params['uri'])
            return super(EditRecord, self).__call__()
コード例 #4
0
ファイル: test_tinfo.py プロジェクト: webmaven/ptah
    def test_uri_resolver(self):
        import ptah
        import sqlalchemy as sqla

        @ptah.type('mycontent', 'MyContent')
        class MyContentSql(ptah.get_base()):
            __tablename__ = 'tinfo_sql_test7'

            id = sqla.Column(sqla.Integer, primary_key=True)
            test = sqla.Column(sqla.Unicode)

        self.init_ptah()

        id = None
        uri = None

        with ptah.sa_session() as sa:
            item = MyContentSql(test='title')
            sa.add(item)
            sa.flush()

            id = item.id
            uri = item.__uri__

        self.assertEqual(uri, 'mycontent:%s'%id)

        item = ptah.resolve(uri)
        self.assertTrue(item.id == id)
コード例 #5
0
ファイル: users.py プロジェクト: ptahproject/heroku-ptah
    def modify_handler(self):
        data, errors = self.extract()
        if errors:
            return errors

        with ptah.sa_session() as sa:
            user = ptah.resolve(self.params['__uri__'])

            # update attrs
            user.name = data['name']
            user.login = data['login']
            user.email = data['login']
            if data['password'] is not ptah.form.null:
                user.password = ptah.pwd_tool.encode(data['password'])

            # update props
            user.validated = data['validated']
            user.suspended = data['suspended']

            # add roles and groups info
            props = user.properties
            props['roles'] = data['roles']
            props['groups'] = data['groups']

            info = self.protocol.get_user_data(user)

        # done
        self.close('User properties has been updated.')
        self.protocol.broadcast('updated', info)
コード例 #6
0
ファイル: files.py プロジェクト: ptahproject/heroku-ptah
    def msg_list(self, data):
        with ptah.sa_session() as sa:
            data = []
            for f in sa.query(File).all():
                data.append(self.get_info(f))

            self.send('list', {'files':sorted(data,key=lambda i:i['created'])})
コード例 #7
0
ファイル: todo.py プロジェクト: ptahproject/heroku-ptah
    def msg_complete(self, data):
        with ptah.sa_session() as sa:
            todo = sa.query(Todo).filter(Todo.id==data['id']).first()

            if todo is not None:
                todo.completed = not todo.completed

                self.broadcast('completed', self.get_info(todo))
コード例 #8
0
ファイル: todo.py プロジェクト: ptahproject/heroku-ptah
    def msg_create(self, data):
        with ptah.sa_session() as sa:
            todo = Todo(text=data['text'],
                        creator=self.user_name)
            sa.add(todo)
            sa.flush()

            self.broadcast('added', self.get_info(todo))
コード例 #9
0
ファイル: settings.py プロジェクト: ptahproject/heroku-ptah
    def modify_handler(self):
        data, errors = self.extract()
        if errors:
            self.errors = errors
            return

        with ptah.sa_session():
            self.context.updatedb(**data)

        self.close("Settings have been modified.")
        self.protocol.broadcast(
            'updated', self.protocol.get_info(self.context.__name__))
コード例 #10
0
ファイル: users.py プロジェクト: ptahproject/heroku-ptah
    def update(self):
        # load user
        with ptah.sa_session() as sa:
            uri = self.params['__uri__']
            user = ptah.resolve(uri)
            if user is None:
                raise ValueError("User unknown")

            sa.expunge(user)
            self.context = user

        super(ModifyUserForm, self).update()
コード例 #11
0
ファイル: gallery.py プロジェクト: ptahproject/examples
 def update(self):
     # load user
     with ptah.sa_session() as sa:
         id = self.params['id']
         gallery = sa.query(Gallery).filter(Gallery.id==id).first()
         
         self.sa = sa
         self.context = gallery
         self.content = {'title': gallery.name,
                         'description': gallery.description}
         
         return super(EditGallery, self).update()
コード例 #12
0
ファイル: files.py プロジェクト: ptahproject/heroku-ptah
    def msg_upload(self, data):
        if isinstance(data['data'], unicode):
            data['data'] = data['data'].encode('latin1')

        with ptah.sa_session() as sa:
            file = File(filename=data['filename'], 
                        mimetype=data['mimetype'],
                        size=len(data['data']),
                        data=data['data'])
            sa.add(file)
            sa.flush()
            self.broadcast('added', self.get_info(file))
コード例 #13
0
    def update(self):
        # load user
        with ptah.sa_session() as sa:
            id = self.params['id']
            gallery = sa.query(Gallery).filter(Gallery.id == id).first()

            self.sa = sa
            self.context = gallery
            self.content = {
                'title': gallery.name,
                'description': gallery.description
            }

            return super(EditGallery, self).update()
コード例 #14
0
ファイル: proto.py プロジェクト: ptahproject/examples
    def msg_upload(self, data):
        if isinstance(data['data'], unicode):
            data['data'] = data['data'].encode('latin1')

            with ptah.sa_session() as sa:
                p = Photo(gallery = data['id'],
                          name = data['filename'],
                          filename = data['filename'],
                          size = len(data['data']),
                          mimetype = data['mimetype'],
                          data = data['data'])
                sa.add(p)
                sa.flush()
                self.send('gallery', self.list_gallery(data['id'], sa))
コード例 #15
0
ファイル: gallery.py プロジェクト: ptahproject/examples
    def on_submit(self):
        data, errors = self.extract()
        if errors:
            return errors

        with ptah.sa_session() as sa:
            gallery = Gallery(user = self.protocol.user_id,
                              name = data['title'],
                              description = data['description'])
            sa.add(gallery)
            sa.flush()

            self.close()
            self.protocol.send('galleries', self.protocol.get_galleries(sa))
コード例 #16
0
ファイル: proto.py プロジェクト: sergiPopescou/examples
    def msg_upload(self, data):
        if isinstance(data['data'], unicode):
            data['data'] = data['data'].encode('latin1')

            with ptah.sa_session() as sa:
                p = Photo(gallery=data['id'],
                          name=data['filename'],
                          filename=data['filename'],
                          size=len(data['data']),
                          mimetype=data['mimetype'],
                          data=data['data'])
                sa.add(p)
                sa.flush()
                self.send('gallery', self.list_gallery(data['id'], sa))
コード例 #17
0
    def on_submit(self):
        data, errors = self.extract()
        if errors:
            return errors

        with ptah.sa_session() as sa:
            gallery = Gallery(user=self.protocol.user_id,
                              name=data['title'],
                              description=data['description'])
            sa.add(gallery)
            sa.flush()

            self.close()
            self.protocol.send('galleries', self.protocol.get_galleries(sa))
コード例 #18
0
ファイル: crud.py プロジェクト: ptahproject/heroku-ptah
    def modify_handler(self):
        data, errors = self.extract()
        if errors:
            return errors

        with ptah.sa_session() as sa:
            tinfo = ptah.resolve(self.params['turi'])

            instance = tinfo.create(**data)
            sa.add(instance)

            uri = instance.__uri__

        self.close("Record has been created.")
        self.protocol.broadcast('added', {'uri': uri})
コード例 #19
0
ファイル: users.py プロジェクト: ptahproject/heroku-ptah
    def msg_remove_users(self, data):
        users = [uri for uri in data if uri != self.user_id]
        if not users:
            return

        # remove users
        with ptah.sa_session() as sa:
            for uri in users:
                user = sa.query(ptahcrowd.CrowdUser) \
                    .filter(ptahcrowd.CrowdUser.__uri__ == uri).first()
                if user is not None:
                    sa.delete(user)

        # notify client
        self.broadcast('removed', data)
コード例 #20
0
ファイル: users.py プロジェクト: ptahproject/heroku-ptah
    def msg_suspend_users(self, data):
        users = [uri for uri in data if uri != self.user_id]
        if not users:
            return

        # suspend users
        with ptah.sa_session() as sa:
            for user in sa.query(ptahcrowd.CrowdUser)\
                    .filter(ptahcrowd.CrowdUser.__uri__.in_(users)):
                user.suspended = True
                sa.add(user)
                self.broadcast('updated', self.get_user_data(user))

        self.send(
            'message',
            {'message': "Selected accounts have been suspended."})
コード例 #21
0
ファイル: proto.py プロジェクト: sergiPopescou/examples
def download(request):
    id = request.matchdict['id']

    with ptah.sa_session() as sa:
        f = sa.query(Photo).filter(Photo.id == id).first()
        if f is None:
            return HTTPNotFound()

        response = request.response

        headers = {'Content-Type': f.mimetype.encode('utf-8')}
        if f.filename:
            headers['Content-Disposition'] = \
                bytes_('filename="{0}"'.format(f.filename), 'utf-8')

        response.headers = headers
        response.body = f.data
        return response
コード例 #22
0
ファイル: files.py プロジェクト: ptahproject/heroku-ptah
def download(request):
    id = request.matchdict['id']

    with ptah.sa_session() as sa:
        f = sa.query(File).filter(File.id == id).first()
        if f is None:
            return HTTPNotFound()

        response = request.response

        headers = {'Content-Type': f.mimetype.encode('utf-8')}
        if f.filename:
            headers['Content-Disposition'] = \
                bytes_('filename="{0}"'.format(f.filename), 'utf-8')

        response.headers = headers
        response.body = f.data
        return response
コード例 #23
0
ファイル: crud.py プロジェクト: ptahproject/heroku-ptah
    def msg_list_model(self, data):
        uri = data['uri']
        ti = ptah.resolve(uri)

        fields = [{'name':'id', 'title': 'Id'}]
        for name in ti.fieldset:
            fields.append({'name': name,
                           'title': ti.fieldset[name].title})

        info = {
            'uri': ti.__uri__,
            'name': ti.name,
            'description': ti.description,
            'fields': fields}
        self.send('load_model', info)

        with ptah.sa_session() as sa:
            result = {'size': sa.query(ti.cls).count(),
                      'page': self.page(sa, ti, 0, 5)}
            self.send('page', result)
コード例 #24
0
ファイル: users.py プロジェクト: ptahproject/heroku-ptah
    def on_submit(self):
        data, errors = self.extract()
        if errors:
            return errors

        with ptah.sa_session() as sa:
            # create user
            user = ptahcrowd.CrowdUser.__type__.create(
                name=data['name'],
                login=data['login'],
                email=data['login'],
                suspended = data['suspended'],
                validated = True,
                password=ptah.pwd_tool.encode(data['password']))
            user = ptahcrowd.CrowdUser.__type__.add(user)

            # additional props
            props = user.properties
            props['roles'] = data['roles']
            self.request.registry.notify(ptah.events.PrincipalAddedEvent(user))

            # done
            self.close("User has been created.")
            self.protocol.broadcast('added', self.protocol.get_user_data(user))
コード例 #25
0
ファイル: proto.py プロジェクト: ptahproject/examples
 def msg_list(self, data):
     if self.user_id is not None:
         with ptah.sa_session() as sa:
             self.send('galleries', self.get_galleries(sa))
コード例 #26
0
ファイル: proto.py プロジェクト: ptahproject/examples
 def msg_removephoto(self, data):
     with ptah.sa_session() as sa:
         sa.query(Photo).filter(Photo.id == data['id']).delete()
         sa.flush()
         self.send('gallery', self.list_gallery(data['id'], sa))
コード例 #27
0
ファイル: proto.py プロジェクト: ptahproject/examples
 def msg_gallery(self, data):
     with ptah.sa_session() as sa:
         self.send('gallery', self.list_gallery(data['id'], sa))
コード例 #28
0
ファイル: test_sqlsession.py プロジェクト: webmaven/ptah
 def test_sa_session(self):
     with ptah.sa_session() as sa:
         self.assertIs(sa, ptah.get_session())
コード例 #29
0
ファイル: facebook.py プロジェクト: ptahproject/examples
def facebook_process(request):
    """Process the facebook redirect"""
    print request.GET

    # get session
    st = request.GET.get('state').split(',')[-1]
    manager = ptah.sockjs.get_session_manager(request.registry)
    try:
        session = manager.get(st)
    except:
        raise HTTPBadRequest("No session")

    code = request.GET.get('code')
    if not code:
        raise HTTPBadRequest("No reason")

    # auth
    cfg = ptah.get_settings(CFG_ID_AUTH, request.registry)

    client_id = cfg['facebook_id']
    client_secret = cfg['facebook_secret']

    # Now retrieve the access token with the code
    access_url = '{0}?{1}'.format(
        'https://graph.facebook.com/oauth/access_token',
        url_encode({'client_id': client_id,
                    'client_secret': client_secret,
                    'redirect_uri': request.route_url('facebook_process'),
                    'code': code}))

    r = requests.get(access_url)
    if r.status_code != 200:
        raise HTTPBadRequest("Status %s: %s" % (r.status_code, r.content))

    access_token = urlparse.parse_qs(r.content)['access_token'][0]

    with ptah.sa_session() as sa:
        user = User.get_bytoken(access_token)
        if user is not None:
            protocol = session.protocols.get('gallery')
            protocol.auth(user)
            
            response = request.response
            response.content_type = 'text/html'
            response.body = close
            return response

    # Retrieve profile data
    graph_url = '{0}?{1}'.format('https://graph.facebook.com/me',
                                 url_encode({'access_token': access_token}))
    r = requests.get(graph_url)
    if r.status_code != 200:
        raise HTTPBadRequest("Status %s: %s" % (r.status_code, r.content))

    profile = ptah.json.loads(r.content)

    id = profile['id']
    name = profile['name']
    email = profile.get('email','').lower()

    with ptah.sa_session() as sa:
        sa.query(User).filter(User.email == email).delete()

        user = User(
            token = access_token,
            source = 'facebook',
            name = name, email = email)
        sa.add(user)
        sa.flush()

        protocol = session.protocols.get('gallery')
        protocol.auth(user)

        response = request.response
        response.content_type = 'text/html'
        response.body = close
        return response
コード例 #30
0
ファイル: files.py プロジェクト: ptahproject/heroku-ptah
    def msg_remove(self, data):
        with ptah.sa_session() as sa:
            sa.query(File).filter(File.id == data['id']).delete()

        self.broadcast('removed', {'id': data['id']})
コード例 #31
0
ファイル: proto.py プロジェクト: sergiPopescou/examples
 def msg_removephoto(self, data):
     with ptah.sa_session() as sa:
         sa.query(Photo).filter(Photo.id == data['id']).delete()
         sa.flush()
         self.send('gallery', self.list_gallery(data['id'], sa))
コード例 #32
0
ファイル: proto.py プロジェクト: sergiPopescou/examples
 def msg_removegallery(self, data):
     if self.user_id is not None:
         with ptah.sa_session() as sa:
             sa.query(Gallery).filter(Gallery.id == data['id']).delete()
             self.send('galleries', self.get_galleries(sa))
コード例 #33
0
ファイル: proto.py プロジェクト: sergiPopescou/examples
 def msg_list(self, data):
     if self.user_id is not None:
         with ptah.sa_session() as sa:
             self.send('galleries', self.get_galleries(sa))
コード例 #34
0
ファイル: proto.py プロジェクト: sergiPopescou/examples
 def msg_gallery(self, data):
     with ptah.sa_session() as sa:
         self.send('gallery', self.list_gallery(data['id'], sa))
コード例 #35
0
ファイル: crud.py プロジェクト: ptahproject/heroku-ptah
    def msg_load_page(self, data):
        uri = data['uri']
        ti = ptah.get_types()[uri]

        with ptah.sa_session() as sa:
            self.send('page', {'page': self.page(sa, ti, 0, 5)})
コード例 #36
0
def facebook_process(request):
    """Process the facebook redirect"""
    print request.GET

    # get session
    st = request.GET.get('state').split(',')[-1]
    manager = ptah.sockjs.get_session_manager(request.registry)
    try:
        session = manager.get(st)
    except:
        raise HTTPBadRequest("No session")

    code = request.GET.get('code')
    if not code:
        raise HTTPBadRequest("No reason")

    # auth
    cfg = ptah.get_settings(CFG_ID_AUTH, request.registry)

    client_id = cfg['facebook_id']
    client_secret = cfg['facebook_secret']

    # Now retrieve the access token with the code
    access_url = '{0}?{1}'.format(
        'https://graph.facebook.com/oauth/access_token',
        url_encode({
            'client_id': client_id,
            'client_secret': client_secret,
            'redirect_uri': request.route_url('facebook_process'),
            'code': code
        }))

    r = requests.get(access_url)
    if r.status_code != 200:
        raise HTTPBadRequest("Status %s: %s" % (r.status_code, r.content))

    access_token = urlparse.parse_qs(r.content)['access_token'][0]

    with ptah.sa_session() as sa:
        user = User.get_bytoken(access_token)
        if user is not None:
            protocol = session.protocols.get('gallery')
            protocol.auth(user)

            response = request.response
            response.content_type = 'text/html'
            response.body = close
            return response

    # Retrieve profile data
    graph_url = '{0}?{1}'.format('https://graph.facebook.com/me',
                                 url_encode({'access_token': access_token}))
    r = requests.get(graph_url)
    if r.status_code != 200:
        raise HTTPBadRequest("Status %s: %s" % (r.status_code, r.content))

    profile = ptah.json.loads(r.content)

    id = profile['id']
    name = profile['name']
    email = profile.get('email', '').lower()

    with ptah.sa_session() as sa:
        sa.query(User).filter(User.email == email).delete()

        user = User(token=access_token,
                    source='facebook',
                    name=name,
                    email=email)
        sa.add(user)
        sa.flush()

        protocol = session.protocols.get('gallery')
        protocol.auth(user)

        response = request.response
        response.content_type = 'text/html'
        response.body = close
        return response
コード例 #37
0
ファイル: proto.py プロジェクト: ptahproject/examples
 def msg_removegallery(self, data):
     if self.user_id is not None:
         with ptah.sa_session() as sa:
             sa.query(Gallery).filter(Gallery.id == data['id']).delete()
             self.send('galleries', self.get_galleries(sa))
コード例 #38
0
ファイル: users.py プロジェクト: ptahproject/heroku-ptah
    def msg_init(self, data):
        with ptah.sa_session() as sa:
            users = [(user.name, self.get_user_data(user))
                     for user in sa.query(ptahcrowd.CrowdUser).all()]

        self.send('list', {'users': [u for _n,u in sorted(users)]})