Scaffolding: meta_scaffold.py

File meta_scaffold.py, 4.4 KB (added by javinievas@…, 18 years ago)

Scaffolding the whole project

Line 
1#!/usr/bin/python
2
3###################################################################################################
4# Scaffolding the whole project
5# Author: Javier Nievas (javinievas@gmail.com)
6# Date: 6th August 2006
7###################################################################################################
8# BASED ON...
9# Script based on the work of:
10# - Lllama
11# - Akaihola
12# - David Warry
13###################################################################################################
14# INTRODUCTION...
15# The original work lives in: http://code.djangoproject.com/wiki/ScaffoldScript
16# I have extended the scaffold to work for the whole project and also generate automatic urls
17# I have also put together the generation of forms and manipulators in the same file (scaffold.py)
18###################################################################################################
19# Add the following line to your urls.py if you want to use automatic generated urls
20# from _urls import urlpatterns
21#
22# The templates are generated under your app folder, in a templates/app_label folder
23#
24# This script was tested under Windows XP, using Django 0.96-pre
25# You may have to change some code to match your own installation
26###################################################################################################
27
28from optparse import OptionParser
29import sys
30import os
31from django.shortcuts import render_to_response
32from django.template.loader import get_template
33from scaffold import renderForm, readfile
34from django.db import models
35from django.template import Context, Template
36
37TEMPLATES_FILES_PATTERN = "_%s_form.html"
38APPS_FOLDER = r"../apps"
39TEMPLATE_PATH_PATTERN = r"%s/%s/templates/%s"
40URLS_PATH_PATTERN = r"%s/%s"
41
42def writefile(fichero, cadena):
43 f = open(fichero,"wt")
44 pre = f.write(cadena)
45 f.close()
46
47urls_prefix="""
48# SCAFFOLDING AUTOGENERATED URLS (by javinievas@gmail.com)
49# Add the following line to your urls.py if you want to use automatic generated urls
50# from _urls import urlpatterns
51
52from django.conf.urls.defaults import *
53from django.conf import settings
54from contratacion.models import *
55
56urlpatterns = patterns('')
57
58"""
59def meta_generate(app, options):
60 list = models.get_models(app_mod=app.models)
61 list_names = [i.__name__ for i in list]
62 list_names_lower = [i.lower() for i in list_names]
63
64 template_path = TEMPLATE_PATH_PATTERN % (APPS_FOLDER, options.app, options.app)
65 urls_path = URLS_PATH_PATTERN % (APPS_FOLDER, options.app,)
66 urls = ""
67 print template_path
68
69 print list_names
70 print "Building forms..."
71 for i, name in enumerate(list_names):
72 template_file = os.path.join(template_path, TEMPLATES_FILES_PATTERN % list_names_lower[i])
73 print "Form for '%s' in: \n\t'%s'" % (name, template_file)
74 template_content = renderForm(options.app, name)
75 writefile(template_file, template_content)
76 urls = urls + genera_urls(app.__name__,name)
77
78 print "\nBuilding _urls.py"
79 writefile(os.path.join(urls_path, "_urls.py"), urls_prefix + urls)
80 print "\nScaffolding completed!"
81
82def genera_urls(app,modelo):
83 template = """
84# URLS of {{modelo}}
85
86urlpatterns += patterns('django.views.generic.create_update',
87 (r'^{{modelo|lower}}/new/$', 'create_object', dict({'model':{{modelo}}})),
88 (r'^{{modelo|lower}}/(?P<object_id>\d+)/edit/$', 'update_object', dict({'model':{{modelo}}})),
89 (r'^{{modelo|lower}}/(?P<object_id>\d+)/delete/$', 'delete_object', dict({'model':{{modelo}}})),
90)
91urlpatterns += patterns('{{app}}.views',
92 (r'^{{modelo|lower}}/list/$','{{modelo|lower}}_list'),
93)
94info_dict = {
95 'queryset': {{modelo}}.objects.all(),
96}
97urlpatterns += patterns('django.views.generic.list_detail',
98 (r'^{{modelo|lower}}/(?P<object_id>\d+)/$', 'object_detail', dict(info_dict)),
99)
100"""
101 t = Template(template)
102 return t.render(Context({'modelo': modelo,'app':app}))
103
104if __name__ == '__main__':
105 try:
106 import settings
107 except ImportError:
108 print "Settings file not found. Place this file in the same place as manage.py"
109 sys.exit()
110
111 p = OptionParser()
112
113 p.add_option("-p", "--project", dest="project", help="The name of the project")
114 p.add_option("-a", "--app", dest="app", help="The app which contains the models")
115 options, args = p.parse_args()
116
117 if not (options.app):
118 p.print_help()
119 sys.exit()
120
121 app_models = __import__("%s.models" % options.app)
122 meta_generate(app_models, options)
123
Back to Top