예제 #1
0
    def post(self, request):
        validated_data = request.serializer.validated_data

        task = Task.objects.create(title=validated_data['title'],
                                   description=validated_data['description'],
                                   status=Task.CREATED,
                                   user_created=request.user,
                                   date_create_task=datetime.now())
        if validated_data['user_assigned']:
            task.user_assigned = validated_data['user_assigned']

        task.save()

        if validated_data['user_assigned'] and validated_data[
                'user_assigned'] != request.user:
            AddNotificationTaskStatus(task.user_assigned, task, "created")

        # add in ReJSON database
        rj = Client(
            host='localhost',
            port=6379,
        )
        rj.jsonset('task:' + str(task.id), Path.rootPath(),
                   TaskSerializer(task).data)
        rj.execute_command('JSON.NUMINCRBY acc .total 1')
        rj.execute_command('JSON.SET acc .maxId ' + str(task.id))

        return Response(status=201)
예제 #2
0
    def get(self, request):
        for r in request.META:
            print(str(r) + " <-> " + str(request.META[r]))

        rj = Client(
            host='localhost',
            port=6379,
        )

        url_parameters = str(request.META['QUERY_STRING'])
        params = url_parameters.split('&')
        task = list()

        response = dict()
        rj = Client(
            host='localhost',
            port=6379,
        )
        response.update(
            {"count": int(rj.execute_command('JSON.GET acc .total'))})

        page = 0

        for param in params:
            if param:
                if param and int(param.split('=')[1]) >= 0 and param.split(
                        '=')[0] == "page":
                    page = int(param.split('=')[1])
                    valueStart = (int(param.split('=')[1]) * 10)
                    valueEnd = int(valueStart) + 10
                    tasksList = sorted(rj.execute_command('keys task:*'),
                                       reverse=True)

                    for item in tasksList[valueStart:valueEnd]:
                        current_task = getJSON(rj, item.decode('utf-8'),
                                               Path.rootPath())
                        if current_task:
                            task.append(current_task)

                    if not task:
                        return Response(status=204)
                else:
                    return Response(status=400)

        if not task:
            tasksList = sorted(rj.execute_command('keys task:*'), reverse=True)

            for item in tasksList[0:10]:
                current_task = getJSON(rj, item.decode('utf-8'),
                                       Path.rootPath())
                if current_task:
                    task.append(current_task)

        total_pages = int(int(rj.execute_command('JSON.GET acc .total')) / 10)
        if page < total_pages:
            next_page = str(request.META['wsgi.url_scheme']) + "://" + str(
                request.META['HTTP_HOST']) + "/task/all/?page=" + str(page + 1)
        else:
            next_page = None

        if page > 0:
            prev_page = str(request.META['wsgi.url_scheme']) + "://" + str(
                request.META['HTTP_HOST']) + "/task/all/?page=" + str(page - 1)
        else:
            prev_page = None

        response.update({"next": next_page})
        response.update({"previous": prev_page})
        response.update({"results": task})

        return Response(response)
