コード例 #1
0
    def test_delete_task(self):
        factory = APIRequestFactory()
        view = TaskDetail.as_view()

        project = Project.objects.create(title='TestProject')
        tasks = Task.objects.bulk_create([(Task(id=1,
                                                title='Test1',
                                                description='d1',
                                                project=project)),
                                          (Task(id=2,
                                                title='Test2',
                                                description='d2',
                                                project=project)),
                                          (Task(id=3,
                                                title='Test3',
                                                description='d3',
                                                project=project))])
        task = tasks[0]

        request = factory.delete('/api/tasks/1')
        force_authenticate(request,
                           user=self.test_user,
                           token=self.full_access_token)
        response = view(request, pk='1')

        self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
        self.assertEqual(len(Task.objects.all()), 2)
        self.assertNotIn(task, Task.objects.all())
コード例 #2
0
 def load_task(self, path, delete_all=False):
     if delete_all:
         Task.objects.all().delete()
     with open(path) as jsonfile:
         reader = json.loads(jsonfile.read())
         for row in reader:
             title, desc = row.get('title'), row.get('description')
             created_by, assigned_to = None, None
             if title and desc:
                 description = self.get_clean_description(desc)
                 priority = self.get_priority()
                 while not created_by:
                     created_by = self.get_user()
                 while not assigned_to:
                     assigned_to = self.get_user()
                 while created_by.id == assigned_to.id:
                     assigned_to = self.get_user(
                     )  # If assign and user are same
                 task = Task(title=title,
                             description=description,
                             priority=priority,
                             created_by=created_by,
                             assigned_to=assigned_to)
                 task.save()
                 # Add tags and categories
                 [task.category.add(cat) for cat in self.get_categories()]
                 [task.tag.add(tag) for tag in self.get_tags()]
コード例 #3
0
def get_tasks():
    user = g.user
    done = request.args.get('done')
    if done:
        tasks = Task.serialize_list(user.tasks.filter_by(done=done))
    else:
        tasks = Task.serialize_list(user.tasks.all())

    return jsonify(tasks=[make_public_task(task) for task in tasks])
コード例 #4
0
ファイル: dbAccess.py プロジェクト: gveps/Hacknarok3
def saveTask(name, description, total_times, startDate, endDate, type, status):
    task = Task(name=name,
                description=description,
                total_times=total_times,
                startDate=startDate,
                endDate=endDate,
                type=type,
                status=status)
    task.save()
    return task
コード例 #5
0
    def test_get_tasks(self):
        factory = APIRequestFactory()
        view = TaskList.as_view()

        project = Project.objects.create(title='TestProject 1')
        tasks = Task.objects.bulk_create([(Task(id=1,
                                                title='Test1',
                                                project=project)),
                                          (Task(id=2,
                                                title='Test2',
                                                project=project)),
                                          (Task(id=3,
                                                title='Test3',
                                                project=project))])

        request = factory.get('/api/tasks')
        force_authenticate(request,
                           user=self.test_user,
                           token=self.full_access_token)
        response = view(request)

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), 3)

        for i in range(3):
            # Reverse comparison because tasks are ordered by created date.
            self.assertEqual(tasks[i].title, response.data[2 - i]['title'])
            self.assertEqual(tasks[i].description,
                             response.data[2 - i]['description'])
            self.assertEqual(tasks[i].project.id,
                             response.data[2 - i]['project']['id'])
            self.assertEqual(tasks[i].project.title,
                             response.data[2 - i]['project']['title'])
            self.assertEqual(tasks[i].project.description,
                             response.data[2 - i]['project']['description'])

        force_authenticate(request,
                           user=self.test_user,
                           token=self.read_access_token)
        response = view(request)

        self.assertEqual(response.status_code, status.HTTP_200_OK)
        self.assertEqual(len(response.data), 3)

        for i in range(3):
            self.assertEqual(tasks[i].title, response.data[2 - i]['title'])
            self.assertEqual(tasks[i].description,
                             response.data[2 - i]['description'])
            self.assertEqual(tasks[i].project.id,
                             response.data[2 - i]['project']['id'])
            self.assertEqual(tasks[i].project.title,
                             response.data[2 - i]['project']['title'])
            self.assertEqual(tasks[i].project.description,
                             response.data[2 - i]['project']['description'])
