Exemplo n.º 1
0
    def on_get(self, req, resp):
        user = getUserInfoFromSession(req, resp)
        bfolder = req.get_param('folder') or 'inbox'
        if not bfolder in [
                'inbox', 'sent', 'draft', 'star', 'archive', 'spam', 'trash'
        ]:
            resp.body = falcon.HTTP_400
            return
        bname = getUserMessageBox(user.get('uuid'), name=True)
        query = riak.RiakMapReduce(riakClient).add(bname)
        query.map(
            "function(v) { var data = JSON.parse(v.values[0].data); if(data.folder == '%s') { return [[v.key, data]]; } return []; }"
            % bfolder)
        query.reduce(
            "function(values) { return values.sort(function(a, b){return a[1].datetime<b[1].datetime}) }"
        )
        results = query.run()
        output = []
        if results:
            for result in results:
                data = result[1]
                data['key'] = result[0]
                output.append(data)

        resp.body = output
Exemplo n.º 2
0
 def on_put(self, req, resp, **kw):
     u = getUserInfoFromSession(req, resp)
     targetUser = User.query.filter_by(id=u.get('id')).first()
     data = get_params(req.stream, flat=False)
     if data and data.get('body'):
         targetUser.reports.append(data.get('body'))
         resp.status = falcon.HTTP_202
         resp.body = {'message': 'OK'}
Exemplo n.º 3
0
 def on_post(self, req, resp, key):
     options = get_params(req.stream, False)
     folder = options.get('folder')
     message = options.get('message')
     user = getUserInfoFromSession(req, resp)
     mdb = getUserMessageBox(user.get('uuid'))
     mdb.delete(key)
     obj = mdb.new(key, message)
     obj.store()
     resp.body = {'message': 'updated'}
Exemplo n.º 4
0
 def on_get(self, req, resp):
     user = getUserInfoFromSession(req, resp)
     bfolder = req.get_param('folder') or 'inbox'
     if not bfolder in [
             'inbox', 'sent', 'draft', 'star', 'archive', 'spam', 'trash'
     ]:
         resp.body = falcon.HTTP_400
         return
     mdb = getUserMessageBox(user.get('uuid'))
     resp.body = mdb.get_keys()
Exemplo n.º 5
0
    def on_put(self, req, resp):
        user = getUserInfoFromSession(req, resp)
        projectData = get_params(req.stream, flat=False)
        start, end, name, lead_id, description = None, None, None, None, None
        if projectData.get('start'):
            start = str(projectData.get('start'))
        if projectData.get('end'):
            end = str(projectData.get('end'))
        if projectData.get('name'):
            name = str(projectData.get('name'))
        if projectData.get('description'):
            description = str(projectData.get('description'))
        if projectData.get('lead_id'):
            lead_id = int(projectData.get('lead_id'))

        if start and end and name and lead_id:
            leader = User.query.filter_by(id=lead_id).first()
            creater = User.query.filter_by(id=user.get('id')).first()
            new = Project(start=start,
                          name=name,
                          end=end,
                          lead=leader,
                          creater=creater)
            if description:
                new.description = description
            repoName = name
            newRepoFolder = os.path.join(home, '.fearlessrepo', repoName)
            if not os.path.isdir(newRepoFolder):
                os.makedirs(newRepoFolder)
            new_repository = Repository.query.filter(
                Repository.name == repoName).first()
            if not new_repository:
                new_repository = Repository(name=repoName, path=newRepoFolder)
                #

            chars_section = Collection(name='Characters', path='chars')

            props_section = Collection(name='Props', path='props')
            sets_section = Collection(name='Sets', path='sets')
            sequences_section = Collection(name='Sequences', path='sequences')
            editorial_section = Collection(name='Editorial', path='editorial')
            resources_section = Collection(name='Resources', path='resources')

            new_repository.collections.append(chars_section)
            new_repository.collections.append(props_section)
            new_repository.collections.append(sets_section)
            new_repository.collections.append(sequences_section)
            new_repository.collections.append(editorial_section)
            new_repository.collections.append(resources_section)

            new.repositories.append(new_repository)
            req.session.add(new)
            resp.status = falcon.HTTP_201
            req.session.flush()
            resp.body = {'message': 'OK'}
