summaryrefslogtreecommitdiff
path: root/testapp/scripts/vimarsh.py
blob: 863193aab4ebf1e0c21d34003e8b48298142b4fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import subprocess
import contextlib
import os
from os import path
import argparse
from django.conf import settings
from django.core import management
from django.template import Template, Context, loader

from project_detail import NAME, PATH 

CUR_DIR = os.getcwd()
SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
PARENT_DIR = os.path.abspath(os.path.join(SCRIPT_DIR, os.pardir))
TEMPLATE_DIR = path.join(PARENT_DIR, 'templates')

def main():
    #Parse command-line to obtain the arguments and/or options
    help_msg = ("Enter the subcommand to be executed.\n"
    "Available subcommands:\n"
    " - create_demo <projectname> [destination-path]\n"
    " - run_demo")

    parser = argparse.ArgumentParser(prog="vimarsh", 
                                        usage="vimarsh.py subcommand [args]",
                                        formatter_class=argparse.RawTextHelpFormatter)
    parser.add_argument("subcommand", type=str, nargs='+', help=help_msg)
    args = parser.parse_args()

    if args.subcommand[0] == "create_demo":
        if len(args.subcommand) > 3 or len(args.subcommand) <= 1:
            parser.print_help()
        elif len(args.subcommand) == 3:
            project_name = args.subcommand[1]
            project_dir = args.subcommand[2]
            create_demo(args.subcommand[1], args.subcommand[2])
        else:
            project_name = args.subcommand[1]
            create_demo(args.subcommand[1])

    elif args.subcommand[0] == "run_demo":
        if len(args.subcommand) != 1:
            parser.print_help()
        else:
            try:
                run_demo(NAME, PATH)
            except Exception, e:
                if not NAME or not PATH:
                    print "Error: Unable to find Project Name and Path variables\n"
                else:
                    print "Error: ", e, "\n"
                parser.print_help()

    else:
        parser.print_help()


def create_demo(project_name='vimarsh_demo', project_dir=None):
    try:
        management.call_command('startproject', project_name, project_dir)
        print "Demo Django project '{0}' created at '{1}'"
    except Exception, e:
        print "Error: ", e, "\nExiting Vimarsh Installer"

    if project_dir is None:
        top_dir = path.join(os.getcwd(), project_name)
    else:
        top_dir = project_dir

    project_path = path.join(top_dir, project_name)
    # Store project details
    _set_project_details(project_name, top_dir)

    with _chdir(project_path):
        root_urlconf = "{0}.{1}".format(project_name, 'demo_urls')
        settings_template_path = path.join(TEMPLATE_DIR, 'demo_settings.py')
        settings_target_path = path.join(project_path, 'demo_settings.py')
        settings_context = Context({'project_name': project_name, # 'custom_apps': custom_apps, 
                        'root_urlconf': root_urlconf})
        urls_template_path = path.join(TEMPLATE_DIR, 'demo_urls.py')
        urls_target_path = path.join(project_path, 'demo_urls.py')
        command = ("python ../manage.py syncdb "
                        "--noinput --settings={0}.demo_settings").format(project_name)

        # Create demo_settings file
        _render_demo_files(settings_template_path, settings_target_path, settings_context)
        # Create demo_urls file 
        _render_demo_files(urls_template_path, urls_target_path)
        # Run syncdb
        subprocess.call(command, shell=True)

def run_demo(project_name, top_dir):
    with _chdir(top_dir):
        project_path = path.join(top_dir, 'manage.py')
        command = ("python manage.py runserver "
                        "--settings={0}.demo_settings").format(project_name)
        subprocess.call(command, shell=True)

def _set_project_details(project_name, top_dir):
    file_path = path.join(SCRIPT_DIR, 'project_detail.py')
    detail = "NAME ='{0}'\nPATH ='{1}'".format(project_name, top_dir)
    with open(file_path, 'w') as data_store:
        data_store.write(detail)

def _render_demo_files(template_path, output_path, context=None):
    with open(template_path, 'r') as template_file:
        content = template_file.read()
        if context:
            content = content.decode('utf-8')
            template = Template(content)
            content = template.render(context)
            content = content.encode('utf-8')

    with open(output_path, 'w') as new_file:
        new_file.write(content)

@contextlib.contextmanager
def _chdir(path):
    starting_directory = os.getcwd()
    try:
        os.chdir(path)
        yield
    finally:
        os.chdir(starting_directory)

if __name__ == '__main__':
    main()