Example #1
0
def create_template_project(request):
    workspace = Workspace.objects.get(owner=request.user,
                                      inner_name='home_page')

    count = Project.objects.filter(
        owner=request.user, inner_name__startswith='custom_template').count()

    project = Project.objects.create(owner=request.user,
                                     inner_name='custom_template',
                                     workspace_id=workspace.id,
                                     name=u'定制模板{}'.format(count + 1),
                                     type='weapp')
    Project.objects.filter(id=project.id).update(
        inner_name=project.inner_name + str(project.id))

    #导入page
    pagestore = pagestore_manager.get_pagestore_by_type('mongo')
    custom_template_source_dir = os.path.join(
        settings.PROJECT_HOME,
        '../webapp/modules/viper_workspace_home_page/project_weapp_custom_template_base/'
    )
    pages_data_file_path = os.path.join(custom_template_source_dir,
                                        'pages.json')
    pages_data_file = open(pages_data_file_path, 'rb')
    content = pages_data_file.read()
    pages_data_file.close()
    for page in json.loads(content):
        page_id = page['page_id']
        page_component = page['component']
        page_component['is_new_created'] = True
        pagestore.save_page(str(project.id), page_id, page_component)

    response = create_response(200)
    response.data = {'project_id': project.id}
    return response.get_response()
Example #2
0
    def get(request):
        """
		导航渲染页面

		project_id的格式为:
		fake:${project_type}:${webapp_owner_id}:${page_id}:${mongodb_id}
		"""
        pagestore = pagestore_manager.get_pagestore_by_type('mongo')
        project_id = 'fake:wepage:%d:navbar' % request.manager.id
        page_id = 'navbar'

        page = pagestore.get_page(project_id, page_id)
        if page:
            mongodb_id = str(page['_id'])
        else:
            mongodb_id = 'new'
        project_id = '%s:%s' % (project_id, mongodb_id)

        # 是否启用
        global_navbar = termite_models.TemplateGlobalNavbar.get_object(
            request.manager.id)

        c = RequestContext(
            request, {
                'first_nav_name': FIRST_NAV,
                'second_navs': export.get_wepage_second_navs(request),
                'second_nav_name': export.WEPAGE_GLOBAL_NAVBAR_NAV,
                'is_new_navbar': True,
                'project_id': project_id,
                'is_enable': global_navbar.is_enable
            })
        return render_to_response('termite2/global_navbar_editor.html', c)
Example #3
0
def __delete_workspaces(workspace_ids):
    pagestore = pagestore_manager.get_pagestore_by_type('mongo')

    project_ids = []
    for workspace_id in workspace_ids:
        for project in Project.objects.filter(workspace_id=workspace_id):
            print '>>> remove mongo page in project ', project.id
            pagestore.remove_project_pages(str(project.id))
            project_ids.append(project.id)

    Project.objects.filter(id__in=project_ids).delete()
    Workspace.objects.filter(id__in=workspace_ids).delete()
Example #4
0
def __delete_project(project):
    pagestore = pagestore_manager.get_pagestore_by_type('mongo')

    #module_project = Project.objects.get(id=project_id)
    '''	
	for jqm_project in Project.objects.filter(datasource_project_id=module_project.id):
		pagestore.remove_project_pages(str(jqm_project.id))
	Project.objects.filter(datasource_project_id=module_project.id).delete()
	'''

    pagestore.remove_project_pages(str(project.id))
    Project.objects.filter(id=project.id).delete()
Example #5
0
    def copy_page(project, source_template_id):
        """
		从mongodb中拷贝现存project的page数据
		"""
        pagestore = pagestore_manager.get_pagestore_by_type('mongo')
        page_id = 1
        page = pagestore.get_page(source_template_id, page_id)
        page_component = page['component']
        page_component['is_new_created'] = True

        pagestore.save_page(str(project.id), page_id, page_component)
        return True