Exemplo n.º 6
0
    def on_get(self, req, resp, **kw):
        u = getUserInfoFromSession(req, resp)

        targetUser = User.query.filter_by(id=u.get('id')).first()

        resp.body = [{
            'id': i.id,
            'body': i.body,
            'datetime': i.created_on,
            'tgs': i.tgs
        } for i in targetUser.reps[::-1][:5]]
Exemplo n.º 7
0
    def on_delete(self, req, resp, taskId):
        user = getUserInfoFromSession(req, resp)
        target = Task.query.filter(Task.id == taskId).first()
        if target:
            req.session.delete(target)
            resp.status = falcon.HTTP_202
            resp.body = {'message': 'ok', 'info': 'task deleted'}

        else:
            resp.status = falcon.HTTP_404
            resp.body = {'message': 'error', 'info': 'task not found'}
Exemplo n.º 8
0
 def on_get(self, req, resp):
     user = getUserInfoFromSession(req, resp)
     uid = user.get('id')
     projects = Project.query.filter(
         or_(Project.lead_id == uid,
             Project.director_id == uid, Project.creator_id == uid,
             Project.watchers.any(User.id == uid))).all()
     involving = Project.query.join(Task)\
         .join(Task.resources).filter(Task.resources.any(User.id == uid)).all()
     data = list(set(projects + involving))
     resp.body = data
Exemplo n.º 9
0
    def on_post(self, req, resp, assetId):
        '''Get asset thumbnails from riak'''
        try:
            target = Asset.query.filter_by(id=int(assetId)).scalar()
        except ValueError:
            resp.status = falcon.HTTP_404
            return
        userInfo = getUserInfoFromSession(req, resp)
        from flib.tasks import process
        from flib.utils.defaults import ASSETS
        asset_folder = os.path.join(ASSETS, target.uuid)
        if not os.path.isdir(asset_folder):
            resp.status = falcon.HTTP_204  # empty content
            return

        version = req.get_param('version')
        command1= 'pull origin master'
        command2= 'pull origin master --tags'
        command3= 'checkout %s' % version
        arg1 = 'git --git-dir="{d}/.git" --work-tree="{d}" {c}'.format(
            d=asset_folder, c=command1)
        arg2 = 'git --git-dir="{d}/.git" --work-tree="{d}" {c}'.format(
            d=asset_folder, c=command2)
        arg3 = 'git --git-dir="{d}/.git" --work-tree="{d}" {c}'.format(
            d=asset_folder, c=command3)

        LOCK = os.path.join(asset_folder, 'LOCK')
        if os.path.isfile(LOCK):
            LD = pickle.load(open(LOCK, 'rb'))
            now = datetime.utcnow()
            locktime = LD.get('datetime')
            if locktime and (now-locktime).seconds < 15:  ## 15 seconds is maximum time for checking out
                resp.status = falcon.HTTP_202
                resp.body = {'message':'File is busy. try again'}
                return

        LD = {'datetime':datetime.utcnow(), 'user':userInfo.get('lastname')}
        pickle.dump(LD, open(LOCK, 'wb'))
        error1, result1 = process(arg1)  ## pull
        error2, result2 = process(arg2)  ## tags
        error3, result3 = process(arg3)  ## checkout
        pstKey = '%s_poster_v%s' % (target.uuid, version.split('_')[1])
        thmbKey = '%s_thmb_v%s' % (target.uuid, version.split('_')[1])
        poster = os.path.join(
            'uploads', target.uuid + '_poster_' + version.split('_')[1] + '.png')
        thumbnail = os.path.join(
            'uploads', target.uuid + '_thmb_' + version.split('_')[1] + '.png')
        fid = target.uuid + '_preview_' + version.split('_')[1]
        fmt = 'mp4'
        preview = os.path.join('uploads', fid + '.' + fmt)
        if os.path.isfile(LOCK):
            os.remove(LOCK)
        resp.body = {'poster': poster, 'thumbnail': thumbnail,
                     'version': version, 'preview': preview}
Exemplo n.º 10
0
    def on_post(self, req, resp, taskId):
        user = getUserInfoFromSession(req, resp)
        uid = int(user.get('id'))

        reviewData = get_params(req.stream, flat=False)
        rew = reviewData.get('review')
        if rew:
            r = Review(content=rew, reviewer_id=uid, task_id=taskId)
            req.session.add(r)
            resp.status = falcon.HTTP_201
        else:
            resp.status = falcon.HTTP_204