コード例 #6
0
ファイル: views.py プロジェクト: deepnirmal/Django-sample
    def addTask(request):

        print("Request got here")
        # print(request.__dict__)
        new_task = Task(title=request.POST.get('title'),
                        due_date=request.POST.get('date'),
                        status=request.POST.get('status'))
        print("Got the request correctly")
        new_task.save()

        return redirect('home')
コード例 #7
0
 def put(self, request, user_name):
     tasks = Task.objects.filter(user_name=user_name)
     tasks.delete()
     user = User.objects.get(name=user_name)
     newList = json.loads(request.body)
     for task in newList:
         newTask = Task(user_name=user,
                        label=task["label"],
                        done=task["done"])
         newTask.save()
     response = {"result": "ok"}
     return Response(response, status=status.HTTP_200_OK)
コード例 #8
0
ファイル: api.py プロジェクト: qubitron/StarterCode
def add_task():
    incoming = request.get_json()
    task = incoming.get('task')

    try:
        Task.create_task_from_json(task)
        resp = jsonify({'success': True}), 200

    except IntegrityError:
        resp = jsonify({'success': False}), 403

    return resp
コード例 #9
0
 def delete(self, idProject, idTask):
     project = Project.getProject(idProject, current_user.id)
     if project != None:
         task = Task.getTask(idProject, idTask)
         if task != None:
             result = Task.delete_task(idProject, idTask)
             if result:
                 return make_response(
                     jsonify({'result': 'Task removida com sucesso!'}), 200)
             return make_response(
                 jsonify({'error': 'Ocorreu um erro! Tente de outra vez!'}),
                 500)
     return make_response(jsonify({'task': 'Task nao encontrada!'}), 404)
コード例 #10
0
def create_task():
    if not request.json or not 'title' in request.json:
        abort(400)

    user = g.user
    task = Task(title=request.json['title'],
                description=request.json.get('description', ''),
                done=request.json.get('done', False),
                author=user)

    db.session.add(task)
    db.session.commit()

    return jsonify(task=make_public_task(task.serialize())), 201
コード例 #11
0
    def create_new_task(self, requestobj):
        task_resp = self.check_parent_task_exist(requestobj)
        if task_resp['Status'] == 'Success':
            ptaskupdate = Task.objects.filter(
                Q(task_id=task_resp['taskid']) & Q(userid=requestobj['userid'])
                & Q(task_name=requestobj['foldername'])).update(
                    status='pending')

            if ptaskupdate:
                resposnse = self.insert_new_task(task_resp['taskid'],
                                                 requestobj)
            else:
                resposnse = {
                    'Status': 'Error',
                    'Message': 'Please try Again',
                    'code': '100'
                }
        else:
            ptaskid = self.generate_task_id(7)
            ptaskobj = Task()
            ptaskobj.userid = requestobj['userid']
            ptaskobj.task_id = ptaskid
            ptaskobj.task_name = requestobj['foldername']
            ptaskobj.created_date = get_current_time()
            ptaskobj.save()
            resposnse = self.insert_new_task(ptaskid, requestobj)
        return resposnse
コード例 #12
0
ファイル: views.py プロジェクト: hafsamufassir/webdev2019
def task_detail(request, pk):
    try:
        task_list = TaskList.objects.get(id=pk)
    except TaskList.DoesNotExist as e:
        return JsonResponse({'error': str(e)})

    return JsonResponse(Task.to_json())
コード例 #13
0
ファイル: tasks.py プロジェクト: koiic/project-tracker
    def patch(self, task_id):
        """ Endpoint to update task"""
        request_data = request.get_json()
        user = get_jwt_identity()
        task = Task.get_or_404(task_id)
        schema = TaskSchema(context={'id': task_id})

        if 'task_assignees' in request_data:
            project = Project.get_or_404(task.project_id)
            assignee_list = check_assignee(request_data.get('task_assignees'),
                                           project.assignees)
            if assignee_list is not None:
                user_list = assign_user(assignee_list)
                assignees = user_list if user_list is not None else []
                del request_data['task_assignees']
                data = schema.load_object_into_schema(request_data,
                                                      partial=True)
                data['task_assignees'] = assignees
                task.update_(**data)
        else:
            data = schema.load_object_into_schema(request_data, partial=True)
            task.update_(**data)
        return response('success',
                        message=success_messages['updated'].format('Task'),
                        data=schema.dump(task).data,
                        status_code=200)