Example #6
0
def sync_to_user_template_project(request):
	"""
	将template project同步到所有用户
	"""
	pagestore = pagestore_manager.get_pagestore_by_type('mongo')

	project_id = request.POST['project_id']
	page = pagestore.get_first_page(project_id)
	project = Project.objects.get(id=project_id)
	inner_name = project.inner_name

	manager = User.objects.get(username='******')

	#workspace_ids = Project.objects.values_list('workspace_id', flat=True).filter(inner_name=inner_name, owner=manager)
	#workspace2project = dict([(p.workspace_id, p) for p in Project.objects.filter(workspace_id__in=workspace_ids, inner_name=inner_name)])

	#为所有拥有该workspace的用户添加project
	source_workspace = Workspace.objects.get(owner=manager, inner_name="home_page")
	project = Project.objects.get(owner=manager, workspace=source_workspace, inner_name=inner_name)
	for workspace in Workspace.objects.filter(source_workspace_id=source_workspace.id):
		is_new_created_page = True
		if Project.objects.filter(workspace=workspace, inner_name=inner_name).count() > 0:
			#更新
			is_new_created_page = False
			new_project = Project.objects.get(workspace=workspace, inner_name=inner_name)
			new_project_id = str(new_project.id)
		else:
			#创建
			new_project = Project.objects.create(
				owner_id = workspace.owner_id,
				workspace = workspace,
				name = project.name,
				inner_name = project.inner_name,
				type = project.type,
				css = project.css,
				pagestore = project.pagestore,
				source_project_id = project.id,
				datasource_project_id = 0,
				template_project_id = 0
			)
			new_project_id = str(new_project.id)

		if project.type == 'jqm':
			page_id = page['page_id']
			page_component = page['component']
			page_component['is_new_created'] = is_new_created_page
			pagestore.save_page(new_project_id, page_id, page_component)

	response = create_response(200)
	return response.get_response()
Example #7
0
    def api_delete(request):
        #删除mongo中project所有的page
        project_id = request.POST['id']
        pagestore = pagestore_manager.get_pagestore_by_type('mongo')
        pagestore.remove_project_pages(str(project_id))

        #删除project本身
        webapp_models.Project.objects.filter(owner=request.manager,
                                             id=project_id).delete()

        #清除webapp page cache
        Project.delete_webapp_page_cache(request.manager.id, project_id)

        response = create_response(200)
        return response.get_response()
Example #8
0
    def create_empty_app_page(request):
        """
		创建新的
		"""
        _, app_name, _ = request.GET['project_id'].split(':')
        page_component = json.loads(request.POST['page_json'])
        page_component['is_new_created'] = True
        page_id = 1
        project_id = 'app:%s:%s:%s' % (app_name, request.manager.id,
                                       time.time())
        pagestore = pagestore_manager.get_pagestore_by_type('mongo')
        pagestore.save_page(project_id, page_id, page_component)

        page = pagestore.get_page(project_id, page_id)
        new_project_id = str(page['_id'])
        pagestore.update_page_project_id(project_id, page_id, new_project_id)
        return new_project_id
Example #9
0
    def create_empty_page(project):
        """
		从硬盘导入空page的json数据到mongodb
		"""
        pagestore = pagestore_manager.get_pagestore_by_type('mongo')
        custom_template_source_dir = os.path.join(
            settings.PROJECT_HOME,
            '../webapp/modules/viper_workspace_home_page/project_wepage_template_base/'
        )
        pages_data_file_path = os.path.join(custom_template_source_dir,
                                            'pages.json')
        pages_data_file = open(pages_data_file_path, 'rb')
        content = pages_data_file.read()
        pages_data_file.close()
        page = json.loads(content)[0]
        page_id = page['page_id']
        page_component = page['component']
        page_component['is_new_created'] = True
        pagestore.save_page(str(project.id), page_id, page_component)

        return True