Exemplo n.º 11
0
    def on_post(self, req, resp, taskId):
        user = getUserInfoFromSession(req, resp)
        resources, depends, responsibles, effort, alternative_resources = list(
        ), list(), list(), 0, list()
        taskData = get_params(req.stream, flat=False)
        if taskData.get('resources'):
            resources = [int(i.get('id')) for i in taskData.get('resources')]
        if taskData.get('updatedResponsibles'):
            responsibles = taskData.get('updatedResponsibles')
        if taskData.get('depends'):
            depends = [int(i.get('id')) for i in taskData.get('depends')]
        if taskData.get('updatedAlternativeResources'):
            alternative_resources = taskData.get('updatedAlternativeResources')
        if taskData.get('updatedWatchers'):
            watchers = taskData.get('updatedWatchers')

        complete = int(taskData.get('complete'))
        effort = int(taskData.get('effort'))
        start = str(taskData.get('start'))
        end = str(taskData.get('end'))
        title = taskData.get('title')
        priority = taskData.get('priority')
        _id = int(taskData.get('id'))
        priority = int(taskData.get('priority'))
        target = Task.query.filter(Task.id == _id).first()
        if target:
            target.title = title
            target.start = start
            target.priority = priority
            target.end = end
            target.effort = effort
            if effort:
                target.complete = complete
            if resources:
                target.resources = []
            for i in resources:
                resource = User.query.filter(User.id == i).first()
                if not resource in target.project.users:
                    target.project.users.append(resource)
                if resource:
                    target.resources.append(resource)
            if depends:
                target.depends = []
            for i in depends:
                depend = Task.query.filter(Task.id == i).first()
                if depend:
                    target.depends.append(depend)

            resp.body = {'message': 'Task Updated'}
        else:
            resp.status = falcon.HTTP_404
            resp.body = {'message': 'Task Not Found'}
Exemplo n.º 12
0
    def on_get(self, req, resp, projId):
        user = getUserInfoFromSession(req, resp)
        sole = req.get_param('sole')
        tasks = Task.query.join(Project).filter_by(id=projId)
        isWatcher = any(Project.query.filter_by(id=projId).\
                        filter(Project.watchers.any(id=user.get('id'))).all())
        if sole and not isWatcher:
            tasks = tasks.filter(
                or_(Task.resources.any(id=user.get('id')),
                    Task.watchers.any(id=user.get('id')),
                    Task.responsibles.any(id=user.get('id')),
                    Task.project.has(lead_id=user.get('id'))))

        if tasks:
            data = [{
                'start':
                i.start,
                'end':
                i.end,
                'title':
                i.title,
                'id':
                i.id,
                'effort':
                i.effort,
                'gauge':
                i.gauge,
                'complete':
                i.complete,
                'dependent_of': [{
                    'title': j.title,
                    'id': j.id
                } for j in i.dependent_of],
                'depends': [{
                    'title': g.title,
                    'id': g.id
                } for g in i.depends],
                'resources': [{
                    'id': k.id,
                    'lastname': k.lastname
                } for k in i.resources],
                'reviews': [{
                    'id': h.id,
                    'reviewer': {
                        'id': h.reviewer.id,
                        'firstname': h.reviewer.firstname,
                        'lastname': h.reviewer.lastname,
                    },
                    'content': h.content
                } for h in i.reviews],
            } for i in tasks.all()]
            resp.body = data
Exemplo n.º 13
0
    def on_get(self, req, resp, **kw):

        args = req.path.split('/')
        table = args[3]
        u = getUserInfoFromSession(req, resp)
        # if not isAuthorizedTo(u.get('id'), 'see_%s'%table):
        #    raise falcon.HTTPUnauthorized('Not Authorized', 'Permission Denied')
        key = req.get_param('key') or 'id'
        if key:
            key = key.replace('\\', '\\\\')
        listMe = req.get_param('list')
        table = table.title()
        show = req.get_param('show')
        start = req.get_param('s')
        end = req.get_param('e')

        filters_raw = req.get_param('filters')
        add = req.get_param('add') or ''
        add = add.split(',')
        tags = req.get_param_as_list('tags') or []
        appendix = req.get_param_as_list('appendix') or []
        filters = []
        if filters_raw:
            filters += [{
                i.split('=')[0]: i.split('=')[1],
                '_': '=='
            } for i in filters_raw.split(',') if '=' in i]
            filters += [{
                i.split('>')[0]: i.split('>')[1],
                '_': '>'
            } for i in filters_raw.split(',') if '>' in i]
            filters += [{
                i.split('<')[0]: i.split('<')[1],
                '_': '<'
            } for i in filters_raw.split(',') if '<' in i]

        get_count = req.get_param('count')
        sort = req.get_param('sort')
        if not sort:
            sort = 'desc'
        order_by = req.get_param('order_by')
        if not order_by:
            order_by = 'modified_on'
        try:
            if start:
                start = int(start)
            if end:
                end = int(end)
        except ValueError, e:
            print e
            start = 0
            end = 10