コード例 #14
0
ファイル: routes.py プロジェクト: bjjohnsontech/taskApp
def get_tasks(id=None, parent=None, top=None):
    total_work = 0  # set total work to 0
    taskL = []
    # will default to all if id, parent, and top are None
    tasks = Task.select()
    if id:
        tasks = tasks.select().where(Task.id == id)
    if parent:
        tasks = tasks.select().where(Task.parent == parent)
    elif top:
        tasks = tasks.where(Task.parent >> None)
    for task in tasks:
        task = model_to_dict(task)
        #print task
        children = get_tasks(parent=task['id'])
        child_work = children[
            'total_work']  # track each task's children's work
        task['children'] = children['tasks']  # each task's children
        task['work'] = []  # list of dates task worked on
        task[
            'work_complete'] = 0 + child_work  # total amount of work done on this task + children
        for work in Work.select().where(Work.task == task['id']):
            if not work.end_time:
                duration = datetime.datetime.now() - work.start_time
            else:
                duration = work.end_time - work.start_time
                # full days = 24 hours * 60 minutes + seconds divisible by 60, leave the remainder
            minutes = duration.days * 24 * 60 + (duration.seconds // 60)
            task['work_complete'] += minutes  # add work minutes to this task
            task['work'].append(model_to_dict(work))  # add work row to list
        taskL.append(task)
        total_work += task[
            'work_complete']  # track total time for this task for parent
    return {'total_work': total_work, 'tasks': taskL}
コード例 #15
0
def handle_hello():
    user_id = get_jwt_identity()
    print(user_id)
    if request.method == 'GET':
        # if _from = todays_date get all matching dates and all None dates else just get all matching dates
        _from = request.args.get('from', None)
        _null = request.args.get('_null', None)
        print("_nullywully", _null)
        _from = datetime.strptime(_from, '%Y/%m/%d')
        _until = request.args.get('until', None)
        _until = datetime.strptime(_until, '%Y/%m/%d')
        all_tasks = get_all_tasks(user_id, _from, _until, _null == "true")
        all_tasks = list(map(lambda t: t.serialize(), all_tasks))
        return jsonify(all_tasks), 200
    if request.method == 'POST':
        body = request.get_json()
        print("BODDYYY***", body)
        new_task = Task(label=body['label'],
                        date=body['date'],
                        dashboard=body['dashboard'],
                        folder=body['folder'],
                        user_id=user_id)
        db.session.add(new_task)
        db.session.commit()
        _from = request.args.get('from', None)
        _null = request.args.get('_null', None)
        _from = datetime.strptime(_from, '%Y/%m/%d')
        _until = request.args.get('until', None)
        _until = datetime.strptime(_until, '%Y/%m/%d')
        if _until is not None:
            _until += timedelta(days=1)
        all_tasks = get_all_tasks(user_id, _from, _until, _null == "true")
        all_tasks = list(map(lambda t: t.serialize(), all_tasks))
        return jsonify(all_tasks), 201
    return "invalid request4r  method", 404
コード例 #16
0
ファイル: routes.py プロジェクト: VitorGGs/rest-todo-app
def create():
    task = request.form.get('task')
    if task:
        todo = Task(task=task)
        db.session.add(todo)
        db.session.commit()
        return {'message': 'Task created'}, 201
    return {'message': 'No task send.'}, 404
コード例 #17
0
    def test_get_tasks_of_project(self):
        factory = APIRequestFactory()
        view = ProjectTasks.as_view()

        project = Project.objects.create(id=1, title='TestProject')
        Task.objects.bulk_create([(Task(id=1, title='Test1', project=project)),
                                  (Task(id=2, title='Test2', project=project)),
                                  (Task(id=3, title='Test3',
                                        project=project))])

        request = factory.get('/api/projects/1/tasks')
        force_authenticate(request,
                           user=self.test_user,
                           token=self.full_access_token)
        response = view(request, pk='1')

        self.assertEqual(len(response.data), 3)
コード例 #18
0
    def test_delete_task_fail_by_user_with_read_scope_only(self):
        factory = APIRequestFactory()
        view = TaskDetail.as_view()

        project = Project.objects.create(title='TestProject')

        Task.objects.bulk_create([(Task(id=1, title='Test1', project=project)),
                                  (Task(id=2, title='Test2', project=project)),
                                  (Task(id=3, title='Test3',
                                        project=project))])

        request = factory.delete('/api/tasks/1')
        force_authenticate(request,
                           user=self.test_user,
                           token=self.read_access_token)
        response = view(request)

        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
コード例 #19
0
 def function_alter_task(self, uuid_: uuid.UUID, item: Task):
     try:
         update_data = item.dict(exclude_unset=True)
         self.tasks[uuid_] = self.tasks[uuid_].copy(update=update_data)
     except KeyError as exception:
         raise HTTPException(
             status_code=404,
             detail='Task not found',
         ) from exception
コード例 #20
0
def create_task():
    if not request.json:
        return abort(404)
    
    task = Task(name=request.json["name"], started="N/A", finished="N/A", status="Not started", step=request.json["step"], file_path=request.json["file_path"], result="")
    db.session.add(task)
    db.session.commit()

    return jsonify([task.serialize])
コード例 #21
0
ファイル: views.py プロジェクト: fjkang/Flask
 def post(self):
     # 创建一个task
     args = self.reqparse.parse_args()
     title = args['title']
     task = Task(
         title=args['title'], description=args['description'], done=False)
     db.session.add(task)
     db.session.commit()
     return {'msg': f'创建task:{title}成功'}, 201
コード例 #22
0
def validateTask(data, idProject):
    try:
        task = Task(title=data["title"],
                    order=int(data['order']),
                    due_date=datetime.strptime(data['due_date'], '%Y-%m-%d'),
                    completed=data['completed'],
                    creation_date=datetime.now(),
                    project_id=idProject)
        return task
    except:
        return None
コード例 #23
0
ファイル: tasks.py プロジェクト: koiic/project-tracker
    def delete(self, task_id):
        """
		Delete a single task
		:param task_id:
		:return:
		"""
        user = get_jwt_identity()
        task_exists = Task.find_by_id(task_id)
        if task_exists is None:
            raise ValidationError({'message': 'Task not found'})
        Project.delete_item(task_exists)

        return {'status': 'success', 'message': 'Task deleted successfully'}
コード例 #24
0
 def put(self, idProject, idTask):
     project = Project.getProject(idProject, current_user.id)
     if project != None:
         data = request.get_json()
         task = validateTask(data, idProject)
         if task == None:
             return make_response(
                 jsonify({'fields': 'Existem campos mal preenchidos!'}),
                 400)
         else:
             task = Task.getTask(idProject, idTask)
             if task != None:
                 result = Task.update_task(idTask, data, idProject)
                 if result:
                     return make_response(
                         jsonify({'result':
                                  'Task atualizada com sucesso!'}), 200)
                 return make_response(
                     jsonify(
                         {'error': 'Ocorreu um erro! Tente de outra vez!'}),
                     500)
     return make_response(jsonify({'task': 'Task nao encontrada!'}), 404)
コード例 #25
0
    def _add_handler(self, arg):
        try:
            id_card, train_code, start_code, end_code, start_time, end_time = self._parser_order_string(
                arg)
        except ParserBookingInfoException as e:
            return Strings.ERROR_ADD_FORMAT
        except ParserBookingInfoStartStationException as e:
            return Strings.ERROR_ADD_FORMAT_START_STATION
        except ParserBookingInfoEndStationException as e:
            return Strings.ERROR_ADD_FORMAT_END_STATION
        except ParserBookingInfoTimeException as e:
            return Strings.ERROR_ADD_FORMAT_Time
        # test once
        try:
            train_crawler = TrainCrawler()
            ticket = train_crawler.query_exist_seat(id_card,
                                                    TRAIN_CODE_MAP[train_code],
                                                    start_code, end_code,
                                                    start_time, end_time)
        except QueryExistSeatException as e:
            return Strings.ERROR_QUERY_SEAT
        except Exception as e:
            traceback.print_exc()
            return Strings.ERROR_QUERY_SEAT

        # add order task
        task = Task.objects.filter(line_id=self.user_id).first()
        if task is None or task.status == Status.DELETING:
            task = Task(line_id=self.user_id, status=Status.RUNNING)
            task.save()
            t = threading.Thread(target=booking_ticket_task,
                                 args=(self.user_id, id_card, train_code,
                                       start_code, end_code, start_time,
                                       end_time))
            t.start()
            # booking_ticket_task.delay(self.user_id, id_card, train_code, start_code, end_code, start_time, end_time)
            return Strings.ADD_BOOKING_TASK_SUCCESS
        else:
            return Strings.ERROR_ALREADY_HAS_TASK
コード例 #26
0
    def test_relations(self):
        user2_json = {'username': '******', 'password': '******'}

        user2 = User.from_json(user2_json)
        db.session.add(user2)
        db.session.commit()

        user2_tasks = [{
            'title': 'destroy the state'
        }, {
            'title': 'form cooperatives'
        }]
        user1_tasks = [{
            'title': 'form a proletarian dictatorship'
        }, {
            'title': 'implement the 5 year plan'
        }, {
            'title': 'decide on a successor'
        }]

        # we put the tasks 'manually' in order to not login in and out of user1
        for task_json in user2_tasks:
            task = Task.from_json(task_json)
            task.user_id = user2.id
            db.session.add(task)
        db.session.commit()

        # create task of user1
        for task in user1_tasks:
            response, json_response = self.client.post(
                url_for('api.create_task'), data=task)

        # get tasks of user1

        response, json_response = self.client.get(url_for('api.get_tasks'))
        self.assertEquals(response.status_code, 200)

        # check if only the task of the user is given
        self.assertEquals(len(json_response['tasks']), 3)

        response_titles = [task['title'] for task in json_response['tasks']]
        input_titles = [task['title'] for task in user1_tasks]

        self.assertEquals(set(input_titles), set(response_titles))

        # check if access to the tasks of user2 allowed
        user2_task = user2.tasks.first()

        response, json_response = self.client.get(
            url_for('api.get_task', task_id=user2_task.id))
        self.assertEquals(response.status_code, 403)
コード例 #27
0
def task_lists(request):
    if request.method == 'GET':
        t_lists = TaskList.objects.all()
        serializer = Task(t_lists, many=True)
        return JsonResponse(serializer.data, safe=False)
    elif request.method == 'POST':
        t_list = json.loads(request.body)
        serializer = Task(data=t_list)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors)