Example #10
0
def get_workspace_navs(user):
	from webapp.models import Workspace, Project
	from termite import pagestore as pagestore_manager
	
	webapp_editor_navs = []
	pagestore = pagestore_manager.get_pagestore_by_type('mongo')
	for workspace in Workspace.objects.filter(owner=user):
		if 'viper:' in workspace.data_backend:
			project_id = workspace.data_backend.split(':')[-1]
			project = Project.objects.get(id=project_id)
			pages = pagestore.get_pages(project_id=project_id)
			webapp_editor_nav = {
				'section': workspace.name,
				'navs': []
			}
			for page in pages:
				page_id = page['page_id']
				page_model = page['component']['model']
				print page_model
				if page_model.get('is_free_page', 'no') == 'yes':
					url = '/workbench/viper/page/?project_id=%s&page_id=%s' % (project_id, page_id)
				else:
					url = '/workbench/viper/records/?project_id=%s&page_id=%s' % (project_id, page_id)
				webapp_editor_nav['navs'].append({
					'name': page_id,
					'url': url,
					'title': page['component']['model']['navName']
				})

			webapp_editor_navs.append(webapp_editor_nav)
		elif 'module:' in workspace.data_backend:
			webapp_template_info_module = 'webapp.modules.%s.webapp_template_info' % workspace.data_backend.split(':')[-1]
			module = __import__(webapp_template_info_module, {}, {}, ['*',])
			webapp_editor_navs.append({'section': workspace.name, 'navs':module.NAV['navs']})
		else:
			pass

	return webapp_editor_navs
Example #11
0
def update_template_project(request):
	"""
	从硬盘上更新数据库中的模板project和page信息
	"""
	pagestore = pagestore_manager.get_pagestore_by_type('mongo')

	project_id = request.POST['project_id']
	project = Project.objects.get(id=project_id)

	#删除已有的page
	pagestore.remove_project_pages(project_id)

	#更新page
	project_dir = '%s/../webapp/modules/viper_workspace_home_page/project_jqm_%s' % (settings.PROJECT_HOME, project.inner_name)
	pages_data_file_path = os.path.join(project_dir, 'pages.json')
	pages_data_file = open(pages_data_file_path, 'rb')
	content = pages_data_file.read()
	pages_data_file.close()
	has_page = False
	for page in json.loads(content):
		has_page = True
		page_id = page['page_id']
		page_component = page['component']
		page_component['is_new_created'] = True
		pagestore.save_page(str(project.id), page_id, page_component)
	if settings.MODE == 'develop' and has_page:
		print 'create project\'s pages: %s' % pages_data_file_path

	#更新css
	# css_dir = os.path.join(settings.TERMITE_HOME, '../static/project_css')
	# src_file = os.path.join(project_dir, 'project.css')
	# dst_file = os.path.join(css_dir, 'project_%s.css' % project.id)
	# shutil.copyfile(src_file, dst_file)
	# if settings.MODE == 'develop':
	# 	print 'update css file: %s' % dst_file

	response = create_response(200)
	return response.get_response()