Exemplo n.º 14
0
    def on_put(self, req, resp, projId):
        user = getUserInfoFromSession(req, resp)
        taskData = get_params(req.stream, flat=False)
        resources, depends, manager, effort = list(), list(), 0, 0
        title = taskData.get('title')
        if taskData.get('effort'):
            effort = int(taskData.get('effort'))
        start = taskData.get('start')
        end = taskData.get('end')
        priority = taskData.get('priority')
        project = Project.query.filter_by(id=int(projId)).scalar()
        if Project.query.join(Task).filter_by(title=title).all():
            resp.status = falcon.HTTP_203
            resp.body = {'message': 'task already available'}
            return
        if not start:
            start = project.start
        else:
            start = str(start)

        newTask = Task(title=title,
                       effort=effort,
                       project_id=project.id,
                       start=start)

        newTask.priority = priority
        if end:
            newTask.end = str(end)

        if taskData.get('resources'):
            resources = [int(i.get('id')) for i in taskData.get('resources')]
        if taskData.get('depends'):
            depends = [int(i.get('id')) for i in taskData.get('depends')]
        if taskData.get('manager'):
            manager = int(taskData.get('manager').get('id'))
        for i in resources:
            resource = User.query.filter(User.id == i).first()
            if resource:
                newTask.resources.append(resource)
        if manager:
            manager = User.query.filter(User.id == manager).first()
            if manager:
                newTask.responsibles.append(manager)
        for i in depends:
            depend = Task.query.filter(Task.id == i).first()
            if depend:
                newTask.depends.append(depend)
        #depend = session.query(Task).filter(Task.id==depends).first()
        # newTask.depends.append(depend)
        req.session.add(newTask)
        resp.body = {'message': 'OK'}
Exemplo n.º 15
0
 def on_put(self, req, resp, **kw):
     args = req.path.split('/')
     table = args[3].title()
     u = getUserInfoFromSession(req, resp)
     # if not isAuthorizedTo(u.get('id'), 'create_%s'%table):
     #    raise falcon.HTTPUnauthorized('Not Authorized', 'Permission Denied')
     query_params = get_params(req.stream, flat=False)
     insert_cmd = '{t}(**query_params)'.format(t=table)
     new = eval(insert_cmd)
     # for i in query_params:
     #    setattr(new, i, query_params.get(i))
     resp.status = falcon.HTTP_201
     req.session.add(new)
     data = repr(new)
     resp.body = data
Exemplo n.º 16
0
 def on_post(self, req, resp, key):
     options = get_params(req.stream, False)
     from_folder = options.get('from_folder') or req.get_param(
         'from_folder')
     to_folder = options.get('to_folder') or req.get_param('to_folder')
     if not from_folder in [
             'inbox', 'sent', 'draft', 'star', 'archive', 'spam', 'trash'
     ]:
         resp.body = falcon.HTTP_400
         return
     if not to_folder in [
             'inbox', 'sent', 'draft', 'star', 'archive', 'spam', 'trash'
     ]:
         resp.body = falcon.HTTP_400
         return
     if to_folder == from_folder:
         resp.body = falcon.HTTP_201
         return
     user = getUserInfoFromSession(req, resp)
     mdb = getUserMessageBox(user.get('uuid'))
     message = mdb.get(key)
     data = message.data
     # lets move
     #        if data:
     #            target_mdb = getUserMessageBox(user.get('uuid'),  to_folder)
     #            tobj = target_mdb.new(key, data)
     #            tobj.store()
     #            mdb.delete(key)
     #            resp.body = falcon.HTTP_201
     #            resp.body = {'message':'MOVED'}
     #        else:
     #            resp.status = falcon.HTTP_404
     #            resp.body = {'message':'Not Found'}
     if data:
         data['folder'] = to_folder
         mdb.delete(key)
         obj = mdb.new(key, data)
         obj.store()
         resp.body = falcon.HTTP_201
         resp.body = {'message': 'MOVED'}
     else:
         mdb.delete(key)
         resp.status = falcon.HTTP_404
         resp.body = {'message': 'Not Found'}
