# -*- coding: utf-8 -*- import os, uuid, re, pickle, urllib, glob from gluon.admin import app_create, plugin_install from gluon.fileutils import abspath def reset(session): session.app={ 'name':'', 'params':[('title','My New App'), ('subtitle','powered by web2py'), ('author','you'), ('author_email','you@example.com'), ('keywords',''), ('description',''), ('layout_theme','Default'), ('database_uri','sqlite://storage.sqlite'), ('security_key',str(uuid.uuid4())), ('email_server','localhost'), ('email_sender','you@example.com'), ('email_login',''), ('login_method','local'), ('login_config',''), ('plugins',[])], 'tables':['auth_user'], 'table_auth_user':['username','first_name','last_name','email','password'], 'pages':['index','error'], 'page_index':'# Welcome to my new app', 'page_error':'# Error: the document does not exist', } if not session.app: reset(session) def listify(x): if not isinstance(x,(list,tuple)): return x and [x] or [] return x def clean(name): return re.sub('\W+','_',name.strip().lower()) def index(): response.view='wizard/step.html' reset(session) apps=os.listdir(os.path.join(request.folder,'..')) form=SQLFORM.factory(Field('name',requires=[IS_NOT_EMPTY(),IS_ALPHANUMERIC()])) if form.accepts(request.vars): app = form.vars.name session.app['name'] = app if MULTI_USER_MODE and db(db.app.name==app)(db.app.owner!=auth.user.id).count(): session.flash = 'App belongs already to other user' elif app in apps: meta = os.path.join(request.folder,'..',app,'wizard.metadata') if os.path.exists(meta): try: session.app=pickle.load(open(meta,'rb')) session.flash = "The app exists, was created by wizard, continue to overwrite!" except: session.flash = "The app exists, was NOT created by wizard, continue to overwrite!" redirect(URL('step1')) return dict(step='Start',form=form) def step1(): from gluon.contrib.simplejson import loads import urllib if not session.themes: url=LAYOUTS_APP+'/default/layouts.json' try: data = urllib.urlopen(url).read() session.themes = ['Default']+loads(data)['layouts'] except: session.themes = ['Default'] themes = session.themes if not session.plugins: url = PLUGINS_APP+'/default/plugins.json' try: data = urllib.urlopen(url).read() session.plugins = loads(data)['plugins'] except: session.plugins = [] plugins = [x.split('.')[2] for x in session.plugins] response.view='wizard/step.html' params = dict(session.app['params']) form=SQLFORM.factory( Field('title',default=params.get('title',None), requires=IS_NOT_EMPTY()), Field('subtitle',default=params.get('subtitle',None)), Field('author',default=params.get('author',None)), Field('author_email',default=params.get('author_email',None)), Field('keywords',default=params.get('keywords',None)), Field('description','text', default=params.get('description',None)), Field('layout_theme',requires=IS_IN_SET(themes), default=params.get('layout_theme',themes[0])), Field('database_uri',default=params.get('database_uri',None)), Field('security_key',default=params.get('security_key',None)), Field('email_server',default=params.get('email_server',None)), Field('email_sender',default=params.get('email_sender',None)), Field('email_login',default=params.get('email_login',None)), Field('login_method',requires=IS_IN_SET(('local','janrain')), default=params.get('login_method','local')), Field('login_config',default=params.get('login_config',None)), Field('plugins','list:string',requires=IS_IN_SET(plugins,multiple=True))) if form.accepts(request.vars): session.app['params']=[(key,form.vars.get(key,None)) for key,value in session.app['params']] redirect(URL('step2')) return dict(step='1: Setting Parameters',form=form) def step2(): response.view='wizard/step.html' form=SQLFORM.factory(Field('table_names','list:string', default=session.app['tables'])) if form.accepts(request.vars): table_names = [clean(t) for t in listify(form.vars.table_names) if t.strip()] if [t for t in table_names if t.startswith('auth_') and not t=='auth_user']: form.error.table_names = T('invalid table names (auth_* tables already defined)') else: session.app['tables']=table_names for table in session.app['tables']: if not 'table_'+table in session.app: session.app['table_'+table]=['name'] if not table=='auth_user': for key in ['create','read','update','select','search']: name = table+'_'+key if not name in session.app['pages']: session.app['pages'].append(name) session.app['page_'+name]='## %s %s' % (key.capitalize(),table) if session.app['tables']: redirect(URL('step3',args=0)) else: redirect(URL('step4')) return dict(step='2: Tables',form=form) def step3(): response.view='wizard/step.html' n=int(request.args(0) or 0) m=len(session.app['tables']) if n>=m: redirect(URL('step2')) table=session.app['tables'][n] form=SQLFORM.factory(Field('field_names','list:string', default=session.app.get('table_'+table,[]))) if form.accepts(request.vars) and form.vars.field_names: fields=listify(form.vars.field_names) if table=='auth_user': for field in ['first_name','last_name','username','email','password']: if not field in fields: fields.append(field) session.app['table_'+table]=[t.strip().lower() for t in listify(form.vars.field_names) if t.strip()] try: tables=sort_tables(session.app['tables']) except RuntimeError: response.flash=T('invalid circual reference') else: if n=m: redirect(URL('step4')) page=session.app['pages'][n] markmin_url='http://web2py.com/examples/static/markmin.html' form=SQLFORM.factory(Field('content','text', default=session.app.get('page_'+page,[]), comment=A('use markmin',_href=markmin_url,_target='_blank')), formstyle='table2cols') if form.accepts(request.vars): session.app['page_'+page]=form.vars.content if n