예제 #3
0
class JobsAPI(Resource):
    def __init__(self):
        self.redis = Client(host='127.0.0.1', port=6379, decode_responses=True)

    def get(self, **kwargs):
        if kwargs.get('job_id'):
            job_id = kwargs.get('job_id')
            if self.redis.exists(job_id):
                parser = reqparse.RequestParser()

                if request.url_rule.rule == '/jobs/<string:job_id>/next':
                    parser.add_argument('expired_duration',
                                        type=int,
                                        default=300)
                    args = parser.parse_args(strict=True)
                    if self.redis.jsonget(job_id, Path('.items')):
                        ttl = args.get('expired_duration')
                        items = self.redis.jsonget(job_id, Path('.items'))
                        for item in items:
                            if not self.redis.exists(f'hold_{item}'):
                                self.redis.execute_command(
                                    'SET', f'hold_{item}', job_id)
                                self.redis.execute_command(
                                    'EXPIRE', f'hold_{item}', ttl)
                                return output_json(
                                    {
                                        'status': 'ok',
                                        'job_id': job_id,
                                        'ttl': ttl,
                                        'index': items.index(item),
                                        'item': item
                                    }, 200)
                    return output_json(
                        {
                            'status': 'error',
                            'job_id': job_id,
                            'description': 'Items list is empty.'
                        }, 400)

                if request.url_rule.rule == '/jobs/<string:job_id>/items':
                    parser.add_argument('active',
                                        default='true',
                                        choices=('true', 'false'))
                    args = parser.parse_args(strict=True)
                    items = self.redis.jsonget(job_id, Path('.items'))
                    done_items = self.redis.jsonget(job_id, Path('.done'))
                    if args.get('active') == 'true':
                        active_items = []
                        for item in items:
                            if not self.redis.exists(f'hold_{item}') and \
                                    items.index(item) not in done_items:
                                active_items.append(item)
                        return output_json(
                            {
                                'status': 'ok',
                                'job_id': job_id,
                                'items': active_items
                            }, 200)
                    return output_json(
                        {
                            'status': 'ok',
                            'job_id': job_id,
                            'items': items + done_items
                        }, 200)
            else:
                return output_json(
                    {
                        'status': 'error',
                        'job_id': job_id,
                        'description': 'The job is not in the queue.'
                    }, 400)

        return output_json(
            {
                'status': 'ok',
                'jobs': [i for i in self.redis.keys() if i[:5] != 'hold_']
            }, 200)

    def post(self, **kwargs):
        if request.url_rule.rule == '/jobs/<string:job_id>/items/<int:item_index>/done':
            job_id = kwargs.get('job_id')
            item_index = kwargs.get('item_index')
            done_item = self.redis.jsonget(job_id, Path('.items'))[item_index]
            if item_index in self.redis.jsonget(job_id, Path('.done')):
                return output_json(
                    {
                        'status': 'error',
                        'description': 'The item already was marked as done.',
                        'job_id': job_id,
                        'index': item_index,
                        'item': done_item
                    }, 400)
            self.redis.delete(f'hold_{done_item}')
            self.redis.jsonarrappend(job_id, Path('.done'), item_index)
            return output_json(
                {
                    'status': 'ok',
                    'description': 'The item is marked as done.',
                    'job_id': job_id,
                    'index': item_index,
                    'item': done_item
                }, 200)

        if request.url_rule.rule == '/jobs/<string:job_id>/items/<int:item_index>/error':
            job_id = kwargs.get('job_id')
            item_index = kwargs.get('item_index')
            error_item = self.redis.jsonget(job_id, Path('.items'))[item_index]
            if item_index in self.redis.jsonget(job_id, Path('.error')):
                return output_json(
                    {
                        'status': 'error',
                        'description': 'The item already was marked as error.',
                        'job_id': job_id,
                        'index': item_index,
                        'item': error_item
                    }, 400)
            self.redis.delete(f'hold_{error_item}')
            self.redis.jsonarrappend(job_id, Path('.error'), item_index)
            return output_json(
                {
                    'status': 'ok',
                    'description': 'The item is marked as error.',
                    'job_id': job_id,
                    'index': item_index,
                    'item': error_item
                }, 200)

        if isinstance(request.json, list) and request.json:
            job_id = str(uuid.uuid4())

            data = {'items': request.json, 'done': [], 'error': []}

            if self.redis.jsonset(job_id, Path.rootPath(), data):
                return output_json(
                    {
                        'status': 'ok',
                        'description': 'Job is added to queue.',
                        'job_id': job_id
                    }, 201)
        else:
            return output_json(
                {
                    'status': 'error',
                    'description': 'Wrong request!'
                }, 400)

    def delete(self, job_id):
        if self.redis.exists(job_id):
            self.redis.delete(job_id)
            return output_json(
                {
                    'status': 'ok',
                    'description': 'Job is deleted.'
                }, 200)
        else:
            return output_json(
                {
                    'status': 'error',
                    'description': 'The job is not in the queue.'
                }, 400)