Exemplo n.º 17
0
 def on_get(self, req, resp, key):
     user = getUserInfoFromSession(req, resp)
     bfolder = req.get_param('folder') or 'inbox'
     mdb = getUserMessageBox(user.get('uuid'))
     if not bfolder in [
             'inbox', 'sent', 'draft', 'star', 'archive', 'spam', 'trash'
     ]:
         resp.body = falcon.HTTP_400
         return
     data = mdb.get(key)
     messages = []
     for message in data.siblings:
         result = message.data
         try:
             result['key'] = key
         except TypeError:
             pass
         messages.append(result)
     resp.body = messages
Exemplo n.º 18
0
    def on_post(self, req, resp, projId):
        user = getUserInfoFromSession(req, resp)
        data = get_params(req.stream, flat=False)
        project = Project.query.filter(Project.id == int(projId)).first()
        if project:
            project.start = data.get('start')
            project.name = data.get('name')
            project.end = data.get('end')
            project.description = data.get('description')
            if data.get('leader'):
                project.lead_id = data.get('leader').get('id')
            project.watchers = []
            if data.get('watchers'):
                for eachWatcherId in data.get('watchers'):
                    _id = int(eachWatcherId.get('id'))
                    watcher = User.query.filter(User.id == _id).first()
                    project.watchers.append(watcher)

            resp.body = {'message': 'OK'}
        else:
            resp.status = falcon.HTTP_404
Exemplo n.º 19
0
    def on_put(self, req, resp):
        userInfo = getUserInfoFromSession(req, resp)
        data = get_params(req.stream, flat=False)
        name = data.get('name')
        repository_id = data.get('repository_id')
        parent_id = data.get('parent_id')

        template = data.get('template').lower()
        if name and repository_id:
            _uid = getUUID()
            newC = Collection( name=name, uuid=_uid, path=name,
                              repository_id=repository_id, owner_id=userInfo.get('id'))
            if parent_id:
                newC.parent_id = parent_id
            if template:
                newC.template = template

            # if not os.path.isdir(newC.url):
            req.session.add(newC)
            req.session.flush()
            resp.body = {'message': 'OK', 'info': {'uuid': _uid}}
Exemplo n.º 20
0
    def on_get(self, req, resp, date):
        user = getUserInfoFromSession(req, resp)
        uid = int(user.get('id'))
        now = datetime.datetime.utcnow
        today = now().strftime('%Y-%m-%d')
        tomorrow = (now() + datetime.timedelta(hours=24)).strftime('%Y-%m-%d')
        if date == 'today':
            '''These are tasks that started today and not finished yet'''
            data = Task.query.filter(Task.resources.any(id=uid))\
                .filter(Task.start <= now())\
                .filter(Task.complete < 100).filter(Task.end > now()).all()
        elif date == 'before':
            '''These are tasks that should have been ended before nut not completed yet'''
            data = Task.query.filter(Task.resources.any(id=uid))\
                .filter(Task.end <= now()).filter(Task.complete < 100).all()

        resp.body = [{
            'title': i.title,
            'id': i.id,
            'project': {
                'id': i.project.id,
                'name': i.project.name,
            }
        } for i in data]
