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)
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)
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)