def update_project(project_id):
    new_project = request.get_json()
    try:
        project = Project.get(Project.id == project_id)
    except models.DoesNotExist:
        return jsonify({ 'message': 'Project not found' }), 400
    if new_project['id'] != project.id:
        return jsonify({ 'message': 'Cannot update project at this url' }), 400
    try:
        if new_project['markerOptions']:
            marker_options = new_project['markerOptions']
            for marker_name in marker_options:
                try:
                    marker_option = MarkerOption.get(MarkerOption.name == marker_name)
                    ProjectMarkerOption.get(ProjectMarkerOption.project == project.id,
                                            ProjectMarkerOption.marker_option == marker_option.id)
                except models.DoesNotExist:
                    ProjectMarkerOption.create(project = project, marker_option = marker_option)
        if new_project['users']:
            users = new_project['users']
            for user in users:
                try:
                    project_user = ProjectUser.get(ProjectUser.app_user == user['id'],
                                                    ProjectUser.project == project)
                except models.DoesNotExist:
                    ProjectUser.create(app_user = user['id'], project = project)
        if new_project['stacks']:
            stacks = new_project['stacks']
            with db.atomic():
                for stack in stacks:
                    try:
                        project_stack = ProjectStack.get(ProjectStack.stack == stack['id'],
                                                        ProjectStack.project == project)
                    except models.DoesNotExist:
                        project_stack = ProjectStack.create(project=project, stack = stack['id'])
                        probe_setting = stack['probeSettings']
                        probe_position = json.loads(probe_setting['position'])
                        ProbeSetting.create(x_offset=int(probe_position['xOffset']),
                                            y_offset=int(probe_position['yOffset']),
                                            project_stack=project_stack,
                                            label=probe_position['label']
                                        )
        message = "Project updated"
    except Exception as ex:
        print ex
    project = Project.get(Project.id == project_id)
    return jsonify({ 'message': 'Project updated', 'project': project.deep_serialized() }), 200
def project_stack_images(project_id, stack_id):
    first_image = Image.select().join(StackImage).where(StackImage.stack == stack_id).get().key
    last_underscore = first_image.rfind('_')
    stack_title = first_image[:last_underscore]
    project_stack = ProjectStack.get(ProjectStack.project == project_id, ProjectStack.stack == stack_id)
    project_stack_user_data = project_stack.project_stack_data.where(ProjectStackDatum.user == g.user_id)
    probe_type = project_stack.project.probe_type
    probe_settings = project_stack.probe_setting.get()
    images = (Image.select().join(StackImage).where(StackImage.stack == stack_id)
                .order_by(Image.name))
    project_stacks = Stack.select().join(ProjectStack).where(ProjectStack.project == project_id).order_by(Stack.id)
    marker_options = MarkerOption.select().join(ProjectMarkerOption).where(ProjectMarkerOption.project == project_id)
    return jsonify({ 'images': [image.stack_image_serialized for image in images],
                     'data': [d.serialized for d in project_stack_user_data],
                     'probeSettings': probe_settings.serialized,
                     'stackTitle': stack_title,
                     'probeType': probe_type,
                     'markerOptions': [marker_option.name for marker_option in marker_options],
                     'projectStackIds': [stack.id for stack in project_stacks]
                    })