Exemplo n.º 21
0
    def on_post(self, req, resp):
        user = getUserInfoFromSession(req, resp)
        message = get_params(req.stream, False)
        TO = None
        if message.get('to'):
            TO = req.session.query(User).filter_by(
                id=message.get('to').get('id')).first()
        FROM = req.session.query(User).filter_by(
            email=user.get('email')).first()
        _from = user.get('email')
        _from_fn = user.get('firstname')
        _from_ln = user.get('lastname')

        data = {
            'to_s': {
                'firstname_s': TO.firstname if TO else None,
                'lastname_s': TO.lastname if TO else None,
                'email_s': TO.email if TO else None,
                'id': TO.id if TO else None,
            },
            'from_s': {
                'firstname_s': FROM.firstname,
                'lastname_s': FROM.lastname,
                'email_s': FROM.email,
                'id': FROM.id
            },
            'read': False,
            'attachments': [],
            'body_s': message.get('body'),
            'subject_s': message.get('subject'),
            'folder': 'sent',
            'stared': False,
            'flagged': False,
            'datetime': time.time()
        }

        target_data = data.copy()
        bfolder = message.get('folder') or 'sent'
        if not bfolder in [
                'inbox', 'sent', 'draft', 'star', 'archive', 'spam', 'trash'
        ]:
            resp.body = falcon.HTTP_400
            return
        if not TO or not message.get('subject') or message.get('draft'):
            bfolder = 'draft'
            target_data = {}
            data['folder'] = 'draft'
        if FROM and message.get('body'):
            key = getUUID()
            if data:
                from_mdb = getUserMessageBox(FROM.uuid)
                obj = from_mdb.new(key, data)
                obj.store()
            if target_data:
                to_mdb = getUserMessageBox(TO.uuid)
                target_data['folder'] = 'inbox'
                tobj = to_mdb.new(key, target_data)
                tobj.store()
                mail_body = misaka.html('_____\n %s \n_____' %
                                        message.get('body'))
                mail_subject = ('New message from %s: ' %
                                FROM.firstname) + message.get('subject')
                sent = send_envelope.delay([TO.email], [], [], mail_subject,
                                           mail_body, FROM.email)
            if data:
                resp.body = {'message': data, 'key': key}
            else:
                resp.status = falcon.HTTP_201
        else:
            resp.status = falcon.HTTP_400
            resp.body = {
                'message': 'error',
                'info': 'subject, to and body needed.'
            }