コード例 #28
0
ファイル: tasks.py プロジェクト: koiic/project-tracker
    def get(self):
        """
		Get all tasks
		:param None:
		:return: Tasks List
		"""
        # user = get_jwt_identity()
        schema = TaskSchema(many=True)
        tasks = Task.get_all()
        if tasks is None:
            raise ValidationError({'message': 'No Task Found'})
        return response('success',
                        success_messages['retrieved'].format('Tasks'),
                        schema.dump(tasks).data)
コード例 #29
0
def get_tasks(task_names, worker_id, limit=1):
    with connection.cursor() as cursor:
        cursor.execute(get_task_sql, [task_names, limit, worker_id])
        raw_tasks = dictfetchall(cursor)

    for raw_task in raw_tasks:
        task_name = raw_task.pop('task_def_name')
        raw_task['task_def'] = TaskDef(name=task_name)

    tasks = []
    for raw_task in raw_tasks:
        tasks.append(Task(**raw_task))

    return tasks
コード例 #30
0
 def post(self, idProject):
     data = request.get_json()
     task = validateTask(data, idProject)
     if task == None:
         return make_response(
             jsonify({'fields': 'Existem campos mal preenchidos!'}), 400)
     else:
         result = Task.add_task(idProject, data)
         if result:
             return make_response(
                 jsonify({'result': 'Task adicionada com sucesso!'}), 200)
         return make_response(
             jsonify({'error': 'Ocorreu um erro! Tente de outra vez!'}),
             500)