Example #12
0
def __get_modules_page_second_navs(workspaces):
    pagestore = pagestore_manager.get_pagestore_by_type('mongo')
    second_navs = []

    for workspace in workspaces:
        if workspace.is_deleted:
            continue

        if 'viper:' in workspace.data_backend:
            project_id = workspace.data_backend.split(':')[-1]
            project = Project.objects.get(id=project_id)
            #取viper project的source project的page集合
            pages = list(pagestore.get_pages(str(project.source_project_id)))
            webapp_editor_nav = {'section': workspace.name, 'navs': []}
            for page in pages:
                page_id = page['page_id']
                page_model = page['component']['model']
                print page_model
                if page_model.get('is_free_page', 'no') == 'yes':
                    url = '/workbench/viper/page/?project_id=%s&page_id=%s' % (
                        project_id, page_id)
                else:
                    url = '/workbench/viper/records/?project_id=%s&page_id=%s' % (
                        project_id, page_id)
                webapp_editor_nav['navs'].append({
                    'name':
                    page_id,
                    'url':
                    url,
                    'title':
                    page['component']['model']['navName']
                })

            #插入“管理模板”
            '''
			webapp_editor_nav['navs'].append({
				'name': 'template',
				'url': '/termite/workbench/project/edit/%d/' % workspace.template_project_id,
				'title': u'模板管理'
			})
			'''

            second_navs.append(webapp_editor_nav)
        elif 'module:' in workspace.data_backend:
            export_module_name = 'webapp.modules.%s.export' % workspace.data_backend.split(
                ':')[-1]
            module = __import__(export_module_name, {}, {}, [
                '*',
            ])
            #second_navs.append({'section': workspace.name, 'navs':module.NAV['navs']})
            nav = copy.deepcopy(module.NAV)
            #插入“管理模板”
            '''
			nav['navs'].append({
				'name': 'template',
				'url': '/termite/workbench/project/edit/%d/' % workspace.template_project_id,
				'title': u'模板管理'
			})
			'''
            second_navs.append(nav)
        else:
            pass
    '''
	second_navs.append(
		{
			'section': u'微站模块',
			'navs': [{
				'name': 'module',
				'title': u'模块管理',
				'url': '/webapp/modules/',
			}]
		}
	)
	second_navs.append(
		{
			'section': u'微站统计',
			'navs': [{
				'name': 'statistics',
				'title': u'流量统计',
				'url': '/webapp/visit_statistics/',
			}]
		}
	)
	'''

    return second_navs
Example #13
0
def add_module(request):
    pagestore = pagestore_manager.get_pagestore_by_type('mongo')

    #获得页面上选中的module
    module_ids = []
    for key, value in request.POST.items():
        if key.startswith('module_'):
            module_ids.append(int(value))
    module_id_set = set(module_ids)

    #获得用户已经创建的workspace
    existed_workspaces = list(Workspace.objects.filter(owner=request.user))
    existed_source_workspace_id_set = set()
    modules_need_restore = set()
    modules_need_delete = set()
    for existed_workspace in existed_workspaces:
        existed_source_workspace_id_set.add(
            existed_workspace.source_workspace_id)

        if (existed_workspace.source_workspace_id
                in module_id_set) and existed_workspace.is_deleted:
            #已删除的workspace出现在选中的workspace集合中,需要恢复
            modules_need_restore.add(existed_workspace.id)
            continue

        if not (existed_workspace.source_workspace_id in module_id_set):
            #已有的workspace不在选中的workspace集合中,需要删除
            modules_need_delete.add(existed_workspace.id)
            continue

    modules_need_add = module_id_set - existed_source_workspace_id_set

    #处理需要创建的module workspace
    id2module = dict([(workspace.id, workspace)
                      for workspace in Workspace.objects.filter(
                          id__in=list(modules_need_add))])
    for module_workspace_id, module_workspace in id2module.items():
        new_workspace = Workspace.objects.create(
            owner=request.user,
            name=module_workspace.name,
            source_workspace_id=module_workspace.id,
            data_backend=module_workspace.data_backend)

        module_projects = list(
            Project.objects.filter(workspace=module_workspace_id))
        #复制workspace下的jqm project,及其page
        template_project = None  #template_project默认为遇到的第一个jqm project
        new_data_backend = None
        for module_project in module_projects:
            new_project = Project.objects.create(
                owner=request.user,
                workspace_id=new_workspace.id,
                name=module_project.name,
                type=module_project.type,
                source_project_id=module_project.id,
                datasource_project_id=0)

            if module_project.type == 'viper':
                #跳过viper project,不拷贝page
                new_data_backend = 'viper:%d' % new_project.id
                continue

            pagestore.copy_project_pages(str(module_project.id),
                                         str(new_project.id))

            if not template_project:
                template_project = new_project

        if new_data_backend:
            Workspace.objects.filter(id=new_workspace.id).update(
                template_project_id=template_project.id,
                data_backend=new_data_backend)
        else:
            Workspace.objects.filter(id=new_workspace.id).update(
                template_project_id=template_project.id)

    #处理需要恢复的module workspace
    #Workspace.objects.filter(id__in=list(modules_need_restore)).update(is_deleted = False)

    #处理需要删除的module workspace
    #Workspace.objects.filter(id__in=list(modules_need_delete)).update(is_deleted = True)
    #做物理删除
    __delete_workspaces(list(modules_need_delete))

    return HttpResponseRedirect('/webapp/modules/')