Exemplo n.º 22
0
    def on_put(self, req, resp, repo):
        ''' Get data based on a file object or b64 data, save and commit it
            repo can be repository name or id.

        '''
        cr = req.headers.get('CONTENT-RANGE')
        userInfo = getUserInfoFromSession(req, resp)
        uploader = userInfo.get('id')

        try:
            repo = int(repo)
            targetRepo = Repository.query.filter_by(id=repo).scalar()
        except ValueError:
            targetRepo = Repository.query.filter_by(name=repo).scalar()

        if not uploader:
            uploader = -1
            targetRepo = Repository.query.filter_by(name='public').scalar()

        targetUser = User.query.filter_by(id=uploader).scalar()

        if not targetRepo:
            targetRepo = Repository.query.filter_by(name=repo).scalar()
            if not targetRepo:
                targetRepo = Repository(
                    name=repo, path=os.path.join(public_repository_path, repo))
                req.session.add(targetRepo)

        ''' When client sends md5, it means that there is probabaly an exsisting file with that md5
            So we server doesnt need file data.  Just need to link old data '''
        _md5 = req.get_param('md5')
        tags = []
        _tags = req.get_param('tags')
        if _tags:
            tags = [tag.strip() for tag in _tags.split(',')]



        _cid = req.get_param('collection_id')
        collection = None
        if _cid:
            collection = Collection.query.filter_by(repository=targetRepo)\
                            .filter_by(id=_cid).scalar()
        _cname = req.get_param('collection')
        if _cname:
            collection = Collection.query.filter_by(repository=targetRepo)\
                            .filter_by(name=_cname).scalar()
        if not collection:
            now = arrow.utcnow()
            today = now.format('YYYY-MM-DD')
            cpath = '%s.%s'%(userInfo.get('alias'), today)
            collection = Collection.query.filter_by(path=cpath)\
                .filter_by(repository=targetRepo).scalar()
            if not collection:
                collection = Collection(path=cpath, repository=targetRepo)
                req.session.add(collection)



        _subpath = req.get_param('subpath')
        if _subpath:
            sub_collections = _subpath.strip().split('/')[:-1]
            _scp = None
            for sc in sub_collections:
                scdb = Collection.query.filter_by(repository=targetRepo)\
                    .filter_by(parent=_scp or collection).filter_by(name=sc).first()
                if not scdb:
                    scdb = Collection(path=sc, parent=_scp or collection, repository=targetRepo)
                    req.session.add(scdb)
                    req.session.flush()
                _scp = scdb

            if sub_collections:
                collection = scdb  ## set collection to last subpath folder


        body = req.stream
        b64 = req.get_param('b64')
        thumbnail = req.get_param('thmb')
        mt = req.get_param('multipart')
        mtname = None
        if mt:
            try:
                fs = cgi.FieldStorage(fp=req.stream, environ=req.env)
            except (ValueError, IOError):
                resp.status = falcon.HTTP_400
                resp.body = {'message': 'Error in myltipart data'}
                return
            _cgi_data = fs['files[]']
            body = _cgi_data.file

            if fs.has_key('thumbnail'):  # thumbnails are dataURLs
                thumbnail = fs['thumbnail'].file.read()

            mtname = _cgi_data.filename
        attach_to = req.get_param('attach_to')
        if targetRepo and (body or _md5):
            if not mtname:
                name = req.get_param(
                    'name') or 'undefined.%s.raw' % _generate_id()
            else:
                name = mtname
            if name:
                name = slugify_filename(name)
            name = name.decode('utf-8')
            assetExt = name.split('.')[-1]
            content_type = contenttype(name)
            assetPath = name
            tempraryStoragePath = path.join(targetRepo.path, collection.path,
                                            name)
            #name = os.path.basename(tempraryStoragePath)
            if _md5:
                availableAsset = Asset.query.filter_by(key=_md5).join(
                    Collection).filter_by(repository_id=targetRepo.id).first()
                if availableAsset:
                    # create folder if not available
                    checkPath(os.path.dirname(tempraryStoragePath))
                    if os.path.isfile(tempraryStoragePath):
                        os.remove(tempraryStoragePath)
                    os.symlink(availableAsset.full_path, tempraryStoragePath)
                    bodyMd5 = _md5
                else:
                    resp.status = falcon.HTTP_404
                    return
            else:
                if body:
                    bodyMd5 = safeCopyAndMd5(
                        req, body, tempraryStoragePath, targetRepo.id, targetUser, b64=b64, content_range=cr)

                    # in uploading progress
                    if bodyMd5 in ['IN_PROGRESS', 'IN_PROGRESS_NEW']:
                        resp.body = {'info': bodyMd5}
                        resp.status = falcon.HTTP_206
                        return
                else:
                    resp.status = falcon.HTTP_204
                    return

            fullname = name
            name = (name[:10] + '..') if len(name) > 10 else name
            asset = Asset.query.filter(
                Asset.repository == targetRepo).filter_by(collection=collection)\
                .filter_by(fullname=fullname).scalar()
            resp.status = falcon.HTTP_200
            if not asset:
                _uid = getUUID()
                asset = Asset(key=bodyMd5, version=1, repository=targetRepo, uuid=_uid,
                              collection=collection, name=name, fullname=fullname,
                              path=assetPath, ext=assetExt, owner_id=targetUser.id)
                req.session.add(asset)
                resp.status = falcon.HTTP_201
            else:
                if not bodyMd5 == asset.key:
                    asset.version += 1
                asset.name = name
                asset.fullname = fullname
                asset.key = bodyMd5
            # Asset descriptionspath
            asset.path = assetPath
            if req.get_param('description'):
                asset.description = req.get_param('description')
            if targetUser:
                asset.modifiers.append(targetUser)
                asset.users.append(targetUser)
            if thumbnail:  # thumbnail is base64 format
                fmt = 'png'
                fid = asset.uuid + '_thmb_' + str(asset.version)
                result = os.path.join('uploads', fid + '.' + fmt)
                thmbpath = os.path.join(public_upload_folder, fid + '.' + fmt)
                thmb_data = decodestring(unquote(thumbnail).split(',')[1])
                with open(thmbpath, 'wb') as f:
                    f.write(thmb_data)
            if attach_to:
                parent_id = int(attach_to)
                parent = Asset.query.filter_by(id=parent_id).scalar()
                asset.attached_to.append(parent)

            task_id = req.get_param('task_id')
            if task_id:
                target_task = Task.query.filter_by(id=task_id).scalar()
                target_task.assets.append(asset)

            if tags:
                asset.tags += tags
                collection.tags += tags
            req.session.flush()
            resp.body = {'key': asset.key, 'id':asset.id,
                         'url': asset.url, 'fullname': asset.fullname, 'uuid': asset.uuid,
                         'name': asset.name, 'content_type': asset.content_type.split('/')[0],
                         'datetime': time.time()}
            #resp.body = "I am working"
        else:  # lets consume the stream!
            while True:
                chunk = req.stream.read(2 ** 22)
                if not chunk:
                    break

            resp.status = falcon.HTTP_400
            resp.body = {'message': 'Something Wrong!'}
Exemplo n.º 23
0
 def on_delete(self, req, resp, id):
     target = Asset.query.filter_by(id=id).scalar()
     userInfo = getUserInfoFromSession(req, resp)
     if userInfo.get('id') == target.owner.id:
         req.session.delete(target)
         resp.status = falcon.HTTP_202