コード例 #31
0
def save_feedback(f):
    existing_feedback = get_existing_feedback(f['service_request_id'])
    # Maybe just say Feedback(**f) or the like?
    updated_feedback = Feedback(
            service_request_id=f['service_request_id'],
            status_notes=f.get('status_notes', ''),
            status=f['status'],
            service_code=f.get('service_code', ''),
            service_name=f.get('service_name', ''),
            description=f.get('description', ''),
            agency_responsible=f.get('agency_responsible', ''),
            service_notice=f.get('service_notice', ''),
            requested_datetime=f.get('requested_datetime', ''),
            updated_datetime=f.get('updated_datetime', ''),
            address_string=f.get('address', ''),
            media_url=f.get('media_url', ''),

            email=f.get('email', ''),
            first_name=f.get('first_name', ''),
            last_name=f.get('last_name', ''),
            phone=f.get('phone', ''),

            # Extension information
            service_object_id=f.get('service_object_id', ''),
            service_object_type=f.get('service_object_type', ''),

            location=GEOSGeometry('SRID=4326;POINT(' + str(f.get('long', 0)) + ' ' + str(f.get('lat', 0)) + ')'),

            synchronized=True
    )

    if existing_feedback:
        updated_feedback.id = existing_feedback.id
        Task.objects.filter(feedback_id=existing_feedback.id).delete()
        MediaURL.objects.filter(feedback_id=existing_feedback.id).delete()

    extended_attributes = f.get('extended_attributes', None)
    if extended_attributes:
        updated_feedback.title = extended_attributes.get('title', '')
        updated_feedback.detailed_status = extended_attributes.get('detailed_status', '')

    updated_feedback.save()

    if extended_attributes:
        media_urls_json = extended_attributes.get('media_urls', None)
        if media_urls_json:
            for media_url_json in media_urls_json:
                media_url = MediaURL(feedback_id=updated_feedback.id, media_url=media_url_json)
                media_url.save()

        tasks_json = extended_attributes.get('tasks', None)
        if tasks_json:
            for task_json in tasks_json:
                task = Task(
                        feedback_id=updated_feedback.id,
                        task_state=task_json.get('task_state', ''),
                        task_type=task_json.get('task_type', ''),
                        owner_name=task_json.get('owner_name', ''),
                        task_modified=task_json.get('task_modified', ''),
                        task_created=task_json.get('task_created', '')
                )
                task.save()
