def configureApp(path, app, properties): """After it has been created it is populated""" print "Configuring app: " + app #where to put template chains templates = os.path.join(path, 'templates') #generate themes theme = path + "/static/" print "Generating: " + theme try: call(["mkdir", theme]) call(["mkdir", templates]) if call(["cp","-a", os.path.join(consts.RESOURCES, 'themes', properties['theme'],'static','.'), theme]) == 1: if call(["cp", "-a", os.path.join(consts.PATH, properties['theme'], 'static', '.'), theme]) == 1: print "Failed to find theme: " + properties['theme'] + " static files" sys.exit(1) if call(["cp", "-a", os.path.join(consts.RESOURCES, 'themes', properties['theme'], 'templates', '.'), templates]) == 1: if call(["cp", "-a", os.path.join(consts.PATH, properties['theme'], 'templates', '.'), templates]) == 1: print "Failed to find theme " + properties['theme'] + " templates" call(["cp", "-a", os.path.join(consts.RESOURCES, 'themes', 'core', '.'), theme]) call(["cp", "-a", os.path.join(consts.RESOURCES, 'templatechains', 'core','.'), templates]) except: print "Failed to generate theme" #generate the models try: generateModels(path,app,properties['models']) #when done writing models for this app migrate it #call([consts.PYTHON, consts.MANAGE, "schemamigration", app, "--intial"]) #generate default html for displaying the models, these are not fullon pages rather #they are small snipets that can be loaded by other pages by using a view to access them generateModelView(path,app,properties['models']) #generate middletier functions for each model generateMiddletier(path,app,properties['models']) #generate the form generators generateForms(path,app,properties['models']) except KeyError: #but we still want to make a models file writeFile(os.path.join(path,'models.py'), "from django.contrib.auth.models import User") print app + " has no models" if app == 'main': #set urls to callback to the middletier addURL('api/login/', 'main.middletier.login', 'login') addURL('api/logout/', 'main.middletier.logout', 'logout') addURL('api/signup/', 'main.middletier.signup', 'signup') #need to put in the context processor that allows us to access login/logout/signout stuff call(["cp", os.path.join(consts.RESOURCES,'processors','context_processors.py'),os.path.join(consts.PROJECT,'main','context_processors.py')]) #copy in the middletier call(["cp", os.path.join(consts.RESOURCES,'middletier','middletier.py'),os.path.join(consts.PROJECT,'main','middletier.py')]) #copy in the form data call(["cp", os.path.join(consts.RESOURCES,'userforms.html'),os.path.join(consts.PROJECT,'main','templates','userforms.html')])
def generatePage(app, name, appPath, parent, properties, top): """ Generate a page given a dict of properties A page consists of both a view and a template both are generated by this function. """ print "Generating page: " + name #basics for each page template tabs = 0 page = "<!-- Generated code for page: " + name + " -->\n" page += tabify("{%% extends \"%s.html\" %%}" % parent, tabs) #Generate unique portion for each page try: page += tabify(("{%% block title %%}%s{%% endblock %%}" % properties["title"]), tabs) except KeyError: pass #no title for page #if this is a top level page fill in the content block if top: try: page += "{% block content %}" + handlePercentToken(properties["template"],'{{ ','|safe }}') + "{% endblock %}" except KeyError: print "Page " + name + " has no content" else:#otherwise we just pop everything in assuming the percent tokens are set up right try: page += handlePercentToken(properties["template"],'{{ ','|safe }}') except KeyError: print "page " + name + " has no content" with open(os.path.join(appPath, 'templates', name+'.html'), 'w') as f: f.write(page) tabs = 0 #write view #urls need to count capture groups args = "request" try: counter = 1 for symbol in properties["url"]: if symbol == "(": #assume matching for now args += ",u_" + str(counter) counter += 1 except KeyError: pass #didnt have a url view = "" #now the definition of the view function view += tabify("def %s(%s):" % (name, args), tabs) tabs += 1 #time to call the access function try: login = properties['access']['login'] #requires a login except KeyError: login = "******" try: groups = properties['access']['groups'] #get groups required except KeyError: groups = "" try: error_message = "messages.add_message(request, messages.ERROR, '%s')" % properties['access']['failmessage'] except KeyError: error_message = "messages.add_message(request, messages.ERROR, 'Something went wrong man!')" try: redirect = "return %s(request)" % properties['access']['fail'] except KeyError: redirect = "return HttpResponse('Denied', status=403)" view += tabify("if not permissionsCheck(request,%s,'%s'):" % (login,groups), tabs) tabs += 1 view += tabify(error_message, tabs) view += tabify(redirect, tabs) tabs -= 1 #time to define variables in the page view += tabify("d = {}",tabs) #to hold the variables for key in iter(properties): if key not in ["title", "url", "template", "pages", "access"]: #predefined keys, anything else is a variable view += decodePageKey(key,properties[key],tabs) view += tabify("return render(request,\"%s.html\",d)" % name, tabs) #write the view files writeFile(os.path.join(appPath, 'views.py'), view, 'a') #adds a url mapping try: addURL(properties['url'],"%s.views.%s" % (app, name), name) except KeyError: pass #wasnt a leaf page, dont really care if its missing a url #generate all sub pages try: for key in iter(properties['pages']): generatePage(app, key, appPath, name, properties['pages'][key], False) except KeyError: pass #this was a leaf page
def generateMiddletierForModel(app, model, properties): """Generate portion of middletier file for a particular model""" result = "\n\n#interactions for model " + model + "\n" fields = properties['fields'] unique = [] required = [] for field in iter(fields): if 'unique' in fields[field].keys(): unique.append(field) if 'required' in fields[field].keys(): required.append(field) #TODO verify that unique and required are being honored #TODO also this is a pretty horrible way to generate these functions, should implemenmt a template system (again) for it result += "from django.http import HttpResponse\n" #create function result += "def create%s(request):\n" % model result += " if request.method == 'POST':\n" result += " data = request.POST.copy()\n" result += " del data['csrfmiddlewaretoken'] #remove this since it is not a part of the object\n" result += " from %s.forms import %sForm\n" % (app,model) result += " form = %sForm(data)\n" % model result += " if form.is_valid():\n" result += " data = form.cleaned_data\n" result += " new%s = form.save()\n" % model result += " new%s.save()\n" % model # result += " newObject = %s(**data)\n" % model # result += " newObject.save()\n" result += " return HttpResponse('\\'Succesfully Created\\'')\n" result += " return HttpResponse('\\'Data Unclean\\'')\n\n" addURL('api/%s/%s/create/'%(app,model),'%s.middletier.create%s'%(app,model),'create_%s' % (model)) #retrieve function result += "def retrieve%s(request):\n" % model result += " if request.method == 'POST':\n" result += " data = request.POST\n" result += " filters = data['filters']\n" result += " qs = %s.objects.filter(**filters)\n" % model result += " return HttpResponse(serializers.serialize([qs]))\n" result += " return HttpResponse('Please send data as POST')\n\n" #delete function result += "def delete%s(request):\n" % model result += " if request.method == 'POST':\n" result += " data = request.POST\n" result += " filters = data['filters']\n" result += " qs = %s.objects.filter(**filters)\n" % model result += " count = 0\n" result += " for obj in qs:\n" result += " obj.delete()\n" result += " count += 1\n" result += " return HttpResponse('Deleted %s objects' % count)\n" result += " return HttpResponse('Please send data as POST')\n\n" #unsure how edit differs from creation/deletion must pontificate return result
def generatePage(app, name, appPath, parent, properties, top): """ Generate a page given a dict of properties A page consists of both a view and a template both are generated by this function. """ print "Generating page: " + name #basics for each page template tabs = 0 page = "<!-- Generated code for page: " + name + " -->\n" page += tabify("{%% extends \"%s.html\" %%}" % parent, tabs) #Generate unique portion for each page try: page += tabify( ("{%% block title %%}%s{%% endblock %%}" % properties["title"]), tabs) except KeyError: pass #no title for page #if this is a top level page fill in the content block if top: try: page += "{% block content %}" + handlePercentToken( properties["template"], '{{ ', '|safe }}') + "{% endblock %}" except KeyError: print "Page " + name + " has no content" else: #otherwise we just pop everything in assuming the percent tokens are set up right try: page += handlePercentToken(properties["template"], '{{ ', '|safe }}') except KeyError: print "page " + name + " has no content" with open(os.path.join(appPath, 'templates', name + '.html'), 'w') as f: f.write(page) tabs = 0 #write view #urls need to count capture groups args = "request" try: counter = 1 for symbol in properties["url"]: if symbol == "(": #assume matching for now args += ",u_" + str(counter) counter += 1 except KeyError: pass #didnt have a url view = "" #now the definition of the view function view += tabify("def %s(%s):" % (name, args), tabs) tabs += 1 #time to call the access function try: login = properties['access']['login'] #requires a login except KeyError: login = "******" try: groups = properties['access']['groups'] #get groups required except KeyError: groups = "" try: error_message = "messages.add_message(request, messages.ERROR, '%s')" % properties[ 'access']['failmessage'] except KeyError: error_message = "messages.add_message(request, messages.ERROR, 'Something went wrong man!')" try: redirect = "return %s(request)" % properties['access']['fail'] except KeyError: redirect = "return HttpResponse('Denied', status=403)" view += tabify( "if not permissionsCheck(request,%s,'%s'):" % (login, groups), tabs) tabs += 1 view += tabify(error_message, tabs) view += tabify(redirect, tabs) tabs -= 1 #time to define variables in the page view += tabify("d = {}", tabs) #to hold the variables for key in iter(properties): if key not in ["title", "url", "template", "pages", "access" ]: #predefined keys, anything else is a variable view += decodePageKey(key, properties[key], tabs) view += tabify("return render(request,\"%s.html\",d)" % name, tabs) #write the view files writeFile(os.path.join(appPath, 'views.py'), view, 'a') #adds a url mapping try: addURL(properties['url'], "%s.views.%s" % (app, name), name) except KeyError: pass #wasnt a leaf page, dont really care if its missing a url #generate all sub pages try: for key in iter(properties['pages']): generatePage(app, key, appPath, name, properties['pages'][key], False) except KeyError: pass #this was a leaf page