Example #14
0
def sync_workspace(request):
    pagestore = pagestore_manager.get_pagestore_by_type('mongo')
    modules_info = json.loads(request.POST['modules_info'])
    modules = modules_info['modules']
    allow_update = modules_info['allow_update']
    modules_dir = os.path.join(settings.PROJECT_HOME, '../webapp/modules')

    for module in modules:
        module_dir = os.path.join(modules_dir, module)
        print 'process module: ', module_dir

        #加载workspace的table data json文件
        workspace_table_data_file_path = os.path.join(module_dir,
                                                      'workspace_table.json')
        if os.path.exists(workspace_table_data_file_path):
            workspace_table_data_file = open(workspace_table_data_file_path,
                                             'rb')
            content = workspace_table_data_file.read()
            workspace_table_data_file.close()

            data = json.loads(content)
            data['owner'] = request.user
            del data['id']

            try:
                workspace = Workspace.objects.get(
                    owner=request.user, inner_name=data['inner_name'])
            except:
                workspace = None
            if workspace:
                if allow_update:
                    #workspace已经存在,更新之
                    print 'update workspace: ', workspace.inner_name
                    Workspace.objects.filter(
                        owner=request.user,
                        inner_name=data['inner_name']).update(**data)
                else:
                    print 'not allowed to update workspace'
            else:
                #workspace不存在,创建之
                print 'create workspace: ', data['inner_name']
                workspace = Workspace.objects.create(**data)
                #TODO: 是否为所有用户创建workspace?

        #同步project
        apis_dir = os.path.join(settings.PROJECT_HOME, '../webapp')
        css_dir = os.path.join(settings.TERMITE_HOME, '../static/project_css')
        template_project = None
        for file in os.listdir(module_dir):
            if not file.startswith('project_'):
                continue

            project_dir = os.path.join(module_dir, file)
            print 'process project: ', project_dir
            #加载project的table data json文件
            project_table_data_file_path = os.path.join(
                project_dir, 'project_table.json')
            if not os.path.exists(project_table_data_file_path):
                continue

            project_table_data_file = open(project_table_data_file_path, 'rb')
            content = project_table_data_file.read()
            project_table_data_file.close()

            data = json.loads(content)
            data['owner'] = request.user
            data['workspace'] = workspace
            del data['id']

            allow_update_pages = False  #是否允许更新mongo中的pages
            try:
                project = Project.objects.get(workspace=workspace,
                                              inner_name=data['inner_name'])
                if allow_update:
                    #如果project存在,删除pages
                    print 'delete pages for project: ', project.inner_name, ' ', project.id
                    pagestore.remove_project_pages(str(project.id))
                    allow_update_pages = True
                else:
                    print 'not allowed to remove project\'s pages'
            except:
                project = None
            if project:
                if allow_update:
                    #project已经存在,更新之
                    print 'update project: %s(%d)-%s' % (
                        workspace.inner_name, workspace.id, data['inner_name'])
                    Project.objects.filter(
                        workspace=workspace,
                        inner_name=data['inner_name']).update(**data)
                else:
                    print 'not allowed to update project'
            else:
                #project不存在,创建之
                print 'create project: %s-%s' % (workspace.inner_name,
                                                 data['inner_name'])
                project = Project.objects.create(**data)
                '''
				if project.type == 'wepage' and project.inner_name == 'empty':
					print 'update is_active=True'
					project.is_active = True
					project.save()
				'''
                allow_update_pages = True

            if project.inner_name == 'default':
                template_project = project

            #拷贝apis.py
            # src_file = os.path.join(project_dir, 'apis.py')
            # dst_file = os.path.join(apis_dir, 'apis_%s.py' % project.id)
            # shutil.copyfile(src_file, dst_file)

            #拷贝project.css
            # src_file = os.path.join(project_dir, 'project.css')
            # dst_file = os.path.join(css_dir, 'project_%s.css' % project.id)
            # shutil.copyfile(src_file, dst_file)

            #拷贝pages
            if allow_update_pages:
                pages_data_file_path = os.path.join(project_dir, 'pages.json')
                pages_data_file = open(pages_data_file_path, 'rb')
                content = pages_data_file.read()
                pages_data_file.close()
                has_page = False
                for page in json.loads(content):
                    has_page = True
                    page_id = page['page_id']
                    page_component = page['component']
                    page_component['is_new_created'] = True
                    pagestore.save_page(str(project.id), page_id,
                                        page_component)
                if has_page:
                    print 'create project\'s pages: %s' % pages_data_file_path
            else:
                print 'not allowed to re-create pages'

        if template_project:
            print 'set template project to: ', template_project.id
            Workspace.objects.filter(id=workspace.id).update(
                template_project_id=template_project.id)

    response = create_response(200)
    return response.get_response()