コード例 #32
0
	def test_quick_create(self):
		task = Task.quick_create()
		
		assert isinstance(task, Task), 'Task instance is created'
コード例 #33
0
def save_feedback(f):
    existing_feedback = get_existing_feedback(f['service_request_id'])

    expected_datetime = f.get('expected_datetime', None)
    requested_datetime = f.get('requested_datetime', None)
    if expected_datetime is None and requested_datetime is not None:
        requested_datetime = parse(requested_datetime)
        median = timedelta(milliseconds=calc_fixing_time(f.get('service_code', '')))
        if median.total_seconds() > 0:
            expected_datetime = requested_datetime + median

    updated_feedback = Feedback(
            service_request_id=f['service_request_id'],
            status_notes=f.get('status_notes', ''),
            status=f['status'],
            service_code=f.get('service_code', ''),
            service_name=f.get('service_name', ''),
            description=f.get('description', ''),
            agency_responsible=f.get('agency_responsible', ''),
            service_notice=f.get('service_notice', ''),
            requested_datetime=f.get('requested_datetime', ''),
            updated_datetime=f.get('updated_datetime', ''),
            expected_datetime=expected_datetime,
            address_string=f.get('address', ''),
            media_url=f.get('media_url', ''),

            email=f.get('email', ''),
            first_name=f.get('first_name', ''),
            last_name=f.get('last_name', ''),
            phone=f.get('phone', ''),

            # Extension information
            service_object_id=f.get('service_object_id', ''),
            service_object_type=f.get('service_object_type', ''),

            location=GEOSGeometry('SRID=4326;POINT(' + str(f.get('long', 0)) + ' ' + str(f.get('lat', 0)) + ')'),

            synchronized=True
    )

    if existing_feedback:
        updated_feedback.id = existing_feedback.id
        Task.objects.filter(feedback_id=existing_feedback.id).delete()
        MediaURL.objects.filter(feedback_id=existing_feedback.id).delete()

    extended_attributes = f.get('extended_attributes', None)
    if extended_attributes:
        updated_feedback.title = extended_attributes.get('title', '')
        updated_feedback.detailed_status = extended_attributes.get('detailed_status', '')

    updated_feedback.save()

    if extended_attributes:
        media_urls_json = extended_attributes.get('media_urls', None)
        if media_urls_json:
            for media_url_json in media_urls_json:
                media_url = MediaURL(feedback_id=updated_feedback.id, media_url=media_url_json)
                media_url.save()

        tasks_json = extended_attributes.get('tasks', None)
        if tasks_json:
            for task_json in tasks_json:
                task = Task(
                        feedback_id=updated_feedback.id,
                        task_state=task_json.get('task_state', ''),
                        task_type=task_json.get('task_type', ''),
                        owner_name=task_json.get('owner_name', ''),
                        task_modified=task_json.get('task_modified', ''),
                        task_created=task_json.get('task_created', '')
                )
                task.save()

    if settings.SEND_STATUS_UPDATE_NOTIFICATIONS \
            and existing_feedback and feedback_status_was_changed(existing_feedback, updated_feedback):
        send_email_notification(updated_feedback)