Example #15
0
def export_workspace(request):
    pagestore = pagestore_manager.get_pagestore_by_type('mongo')
    workspace_id = request.GET['workspace_id']
    workspace = Workspace.objects.get(id=workspace_id)

    if not workspace.data_backend:
        response = create_response(500)
        response.data = u'没有配置数据源,请先配置'
        return response.get_response()

    #
    #获得workspace_dir
    #
    data_type, name_or_id = workspace.data_backend.split(':')
    webapp_modules_dir = os.path.join(settings.PROJECT_HOME,
                                      '../webapp/modules')
    workspace_dir = None
    if data_type == 'viper':
        workspace_name = 'viper_workspace_%s' % workspace.inner_name
        workspace_dir = os.path.join(webapp_modules_dir, workspace_name)
        '''
		if os.path.isdir(workspace_dir):
			#删除已存在的workspace
			shutil.rmtree(workspace_dir)

		#重建workspace目录
		os.makedirs(workspace_dir)
		'''
    elif data_type == 'module':
        workspace_name = name_or_id
        workspace_dir = os.path.join(webapp_modules_dir, workspace_name)

    #
    #导出workspace数据表的内容到${workspace_dir}/workspace目录下
    #
    workspace_data_dir = os.path.join(workspace_dir, 'workspace')
    table_data = {
        'id': workspace.id,
        'name': workspace.name,
        'inner_name': workspace.inner_name,
        'data_backend': workspace.data_backend,
        'source_workspace_id': workspace.source_workspace_id,
        'template_project_id': workspace.template_project_id
    }

    workspace_data_file_path = os.path.join(workspace_dir,
                                            'workspace_table.json')
    workspace_data_file = open(workspace_data_file_path, 'wb')
    print >> workspace_data_file, json.dumps(table_data, indent=True)
    workspace_data_file.close()

    #
    #删除已存在的project
    #
    '''
	for file in os.listdir(workspace_dir):
		if not file.startswith('project_'):
			continue

		project_dir = os.path.join(workspace_dir, file)
		if os.path.isdir(project_dir):
			project_info_file_path = os.path.join(project_dir, 'project_info.json')
			if os.path.exists(project_info_file_path):
				f = open(project_info_file_path, 'rb')
				content = f.read()
				f.close()
				print content

				project_info = json.loads(content)
				if project_info['type'] == 'raw':
					#跳过raw 类型的project
					continue
				else:
					shutil.rmtree(project_dir)
	'''

    #
    #导出project
    #
    apis_dir = os.path.join(settings.PROJECT_HOME, '../webapp')
    css_dir = os.path.join(settings.TERMITE_HOME, '../static/project_css')
    for project in Project.objects.filter(workspace_id=workspace.id):
        project_name = 'project_%s_%s' % (project.type, project.inner_name)
        project_dir = os.path.join(workspace_dir, project_name)
        if not os.path.isdir(project_dir):
            os.makedirs(project_dir)

        #写数据库数据文件
        table_data = {
            'id': project.id,
            'name': project.name,
            'inner_name': project.inner_name,
            'type': project.type,
            'css': project.css,
            'pagestore': project.pagestore,
            'source_project_id': project.source_project_id,
            'datasource_project_id': project.datasource_project_id,
            'template_project_id': project.template_project_id
        }

        data_file_path = os.path.join(project_dir, 'project_table.json')
        data_file = open(data_file_path, 'wb')
        print >> data_file, json.dumps(table_data, indent=True)
        data_file.close()

        #拷贝apis.py
        src_file = os.path.join(apis_dir, 'apis_%s.py' % project.id)
        if os.path.exists(src_file):
            dst_file = os.path.join(project_dir, 'apis.py')
            shutil.copyfile(src_file, dst_file)

        #export project.css
        src_file = os.path.join(css_dir, 'project_%s.css' % project.id)
        if os.path.exists(src_file):
            dst_file = os.path.join(project_dir, 'project.css')
            shutil.copyfile(src_file, dst_file)

        #导出project中的page
        pages = []
        for page in pagestore.get_pages(str(project.id)):
            del page['_id']
            pages.append(page)
        data_file_path = os.path.join(project_dir, 'pages.json')
        data_file = open(data_file_path, 'wb')
        print >> data_file, json.dumps(pages, indent=True)
        data_file.close()

    response = create_response(200)
    return response.get_response()
Example #16
0
    def api_post(request):
        """
		保存(更新)模板项目
		"""
        project_id = request.POST['id']
        field = request.POST['field']
        if field == 'page_content_from_zip':
            if not Project.import_from_zip_file(request):
                response = create_response(501)
                response.errMsg = u'导入page失败'
                return response.get_response()
        elif field == 'page_content':
            project_id = request.GET.get('project_id', '')
            if project_id.startswith('fake:'):
                _, project_type, webapp_owner_id, page_id, mongodb_id = project_id.split(
                    ':')
                pagestore = pagestore_manager.get_pagestore_by_type('mongo')
                page_component = json.loads(request.POST['page_json'])
                if mongodb_id == 'new':
                    page_component['is_new_created'] = True
                real_project_id = 'fake:%s:%s:%s' % (project_type,
                                                     webapp_owner_id, page_id)
                pagestore.save_page(real_project_id, page_id, page_component)

                if mongodb_id == 'new':
                    page = pagestore.get_page(real_project_id, page_id)
                    result_project_id = 'fake:%s:%s:%s:%s' % (
                        project_type, webapp_owner_id, page_id, str(
                            page['_id']))
                else:
                    result_project_id = project_id
                response = create_response(200)
                response.data = result_project_id
                Project.delete_all_webapp_page_cache(webapp_owner_id)
                return response.get_response()
            if project_id.startswith('new_app:'):
                if project_id.endswith(':0'):
                    project_id = Project.create_empty_app_page(request)
                    response = create_response(200)
                    response.data = {'project_id': project_id}
                    Project.delete_all_webapp_page_cache(request.manager.id)
                    return response.get_response()
                else:
                    Project.update_app_page_content(request)
            else:
                Project.update_page_content(request)
                #清除webapp page cache
                # Project.delete_webapp_page_cache(request.manager.id, project_id)
        elif field == 'is_enable':
            webapp_models.Project.objects.filter(id=project_id).update(
                is_enable=True)
        else:
            if field[0] == '[':
                fields = json.loads(field)
                values = json.loads(request.POST['value'])
                options = dict(zip(fields, values))
            else:
                value = request.POST['value']
                options = {field: value}
            webapp_models.Project.objects.filter(id=project_id).update(
                **options)

        key_termite_page = 'termite_webapp_page_%s_*' % request.manager.id
        cache_util.delete_pattern(key_termite_page)
        purge_webapp_page_from_varnish_cache.delay(request.manager.id)

        response = create_response(200)
        return response.get_response()